linux2.6.32.2 mini2440平臺移植--LCD 背光驅動

1.3.1 LCD 背光控制原理

到目前爲止,我們一直都在命令行下移植,查看結果,在 mini2440/micro2440 開發板中,LCD 背光是通過 CPU  LCD_PWR 引腳來控制的,從原理圖中可以看出,它對應於 GPG4 

 LCD_PWR  輸出爲高電平"1"時,將打開背光;當輸出爲低電平"0"時,將關閉背光(注意:這裏只是打開和關閉背光,而並沒有背光亮度的調節作用)。

 

1.3.2  在內核中添加背光驅動程序

 

現在,我們需要增加一個簡單的背光驅動,以便能夠通過軟件便可簡單的控制背光的開關。我們要達到的目的是:在命令終端通過向背光設備發送偶數比如"0"便可關閉背光,發送奇數比如"1"便可打開背光,這樣使用起來就方便多了,而不需要專門的應用程序控制它,提示:LCD 背光設備文件:/dev/backlight

在命令行種輸入:echo 0 > /dev/backlight 可以關閉 LCD 背光。

在命令行種輸入:echo 1 > /dev/backlight 可以打開 LCD 背光。

爲了實現這點,我們在 linux-2.6.32.2/drivers/video 目錄增加一個 mini2440_backlight.c

文件,內容如下:

//以下頭文件可能並不是每一個都必須的,但多餘的並不會影響驅動程序的內容

#include <linux/errno.h>

#include <linux/kernel.h>

#include <linux/module.h>

#include <linux/slab.h>

#include <linux/input.h>

#include <linux/init.h>

#include <linux/serio.h>

#include <linux/delay.h>

#include <linux/clk.h>

#include <linux/miscdevice.h>

#include <linux/gpio.h>

 

#include <asm/io.h>

#include <asm/irq.h>

#include <asm/uaccess.h>

#include <mach/regs-clock.h>

#include <plat/regs-timer.h>

 

#include <mach/regs-gpio.h>

#include <linux/cdev.h>

 

#undef DEBUG

//#define DEBUG

#ifdef DEBUG

 

 

#define DPRINTK(x...) {printk(__FUNCTION__"(%d): ",__LINE__);printk(##x);}

#else

#define DPRINTK(x...) (void)(0)

#endif

 

//定義背光驅動的名稱爲 backligh,將會出現在/dev/backlight

#define DEVICE_NAME      "backlight"

 

//定義背光變量 bl_state,以記錄背光的開關狀態

static unsigned int bl_state;

 

//設置背光開關的函數,主要是翻轉背光變量 bl_state

static inline void set_bl(int state)

{

bl_state = !!state; //翻轉 bl_state 變量

s3c2410_gpio_setpin(S3C2410_GPG(4), bl_state); //把結果寫入背光所用的寄存器 GPG4

}

 

//獲取背光狀態

static inline unsigned int get_bl(void)

{

return bl_state;

}

 

//從應用程序讀取參數,並傳遞到內核中

static ssize_t dev_write(struct file *file, const char *buffer, size_t count, loff_t * ppos)

{

unsigned char ch;

int ret;

if (count == 0) {

return count;

}

//使用 copy_from_user 函數從用戶層/應用層讀取參數

ret = copy_from_user(&ch, buffer, sizeof ch) ? -EFAULT : 0;

if (ret) {

return ret;

}

 

ch &= 0x01; //判斷奇數還是偶數

 

 

set_bl(ch); //設置背光狀態

 

return count;

}

 

//把內核參數傳遞給用戶層/應用層的讀函數

static ssize_t dev_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)

{

int ret;

unsigned char str[] = {'0', '1' };

 

if (count == 0) {

return 0;

}

 

//使用 copy_to_user 函數把內核參數傳遞到用戶層/應用層

ret = copy_to_user(buffer, str + get_bl(), sizeof(unsigned char) ) ? -EFAULT : 0;

if (ret) {

return ret;

}

 

return sizeof(unsigned char);

}

 

//設備操作集

static struct file_operations dev_fops = {

owner:     THIS_MODULE,

read:dev_read,

write:      dev_write,

};

 

static struct miscdevice misc = {

.minor = MISC_DYNAMIC_MINOR,

.name = DEVICE_NAME,

.fops = &dev_fops,

};

 

//設備初始化,內核啓動時就有效

static int __init dev_init(void)

 

 

{

int ret;

 

ret = misc_register(&misc);

 

printk (DEVICE_NAME"\tinitialized\n");

 

//初始化背光所用的端口 GPG4 爲輸出

s3c2410_gpio_cfgpin(S3C2410_GPG(4), S3C2410_GPIO_OUTPUT);

//啓動內核時打開背光

set_bl(1);

return ret;

}

static void __exit dev_exit(void)

{

misc_deregister(&misc);

}

 

module_init(dev_init); //註冊背光驅動模塊

module_exit(dev_exit); //卸載背光驅動模塊

MODULE_LICENSE("GPL");

MODULE_AUTHOR("FriendlyARM Inc.");

 

然後把背光配置選項加入內核配置菜單,打開 linux-2.6.32.2/drivers/video/Kconfig,在如下位置加入:

config FB_S3C2410_DEBUG

bool "S3C2410 lcd debug messages"

depends on FB_S3C2410

help

Turn on debugging messages. Note that you can set/unset at run time

through sysfs

 

//在里加入 MINI2440 的背光驅動配置

config BACKLIGHT_MINI2440

tristate "Backlight support for mini2440 from FriendlyARM"

depends on MACH_MINI2440 && FB_S3C2410

help

backlight driver for MINI2440 from FriendlyARM

 

config FB_SM501

tristate "Silicon Motion SM501 framebuffer support"

depends on FB && MFD_SM501

select FB_CFB_FILLRECT

select FB_CFB_COPYAREA

select FB_CFB_IMAGEBLIT

再打開 linux-2.6.32.2/drivers/video/Makefile,根據配置定義加入驅動目標文件,如下:

# the test framebuffer is last

obj-$(CONFIG_FB_VIRTUAL)

 

#video output switch sysfs driver

+= vfb.o

obj-$(CONFIG_VIDEO_OUTPUT_CONTROL) += output.o

 

obj-$(CONFIG_BACKLIGHT_MINI2440) += mini2440_backlight.o

這樣,我們就在內核中移植好了 mini2440 的背光驅動,在內核源代碼根目錄執行:

make menuconfig,依次選擇如下子菜單:

Device Drivers    --->

Graphics support    --->

<*> Support for frame buffer devices    --->

就可以找到該配置選項,在這裏,按空格選中我們剛剛加入的 mini2440 配置項,然後退出保存內核配置菜單,在命令行執行:make zImage

將生成 arch/arm/boot/zImage,使用 supervivi "k"功能把它燒寫到開發板中,可以在啓動時看到如圖所示的企鵝圖像,這說明我們已經點亮了背光,只不過LCD 驅動還有些問題,下一節我們將會詳細的介紹如何移植 LCD 驅動。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章