您的位置:首页 > 运维架构 > Linux

LCD驱动在OK2440开发板的移植

2012-05-26 11:17 411 查看
主  机:Fedora 14 (kernel-2.6.33.7)

    开发板: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_display
4000
s
= 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
=<
ac34
/span> 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息