Chinaunix首页 | 论坛 | 博客
  • 博客访问: 395210
  • 博文数量: 85
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1707
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-27 11:18
个人简介

学无止境……

文章分类

全部博文(85)

分类: 嵌入式

2014-06-26 17:29:13

1  硬件原理图

        由原理图得知LCD的背光是由2440的GPG4口控制的。

2  编写背光驱动

        文件名为my2440_backlight.c。

点击(此处)折叠或打开

  1. #include <linux/errno.h>
  2. #include <linux/kernel.h>
  3. #include <linux/module.h>
  4. #include <linux/slab.h>
  5. #include <linux/input.h>
  6. #include <linux/init.h>
  7. #include <linux/serio.h>
  8. #include <linux/delay.h>
  9. #include <linux/clk.h>
  10. #include <linux/miscdevice.h>

  11. #include <asm/io.h>
  12. #include <asm/irq.h>
  13. #include <asm/uaccess.h>
  14. #include <mach/regs-clock.h>
  15. #include <plat/regs-timer.h>
  16. #include <mach/regs-gpio.h>
  17. #include <linux/cdev.h>

  18. #define DEVICE_NAME "backlight" //设备名称
  19. #define DEVICE_MINOR 5 //次设备号,这里我们将设备注册为misc设备,这种设备的主设备号都为10

  20. static int my2440_backlight_ioctl(struct inode *inode,
  21.                                   struct file *file,
  22.                                   unsigned int cmd,
  23.                                   unsigned long arg)
  24. {
  25.     switch(cmd)
  26.     {
  27.         case 0:
  28.             //当接收的命令为0时,就将GPG4引脚设为低电平,关闭背光
  29.             s3c2410_gpio_setpin(S3C2410_GPG4, 0);
  30.             printk(DEVICE_NAME " turn off!\n");
  31.             return 0;
  32.         case 1:
  33.             //当接收的命令为1时,就将GPG4引脚设为高电平,开启背光
  34.             s3c2410_gpio_setpin(S3C2410_GPG4, 1);
  35.             printk(DEVICE_NAME " turn on!\n");
  36.             return 0;
  37.         default:
  38.             return -EINVAL;
  39.     }
  40. }

  41. static struct file_operations dev_fops =
  42. {
  43.     .owner = THIS_MODULE,
  44.     .ioctl = my2440_backlight_ioctl, //这里只使用控制IO口的方式来控制背光
  45. };

  46. static struct miscdevice misc =
  47. {
  48.     .minor = DEVICE_MINOR,
  49.     .name = DEVICE_NAME,
  50.     .fops = &dev_fops,
  51. };

  52. static int __init dev_init(void)
  53. {
  54.     int ret;

  55.     ret = misc_register(&misc); //注册成misc设备

  56.     if(ret < 0)
  57.     {
  58.         printk("Register misc device fiald!");
  59.         return ret;
  60.     }
  61.     //将GPG4口配置成输出口
  62.     s3c2410_gpio_cfgpin(S3C2410_GPG4, S3C2410_GPG4_OUTP);

  63.     return ret;
  64. }

  65. static void __exit dev_exit(void)
  66. {
  67.     misc_deregister(&misc); //注销该misc设备
  68. }

  69. module_init(dev_init);
  70. module_exit(dev_exit);

  71. MODULE_LICENSE("GPL");
  72. MODULE_AUTHOR("Huang Gang");
  73. MODULE_DESCRIPTION("Backlight control for my2440");

3. 将驱动添加到内核中,这里我们将采用静态加载的方法。

   将my2440_backlight.c复制到内核drivers/video/backlight/目录下

#cp -f my2440_backlight.c linux-2.6.30.4/drivers/video/backlight/

   修改backlight/目录下的Kconfig文件,添加背光选项

#gedit linux-2.6.30.4/drivers/video/backlight/Kconfig

config MY2440_LCD_BACKLIGHT
    tristate "My2440 LCD Backlight Controls"
    depends on BACKLIGHT_LCD_SUPPORT
    default y

   修改backlight/目录下的Makefile文件,在最后一行添加

#gedit linux-2.6.30.4/drivers/video/backlight/Makefile

obj-$(CONFIG_MY2440_LCD_BACKLIGHT) += my2440_backlight.o

4. 配置内核选项,选中上面添加的配置项

Device Drivers --->
    Graphics support --->
        [*] Backlight & LCD device support --->
            --- Backlight & LCD device support
            <*> My2440 LCD Backlight Controls (NEW)
            < > Lowlevel LCD controls
            < > Lowlevel Backlight controls


5. 重新编译内核并下载到开发板上,在开发板/dev/目录下建立设备的节点。设备名为backlight,主设备号为10,次设备号为5,在驱动源码里有注释


#mknod /dev/backlight c 10 5

6. 编写应用程序测试背光驱动,文件名为backlight_test.c

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fcntl.h>
  4. #include <sys/ioctl.h>

  5. int main(int argc, char **argv)
  6. {
  7.     int turn;
  8.     int fd;
  9.     
  10.     //检测命令后面带的参数
  11.     if(argc == 1 || argc > 2)
  12.     {
  13.         printf("Usage: backlight on|off!\n");
  14.         exit(1);
  15.     }
  16.     
  17.     //打开背光设备
  18.     fd = open("/dev/backlight", O_RDWR);
  19.     
  20.     if(fd < 0)
  21.     {
  22.         printf("Open Backlight Device Faild!\n");
  23.         exit(1);
  24.     }
  25.     
  26.     //判断输入的参数
  27.     if(strcmp(argv[1], "on") == 0)
  28.     {
  29.         turn = 1;
  30.     }
  31.     else if(strcmp(argv[1], "off") == 0)
  32.     {
  33.         turn = 0;
  34.     }
  35.     else
  36.     {
  37.         printf("Usage: backlight on|off!\n");
  38.         exit(1);
  39.     }
  40.     
  41.     //进行IO控制
  42.     ioctl(fd, turn);

  43.     //关闭背光设备
  44.     close(fd);

  45.     return 0;
  46. }

7. 交叉编译应用程序,并下载到开发板的/usr/sbin/目录下

#arm-linux-gcc -o backlight_test backlight_test.c


8. 运行效果。执行应用程序时内核都会打印出背光状态信息,同时观察LCD的背光也得到了控制


 

阅读(1518) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~