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,
};