在Linux2.6.22.2下移植十分简单,只要在/arch/arm/mach-s3c2410/mach-smdk2410.c里添加初始化s3c2410的LCD控制器时所需要的参数就好了。而且SHARP LQ080V3DG01的在同文件夹下的mach-qt2410.c里已经移植过来了,这样更是减小了移植的难度,只要将mach-qt2410.c里的代码拷贝到mach-smdk2410.c里,在稍做修改就好了(我遇到过得最简单的移植)。现在我介绍一下移植过程:
一、修改/arch/arm/mach-s3c2410/mach-smdk2410.c文件1、添加头文件
#include
2、添加初始化s3c2410的LCD控制器时所需的参数(copy from /arch/arm/mach-s3c2410/mach-qt2410.c,稍作修改)。
//tekkaman LCD
/* LCD driver info */
/* Configuration for 640x480 SHARP LQ080V3DG01 */
static struct s3c2410fb_mach_info qt2410_biglcd_cfg __initdata = {
.type = S3C2410_LCDCON1_TFT,
.regs = {
.lcdcon1 = S3C2410_LCDCON1_TFT16BPP |
S3C2410_LCDCON1_TFT |
S3C2410_LCDCON1_CLKVAL(0x01), /* HCLK/4 */
.lcdcon2 = S3C2410_LCDCON2_VBPD(18) | /* 19 */
S3C2410_LCDCON2_LINEVAL(479) |
S3C2410_LCDCON2_VFPD(10) | /* 11 */
S3C2410_LCDCON2_VSPW(14), /* 15 */
.lcdcon3 = S3C2410_LCDCON3_HBPD(43) | /* 44 */
S3C2410_LCDCON3_HOZVAL(639) | /* 640 */
S3C2410_LCDCON3_HFPD(115), /* 116 */
.lcdcon4 = S3C2410_LCDCON4_MVAL(0) |
S3C2410_LCDCON4_HSPW(95), /* 96 */
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
},
.lpcsel = ((0xCE6) & ~7) | 1<<4,
.gpccon= 0xaa8002a8,
.gpccon_mask= 0xffc003fc,
.gpcup= 0xf81e,
.gpcup_mask= 0xf81e,
.gpdcon= 0xaa80aaa0,
.gpdcon_mask= 0xffc0fff0,
.gpdup= 0xf8fc,
.gpdup_mask= 0xf8fc,
.width = 640,
.height = 480,
.xres = {
.min = 640,
.max = 640,
.defval = 640,
},
.yres = {
.min = 480,
.max = 480,
.defval = 480,
},
.bpp = {
.min = 16,
.max = 16,
.defval = 16,
},
};
//tekkaman LCD
特别说明:
(1)其中的".type = S3C2410_LCDCON1_TFT,"一定要加,否则Linux会认为LCD是STN屏,出现花屏(像下雨一样,蓝色的)。
(2)其中:
.gpccon= 0xaa8002a8,
.gpccon_mask= 0xffc003fc,
.gpcup= 0xf81e,
.gpcup_mask= 0xf81e,
.gpdcon= 0xaa80aaa0,
.gpdcon_mask= 0xffc0fff0,
.gpdup= 0xf8fc,
.gpdup_mask= 0xf8fc, 是依据博创2410-S实验箱LCD部分原理图和SHARP LQ080V3DG01的英文数据手册确定的,因为这个LCD只用了s3c2410的LCD控制器引脚的一部分,剩下的一些还可以作为普通I/O口来用。
*_mask 参数的作用
在移植时,我不是很明白*_mask参数的作用,在追踪源码后才知道。看了下面/drivers/video/s3c2410fb.c的源码你就会理解了:
......
static int s3c2410fb_init_registers(struct s3c2410fb_info *fbi)
{
......
modify_gpio(S3C2410_GPCUP, mach_info->gpcup, mach_info->gpcup_mask);
modify_gpio(S3C2410_GPCCON, mach_info->gpccon, mach_info->gpccon_mask);
modify_gpio(S3C2410_GPDUP, mach_info->gpdup, mach_info->gpdup_mask);
modify_gpio(S3C2410_GPDCON, mach_info->gpdcon, mach_info->gpdcon_mask);
......
}
......
static inline void modify_gpio(void __iomem *reg,
unsigned long set, unsigned long mask)
{
unsigned long tmp;
tmp = readl(reg) & ~mask;
writel(tmp | set, reg);
}
其实*_mask参数作用是将要修改的寄存器参数先清零,这样可以保证后面的设置操作正确。因为设置操作是置位操作,无法清零。也就是说:如果没有 tmp = readl(reg) & ~mask;这一句,就无法将11设置成10。
3、打开LCD的初始化。(我以前将它屏蔽了)
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
};
4、添加LCD控制器的寄存器参数设置函数(copy from /arch/arm/mach-s3c2410/mach-qt2410.c)。
static void __init smdk2410_init(void)
{
s3c24xx_fb_set_platdata(&qt2410_biglcd_cfg);
platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices));
smdk_machine_init();
}
mach-smdk2410.c文件修改结束。
去除10分钟左右自动关闭显示的程序(实验时可以这么做,我猜应该是节能作用,并未深究。)。
copy from《2410 lcd(ltv350)驱动在2.6.14下的移植经历》:
“按seigpao大侠的做法,注释掉drivers\char\vt.c的blank_screen_t(unsigned long dummy)的函数内容,否则,lcd会在10分钟左右关掉显示。“
二、配置内核
Device Drivers --->
Graphics support --->
Display device support --->
<*> Display panel/monitor support
<*> Support for frame buffer devices
<*> S3C2410 LCD framebuffer support
Console display driver support --->
<*> Framebuffer Console support
[*] Framebuffer Console Rotation
[*] Select compiled-in fonts
[*] VGA 8x8 font
[*] VGA 8x16 font
[*] Mini 4x6 font
[*] Sparc console 8x16 font
[*] Bootup logo --->
--- Bootup logo
[*] Standard 224-color Linux logo
然后就是重新编译内核,tftp到开发板启动,应该就可以看到企鹅Tux了。但你如果想在LCD上显示自己的Logo,那下面我介绍一下自定义Logo的方法:
(1)进入linux的kde图形界面,使用The GIMP 图像编辑器打开你想要的图像文件,依次选择图像->模式->索引颜色,将颜色改为224色;至于图片大小,不要大于你的显示器分辨率就好(我只试过80*80和320*240的大小),最后将文件保存为ppm格式(ASCii码),文件名为:logo_linux_clut224.ppm。
(2)将logo_linux_clut224.ppm拷贝到/drivers/video/logo文件夹下,替换原有的文件(记得备份啊,以防万一)。
(3)重新编译内核,tftp到开发板启动。
PS:Linux2.6.22.2的移植很顺利,网卡直接就可以用。然后直接接着做LCD驱动,再编译加载zImage,出现:eth0:interrupt from stopped card
死循环。原因不明,重新做了一遍还是这个问题。我就没改网卡,直接做的LCD,LCD可以用,再做的网卡,OK。就是两个驱动做的顺序交换了一下就好了。也不知道什么原因就好了。不知道那个强人tekkaman遇没遇到过,解释下原因,呵呵。
阅读(1461) | 评论(0) | 转发(0) |