LCD背光驱动(字符设备)在FL2440的开发(2.6.33.7内核)

一、开发环境

主   机:fedora 14
(2.6.33.7)
    开发板:FL2440(nandflash:K9F1G08
128m)
    编译器:arm-linux-gcc 4.3.2

二、原理分析

硬件原理图分析。由原理图得知LCD的背光是由2440的GPG4口控制的,只要往GPG4口写入高电平,(1)则背光打开,写入低电平(0)则背光关闭。

三、实现步骤

    1. 编写背光驱动。文件名为fl2440_backlight.c

  1. /*

  2. *==============================================

  3. *Name : fl2440_backlight.c

  4. *Author : y.q.yang

  5. *Date : 17/2/2011

  6. *Copyright : GPL

  7. *Description : fl2440 lcd backlight driver

  8. *==============================================

  9. */

  10. #include <linux/kernel.h>

  11. #include <linux/module.h>

  12. #include <linux/init.h>

  13. #include <linux/errno.h>
  14. #include <mach/hardware.h>

  15. #include <mach/regs-gpio.h>

  16. #include <mach/gpio-fns.h>

  17. #include <mach/gpio-nrs.h>
  18. #define DEVICE_NAME
        “fl2440_backlight”

  19. #define DEVICE_MAJOR    230

  20. #define BL_OFF          0

  21. #define BL_ON           1
  22. #define S3C2410_GPIONO(bank,offset) ((bank) + (offset))

  23. #define S3C2410_GPIO_BANKG (32*6)

  24. #define S3C2410_GPG4
    S3C2410_GPIONO(S3C2410_GPIO_BANKG, 4)
  25. static int bl_open(struct inode *inode, struct file *filp)

  26. {

  27. return 0;

  28. }
  29. static int bl_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)

  30. {

  31. if(cmd<0 || cmd>1)

  32. {

  33. return -EINVAL;

  34. }

  35. switch(cmd)

  36. {

  37. case BL_ON:

  38. {

  39. s3c2410_gpio_setpin(S3C2410_GPG4,BL_ON);

  40. printk(DEVICE_NAME ”
    turn on!\n”);

  41. break;

  42. }

  43. case BL_OFF:

  44. {

  45. s3c2410_gpio_setpin(S3C2410_GPG4,BL_OFF);

  46. printk(DEVICE_NAME ”
    turn off!\n”);

  47. break;

  48. }

  49. default:

  50. printk(“cmd
    default!\n”);

  51. return -EINVAL;

  52. }
  53. return 0;

  54. }
  55. struct file_operations bl_fops =

  56. {

  57. .owner = THIS_MODULE,

  58. .open = bl_open,

  59. .ioctl = bl_ioctl,

  60. };

  61. static int __init
    bl_init(void)

  62. {

  63. int ret;
  64. s3c2410_gpio_cfgpin(S3C2410_GPG4, 0×1 << 8);
  65. s3c2410_gpio_setpin(S3C2410_GPG4, BL_ON);
  66. ret = register_chrdev(DEVICE_MAJOR, DEVICE_NAME, &bl_fops);
  67. if(ret<0)

  68. {

  69. printk(“register
    failed!\n”);

  70. return ret;

  71. }

  72. return ret;

  73. }
  74. static void __exit
    bl_exit(void)

  75. {

  76. unregister_chrdev(DEVICE_MAJOR, DEVICE_NAME);

  77. }
  78. module_init(bl_init);

  79. module_exit(bl_exit);
  80. MODULE_LICENSE(“GPL”);

  81. MODULE_AUTHOR(“y.q.yang”);

  82. MODULE_DESCRIPTION(“FL2440 backlight
    driver”);

2. 把背光驱动代码部署到内核中去

  • #cp -f
    fl2440_backlight.c /linux-2.6.33.7/drivers/char //把驱动源码复制到内核驱动的字符设备下
  • #vim /linux-2.6.33.7/drivers/char/Kconfig //添加LCD背光设备配置

  • config FL2440_BACKLIGHT

  • tristate “FL2440 Backlight
    Device”

  • depends on ARCH_S3C2440

  • default y

  • ---help---

  • FL2440 User Backlight
  • #vim /linux-2.6.33.7/drivers/char/Makefile //添加LCD背光设备配置

  • obj-$(CONFIG_FL2440_BACKLIGHT) += fl2440_backlight.o

3. 配置内核,选择LCD背光设备选项

  1. #make menuconfig

  2. Device
    Drivers --->

  3. Character
    devices --->

  4. <*> FL2440 Backlight
    Device (NEW)

4. 编译内核并下载到开发板上,查看已加载的设备:#cat
/proc/devices,可以看到fl2440_backlight的主设备号为230

  1. 90 mtd

  2. 99 ppdev

  3. 116 alsa

  4. 128 ptm

  5. 136 pts

  6. 180 usb

  7. 188 ttyUSB

  8. 189 usb_device

  9. 204 s3c2410_serial

  10. 230 fl2440_backlight

  11. 231 fl2440_leds

  12. 232 fl2440_buttons

  13. 254 rtc
  14. Block devices:

  15. 1 ramdisk

  16. 259 blkext

四、测试驱动

1. 编写应用程序测试LED驱动,文件名:bl_test.c

  1. /*

  2. *==============================================

  3. *Name   : bl_test.c

  4. *Author : y.q.yang

  5. *Date   : 17/2/2011

  6. *Copyright : GPL

  7. *Description : fl2440 lcd backlight test

  8. *==============================================

  9. */
  10. #include <stdio.h>

  11. #include <stdlib.h>

  12. #include <fcntl.h>

  13. #include <sys/ioctl.h>
  14. int main(int argc, char **argv)

  15. {

  16. int turn,fd;
  17. if(argc == 1 || argc >2)

  18. {

  19. printf(“Usage:
    bl_test on|off\n”);

  20. exit(1);

  21. }
  22. fd = open(“/dev/fl2440_backlight”, 0);
  23. if(fd<0)

  24. {

  25. printf(“Open
    backlight device failed!\n”);

  26. exit(1);

  27. }
  28. if(strcmp(argv[1], “on”) == 0)

  29. {

  30. turn = 1;

  31. }

  32. else if(strcmp(argv[1], “off”) == 0)

  33. {

  34. turn = 0;

  35. }

  36. else

  37. {

  38. printf(“Usage:
    bl_test on|off\n”);

  39. exit(1);

  40. }
  41. ioctl(fd,turn);
  42. close(fd);
  43. return 0;

  44. }

2.
在开发主机上交叉编译测试应用程序,并复制到文件系统的/usr/sbin目录下,然后重新编译文件系统下载到开发板上

  1. #arm-linux-gcc -o
    bl_test bl_test.c

3.
在开发板上的文件系统中创建一个背光设备的节点,然后运行测试程序,效果图如下,观测开发板上的LED灯,可以看到每一步的操作对应的LCD液晶屏会点亮或者熄灭

[[email protected] /]# mknod /dev/fl2440_backlight
c 230 0

  1. [[email protected] /]# bl_test
    –help

  2. Usage: bl_test on|off

  3. [[email protected] /]# bl_test
    off

  4. fl2440_backlight turn off

  5. [[email protected] /]# bl_test
    on

  6. fl2440_backlight turn on

五、补充问题

暂无

From: http://www.w3c.com.cn/lcd%E8%83%8C%E5%85%89%E9%A9%B1%E5%8A%A8%E5%AD%97%E7%AC%A6%E8%AE%BE%E5%A4%87%E5%9C%A8fl2440%E7%9A%84%E5%BC%80%E5%8F%912-6-33-7%E5%86%85%E6%A0%B8

时间: 2024-10-19 11:17:07

LCD背光驱动(字符设备)在FL2440的开发(2.6.33.7内核)的相关文章

【转】s3c2440 按键驱动 — 字符设备

原文网址:http://www.xuebuyuan.com/632893.html 主机:VM - redhat 9.0 开发板:FL2440,linux-2.6.12 arm-linux-gcc:3.4.1 (1)原理图上的按键模块,可以看到相应的GPIO口,以及中断号. 由图可以得知GPF0等接高电平,当按键按下,则接低电平,所以将中断响应设置为下降沿触发. (2)驱动程序gzliu_2440_key.c,实现为一般的字符设备驱动,完整的源码如下,其中: // 定时器的使用参考:http:/

[Linux驱动]字符设备驱动学习笔记(一)

一,主设备号和次设备号代表的含义?linu内核是如果根据主设备号找驱动,次设备号找设备的. 答:通常一个主设备号代表一个驱动,比如在block设备中,一个主设备号代表一个emmc设备,不同次设备号代表的是不同的分区 Linux内核允许多个驱动共享一个主设备号,但更多的设备都遵循一个驱动对一个主设备号的原则.内核维护者一个以主设备号为key的全局哈希表,而哈希表中数据部分则为与该主设备号设备对应的驱动程序(只有一个次设备)的指针或者多个次设备驱动程序组成的数组的指针(次设备共享主设备号) 二,编写

[Linux驱动]字符设备驱动学习笔记(二)———实例

一,注册字符设备 [cpp] view plaincopy #define GLOBALMEM_MAJOR 256 #define GLOBALMEM_SIZE 0X1000 //4k static int char_major=GLOBALMEM_MAJOR;//主设备号 struct chartest_dev { struct cdev cdev; unsigned char mem[GLOBALMEM_SIZE]; }; struct chartest_dev glob_char_dev;

[Linux驱动]字符设备驱动学习笔记(三)———高级

一,ioctl使用实例 ioctl使用实例 驱动程序.h文件  memdev.h [cpp] view plaincopy /* 定义幻数 */ #define MEMDEV_IOC_MAGIC  'k' /* 定义命令 */ #define MEMDEV_IOCPRINT   _IO(MEMDEV_IOC_MAGIC, 1) #define MEMDEV_IOCGETDATA _IOR(MEMDEV_IOC_MAGIC, 2, int) #define MEMDEV_IOCSETDATA _I

字符设备驱动、平台设备驱动、设备驱动模型、sysfs的关系

Linux驱动开发的童鞋们来膜拜吧:-)  学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术.对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了.要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码.网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关联的分析.对于开发者而言,能够熟悉某一点并分享出来已很难得,但对于专注传授技术和经验给

[kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联

转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术.对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了.要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码.网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关

Linux设备驱动基本框架(字符设备)

Linux设备驱动都是以内核模块的形式出现的,但模块不一定是驱动.驱动可以编译进内核,在配置内核时,如果把某个配置项设为m,那么它将会随着内核编译时被编译成一个模块,但是这样向内核添加驱动程序会使得内核变得很大,而且在增加.修改.删除驱动程序时需要再一次编译内核,这样做极为麻烦.所以一般的驱动程序都是采用模块化装载,在需要使用时候通过insmod装载进内核,不需要使用时用rmmod卸载驱动模块. 内核模块的主要相关命令: lsmod:查看当前内核装载有哪些模块 insmod:加载模块 rmmod

字符设备驱动(程序设计)—①

via:http://blog.sina.com.cn/s/blog_7ec8fc2c010157lc.html 1.驱动程序设计 1)驱动分类 驱动这里分为 字符设备驱动.网络接口驱动.块设备驱动!这三类,其中前两者是重点. ①.字符设备 字符设备是一种 按自己来访问 的设备,字符驱动则负责驱动字符设备,这样的驱动通常是先 open.close.read和write 系统调用! ②.块设备 在大部分 Unix 系统中,块设备不能按照字节处理数据,只能一次传送一个或则会多个长度是 512 字节(

高通LCD的pwm背光驱动

发生异常的现象: msm8953 lcd在快速亮灭的情况下背光概率性休眠不灭:测量高通pwm,发现正常的时候pwm的管脚LCM_BL_PWM为低电平,失败的时候为高电平: 根据原理图: mpp是什么? mpp是基于电源pmic的管脚,也叫做多功能管脚:MPP的全称是Multi Purpose Pin:可以做电源.gpio.ADC.PWM.SINK等功能. 背光的控制方式: LCD控制IC支持动态背光控制功能(CABC)通过解析图像的直方图动态改变输出PWM的占空比从而动态调节LCD的背光,在不改