基于S3C2440的LCD驱动的设计.doc_第1页
基于S3C2440的LCD驱动的设计.doc_第2页
基于S3C2440的LCD驱动的设计.doc_第3页
基于S3C2440的LCD驱动的设计.doc_第4页
基于S3C2440的LCD驱动的设计.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于 S3C2440 的 LCD 驱动的设计 作 者:刘 立 指导老师:吴 全 玉开发环境.主机:VMWare-Fedora 9.开发板:Mini2440-64MB Nand, Kerne1:2.6.30.4.编译器:arm-linux-gcc-4.3.2摘要:根据人机交互对于LCD显示系统的需求,围绕S3C2440嵌入式处理器,研究LCD 控制器的设置,以及在Linux下的驱动的工作原理,并介绍在 Linux 系统下 FrameBuffer 设备驱动的结构组成及实现方法。关键字:S3C2440,LCD 驱动,FrameBufferLCD driver based on S3C2440Abstract: For the requirement of LCD display in human-machine interface,using S3C2440 embedded processor , introduce how to set these controller registers and the principle of drivers in Linux,and also described the structure of the FrameBuffer device and how to write a FrameBuffer driver。Keywords: S3C2440,LCD driver,FrameBuffer 注意:Linux-2.6.32.2内核已经支持S3C2440的LCD控制器驱动, 在此我们只讨沦TFT LCD(真彩屏)。1引言随着计算机的不断发展,各种 SOC 的功能越来越强大,嵌入式系统正以前所为有的发展 速度进入我们生活中的各个领域,从工业生产到我们所使用的消费电子产品,随处可见嵌入 式系统的身影。而 LCD 显示系统做为一个很好的人机交互的窗口,已经成为大多是嵌入式系 统不可或缺的组成部分。S3C2440 是韩国 Samsung 公司基于 ARM920T 内核而设计生产的嵌入式处理器,同时支持16/32 位指令集,具有低功耗,高性价比等特点,主要面向手持设备。本文就以 S3C2440 为 平台,应用其内部的 LCD 控制器,阐述 LCD 驱动程序的设计。2LCD 控制器介绍S3C2440 的 LCD 控制器负责产生液晶屏所需要的各种控制信号并负责把显示缓存中的数 据送到液晶屏以显示。LCD 控制器是可编程的,支持单色和彩色显示,支持多种显示器,支持多种水平像素和 竖直像素,数据总线带宽,接口时钟和刷新率。图 1 为 LCD 控制器逻辑框图,LCD 控制器有 REGBANK,LCDCDMA,VIDPRCS,TIMEGEN 和LPC3600 组成。其中 REGBAN有17个可编程的寄存器和25616个调色存储器用来配置 LCD 控制器。LCDCDMA 是一个专用的 DMA,他能够自动传送显存里的内容到 LCD 上去显示。VIDPRCS 接受 LCDCDMA 传送过来的数据然后从 VD23:0口发送到 LCD 驱动器并在此把他们转换成合适的格式。 TIMEGEN 由可编程逻辑组成,它针对不同的 LCD 驱动器提供不同的接口时序。 TIMEGEN 模块产生 VFRAME,VLINE,VCLK,VM 等等信号。而这些控制信号又与REGBANK寄存器组中的LCDCON 1/2/3/4/5的配置密切相关,通过不同的配置,TIMEGEN就能产生这些信号的不同形态,从而支持不同的LCD驱动器(即不同的STN/TFT屏)。 LCD控制器内部共有18个控制寄存器,在设备初始化的时候要针对不同的LCD显面板对这些寄存器进行相应设置,才能够正确的显小。 LCDCONI-LCDCON5主要用来设置与LCD而板相关的信息以及产生对于不同的显器而需要的不同的控制信号。 帧缓冲起始地址寄存器1-3 (LCDSADDRI-3)用于指;:视频缓冲区在系统存储器中的地址,包括起始地址和结束地址,以及虚拟屏幕的偏移量和虚拟屏的页宽度。 RGB查找表包括红色查找表寄存器(REDLUT)、绿色查找表寄存器(GREENLUT)和蓝色查找表寄存器(BLUELUT)。在这3个寄存器中,可以分别设定使用的8种红色、8种绿色、和吐种蓝色。抖动模式寄存器(Dithering Mode Register),实际上,红色、绿色和蓝色的差异,是通过时间抖动算法及帧率控制来实现的,因此还需要设置抖动模式寄存器。3 Linnx下的LCD驱动的实现LCD驱动动基础知识 LCD驱动中最关键的就是时钟频率(Clock frequency)的设置,时钟频率设置不对,LCD的显示就会闪,或者根本没有显示。一般LCD的Datasheet上会写有一个推荐的频率,比如mini2440所用的统宝3.5LCD,在它的数据手册第13页,有这样一个表格: 可以看到,这里推荐的时钟频率是6.39MHz,近似于6.4MHz,范围,是5M-6.8_SMHz 。S3C2440之LCD控制器与此相关的设置为CLKVAL,通过设置它,就可以在LCD接口的VCLK引脚上产生LCD所需要的时钟频率,那么CLKVAL和VCLK有何种关系呢?在2440手册中有这样一段描述:接下来,手册中提供了它们的数学关系公式:VCLK=HCLK/(CLKVAL+1)*2因此可以得出:VCLK=HCLK/(CLKVAL+1)*2那么HCLK是多少呢?我们的开发板运行于400Mhz,这个可以在bootloader的源代码头文件中看到,打开vboot/smdk2440.蓝色框内为所用的时钟频率设置参数,其中的148表示CLKDIVN寄存器中,FCLK HCLK PCLK的设置比例为1:4:8详见2440芯片手册P242 如图:结合2440数据手册242页的内容:可见,FCLK:HCLK:PCLK=1:4:8,因此得出HCLK=100Mhz,再根据上述公式得出CLKVAL应为:CLKVAL=HCLK/(VCLK*2)-1CLKVAL=100000000/(6400000*2)-1=6.8选择最接近的整数值7,并把它写入LCDCON1:17-8由此产生的VCLK频率实测为5.63Mhz左右,它也是在5-6.85Mhz之间的数值.新内核中的pixclock参数在以前较老的Linux内核中,对十LCD寄存器的设置都是这样直接填写CLKVAL的,但Linux-2.6.32.2内核却不再使用这样简单直观的方式,而是通过一个称为“pixclock”的参数进行调节,它的计算变的复杂和难以理解,我们不清楚Linux内核中关十2440部分的移植为何改变成这样的方式,这有可能是为了和X86体系中的设置保持一致的风格,下面我们根据实际的代码进行一些推导和说明,但推导结果和我们的实际设置是并不一致的,会有一些误差。在Framebuffe:驱动(linux-2.6.32.2/ drivers/video/s3c2410fb.c)中有这样一个函数: clkdiv=DIV_ ROUND_ UP(s3c2410fb_ calc_pixclk(fbi, var-pixclock), 2);这里的clkdiv就是我们上面提到的CLKVAL, 而DIV_ ROUND_ UP是一个宏定义,它位与include/linux/kernel.h文件中: #define DIV_ ROUND_ UP(n,d) (n)+(d)-1)/(d)这其实是一个数学概念:向上取整。下面是关与“向上取整”的一段说明:对于除数为“2”的本算法而言,我们可以简单的理解为“(n/2)+ 0.5”所对应的整数值,因此这里不可能避免的就出现了误差,也就是说n的数值是有一定范围的,这里的n就是s3c2410fb_calc_pixclk(fbi, var-pixclock),因此上面的公式可以改写为:clkdiv=s3c2410fb_calc_pixclk(fbi, var-pixclock)/2+0. 5而s3c2410fb_ calc_pixclk(fbi, var-pixclock)这个函数在linux-2.6.32.2/drivers/video/s3c2410fb.c中是这样定义的:因此得出:clkdiv=clk*pixclk/(10 12)/2+0. 5根据实际打印结果验证,此处的clk其实就是HCLK.而根据static void s3c2410fb_ activate_ var(struct fb_ info *info)函数中的描述,会得出这样一个关系:CLKVAL=clkdiv-1再结合从2440芯片手册得到的公式CLKVAL=HCLK/(VCLK*2)-1,因此可以得出大致这样的结果(“大致”可以理解为一定的误差范围): Pixclk=(HCLK-VLCK)x 10 12/HCLK VCLK 以我们所用的统宝屏为例: HCLK=100Mhz=100,000,000Hz VLCK=6.4Mhz=6400,OOOHz因此计算出:pixclk =146250单位是ps(picoseconds),这是我们实际设置的数值170000是有一定误差的。另外,在Linux内核文档中,还有另外一种计算pixclock的方式,见linux/Documentation/fb/framebuffer.txt,在此我们就不再详细介绍了,感兴趣的可以自己看下,或者到网上查下相关资料。如果你对这些参数比较“晕”,我们建议你按照我们已经移植验证好的参数进行设置,下面是具体的参考步骤。在内核中添加各种LCD类型的支持打开arch/arm/mach-s3c2440/mach-mini2440.c,先删除之前的LCD设备平台代码, 再把友善之臂已经移植好的代码加入,如下:然后打开drivers/video/Kconfig,在大概1929行加入以下配置信息: 这样,我们就完成了LCD驱动的移植,如果你需要加入其他型号的LCD驱动,也可以参照上面的方式复制即可,一般小尺寸的pixclock参数可以参考统宝3.5”的,超过640x480分辨率的参数可以参考8LCD的,特别要注意你使用的LCD的长宽也要修改。配置内核并下载到开发板测试现在,我们在命令行输入:make menuconfig进入内核配置:.编译后进入如下界面:依次按下面的子菜单项选择:会出现如图所示LCD型号配置选项:按空格或者回车键选择我们需要的LCD型号,然后退出保存内核配置。在命令行执行: #make zImage 将会生成arch/arm/boot/zImage,把它烧写到开发板中运行即可。参考资料:徐英慧、马忠梅、土磊. ARM9嵌入式系统设计一基于上S3c2W0与Linnx.北京航空航天大学出版社.2007年.第一版Samsnng Electronics Co.,Ltd二S3C2吐吐OA 32-B工T CMOS M工CROCONTROLLER USERSMANUAL Revision 1陈草、于盛林.基于ARM的LCD模块接曰设计及MiniGU工实现.仪器仪表学报. 2007年.28卷.钊郝英华、李晓光.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论