引言
現(xiàn)在大部分的便攜式手持終端產(chǎn)品,,如移動(dòng)電話、導(dǎo)航系統(tǒng)等,,都擁有一個(gè)小型LCD顯示屏,,這使LCD驅(qū)動(dòng)電路的設(shè)計(jì)成為手持終端設(shè)計(jì)的重要組成部分。
本文以應(yīng)用于特殊行業(yè)的手持終端為例,,敘述LCD驅(qū)動(dòng)電路的設(shè)計(jì)實(shí)現(xiàn)方法,。
硬件電路設(shè)計(jì)
硬件電路結(jié)構(gòu)
本設(shè)計(jì)中手持終端CPU采用三星公司ARM920T內(nèi)核處理器S3C2440A,,其LCD控制器支持STN LCD和TFT LCD,實(shí)際使用的LCD為LTS350Q1-PE1_PI,,屬于TFT LCD,。
電路框圖如圖1所示。
驅(qū)動(dòng)電路主要包括三部分:第一部分是LCD驅(qū)動(dòng),,采用MAX1779芯片,;第二部分是LED背光驅(qū)動(dòng),采用MP1521芯片,;第三部分是VCOM信號驅(qū)動(dòng),采用LM8261芯片,。這里主要敘述LCD驅(qū)動(dòng)和背光電路的實(shí)現(xiàn),。
LCD驅(qū)動(dòng)電路
由于LCD內(nèi)集成有數(shù)字電路和模擬電路,需要外部提供數(shù)字電壓DVDD和模擬電壓AVDD,。另外,,為了完成數(shù)據(jù)掃描,需要TFT輪流開啟/關(guān)閉,。當(dāng)TFT開啟時(shí),,數(shù)據(jù)通過源極驅(qū)動(dòng)器加載到顯示電極,顯示電極和公共電極間的電壓差再作用于液晶實(shí)現(xiàn)顯示,,因此需要控制TFT的開啟電壓VGH,、關(guān)閉電壓VGL,以及加到公共電極上的電壓VCOM,。
MAX1779芯片能產(chǎn)生LCD需要的模擬電壓AVDD,、柵極開啟電壓VGH及柵極關(guān)斷電壓VGL。芯片內(nèi)部集成有3個(gè)DC-DC轉(zhuǎn)換器,,其中包括兩個(gè)充電泵和一個(gè)升壓轉(zhuǎn)換器,,可以為小型TFT液晶屏提供高效的調(diào)節(jié)電壓。LCD驅(qū)動(dòng)電路如圖2所示,。
這里,,一個(gè)充電泵產(chǎn)生正電壓,作為TFT的開啟電壓VGH,;另外一個(gè)充電泵產(chǎn)生負(fù)電壓,,作為TFT的關(guān)閉電壓VGL。此外,,芯片還可以產(chǎn)生-5V電壓輸出,,設(shè)計(jì)時(shí)利用-5V輸出電壓協(xié)助LM8261產(chǎn)生VCOM信號。
LED背光驅(qū)動(dòng)電路
LCD作為一種被動(dòng)顯示器件本身并不能發(fā)光,,必須要有背光模塊提供光源,。白光LED由于復(fù)雜程度較低、成本低且尺寸較小,被普遍用做嵌入式手持設(shè)備的LCD背光源,。本文中背光驅(qū)動(dòng)電路如圖3所示,。
驅(qū)動(dòng)芯片采用MP1521,該芯片有3組獨(dú)立的電流反饋回路,,可同時(shí)驅(qū)動(dòng)3組并聯(lián)的LED?,F(xiàn)將3組反饋回路FB1、FB2,、FB3短接,,可以提供更大的驅(qū)動(dòng)電流,用于驅(qū)動(dòng)6個(gè)白色串聯(lián)LED背光燈,。
MP1521支持兩種方式控制LED亮度,,一是將BRT連接在范圍為0.26V~1.2V的電壓上,另外一種是通過PWM信號控制LED亮度,。設(shè)計(jì)時(shí),,將其連接在PWM端口,使用PWM控制LCD背光亮度,。
S3C2440A有5個(gè)16bit定時(shí)器,,其中定時(shí)器0、1,、2,、3有PWM功能。將BRT連接到能夠輸出PWM信號的CPU的TOUT0/GPB0引腳,,利用定時(shí)器0產(chǎn)生的PWM信號控制LCD亮度,。通過改變PWM信號的占空比調(diào)整LED亮度,而通過設(shè)置CPU內(nèi)部寄存器的值可以改變PWM的占空比,。
為了節(jié)省功耗,,電路的使能(EN)端接CPU的LCD_PWREN管腳,高電平時(shí)背光電路工作,;低電平時(shí)背光電路不工作,。同時(shí),可將EN端通過電阻直接連接到3.3V電源上以便調(diào)試時(shí)使用,。
LCD_BCK+和LCD_BCK-分別連接到串聯(lián)LED的正負(fù)兩端,。
軟件設(shè)計(jì)
手持終端的嵌入式Linux所采用的內(nèi)核版本是kernel-2.4.18。 為了使LCD能正常顯示,,還需要在Linux系統(tǒng)下開發(fā)LCD的驅(qū)動(dòng)程序,。
字符設(shè)備的驅(qū)動(dòng)程序
字符設(shè)備是Linux系統(tǒng)中最簡單的設(shè)備,可以像文件一樣訪問,。當(dāng)字符設(shè)備初始化的時(shí)候,,其驅(qū)動(dòng)程序向Linux內(nèi)核登記,,在chrdevs向量表中增加一個(gè)device_struct數(shù)據(jù)結(jié)構(gòu)條目。這個(gè)設(shè)備的主設(shè)備標(biāo)識符用作這個(gè)向量表的索引,。一個(gè)設(shè)備的主設(shè)備標(biāo)識符是固定的,。chrdevs向量表中的device_struct數(shù)據(jù)結(jié)構(gòu)包括一個(gè)登記設(shè)備驅(qū)動(dòng)程序名稱的指針和一個(gè)指向一組文件操作的指針。這組文件操作本身位于這個(gè)設(shè)備的字符設(shè)備驅(qū)動(dòng)程序中,,并處理一些特定任務(wù),。
Linux下的幀緩沖設(shè)備
Linux操作系統(tǒng)為LCD等顯示設(shè)備提供了幀緩沖區(qū)。幀緩沖區(qū)(Framebuffer)是Linux為顯示設(shè)備提供的一個(gè)接口,,是把顯存抽象化后的一種設(shè)備,。為LCD編寫驅(qū)動(dòng)程序的實(shí)質(zhì)就是為幀緩沖區(qū)編寫驅(qū)動(dòng)程序。
由于幀緩沖驅(qū)動(dòng)程序的實(shí)現(xiàn)在許多論文中有詳細(xì)敘述,,這里不再贅述,,本文重點(diǎn)討論背光設(shè)備驅(qū)動(dòng)程序的實(shí)現(xiàn)。
LCD背光設(shè)備的驅(qū)動(dòng)程序
LCD背光設(shè)備可看作字符設(shè)備,,可以按照字符設(shè)備驅(qū)動(dòng)程序的編寫方法進(jìn)行實(shí)現(xiàn)。在驅(qū)動(dòng)程序里實(shí)現(xiàn)了LCD各種控制功能,。驅(qū)動(dòng)程序主要包括lcdctrl.c和lcdctrl_smdk2440.c,。其中l(wèi)cdctrl.c屏蔽了具體的硬件,它通過鉤子函數(shù)調(diào)用lcdctrl_smdk2440.c相關(guān)函數(shù)完成各種具體操作,。為了形象地說明兩個(gè)文件之間的關(guān)系,,這里以LCD亮度調(diào)節(jié)過程為例,說明函數(shù)的調(diào)用過程,,如圖4所示,。
lcdctrl.c中的lcdctrl_ioctl函數(shù)需根據(jù)上層應(yīng)用程序的不同參數(shù)實(shí)現(xiàn)不同的功能,這些控制LCD的功能包括亮度調(diào)整,、對比度調(diào)整,、關(guān)閉LCD、開啟LCD等,。
下面分別敘述兩個(gè)文件的實(shí)現(xiàn),。
lcdctrl.c文件
1、定義file_operation結(jié)構(gòu)體
static struct file_operations lcdctrl_fops = {
ioctl: lcdctrl_ioctl,
open: lcdctrl_open,
release: lcdctrl_close };
LCD的各種控制功能在lcdctrl_ioctl函數(shù)中實(shí)現(xiàn),,lcdctrl_open和lcdctrl_close不實(shí)現(xiàn)具體功能,,直接返回0值。
2,、lcdctrl_ioctl函數(shù)
lcdctrl_ioctl函數(shù)需根據(jù)上層應(yīng)用程序的不同參數(shù)實(shí)現(xiàn)不同的功能,,這里主要說明亮度調(diào)節(jié)功能的實(shí)現(xiàn)。部分代碼如下:
static int lcdctrl_ioctl(struct inode * inode, struct file *filp, unsigned int cmd , unsigned long arg)
{……
switch(cmd)
{ ……
case
_LCDCTRL_IOCTL_BRIGHTNESS:
if ((arg >=0) && (arg <= 100))
ret = lcdctrl_set_brightness(arg);
break; //調(diào)節(jié)LCD背光亮度
……
break;}
return ret;}
當(dāng)應(yīng)用程序傳遞的命令參數(shù)為LCDCTRL_IOCTL_BRIGHTNESS時(shí),,lcdctrl_ioctl調(diào)用lcdctrl_set_ brightness具體實(shí)現(xiàn)亮度調(diào)節(jié)功能,。
3,、lcdctrl_set_brightness函數(shù)
lcdctrl_set_brightness具體實(shí)現(xiàn)亮度調(diào)節(jié)功能。主要代碼如下:
int lcdctrl_set_brightness(int b)
{
brightness = b;
return lcd_device->set_brightness(b);
}
可以看出,,此函數(shù)調(diào)用lcd_ device->set_brightness函數(shù),,而lcd_device在初始化時(shí)已被指向與具體的硬件相關(guān)的函數(shù)。
4,、初始化函數(shù)
初始化函數(shù)主要完成初始信息的設(shè)置和設(shè)備的注冊,。
lcdctrl.c_smdk2440文件
1、lcdctrl_device結(jié)構(gòu)體
lcdctrl_device結(jié)構(gòu)體定義了具體操作LCD的各函數(shù)指針,,包括LCD初始化函數(shù),,LCD開啟和關(guān)閉函數(shù),亮度,、對比度等設(shè)置函數(shù),。其中LCD關(guān)閉函數(shù)的本質(zhì)就是將LCD背光亮度設(shè)置為0。
static struct lcdctrl_device smdk2440_dev = {
init: smdk2440_lcdctrl_init,
enable: smdk2440_lcdctrl_enable,
disable: smdk2440_lcdctrl_disable,
set_intensity: smdk2440_lcdctrl_set_intensity,
set_brightness: smdk2440_lcdctrl_set_brightness,
set_contrast: smdk2440_lcdctrl_set_contrast};
2,、smdk2440_lcdctrl_set_brightnes函數(shù)
這里只敘述亮度設(shè)置函數(shù)的實(shí)現(xiàn),。
static int smdk2440_lcdctrl_set_brightness( int b)
{ ……
TCNTB0 = 100;
TCMPB0 = b*100/100;
//設(shè)置TCMPB0寄存器的值
TCON = (TCON & ~(0xf)) | ( TCON_0_AUTO | TCON_0_MAN | COUNT_0_OFF);
TCON = (TCON & ~(0xf)) | 0;
TCON=(TCON & ~(0xf)) | (TCON_0_AUTO | COUNT_0_ON);}
函數(shù)中的語句大部分是給與定時(shí)器相關(guān)的寄存器寫值。其中b就是上層函數(shù)傳遞下來的bright值,,從程序中可以看到,,調(diào)節(jié)亮度本質(zhì)上是通過TCMPB0寄存器寫入與bright相關(guān)的值,控制PWM占空比實(shí)現(xiàn)亮度調(diào)節(jié)功能,。
3,、LCDctrl_device_get_ops函數(shù)
用于上層獲取具體設(shè)備的鉤子函數(shù)。代碼如下:
struct lcdctrl_device *lcdctrl_device_get_ops(void)
{return &smdk2440_dev;}
此函數(shù)被lcdctrl.c初始化時(shí)調(diào)用,,將設(shè)備指向smdk2440_dev,。
至此,驅(qū)動(dòng)程序設(shè)計(jì)完成,,為了更好地實(shí)現(xiàn)LCD的管理,,需要在上層的Qtopia應(yīng)用程序中提供人機(jī)操作的界面。
Qtopia應(yīng)用程序
Qtopia應(yīng)用程序提供人機(jī)操作界面并調(diào)用底層驅(qū)動(dòng)程序完成LCD控制功能,,這里,,仍然以亮度調(diào)節(jié)為例敘述應(yīng)用程序工作過程。
主要完成功能:
1,、應(yīng)用程序完成人機(jī)操作的界面,,為使用人員提供友好界面;
2,、讀取亮度值,,并將其存入變量bright中;
3,、打開設(shè)備文件:fd=open("/dev/devname",O_RDONLY),;
4,、調(diào)用底層的驅(qū)動(dòng)程序,通過底層的驅(qū)動(dòng)程序?qū)CD背光亮度調(diào)整為指定值,。
ioctl(fd, _BACKLIGHT_ IOCTL_BRIGHT, bright),。
ioctl函數(shù)調(diào)用驅(qū)動(dòng)程序完成亮度的調(diào)節(jié)。
結(jié)語
經(jīng)測試,,設(shè)計(jì)完成的LCD能很好地完成圖形的顯示,,終端電源管理界面中包含了LCD亮度調(diào)節(jié)功能。
LCD驅(qū)動(dòng)電路的設(shè)計(jì)是手持終端產(chǎn)品的重要組成部分,。本文設(shè)計(jì)并實(shí)現(xiàn)了基于S3C2440A的手持終端LCD驅(qū)動(dòng)電路,。通過圖形管理界面能夠方便地管理LCD,達(dá)到節(jié)約能量,、延長手持終端工作時(shí)間的目的,。
參考文獻(xiàn)
1. 楊水清, 張劍, 施云飛. ARM嵌入式Linux系統(tǒng)開發(fā)技術(shù)詳解,電子工業(yè)出版社,,2008/11
2. 常贊杰, 張位勇. 基于Framebuffer的LCD驅(qū)動(dòng)程序設(shè)計(jì). 辦公自動(dòng)化,,2008/12