我们采用的这款液晶屏像素时钟频率6.25MHz,采用FPGA分频得到,该时钟同时接PPI_CLK引脚。行频408个像素时钟周期,场频59Hz,即259个行频周期,分别接Blackfin处理器的TMR1/PPI_FS1和TMR2/PPI_FS2口。
设计中,我们采用16bit的颜色显示方式,故分别将红色和绿色的最高位和最低位相连,即R0和R5、B0和B5。16根数据线分别与Blackfin处理器的PPI0到PPI15口相连。数据使能引脚接到FPGA上。硬件框图如图2所示:
2:硬件框图
3、基于硬件的液晶驱动同传统的DSP一样,直接基于Blackfin处理器液晶驱动。
我们采用DMA的方式通过PPI口传输颜色数据,将要显示的数据存放在SDRAM中的两块缓存区域中,采用乒乓模式,在向一块存储区中写数据时,从另一块存储区读。我们在SDRAM中设置一块非Cache的存储区,因为我们每个点用16bit数据表示,故两块缓存区域共320*(234+9+16)*16bit,9+16为每场信号丢失的行数。
3.1DMA的初始化
我们首先配置DMA的工作参数。这里DMA采用Descriptorlist(smallmodel),2D传输方式,每次传输一个字的数据。首先设置一个地址列表,用于装载两块缓存区域的首地址,这样DMA将从地址指示的空间读取数据传送到PPI口。设置DMA每场传输259行,每行传输320个字的数据。最后配置DMA0_CONGFIG,并使能DMA。主要设置有Descriptorlist,2DDMA的Innerloopcount,设置下次2DDMA的读取地址相对本地地址的增量,2DDMA的outerloopcount,配置DMA工作模式等。
3.2PPI的初始化
PPI有两种工作模式:ITU-R656和General-PurposePPI。因为我们只需将数据通过PPI口送出,故使用GP模式。设置PPI_FS1和PPI_FS2下降沿有效,一次传输16bit数据,外部触发,两个外部帧同步信号。主要需要设置的为:PPI参数配置,场频信号发出到开始数据传输的延迟和每行传输的数据个数。
3.3Timer的初始化
由于我们采用2个外部帧同步信号,故采用TMR1/PPI_FS1作为行频信号(HSYNC),TMR2/PPI_FS2作为场频信号(VSYNC)。为了调试程序需要,我们配置定时器为仿真时定时器持续工作。因为只需送出数据给液晶,故配置其为PWM_OUT模式,我们的定时器使用PPI_CLK,故仍需设置其为PWM_OUT时钟,计数到周期结束等。Timer1和Timer2的周期和脉宽按液晶硬件手册给出设置。
3.4Frambuffer的初始化
这样,液晶的相关配置已基本完成,我们在屏幕上写数据即为在两块数据缓冲区中写数据。但应注意,在每次场频信号到来之后,有19行数据不会显示在屏幕上,之后234行为屏幕显示部分,最后又有6行数据为多余需丢掉的数据。因此,我们将显示的数据颜色信息要全部写在中间234行。初始化Framebuffer时应先写入要丢掉的19行内容,再写入234行的初始化颜色数据,最后还须初始化末尾6行丢掉的数据。
4、基于uClinux的液晶驱动嵌入式系统是以应用为中心,以计算机技术为基础、软硬件均可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。uCLinux主要是针对目标处理器没有存储管理单元MMU(MemoryManagementUnit)的嵌入式系统而设计的,它是一种优秀的嵌入式Linux版本,已经被成功地移植到了很多平台上。对开发者来说,AD的Blackfin处理器和uClinux的结合很有吸引力。
在blackfin.uclinux.org网站,提供对在Blackfin上嵌入uclinux的支持,本设计采用了其嵌入式软件支持。选择了uClinux-dist-R06R2-RC2.tar.bz2作为系统使用uClinux的源代码,成功移植了uClinux嵌入式平台。我们用源文件根目录下uClinux-dist/linux2.6.x/driver/video/bf537-lq035.c作为模板,进行液晶驱动的修改。
4.1程序文件修改
以bf537-lq035.c为模板进行修改为bf533-fg0506.c,由于源程序是按BF537开发板来编写,我们重点要修改的是信号使用端口,和液晶设置部分。因为我们的液晶的背光是有逆变器调节,故将屏蔽原程序文件中关于背光亮度调节及相关选项。关键修改点:液晶的行场频、时钟、屏幕大小,定时器的设置(Timer1.Timer2),各种寄存器的设置,以及写数据的DMA、PPI程序部分。液晶显示数据部分:场频信号到来之后需丢掉的行数、每场信号需丢掉的总行数、场频PPI_CLK时钟部分:配置PPI、Hdp+Hpw此段时间内PPI不传数据等。配置TIMER:使能时钟、设置Timer的参数。设置DMA的参数,设置屏幕尺寸色彩等信息,初始化Framebuffer等。
4.2Makefile的改写
此部分是为在编译内核时能够将新编写的液晶驱动编译为目标文件。在uClinux-dist/linux2.6.x/driver/video/Makefile加入编译规则。
4.3修改menu"Graphicssupport"此部分使编译uClinux内核时,可以选择是否编入LCD驱动。在uClinux-dist/linux2.6.x/driver/video/Kconfig文件里添加编译信息。这样,使用makexconfig编译系统内核时,就可以在自定义内核设置的DeviceDriver下,Graphicsupport中选择这个选项。
5、结论
经调试、修改,最终两种方案的液晶均可正确稳定显示所需数据,可以满足本设计预期的数据显示需求。同时由于TFT液晶的可视角度较宽,16位色彩表现丰富,设计得液晶显示得到了理想的效果,并对嵌入式设备的屏幕显示技术有一定的意义。
本文作者创新点:通过对Blackfin嵌入式处理器的内部资源的合理利用,将其和嵌入式系统uClinux的相结合,应用于TFTLCD的驱动设计上。相对基于硬件的驱动设计,基于嵌入式系统uClinux的驱动设计有功能性强、可靠性高、成本低、体积小、功耗低等优势,更具有实际的推广应用价值。