|
我按照下面的操作移植LCD驱动的,驱动是移植上去了图像也出来了,但是就是整个图像的位置都向左上角移动了一定的距离,不知道是怎么回事,我开始移位是LCD的参数设置不对,可是我怎么调整都不行,故来求救。
2.6.32已经包含了s3c2440的frame buffer LCD驱动了,我们要做的就是传递正确的platform_data给内核就可以了。具体移植过程如下:
1)根据实际的LCD屏的物理尺寸大小,修改platform_data结构中的s3c2410fb_display结构变量。具体内容如下:
/* LCD driver info */
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 = 320, // 240,
.height = 240, // 320,
.pixclock = 100000, //166667, /* HCLK 60 MHz, divisor 10 */
.setclkval = 0x3, /* 新加入的项目的是减少计算pixclock的复杂度*/
.xres = 320, // 240,
.yres = 240, // 320,
.bpp = 16,
.left_margin = 33, //20,
.right_margin = 22, //8,
.hsync_len = 44, //4,
.upper_margin = 9, //8,
.lower_margin = 3, //7,
.vsync_len = 15, //4,
};
2)修改s3c2410fb_display结构定义,添加setclkval成员。编辑arch/arm/mach-s3c2410/include/mach/fb.h文件,具体修改内容如下:
在struct s3c2410fb_display 中的unsigned pixclock 后面添加行:
unsigned setclkval; /*新添加的set clock value*/
3)修改s3c2410 frame buffer驱动,使得计算pixclock更加简洁。编辑drivers/video/s3c2410fb.c,具体修改内容如下:
static void s3c2410fb_activate_var(struct fb_info *info)
{
struct s3c2410fb_mach_info *platform_dev = fbi->dev->platform_data;
struct s3c2410fb_display *default_display = platform_dev->displays+platform_dev->default_display;
......
//fbi->regs.lcdcon1 |= S3C2410_LCDCON1_CLKVAL(clkdiv);
fbi->regs.lcdcon1 |= S3C2410_LCDCON1_CLKVAL(default_display->setclkval);
......
}
4)LCD驱动内核配置选项如下:Device Drivers->Graphics support->Support for frame buffer devices->Enable firmware EDID、Enable Video Mode Handling Helpers和S3C2410 LCD framebuffer support,同时在Graphics support选项中还要选择Console display driver support->Framebuffer Console support;
5)添加开机Logo。具体Logo图片可以自行选择,我用的是Linux内核自带的logo图标,具体路径如下:drivers/video/logo/logo_linux_clut224.ppm。
A)使用gimp工具修改该logo图标为224色且保存为ascii码形式。之后将修改后的logo图片文件放回到原位置。
B)内核配置选项如下:Device Drivers->Graphics support->Bootup logo->Standard 224-color Linux logo |
|