R0接地。LCD的显示效果与功耗在很大程度上决定于背光源,因而需对其进行控制。地址线SA-A[20-22]作为译码输入,基地址为Ox0800_0000 的片选信号nCS2选中74LCXl38译码器,让74LCXl38的输出引脚Y0产生脉冲上升沿,驱动LCX374锁存来自数据总线的低8位数据,只要在数据总线上输出Ox80,则可通过Q7使LCD-BACK-0N/0FF输出高电平,控制LCD背光源打开。
5 软件设计
软件主要由嵌入式操作系统与应用软件两部分构成,在应用软件中完成对LCD的驱动。本文采用Linux-2.4.19作为软件平台,程序的交叉编译使用arm-linux-gcc,其中Linux-2.4.19-rmk6-pxal-cerf1内核能稳定地支持PXA270处理器,因Linux的源代码开放,将其下载后只需根据自己的硬件配置对内核中的现有代码与驱动进行裁剪、修改、移植或编写部分驱动。PXA270对LCD显示屏的驱动分为两个方面:一是对LCD控制器及相关部件的初始化,包括创建Frame Buffer、寄存器组与DMA通道的设置等;二是对Frame Buffer的读、写等操作[3、4、5]。
5.1 定义显示缓冲区
Linux下的LCD驱动属于字符设备驱动范围,PXA270处理器与LCD间数据传输也非常频繁,因而在内存中定义一个“显示缓冲区”Frame Buffer,形成一个虚拟的显示器,具体位置在Linux\drivers\video下。Frame Buffer的大小=每像素位数*每屏行数*(每行像素+每行需插入的空像素)/8。本系统中LCD分辨率为640*480,16位/像素,单屏幕模式,Frame Buffer理论值为614400个字节,实际设置640KB。
5.2 初始化函数的编写
在linux的/drivers/video/pxafb.c文件中,通过fb_options()和pxafb_setup()函数来获取内核的启动参数并返回pxafb_driver结构,该结构中pxafb_probe是一个函数指针,指向pxafb_probe()函数,在该函数中完成对 LCD控制器和Frame Buffer等的整个初始化过程,初始化函数部分代码如下:
struct pxafb_info * fbi; //数据结构pxafb_info,主要用于Frame Buffer设备及其操作驱动框架的参数定义,如Frame Buffer的物理和虚拟地址、DMA和一些LCD控制寄存器描述参数等
struct pxafb_mach_info * inf; //数据结构pxafb_mach_info,定义运行机器的一些参数,如pixclock、xres、yres等
pxafb_backlight_power = inf->pxafb_backlight_power; //LCD背光
pxafb_lcd_power = inf->pxafb_lcd_power; //LCD电源
fbi = pxafb_init_fbinfo(dev); //完成数据结构pxafb_info和pxafb_mach_info的初始化,设置使用的字体、显示屏的规格等LCD硬件参数并保存到其中
ret = pxafb_map_video_memory(fbi); //根据LCD硬件参数在内存创建显示缓冲区
pxa_set_cken(CKEN16_LCD,1); //时钟使能寄存器CKEN可使能许多外设单元的时钟,其bit16置1使能LCD单元时钟
pxafb_check_var(fbi->fb.var,fbi->fb); //为控制设备驱动的高层提供一个驱动Frame Buffer的界面
pxafb_set_par(fbi->fb); //配置用户定义的显示控制台,并进一步调用pxafb_activate_var()函数,将fb_var_screeninfo数据结构中的参数写到 PXA270 LCD控制器,来生成LCCR0~LCCR3等多个相关寄存器映像,从而达到设置LCDC寄存器的目的
ret = register_framebuffer(fbi->fb); //注册Frame Buffer使其与控制台设备驱动的高层连接
5.3 显示缓冲区的访问操作
在用户程序中对显示缓冲区设备/dev/fb的访问是通过调用文件层的操作函数来实现。首先用Linux\drivers\video \fbmem.c中的fb_open()打开代表Frame Buffer的/dev/fb设备文件;然后通过fb_ioctl()操作获取LCD显示屏的分辨率屏长、屏宽和每个像素点的位数bpp值等,进而计算得到Frame Buffer的大小并通过fb_mmap()将其映射到用户空间;最后即可通过fb_read()、fb_write()直接对Frame Buffer进行读、写操作,显示相应图像。
驱动程序经编译和连接,定位后加载到kernel,烧到目标板,实现PXA270对TFT-LCD的显示驱动。
6 结论
本文作者创新点:提出了一种基于PXA270和Linux-2.4.19内核的TFT-LCD嵌入式驱动方案,通过分析TFT-LCD与 PXA270内嵌的LCD控制器的工作原理与时序,设计了TFT-LCD的驱动硬件电路和相应软件,实现了PXA270 对LCD的驱动,经在目标板上运行效果显示,各个信号的时序完全满足TFT-LCD的要求。本设计应用于工控领域作为显示输出设备,具有硬件紧凑简单、软件可裁剪和移植、便携性、可视化等优点。
参考文献:
[1] 宁志刚,汪仁煌. 基于PXA270的PDA交通管理系统在Linux环境下的实现[J].电子技术应用,2004,(4):15-17
[2] Intel Corporation. Intel? PXA270 Processor Developer’s Manual[R].2004.1
[3]
|