我一直以为我的LCD已经移植好了,但是在做frame buffer编程的时候却发现显示的图像不对,一开始我怀疑的是测试程序的问题,但是仔细看了几遍觉得不可能错,因为测试程序很简单,就是让屏幕全白,但是板子上显示的是两块白色区域,中间被一条黑色带隔开了。我猜测可能是LCD没有移植正确。
我查了很多网上的参数,每个人各有不同,我还看了同学和老师的,也是各有不同。于是我一一试了一遍,结果更糟了,反而没有我一开始设置的参数好。我的屏幕是480*272的,参数是:
<span style="font-size:10px;">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, //240 .height =272,//320 .pixclock = 40000,// 40000, /* HCLK 60 MHz, divisor 10 */ .xres = 480 , //240 .yres = 272 , //320 .bpp = 16, .left_margin = 8,//19,//20, .right_margin = 43,//10,//8, .hsync_len = 2,//4, .upper_margin = 4,//8, .lower_margin = 12,//2,//7, .vsync_len = 10,//8,//4, };</span>
试了几轮之后,我判定应该也不是这里的问题,最后看到这么一句代码:
static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = { .displays = &smdk2440_lcd_cfg, .num_displays = 1, .default_display = 0, #if 0 /* currently setup by downloader */ .gpccon = 0xaa940659, .gpccon_mask = 0xffffffff, .gpcup = 0x0000ffff, .gpcup_mask = 0xffffffff, .gpdcon = 0xaa84aaa0, .gpdcon_mask = 0xffffffff, .gpdup = 0x0000faff, .gpdup_mask = 0xffffffff, #endif .lpcsel = ((0xCE6) & ~7) | 1<<4, };最有一句中,默认是1<<4,但是老师的是1<<1,我照着改了之后果然成功。
我又翻看了s3c2440的芯片资料:
如果是1<<4,那么RES_SEL这一项将会是 0 ,而1<<1的话则是1,屏幕刚好差了一个90度,所以图像偏移了。