Linux LCD驱动中的LCD参数

转载地址:http://www.linuxidc.com/Linux/2011-01/31800.htm
  1. kernel版本:linux-2.6.34
    开发板:PW2440
    CPU:S3C3440
    LCD:3.5 寸TFT(320×240),Model Name LQ035NC111
  2. LCD的参数设定是需要根据LCD的手册来设定arch/arm/mach-s3c2440/mach-smdk2440.c里面的s3c2410fb_display smdk2440_lcd_cfg结构体
  3. 例如从LQ035NC111的手册可以得到如下一个表
    Linux LCD驱动中的LCD参数

    该表描述了该款并行LCD的所有时钟需求,在这里我参照的全是典型值“Typ”栏
  4. 一个很具有参考价值的文档文件是Documentation/fb/framebuffer.txt文件,里面给我们描述了一个架构(注:#号框内为LCD显示部分)
      +----------+--------------------------------------------------------+----------+-------+
      |                 |          ↑                                                                          |                 |          |
      |                 |         |upper_margin                                                     |                 |         |
      |                 |         ↓                                                                           |                 |          |
      +----------#######################################-----------+-------+
      |                 #                ↑                                                                 #                |             |
      |                 #                |                                                                  #                |             |
      |                 #                |                                                                  #                |             |
      |                 #                |                                                                  #                |             |
      |   left         #                |                                                                 #  right       | hsync  |
      |  margin   #                |       xres                                                    #  margin   |  len     |
      |<-------->#<---------------+--------------------------------->   #<-------->|<----->|
      |                #                |                                                                  #                 |             |
      |                #                |                                                                  #                 |             |
      |                #                |                                                                  #                 |             |
      |                #                |yres                                                           #                  |             |
      |                #                |                                                                  #                 |             |
      |                #                |                                                                  #                 |             |
      |                #                |                                                                  #                 |             |
      |                #                |                                                                  #                 |             |
      |                #                |                                                                  #                 |             |
      |                #                |                                                                  #                 |             |
      |                #                |                                                                  #                 |             |
      |                #                |                                                                  #                 |             |
      |                #                ↓                                                                  #                |             |
      +----------#######################################----------+-------+
      |                |          ↑                                                                           |               |              |
      |                |          |   lower_margin                                                  |               |              |
      |                |          ↓                                                                           |               |              |
      +----------+---------------------------------------------------------+----------+-------+
      |                |         ↑                                                                            |               |              |
      |                |          |  vsync_len                                                          |               |              |
      |                |          ↓                                                                           |               |              |
      +----------+---------------------------------------------------------+----------+-------+

    还有一个很有用的公式

    Pixelclock:

       xfree: in MHz

       fb: in picoseconds (ps)

       pixclock = 1000000 / DCF

  5. 再结合结构体

    staticstruct s3c2410fb_display smdk2440_lcd_cfg __initdata= {

        .lcdcon5    = S3C2410_LCDCON5_FRM565|
                 S3C2410_LCDCON5_INVVLINE |
                 S3C2410_LCDCON5_INVVFRAME |
                 S3C2410_LCDCON5_PWREN |
                 S3C2410_LCDCON5_HWSWP,

        .type        = S3C2410_LCDCON1_TFT,

        .width = LCD_WIDTH,
        .height = LCD_HEIGHT,

        .pixclock = LCD_PIXCLOCK,
        .xres = LCD_WIDTH,
        .yres = LCD_HEIGHT,
        .bpp = 16,
        .left_margin = LCD_LEFT_MARGIN,
        .right_margin = LCD_RIGHT_MARGIN,
        .hsync_len = LCD_HSYNC_LEN,
        .upper_margin = LCD_UPPER_MARGIN,
        .lower_margin = LCD_LOWER_MARGIN,
        .vsync_len = LCD_VSYNC_LEN,
    };

  6. pixclock:现在我们就可以开始设置这个结构体的参数了,有上面第3小结的表我们可以知道LCD的时钟Dclk应该是156ns,这个对应结构体里面的像素点时钟pixclock,在来看看第四节提到的一个公式 pixclock=1000000/DCF,这个DCF就是LCD的Dclk对应的频率,注意,单位为MHz,所以DCF=1000 000 000/156 Hz=1000/156 MHz;可以得到pixclock=1000000/(1000/156)=156000;
  7. width、height的设定这个就没什么歧义了,对应320和240
  8. bpp:其实我的这个LCD手册上说该屏是支持24位色的,但是这里填写16位,有空可以试试24位
  9. 其他的参数:其他参数对应第3节的表填写

    xres         <===========> TEP

    yres         <===========> Tvd

    left_margin  <===========> Thf

    right_margin <===========> Thb

    hsync_len    <===========> THS

    注:我认为 原作者的 left_margin、right_margin的对应关系反了,应该是left_margin--Thb,right_margin--Thf

    upper_margin <===========> Tvf

    lower_margin <===========> Tvb

    vsync_len    <===========> Tvs

    注:我认为 原作者的 upper_margin、lower_margin的对应关系反了,应该是upper_margin--Tvb,lower_margin--Tvf

    所以我的配置如下

    #define LCD_WIDTH 320
    #define LCD_HEIGHT 240
    #define LCD_PIXCLOCK 156000

    #define LCD_RIGHT_MARGIN 38
    #define LCD_LEFT_MARGIN 20
    #define LCD_HSYNC_LEN 30

    #define LCD_UPPER_MARGIN 4
    #define LCD_LOWER_MARGIN 15
    #define LCD_VSYNC_LEN 3

  10. 基本上就这样了吧,呵呵
Linux LCD驱动中的LCD参数