概述
S3C2440A 中的 LCD 控制器由从位于系统存储器的视频缓冲区到外部 LCD 驱动器的转移 LCD 图像数据逻辑组成。LCD 控制器支持单色LCD的单色、2位每像素(4 阶灰度)或 4 位每像素(16 阶灰度)模式,通过使用基于时间的抖动算法和帧频控制(FRC)方法,其可以连接到8 位每像素(256 色)的彩色LCD面板和连接到12位每像素(4096色)的STN LCD。
显示器上数据的组织格式
对于屏幕上的一整幅图象被称为一帧,每帧由多行组成,每行由多个像素组成,每个像素的颜色使用若干位的数据来表示。对于单色显示器,每个像素使用1位来表示,称为1BPP;对于256色显示器,每个像素使用8位来表示,称为8BPP。
显示器从屏幕的左上方开始,一行一行地取得每个像素的数据并显示出来,当显示到一行的最右边时,跳到下一行的最左边开始显示下一行;当显示完所有行后,跳到左上方开始下一帧。显示器沿着“Z”字行的路线进行扫描,使用HSYNC、VSYNC信号来控制扫描路线的跳转,HSYNC表示“是跳到最左边的时候了”,VSYNC表示“是跳到最上边的时候了”。在工作中的显示器可以在四周看见黑色的边框。
上方的黑框是因为当发出VSYNC信号时,需要经过若干行之后第一行数据才有效;
下方的黑框是因为显示完所有行的数据时,显示器还没扫描到最下边(VSYNC信号还没有发出),这时数据已经无效;
左边的黑框是因为当发出HSYNC信号时,需要经过若干像素之后第一列数据才有效;
右边的黑框是因为显示完一行的数据时,显示器还没扫描到最右边(HSYNC信号还没有发出),这时数据已经无效。
显示器只会依据VSYNC、HSYNC信号来取得、显示数据,并不理会该数据是否有效,何时发出有效数据由显卡决定。
VSYNC信号出现的频率表示一秒钟内能显示多少帧图象,称为垂直频率或场频率,这就是我们常说的“显示器的频率”;HSYNC信号出现的频率称为水平频率。
下面看2个例子首先是tq2440板子原装的-----在做这个裸机程序之前我的mini2440板子坏了,接上openjtag之后无法halt开发板。经过推断是板子的jtag接口出问题了,又找了块tq2440。同样是s3c2440处理器,并且好多周边配件和mini2440控制方式一样。 这里不多说了,以后每一个元件操作都把tq2440和mini2440的做下对比。
这个板子是参照赵老师的
http://blog.csdn.net/zhaocj/article/details/5397180 博文代码弄出来的,整个代码拷贝进去未做任何修改可以顺利运行! 由于赵老师未在博文中说明是什么型号的lcd,这里猜测应该也是奇美3.5寸屏 NMA35QV65-B2-K01。 关于这个lcd 可见如下文档:
https://www.dropbox.com/s/ja94yhdpa0be7is/NMA35QV65-B2-K01%28v0.1%29.pdf
在这个文档里面根本没有给出操作lcd的一些必要参数比如水平垂直的前后肩等数据。
在文档里面到时提到了HX8238-A ,这里应该是个控制器驱动芯片。
在这里面可看到需要的数据。
由上面3幅图可以知道
HSPW + 1 + HBPD + 1 = tHBP = 68也就是HSYNC脉冲与数据有效之间的间隔。
HFPD + 1 = tHFP
VSPW + 1 + VBPD + 1 = tVBP = 18 也就是VSYNC脉冲与数据有效之间的间隔。
VFPD + 1 = tVFP
关于这个lcd 就介绍到这里吧上面的博文里面给出了详细的配置方式。
另外再实验下mini2440板子上的lcd,上面标有 X35 按照官网的说法是 索尼3.5"LCD,ACX502BMU这个可以在友善官网下载下来。对于一个lcd首先要确定CLKVAL_TFT,手册上VCLK给出的是5.9 根据公式VCLK = HCLK/[(CLKVAL+1)x2] 可算出这个数值是8.
然后就是前后肩等值了
表中的VBLK结合以下时序图可以知道,它实际上是(VSPW+1)+ (VBPD+1)+ (VFPD+1) 的总和。
表中的HBLK结合以下时序图可以知道,它实际上是(HSPW+1)+ (HBPD+1)+ (HFPD+1) 的总和。
这个屏的PDF手册没有分别给出VSPW,VBPD,VFPD , HSPW,HBPD,HFPD。我们知道的只是水平信号总和32和垂直信号16,那么我们先要任意给一组值,满足和分别32和16就可以了,这一组值不是唯一的。如果调试中出现黑边,则根据黑边情况把以上的值作微小的调整(和保持不变):
上边黑框把VFPD调小(有时候VBPD也要同时调大才可以);
下边黑框把VFPD调大(有时候VBPD也要同时调小才可以);
左边黑框把HFPD调小(有时候HBPD也要同时调大才可以);
右边黑框把HFPD调大(有时候HBPD也要同时调小才可以)。
下面给出一组数据:
//垂直同步信号的脉宽、后肩和前肩 #define VSPW 0 #define VBPD 6 #define VFPD 7 //水平同步信号的脉宽、后肩和前肩 #define HSPW 5 #define HBPD 0 #define HFPD 24
分辨率要相符,在tq板子的lcd 宽320,高240。 在mini2440板子上宽240高320。由于两种lcd 模式不一样,为了做到兼容。能在屏幕正中心显示圆圈,这里修改了以下 源码!
//画实心圆,颜色为c。圆心在屏幕中心,半径为80个像素 void Draw_Circular(U32 c) { #define HF_WIDTH (LCD_WIDTH/2) #define HF_HEIGHT (LCD_HEIGHT/2) int x,y; int tempX,tempY; int radius = 80; int SquareOfR = radius*radius; for( y = 0 ; y < LCD_HEIGHT ; y++ ) { for( x = 0 ; x < LCD_WIDTH ; x++ ) { if(y <= HF_HEIGHT && x<= HF_WIDTH) { tempY=HF_HEIGHT-y; tempX=HF_WIDTH-x; } else if(y<= HF_HEIGHT && x>= HF_WIDTH) { tempY=HF_HEIGHT-y; tempX=x-HF_WIDTH; } else if(y>= HF_HEIGHT && x<= HF_WIDTH) { tempY=y-HF_HEIGHT; tempX=HF_WIDTH-x; } else { tempY = y-HF_HEIGHT; tempX = x-HF_WIDTH; } if ((tempY*tempY+tempX*tempX)<=SquareOfR) LCD_BUFFER[y][x] = c ; } } }
Mini2440 控制到这里就可以结束了,具体代码可以从我的git上clone。里面包括对2中lcd屏幕的控制方式,通过修改target.h文件宏定义选择具体哪个lcd。
文中提到的HX8238-A 文档
https://www.dropbox.com/s/2o46cb9p8y7xe1e/HX8238A.pdf
和 ACX502BMU X35索尼LCD pdf下载:
https://www.dropbox.com/s/aiu2bb47gzcpihx/ACX502BMU--X35%E7%B4%A2%E5%B0%BCLCD.pdf
https://www.dropbox.com/s/qlgrhv35i16s0bc/ACX502BMU%20%E5%8D%81%E5%88%86%E8%AF%A6%E7%BB%86%E8%AE%B2%E8%A7%A3.doc