嵌入式开发第50天(s5pv210的LCD原理)

一、LCD的控制原理

s5pv210处理器里有个LCD控制器,它控制着LCD屏幕的显示,其实LCD是特别为了显示屏而设计的一个寄存器,它能够减轻cpu的负担。

1:显示屏跟内存的关系。
我们都买过显卡,知道买独立显卡的好,那么为什么独显好?
独显跟集显的区别又在哪里?

独显的特点:有独立内存
   可以独立复制内容(DMA控制器)

集显的特点:跟主板共用内存
   可以独立复制内容(DMA控制器)

2:屏幕为什么能显示?(集显)
1)在初始化的时候,在内存开辟的一片空间作为显存 
2)将要显示的内容写到显存上
3)lcd控制器对显存进行读取,然后写入显示屏里。
A:DMA完成显示数据的传输,不需要CPU执行COPY函数
B:LCD控制器 显示屏 提供时序信号、视频数据、 .....

LCD显示原理




如果需要显示一满屏的数据,则数据的大小:800*480*24bits

1、帧同步信号:液晶屏的刷新频率、垂直同步信号的频率、场频率

       帧同步信号=  50Hz~70Hz,典型值:60Hz

2、行同步信号的频率:一帧中有多少行?

       行同步信号的频率 = 480 +回扫的行数(45) )* 帧同步信号的频率

3、像素时钟的频率:扫描像素点的频率

像素时钟频率 = 800+一行中回扫的像素点(256))*行同步信号的频率

注意:

1、液晶屏的分频率越大,则VCLK的频率越高

2、VCLK的频率的最大上限:HCLK_DSYS=166MHz

3、思考:S5PV210最大可以接多大的液晶屏?

计算:

800*480LCD中,VCLK的频率值:

VCLK = 800+256*480+45* 60Hz = 33.264MHz

LCD的描述参数(液晶屏的选型)

1、分辨率

   行和列像素点的个数

2、尺寸

有效的显示区对角线的长度,单位英寸。

3、色位

一个像素点用多少位数据来描述----24bits

4、响应时间

刷新时间---->60Hz(16ms)

响应时间---->ms

5、亮度

cd/m**2  --->高亮屏:600

            一般屏:250

6、对比度

白色的亮度/黑色的亮度。

7、寿命

单位:小时    5万小时

当液晶屏的亮度降低到出厂亮度的一半的时候,认为寿命到了。

8、可视角度

    四个方向的可视角度是不对称的,一般有一个方向是比较差的。

硬件的设计接口

1、S5PV210 LCD控制器的接口


7英寸液晶屏接口  

0xffff

1-11位是功能  剩下的每八位 分别是蓝绿红


LCD的驱动主要做什么?

1、根据液晶屏的特定参数来设置LCD控制器(接口、bpp......

2、设置液晶屏的同步信号的频率(VCLKVSYNCHSYNC.....

3、设置液晶屏的时序参数(帧的回扫时间、行的回扫时间、同步信号的极性.....

4、设置显存的位置和大小

LCD的时序图

目的:

通过对LCD控制器进行参数的配置,让LCD控制器输出的时序符合LCD液晶屏的时序的要求。参数如何确定--->查看时序图。通过LCD液晶屏的时序图来确定LCD控制器的时序。

1、LCD控制器的输出时序

LCD液晶屏的输入时序



四、LCD驱动程序

1、端口初始化

作用:将GPIO初始化成LCD控制器信号的功能

 

void lcd_init(void)

{

    GPF0CON = 0x22222222;

    GPF0DRV = 0xffffffff;

    GPF0PUD = 0x0;

    

    GPF1CON = 0x22222222;

    GPF1DRV = 0xffffffff;

    GPF1PUD = 0x0;

    GPF2CON = 0x22222222;

    GPF2DRV = 0xffffffff;

    GPF2PUD = 0x0;

    GPF3CON &= ~0xffff;

    GPF3CON |=  0x2222;

    GPF3DRV |=  0xff;

    GPF2PUD &= ~0xff;

    

    //set gpd0_1 (backlight pwm pin) output and pull up and high level for disab

    //GPD0_1(TOUT1)-->OUTPUT

    GPD0CON &= ~(0xf<<4);

    GPD0CON |= (1<<4);

    GPD0DAT |= (1<<1);

    //GPH1_2 ok

    //GPH1CON &= ~(0xf<<8);

    //GPH1CON |=  (1<<8);

//GPH1DAT |= (1<<2);

.......................................................

}

--------------------------------------------------------------------------------------------------

2、LCD控制器的初始化(重点)

 

void lcd_init(void)

{

.................................

//Display output path selection, 10: RGB=FIMD I80=FIMD ITU=FIMD

    DISPLAY_CONTROL = (2<<0);

    WINCON2 = 0;

    // bit[30]=0: disable MIPI DSI

    // bit[26~28]=000: output format---RGB interface,

    // bit[18]=0: RGB parallel format

    // bit[2]=0:video clock source,HCLK_DSYS=166MHz    

    VIDCON0 = ~( (1<<30)|(7<<26)|(1<<18)|(1<<16)|(1<<5)|(1<<2) );

    // bit[4]=1:Divided by CLKVAL_F

    // bit[6~13]=4:CLKVAL, VCLK = 166M/(4+1) = 33.3M

    VIDCON0 |= 4<<6 | 1<<4;

    //bit[4]=0:VDEN pulse polarity,,normal

    //bit[5]=1:VSYNC pulse polarity,Inverted

    //bit[6]=1:HSYNC pulse polarity,Inverted

    //bit[7]=0:Video data is fetched at VCLK falling edge

    VIDCON1 = (1<<5) | (1<<6);

    

    

    VIDTCON0 = (VBPD<<16) | (VFPD<<8) | (VSPW<<0);

    VIDTCON1 = (HBPD<<16) | (HFPD<<8) | (HSPW<<0);

    VIDTCON2 = (LINEVAL << 11) | (HOZVAL << 0);

    // bit[0]=1:Enables video output and logic immediately

    // bit[2~5]=1011:Unpacked 24 bpp ( non-palletized R:8-G:8-B:8 )

    // bit[15]:Word swap Enable

    WINCON0 = 1<<0;

    WINCON0 &= ~(0xf << 2);

    WINCON0 |= (0xB<<2) | (1<<15);

    //Window 0 Position Control Register

    VIDOSD0A = (LeftTopX<<11) | (LeftTopY << 0);

    VIDOSD0B = (RightBotX<<11) | (RightBotY << 0);

    VIDOSD0C = (LINEVAL + 1) * (HOZVAL + 1);//Specifies the Window Size(word)

    // Frame Buffer Address Register

    //of the start address for Video frame buffer

    VIDW00ADD0B0 = FB_ADDR;

    //the end address for Video frame buffer

    //VIDW00ADD1B0 = (((HOZVAL + 1)*4 + 0) * (LINEVAL + 1)) & (0xffffff);

    VIDW00ADD1B0 = FB_ADDR+((HOZVAL + 1)*4 + 0) * (LINEVAL + 1);

    //VBASEL = VBASEU + (PAGEWIDTH+OFFSIZE) x (LINEVAL+1)

    //OFFSIZE,PAGEWIDTH

    VIDW00ADD2 = (0<<13)|((HOZVAL + 1)*4);

    // enable channel 0 output

    SHODOWCON = 0x1;

    // bit[1]:Enables video output and logic immediately

    // bit[0]:Enables video output and logic at current frame end.

    VIDCON0 |= ((1<<0)|(1<<1));

}

3、写像素点的函数

在液晶屏上显示的任何内容都是由点组成。画点是液晶屏显示的基础。

void lcd_draw_pixel(int row, int col, int color)

{

    unsigned long * pixel = (unsigned long  *)FB_ADDR;

    *(pixel + row * COL + col) = color;

}

清屏函数:

void lcd_clear_screen(int color)

{

    int i, j;

    for (i = 0; i < ROW; i++)

        for (j = 0; j < COL; j++)

    lcd_draw_pixel(i, j, color);

}



猜你喜欢

转载自blog.csdn.net/reasonss/article/details/52695751