Linux-2.6.32.2内核在mini2440上的移植(五)---添加LCD背光驱动

 

Linux-2.6.32.2内核在mini2440上的移植(五)---添加LCD背光驱动  

【1】LCD 背光控制原理

在 mini2440/micro2440 开发板中,LCD 背光是通过CPU 的LCD_PWR 引脚来控制的,从原理图中可以看出,它对应于GPG4,如图

当LCD_PWR 输出为高电平“1”时,将打开背光;当输出为低电平“0”时,将关闭背光(注意:这里只是打开和关闭背光,而并没有背光亮度的调节作用)。

【2】 在内核中添加背光驱动程序

现在,我们需要增加一个简单的背光驱动,以便能够通过软件便可简单的控制背光的开关。我们要达到的目的是:在命令终端通过向背光设备发送偶数比如“0”便可关闭背光,发送奇数比如“1”便可打开背光,这样使用起来就方便多了,而不需要专门的应用程序控制它,正如在用户手册中所描述的方法(2.5.10 控制LCD 的背光):
提示:LCD 背光设备文件:/dev/backlight
在命令行种输入:echo 0 > /dev/backlight 可以关闭LCD 背光。
在命令行种输入:echo 1 > /dev/backlight 可以打开LCD 背光。
为了实现这点,我们在linux-2.6.32.2/drivers/video目录增加一个mini2440_backlight.c文件,内容如下:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#include
#include
#include
#include
#include
#include
#include

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

extern void s3c2410_gpio_setpin(unsigned int pin, unsigned int to);
extern void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function);

static int mini2440_backlight_ioctl(struct inode *inode,
                                  struct file *file,
                                  unsigned int cmd,
                                  unsigned long arg)
{
   switch(cmd)
     {
        case 0:

            //当接收的命令为0时,就将GPG4引脚设为低电平,关闭背光
            s3c2410_gpio_setpin(S3C2410_GPG(4), 0);
            printk(DEVICE_NAME " turn off!\n");
            return 0;
        case 1:

            //当接收的命令为1时,就将GPG4引脚设为高电平,开启背光
            s3c2410_gpio_setpin(S3C2410_GPG(4), 1);
            printk(DEVICE_NAME " turn on!\n");
            return 0;
        default:
            return -EINVAL;
     }
}

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

static struct miscdevice misc =
{
    .minor = DEVICE_MINOR,
    .name = DEVICE_NAME,
    .fops = &dev_fops,
};

static int __init dev_init(void)
{
   int ret;
   ret = misc_register(&misc);
//注册成misc设备
   if(ret < 0)
     {
        printk("Register misc device fiald!");
        return ret;
     }

     //将GPG4口配置成输出口
    s3c2410_gpio_cfgpin(S3C2410_GPG(4), S3C2410_GPIO_OUTPUT);
    return ret;
}

static void __exit dev_exit(void)
{
    misc_deregister(&misc);
//注销该misc设备
}

module_init(dev_init);
module_exit(dev_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("singleboy");
MODULE_DESCRIPTION("Backlight control for mini2440");

【3】把背光配置选项加入内核配置菜单

打开linux-2.6.32.2/drivers/video/Kconfig,定位到1929行附近,加入如下代码:

#
# Backlight & LCD drivers configuration
#

menuconfig BACKLIGHT_LCD_SUPPORT
 bool "Backlight & LCD device support"
 help
   Enable this to be able to choose the drivers for controlling the
   backlight and the LCD panel on some platforms, for example on PDAs.

#在里加入MINI2440 的背光驱动配置
config BACKLIGHT_MINI2440
 tristate "Backlight support for mini2440 from FriendlyARM"
 depends on BACKLIGHT_LCD_SUPPORT

 help
 backlight driver for MINI2440 from FriendlyARM

#
# LCD
#
config LCD_CLASS_DEVICE

再打开 linux-2.6.32.2/drivers/video/Makefile,定位到文件末尾,根据配置定义加入驱动目标文件,如下:

obj-$(CONFIG_BACKLIGHT_ADP5520) += adp5520_bl.o
obj-$(CONFIG_BACKLIGHT_MINI2440) += mini2440_backlight.o

这样,我们就在内核中移植好了 mini2440 的背光驱动。

【4】在内核配置菜单中确认 "Backlight support for mini2440 from FriendlyARM",被选中。

在内核源代码根目录执行:
make menuconfig,依次选择如下子菜单:

Device Drivers --->
Graphics support --->
 [*] Backlight & LCD device support  --->

就可以找到该配置选项,如图

 

在这里,如果没有被选中,按空格选中我们刚刚加入的mini2440 配置项,然后退出时保存内核配置菜单,在命令行执行:make zImage

将生成arch/arm/boot/zImage,使用 supervivi 的“k”功能把它烧写到开发板中,可以在启动时看到如图所示的企鹅图像,这说明我们已经点亮了背光,只不过LCD 驱动还有些问题,下一节我们将会详细的介绍如何移植 LCD驱动。

你可能感兴趣的:(linux内核移植)