LCD驱动在OK2440开发板的移植

本文介绍在FL2440开发板上移植Linux内核LCD驱动的过程,包括必要的配置修改及内核编译步骤。通过具体的代码示例展示了如何适配不同LCD屏幕的参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主  机: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. 主要修改如下:
  1. #vim arch/arm/mach-s3c2440/mach-smdk2440.c

  2. static struct s3c2410fb_display smdk2440_lcd_cfg[] __initdata= {
  3.         {
  4.         .lcdcon5 = S3C2410_LCDCON5_FRM565 |
  5.                           S3C2410_LCDCON5_INVVLINE |
  6.                           S3C2410_LCDCON5_INVVFRAME |
  7.                           S3C2410_LCDCON5_PWREN |
  8.                           S3C2410_LCDCON5_HWSWP,

  9.         .type = S3C2410_LCDCON1_TFT,    //lcd类型为TFT
  10.         .width = 320,        //lcd宽度为320
  11.         .height = 240,        //lcd高度为240
  12.         .pixclock = 270000,    //像素时钟
  13.         .xres = 320,        //320*240的分辨率
  14.         .yres = 240,
  15.         .bpp = 16,        //颜色位数
  16.         .left_margin = 8,        //对应时序图的HBPD(Back-Porch),表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数。
  17.         .right_margin = 5,        //对应时序图的HFPD(Front-Porch),表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数。
  18.         .hsync_len = 63,        //对应时序图的HSPW(Pulse Width),表示水平同步信号的宽度,用VCLK计算。
  19.         .upper_margin = 15,        //对应时序图的VBPD(Back-Porch),表示一帧图像开始时,垂直同步信号以后的无效的行数。
  20.         .lower_margin = 3,        //对应时序图的VFBD(Front-Porch),表示一帧图像结束后,垂直同步信号以后的无效的行数。
  21.         .vsync_len = 5,        //对应时序图的VSPW(Pulse Width),表示垂直同步脉冲的宽度,用行计算。
  22.         .type = S3C2410_LCDCON1_TFT,
  23.         }
  24. };

  25. static struct s3c2410fb_mach_info smdk2440_fb_info __initdata= {
  26.         .displays = smdk2440_lcd_cfg,    //应用上面定义的配置信息
  27.         .num_displays = ARRAY_SIZE(smdk2440_lcd_cfg),
  28.         .default_display = 0,

  29. #if 0
  30.         /* currently setup by downloader */
  31.         .gpccon = 0xaa940659,
  32.         .gpccon_mask = 0xffffffff,
  33.         .gpcup = 0x0000ffff,
  34.         .gpcup_mask = 0xffffffff,
  35.         .gpdcon = 0xaa84aaa0,
  36.         .gpdcon_mask = 0xffffffff,
  37.         .gpdup = 0x0000faff,
  38.         .gpdup_mask = 0xffffffff,
  39. #endif

  40.         .lpcsel = 0,//((0xCE6) & ~7) | 1<<4,    //如果不是三星公司的LCD,这个参数可以不要

  41. };
    3. 配置内核选项。选上LCD支持和Logo图标
  1. Device Drivers --->
  2.     Graphics support --->
  3.         < > Lowlevel video outputswitch controls
  4.         <*> Supportfor frame buffer devices --->
  5.             --- Supportfor frame buffer devices
  6.             [*] Enable firmware EDID
  7.             [ ] Framebuffer foreign endianness support --->
  8.             [*] Enable Video Mode Handling Helpers
  9.             [ ] Enable Tile Blitting Support
  10.             *** Frame buffer hardware drivers***
  11.             < > Epson S1D13XXX framebuffer support
  12.             <*> S3C2410 LCD framebuffer support
  13.             [ ] S3C2410 lcd debug messages
  14.             < > Silicon Motion SM501 framebuffer support
  15.             < > Virtual Frame Buffer support (ONLY FOR
  16.             < > E-Ink Metronome/8track controller support
  17.             < > Fujitsu MB862xx GDC support
  18.             < > E-Ink Broadsheet/Epson S1D13521 controller support
  19.         [*] Backlight& LCD device support --->
  20.             Display device support --->
  21.             Console display driver support --->
  22.         [*] Bootup logo--->
  23.             --- Bootup logo
  24.             [ ] Standard black and white Linux logo
  25.             [ ] Standard 16-color Linux logo
  26.             [*] Standard 224-color Linux logo(NEW)
    3. 重新编译内核并下载到开发板,这个时候出现了一件很棘手的现象,就是我之前所作出的修改并没有生效,液晶显示的是杂乱无章的雪花。也就是说LCD依然没有被驱动,我仔细检查自己的步骤,重复了好多次都没办法显示,过去了好几天,没有办法,我只能把LCD驱动的移植暂时放下先去做其他驱动的移植。刚好今天移植RTC驱动的时候碰到类似的问题,最后完成RTC驱动移植的时候,我受到了启示----尝试着去修改mach-smdk2410.c。
  1. #vim arch/arm/mach-s3c2410/mach-smdk2440.c

增加几个头文件

  1. #include<mach/fb.h>
  2. #include<mach/regs-lcd.h>
  3. #include<linux/string.h>

增加smdk2410_lcd_cfg[]相关的

  1. static struct s3c2410fb_display smdk2410_lcd_cfg[] __initdata= {
  2.         {
  3.         .lcdcon5 = S3C2410_LCDCON5_FRM565 |
  4.                           S3C2410_LCDCON5_INVVLINE |
  5.                           S3C2410_LCDCON5_INVVFRAME |
  6.                           S3C2410_LCDCON5_PWREN |
  7.                           S3C2410_LCDCON5_HWSWP,

  8.         .type = S3C2410_LCDCON1_TFT,    //lcd类型为TFT
  9.         .width = 320,        //lcd宽度为320
  10.         .height = 240,        //lcd高度为240
  11.         .pixclock = 270000,    //像素时钟
  12.         .xres = 320,        //320*240的分辨率
  13.         .yres = 240,
  14.         .bpp = 16,        //颜色位数
  15.         .left_margin = 8,        //对应时序图的HBPD(Back-Porch),表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数。
  16.         .right_margin = 5,        //对应时序图的HFPD(Front-Porch),表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数。
  17.         .hsync_len = 63,        //对应时序图的HSPW(Pulse Width),表示水平同步信号的宽度,用VCLK计算。
  18.         .upper_margin = 15,        //对应时序图的VBPD(Back-Porch),表示一帧图像开始时,垂直同步信号以后的无效的行数。
  19.         .lower_margin = 3,        //对应时序图的VFBD(Front-Porch),表示一帧图像结束后,垂直同步信号以后的无效的行数。
  20.         .vsync_len = 5,        //对应时序图的VSPW(Pulse Width),表示垂直同步脉冲的宽度,用行计算。
  21.         .type = S3C2410_LCDCON1_TFT,

  22.         }
  23. };

增加smdk2410_fb_info结构体:

  1. static struct s3c2410fb_mach_info smdk2410_fb_info __initdata = {
  2.         .displays = smdk2410_lcd_cfg,    //应用上面定义的配置信息
  3.         .num_displays = ARRAY_SIZE(smdk2410_lcd_cfg),
  4.         .default_display = 0,
  5.         .lpcsel = 0,//((0xCE6) & ~7) | 1<<4,    //如果不是三星公司的LCD,这个参数可以不要

  6. };

应用smdk2410_fb_info的配置信息

  1. static void __init smdk2410_init(void)
  2. {
  3.         s3c24xx_fb_set_platdata(&smdk2410_fb_info);//应用smdk2410_fb_info的配置信息。
  4.         s3c_i2c0_set_platdata(NULL);
  5.         platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices));
  6.         smdk_machine_init();
  7. }

   

参考2.6.28内核的arch/arm/mach-s3c2410/mach-smdk2410.c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值