gnu ucos 加入lcd 显示

概述

        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信号出现的频率称为水平频率。

gnu ucos 加入lcd 显示_第1张图片

         下面看2个例子首先是tq2440板子原装的-----在做这个裸机程序之前我的mini2440板子坏了,接上openjtag之后无法halt开发板。经过推断是板子的jtag接口出问题了,又找了块tq2440。同样是s3c2440处理器,并且好多周边配件和mini2440控制方式一样。 这里不多说了,以后每一个元件操作都把tq2440mini2440的做下对比。

 这个板子是参照赵老师的

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 ,这里应该是个控制器驱动芯片。

在这里面可看到需要的数据。

gnu ucos 加入lcd 显示_第2张图片


gnu ucos 加入lcd 显示_第3张图片


gnu ucos 加入lcd 显示_第4张图片

由上面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"LCDACX502BMU这个可以在友善官网下载下来。对于一个lcd首先要确定CLKVAL_TFT,手册上VCLK给出的是5.9 根据公式VCLK = HCLK/[(CLKVAL+1)x2] 可算出这个数值是8.

然后就是前后肩等值了

gnu ucos 加入lcd 显示_第5张图片

  表中的VBLK结合以下时序图可以知道,它实际上是(VSPW+1VBPD+1VFPD+1) 的总和。

gnu ucos 加入lcd 显示_第6张图片

表中的HBLK结合以下时序图可以知道,它实际上是(HSPW+1HBPD+1HFPD+1) 的总和。 

gnu ucos 加入lcd 显示_第7张图片


      这个屏的PDF手册没有分别给出VSPWVBPDVFPD , HSPWHBPDHFPD。我们知道的只是水平信号总和32和垂直信号16,那么我们先要任意给一组值,满足和分别3216就可以了,这一组值不是唯一的。如果调试中出现黑边,则根据黑边情况把以上的值作微小的调整(和保持不变):

上边黑框把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板子上宽240320。由于两种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 控制到这里就可以结束了,具体代码可以从我的gitclone。里面包括对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

还有一个很好的doc讲解(s3c2440 控制ACX502BMU的  ):

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







你可能感兴趣的:(s3c2440,ACX502BMU,NMA35QV65)