1. 使用lcd 一般需要一个控制器和驱动器,控制器需要初始化以产生正确的时序,驱动器一般是和lcd基板制作在一起

 LCD 控制器结构图:

 

  REGBANK 表示调色板

   LCDDMA 表示DMA通道

2. lcd控制器相关时序图如下

 

 VSPW 表示 VSYNC 的脉冲宽度为 (VSPW+1) 个 HSYNC 信号。

 VBPD  表示经过 (VBPD+1) 个 HSYNC 信号,数据行有效

 VFPD  表示(VFPD + 1) 个无效行

 HSPW 表示 HSYNC 的脉冲宽度为 (HSPW+1) 个 VCLK 信号。

 HBPD 表示经过 (HBPD+1) 个 VCLK 信号,像素数据有效

 HFPD 表示(HFPD + 1) 个无效像素

3. lcd 显示芯片时序图

 

4. VCLK 的获得

 设置时钟来源为 HCLK=133MHz ,又由计算公式

 

 而从 3 中可以得到VCLK的典型值为 9MHz ,HCLK = 133 MHz ,所以 CLKVAL_F =  13.77 约为 14。

5. lcd 接口信号设置,以上时序图可总结如下:

 

6. 初始化代码:

 S3C6410 手册上的初始化流程如下所示:

 代码:

/*lcd 信号计算分配*/
#define  VSPW         9
#define  VBPD          1
#define  LINEVAL     271
#define  VFPD          1


#define  HSPW         40    
#define  HBPD          1
#define  HOZVAL      479
#define  HFPD          1

/*计算分配视口数据*/
#define LeftTopX     0
#define LeftTopY     0

#define RightBotX   479
#define RightBotY   271

/*分配帧缓存地址*/
#define FRAME_BUFFER

void lcd_init(void)
{
    /* 1. 查阅硬件电路原理图,设置相关GPIO引脚用于LCD */
    GPICON = 0xaaaaaaaa;  /* gpi0~gpi15用作lcd_vd[0~15] */
    GPJCON = 0xaaaaaa;   /* gpj0~gpi11用作lcd_vd[16~23]和VDEN/VSYNC/HSYNC/VCLK */
    
    
    GPFCON &= ~(0x3<<28);
    GPFCON |=  (1<<28);    /* GPF14 output用作背光使能信号 CLKOUT*/
    
    
//    GPECON &= ~(0xf);
//    GPECON |= (0x1);          /* GPE0用作LCD的on/off信号 */
    
    /* 2. 初始化6410的display controller 
     * 2.1 hsync,vsync,vclk,vden的极性和时间参数
     * 2.2 行数、列数(分辨率),象素颜色的格式
     * 2.3 分配显存(frame buffer),写入display controller
     */

    MIFPCON &= ~(1<<3);   /* Normal mode SEL_BYPASS[3]=0*/

    SPCON    &= ~(0x3);    /**/
    SPCON    |= 0x1;            /*LCD_SEL = 01 设置为RGB I/F style */


    VIDCON0 &= ~((3<<26) | (3<<17) | (0xff<<6)  | (3<<2));     /* RGB I/F, RGB Parallel format,  */
    VIDCON0 |= ((14<<6) | (1<<4) );      /* vclk== HCLK / (CLKVAL+1) = 133/15 = 9MHz */




    VIDCON1 &= ~((1<<7) | (1<<4));   /* 在vclk的下降沿获取数据 ,VDEN 高电平*/
    VIDCON1 |= ((1<<6) | (1<<5));  /* HSYNC高电平有效, VSYNC高电平有效 */

    VIDTCON0 = (VBPD << 16) | (VFPD << 8) | (VSPW << 0); /*设置LCD信号的值*/
    VIDTCON1 = (HBPD << 16) | (HFPD << 8) | (HSPW << 0);
    VIDTCON2 = (LINEVAL << 11) | (HOZVAL << 0);




    WINCON0 &= ~(0xf << 2);
    WINCON0 |= (0xb<<2);    /* unpacked 24 BPP (non-palletized R:8-G:8-B:8 ) */



    VIDOSD0A = (LeftTopX<<11) | (LeftTopY << 0);/*视口位置设置*/
    VIDOSD0B = (RightBotX<<11) | (RightBotY << 0);
    VIDOSD0C = (LINEVAL + 1) * (HOZVAL + 1);  /* WINDOWS'0 size is 272 * 480 (word)*/

    VIDW00ADD0B0 = FRAME_BUFFER; /*帧缓存起始地址*/
    VIDW00ADD1B0 =  (((HOZVAL + 1)*4 + 0) * (LINEVAL + 1)) & (0xffffff);/*帧缓存大小*/
    
                                    /* 帧缓存与视口设置
                                    *VBASEL = VBASEU + (LINEWIDTH+OFFSIZE) x (LINEVAL+1) 
                                   *        = 0 + (480*4 + 0) * 272
                                     *        = 
                                     * 4 表示一个像素32位,即 4 个字节
                                 */
    
    
}
View Code