fl2440——LCD驱动使能

1.修改内核代码
  vim arch/arm/mach-s3c2440/mach-smdk2440.c
static struct 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      = 480,     //屏幕宽度
    .height     = 272,    //屏幕长度

    .pixclock   = 600000, /* HCLK 60 MHz, divisor 10 */
    .xres       = 480,     //x轴的时间间隔             
    .yres       = 272,     //y周的时间间隔
    .bpp        = 16,
    .left_margin    = 19,
    .right_margin   = 10,
    .hsync_len  = 30,
    .upper_margin   = 4,
    .lower_margin   = 2,
    .vsync_len  = 8,
};
           .
           .
           .
.lpcsel     = 0 // ((0xCE6) & ~7) | 1<<4,  /* add by anzhihong */

2.配置make menuconfig
mkc    //我自己设置的make menuconfig命令别名

Device Drivers  ---> 
     Graphics support  --->
           <*> Support for frame buffer devices  --->
                   [*]   Enable firmware EDID
                   [*]   Enable Video Mode Handling Helpers
                  <*>   S3C2410 LCD framebuffer support
          -*- Backlight & LCD device support  ---> 
                  <M>   Lowlevel LCD controls 
                   {M}   Lowlevel Backlight controls
                  <M>     Generic (aka Sharp Corgi) Backlight Driver
         Console display driver support  --->
                  <*> Framebuffer Console support
                   [*]   Map the console to the primary display device
                   [*]   Framebuffer Console Rotation
                   [*] Select compiled-in fonts
                   [*]   VGA 8x8 font
                   [*]   Mini 4x6 font
         [*] Bootup logo  --->
                   [*]   Standard 224-color Linux logo               
3.配置好后,编译内核,烧录到开发板中如图

但是后来发现屏幕在闪烁,去根据查看了一下LCD的数据手册,发现参数设置有误,改正代码如下:

LCD屏时序图:

从最小的像素开始分析,电子枪每次在CLK下降沿(本开发板是下降沿)从数据线Dn0-Dn7上得到数据,发射到显示屏上,然后移动到下一个位置。Dn0-Dn7上的数据来源就是前面介绍的FrameBuffer。就这样从一行的最左边,一直移动到一行的最右边,完成了一行的显示,假设为x。
当打完一行的最后一个数据后,就会收到Hsync行同步信号,根据时序图,一个Hsync周期可以大致分为五部分组成:thp、thb、1/tc、thd、thf。thp称为脉冲宽度,这个时间不能太短,太短电子枪可能识别不到。电子枪正确识别到thp后,会从最右端移动最左端,这个移动的时间就是thb,称之为移动时间。thf表示显示完最右像素,再过多久Hsync才来。
同理,当电子枪一行一行的从上面移动到最下面时,Vsync垂直同步信号就让电子枪移动回最上边。Vsync中的tvp是脉冲宽度,tvb是移动时间,tvf表示显示完最下一行像素,再过多久Vsync才来。 假设一共有y行,则LCD的分辨率就是x*y。
static struct 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      = 480,
    .height     = 272,

    .pixclock   = 11111, /* Dclk-Period    =>100 00 00/Dclk=1000 000/9*/
    .xres       = 480,
    .yres       = 272,
    .bpp        = 16,
    .left_margin    = 38,
    .right_margin   = 20,
    .hsync_len  = 30,
    .upper_margin   = 15,
    .lower_margin   = 12,
    .vsync_len  = 3,
};

(参考 http://wiki.100ask.org/index.php?title=%E7%AC%AC017%E8%AF%BE_LCD&variant=zh ,这里详细的介绍了LCD的驱动原理)


猜你喜欢

转载自blog.csdn.net/buhuiguowang/article/details/79804245
今日推荐