主 机:Fedora 14 (kernel-2.6.33.7)
开发板:FL2440( nandflash:K9F1G08 128MB)
开发板:FL2440( nandflash:K9F1G08 128MB)
编译器:arm-linux-gcc-4.3.2
二、移植步骤
1. 同样,linux-2.6.33.7内核对LCD的支持已经很完善了,我们所要做的工作只是很小的一部分,对驱动代码做适当的修改以适应FL2440上的LCD。由FL2440光盘所提供的datasheet可以得知,FL2440开发板上使用的是台湾东华影像带触摸屏的LCD液晶屏,型号是WXCAT35-TG3#001。打开LCD的datasheet,翻到AC Characteristics这一章节,这里是我们对驱动程序做出修改的主要依据。
2. 主要修改如下:
- #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, //lcd类型为TFT
- .width = 320, //lcd宽度为320
- .height = 240, //lcd高度为240
- .pixclock = 270000, //像素时钟
- .xres = 320, //320*240的分辨率
- .yres = 240,
- .bpp = 16, //颜色位数
- .left_margin = 8, //对应时序图的HBPD(Back-Porch),表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数。
- .right_margin = 5, //对应时序图的HFPD(Front-Porch),表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数。
- .hsync_len = 63, //对应时序图的HSPW(Pulse Width),表示水平同步信号的宽度,用VCLK计算。
- .upper_margin = 15, //对应时序图的VBPD(Back-Porch),表示一帧图像开始时,垂直同步信号以后的无效的行数。
- .lower_margin = 3, //对应时序图的VFBD(Front-Porch),表示一帧图像结束后,垂直同步信号以后的无效的行数。
- .vsync_len = 5, //对应时序图的VSPW(Pulse Width),表示垂直同步脉冲的宽度,用行计算。
- .type = S3C2410_LCDCON1_TFT,
- }
- };
- static struct s3c2410fb_mach_info smdk2440_fb_info __initdata= {
- .displays = smdk2440_lcd_cfg, //应用上面定义的配置信息
- .num_displays = ARRAY_SIZE(smdk2440_lcd_cfg),
- .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 = 0,//((0xCE6) & ~7) | 1<<4, //如果不是三星公司的LCD,这个参数可以不要
- };
3. 配置内核选项。选上LCD支持和Logo图标
- Device Drivers --->
- Graphics support --->
- < > Lowlevel video outputswitch controls
- <*> Supportfor frame buffer devices --->
- --- Supportfor frame buffer devices
- [*] Enable firmware EDID
- [ ] Framebuffer foreign endianness support --->
- [*] Enable Video Mode Handling Helpers
- [ ] Enable Tile Blitting Support
- *** Frame buffer hardware drivers***
- < > Epson S1D13XXX framebuffer support
- <*> S3C2410 LCD framebuffer support
- [ ] S3C2410 lcd debug messages
- < > Silicon Motion SM501 framebuffer support
- < > Virtual Frame Buffer support (ONLY FOR
- < > E-Ink Metronome/8track controller support
- < > Fujitsu MB862xx GDC support
- < > E-Ink Broadsheet/Epson S1D13521 controller support
- [*] Backlight& LCD device support --->
- Display device support --->
- Console display driver support --->
- [*] Bootup logo--->
- --- Bootup logo
- [ ] Standard black and white Linux logo
- [ ] Standard 16-color Linux logo
- [*] Standard 224-color Linux logo(NEW)
3. 重新编译内核并下载到开发板,这个时候出现了一件很棘手的现象,就是我之前所作出的修改并没有生效,液晶显示的是杂乱无章的雪花。也就是说LCD依然没有被驱动,我仔细检查自己的步骤,重复了好多次都没办法显示,过去了好几天,没有办法,我只能把LCD驱动的移植暂时放下先去做其他驱动的移植。刚好今天移植RTC驱动的时候碰到类似的问题,最后完成RTC驱动移植的时候,我受到了启示----尝试着去修改mach-smdk2410.c。
- #vim arch/arm/mach-s3c2410/mach-smdk2440.c
增加几个头文件
- #include<mach/fb.h>
- #include<mach/regs-lcd.h>
- #include<linux/string.h>
增加smdk2410_lcd_cfg[]相关的
- static struct s3c2410fb_display smdk2410_lcd_cfg[] __initdata= {
- {
- .lcdcon5 = S3C2410_LCDCON5_FRM565 |
- S3C2410_LCDCON5_INVVLINE |
- S3C2410_LCDCON5_INVVFRAME |
- S3C2410_LCDCON5_PWREN |
- S3C2410_LCDCON5_HWSWP,
- .type = S3C2410_LCDCON1_TFT, //lcd类型为TFT
- .width = 320, //lcd宽度为320
- .height = 240, //lcd高度为240
- .pixclock = 270000, //像素时钟
- .xres = 320, //320*240的分辨率
- .yres = 240,
- .bpp = 16, //颜色位数
- .left_margin = 8, //对应时序图的HBPD(Back-Porch),表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数。
- .right_margin = 5, //对应时序图的HFPD(Front-Porch),表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数。
- .hsync_len = 63, //对应时序图的HSPW(Pulse Width),表示水平同步信号的宽度,用VCLK计算。
- .upper_margin = 15, //对应时序图的VBPD(Back-Porch),表示一帧图像开始时,垂直同步信号以后的无效的行数。
- .lower_margin = 3, //对应时序图的VFBD(Front-Porch),表示一帧图像结束后,垂直同步信号以后的无效的行数。
- .vsync_len = 5, //对应时序图的VSPW(Pulse Width),表示垂直同步脉冲的宽度,用行计算。
- .type = S3C2410_LCDCON1_TFT,
- }
- };
增加smdk2410_fb_info结构体:
- static struct s3c2410fb_mach_info smdk2410_fb_info __initdata = {
- .displays = smdk2410_lcd_cfg, //应用上面定义的配置信息
- .num_displays = ARRAY_SIZE(smdk2410_lcd_cfg),
- .default_display = 0,
- .lpcsel = 0,//((0xCE6) & ~7) | 1<<4, //如果不是三星公司的LCD,这个参数可以不要
- };
应用smdk2410_fb_info的配置信息
- static void __init smdk2410_init(void)
- {
- s3c24xx_fb_set_platdata(&smdk2410_fb_info);//应用smdk2410_fb_info的配置信息。
- s3c_i2c0_set_platdata(NULL);
- platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices));
- smdk_machine_init();
- }
参考2.6.28内核的arch/arm/mach-s3c2410/mach-smdk2410.c