Chinaunix首页 | 论坛 | 博客
  • 博客访问: 389026
  • 博文数量: 107
  • 博客积分: 2536
  • 博客等级: 少校
  • 技术积分: 781
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-14 15:19
文章分类

全部博文(107)

文章存档

2017年(11)

2016年(8)

2015年(14)

2014年(32)

2012年(1)

2011年(1)

2010年(7)

2009年(33)

我的朋友

分类: LINUX

2009-07-15 10:22:28

移植Linux2.6.22.2到博创2410-S(s3c2410A)
(补:LCD(SHARP LQ080V3DG01) 驱动移植)

    前段时间移植完了Linux2.6.22.2,开发要用的基本功能都有了。
【置顶】移植Linux2.6.22.2到博创2410-S(s3c2410A)(1)
【置顶】移植Linux2.6.22.2到博创2410-S(s3c2410A)(2)
【置顶】移植Linux2.6.22.2到博创2410-S(s3c2410A)(3)
但是8寸的液晶屏一直是彩条,看着很不爽。也有网友问LCD的移植问题,国庆节前时间比较松,所以决定将LCD驱动起来。

--------------------------------------------------------------------------------
    本次移植的参考资料:
1、《 S3C2410 下LCD 驱动程序移植及GUI 程序编写 》著作权所有:刘利国,是一篇经典的LCD移植文档,移植前必看。网上google一下就有(PDF版)。
2、《 2410 lcd(ltv350)驱动在2.6.14下的移植经历》
URL:
3、《 s3c2410 关于 LCD移植的问题》
URL:http://weibing.blogbus.com/logs/4474252.html
4、博创2410-S实验箱LCD部分原理图
5、 SHARP LQ080V3DG01的英文数据手册
--------------------------------------------------------------------------------
    在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到开发板启动。
--------------------------------------------------------------------------------
至于MINIGUI的移植,我有试了一下,很简单。介绍两个链接:
MiniGUI在S3C2410上的移植
MINIGUI在S3C2410开发板的移植
基本上按这上面的自己改改就好,我现在没用到GUI,所以就不深究了。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dongliqiang2006/archive/2009/05/23/4211440.aspx
阅读(732) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~