[ARM-LINUX]移植2.6.31.12内核到立宇泰ARMSYS2440开发板之LCD驱动+触摸屏驱动

来源:互联网 发布:conico软件 编辑:程序博客网 时间:2024/05/01 03:15

移植完内核和网卡驱动后,下一步就是移植LCD驱动和触摸屏驱动,使我们的tft屏亮起来。

 

注意:文件系统因为是只读的,因此设备节点一律需要手动添加,包括console、null、lcd的fb、ts等。

 

 7. LCD驱动移植

  LCD驱动我们采取了两种方法来移植,每一种方法都可以。一种是移植开发板自带内核中的LCD驱动,另一种就是修改新内核中的LCD驱动。在这里我们分别列出:

  1). 移植开发板自带内核中的LCD驱动

    将板子自带的驱动s3c2410fb.c和.h文件拷备到新内核的drivers/video/目录下,替换原来的文件。

    修改s3c2410fb.c: 主要是修改头文件引用,因为两个内核之间的目录结构有差异。如:

           新内核                     旧内核

           无                   #include <linux/config.h>

      #include <linux/platform_device.h>      #include <linux/device.h>

      #include <mach/hardware.h>         #include <asm/hardware.h>

      #include <mach/regs-gpio.h>         #include <asm/arch/regs-gpio.h>
      #include <mach/regs-lcd.h>          #include <asm/arch/regs-lcd.h>
    修改arch/arm/mach-s3c2410/mach-smdk2410.c,增加LCD相关的map:

      static struct map_desc smdk2410_iodesc[] __initdata = {
        /* nothing here yet */
        {vSMDK2410_ETH_IO,pSMDK2410_ETH_IO,SZ_1M,MT_DEVICE}, // 8900  zhangw
        IODESC_ENT(LCD), // zhangw
        IODESC_ENT(GPIO), // zhangw
        IODESC_ENT(DMA), // zhangw
        IODESC_ENT(IRQ), // zhangw
      };

    修改后,注意map.h中添加S3C24XX_VA_LCD等的定义,编译内核,烧到板子上启动;

    启动后会出现访问空指针的问题,经查看,是regs-lcd.h中的S3C2410_LCDREG(x)的定义不同造成的,参照原有内核中的进行修改。

    因为我们的内核是只读的cramfs,而新内核虽然是配置了devfs支持,但因为没有源码支持,因此devfs还是无效,因此要保证/dev下有framebuffer的节点fb0,若没有,用mknod命令在文件系统中添加,然后重新烧写文件系统,最好是把你可能用到的所有设备节点都建好备用,建节点属性可以参考原有内核中的设备节点属性。

 

    板子启动后,发现文字和图像是左右反着的,左右互换了,从网上查,参考了"S3C2410下LCD驱动程序移植及GUI程序编写.pdf",以为是参数问题,修改参数无效。最后发现是LCD屏硬件连接不牢,导致屏幕显示不稳定,唉,准备工作没做足啊!

    检查了LCD硬件连接没问题后,LCD显示正常了。

 

  2). 修改新内核中的LCD驱动

    新内核的LCD驱动修改更简单一些,主要就是mach信息的修改。

    原有内核驱动中的mach信息为:

      struct pxafb_mach_info S3C2410_800X480_info = {
       .pixclock = 174757,
       .xres  = 800,
       .yres  = 480,
       .bpp  = 16,
       .hsync_len = 95,
       .left_margin = 14,
       .right_margin = 46,
       .vsync_len = 1,
       .upper_margin = 10,
       .lower_margin = 31,
       .sync  = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
       .cmap_greyscale = 0,
       .cmap_inverse = 0,
       .cmap_static = 0,
       .reg  = {
        lcdcon1 : (1<<8)|(1<<7)|(3<<5)|(12<<1),
        lcdcon2 : (31<<24)|(479<<14)|(10<<6)|1,
        lcdcon3 : (39<<19)|(799<<8)|23,
        lcdcon4 : (13<<8)|95,
        lcdcon5 : (1<<11)|(1<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)|(1<<3)|1,
       }
      };

      lcdcon1~5的值有对应的宏可以查看,位置:arch/arm/mach-s3c2410/include/mach/regs-lcd.h

    修改arch/arm/mach-s3c2410/mach-smdk2410.c:

      /* LCD driver info */

      static struct s3c2410fb_display s3c2410_lcd_cfg[] __initdata = {
       
       {
        /* Config for 800X480 LCD */
        .lcdcon5 = (1<<11)|(1<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)|(1<<3)|1,
        .type = S3C2410_LCDCON1_TFT,
          .pixclock = 174757,
          .xres  = 800,
          .yres  = 480,
          .bpp  = 16,
          .hsync_len = 95,
          .left_margin = 14,
          .right_margin = 46,
          .vsync_len = 1,
          .upper_margin = 10,
          .lower_margin = 31,
       },
      };

      static struct s3c2410fb_mach_info s3c2410_fb_info __initdata = {
       .displays  = s3c2410_lcd_cfg,
       .num_displays  = ARRAY_SIZE(s3c2410_lcd_cfg),
       .default_display = 0,

       .lpcsel  = ((0xCE6) & ~7) | 1<<4,
       
      };

 

      在smdk2410_init()函数中添加s3c24xx_fb_set_platdata(&s3c2410_fb_info);

 

    编译内核即可,当然这里还没有小企鹅,可以参照原有内核的方法添加,启动后就会有小企鹅了。

 

8. 触摸屏驱动移植

  触摸屏驱动移植主要是将原有内核中的驱动拿过来进行修改。

  1). 配置dev和mach信息:

    修改devs.c: 增加ts设备定义

      /* Touchscreen */
      static struct s3c2410_ts_mach_info s3c2410ts_info;

      void __init set_s3c2410ts_info(struct s3c2410_ts_mach_info *hard_s3c2410ts_info)
      {
       memcpy(&s3c2410ts_info,hard_s3c2410ts_info,sizeof(struct s3c2410_ts_mach_info));
      }
      EXPORT_SYMBOL(set_s3c2410ts_info);

      struct platform_device s3c_device_ts = {
       .name    = "s3c2410-ts",
       .id    = -1,
       .dev              = {
         .platform_data = &s3c2410ts_info,
       }
      };
      EXPORT_SYMBOL(s3c_device_ts);

    修改devs.h:增加ts设备声明

      extern struct platform_device s3c_device_ts;

    修改mach-smdk2410.c:增加ts设备的mach信息

      static struct s3c2410_ts_mach_info smdk2410_ts_cfg __initdata = {

           .delay = 10000,

           .presc = 49,

           .oversampling_shift = 2,

      };

      static struct platform_device *smdk2410_devices[] __initdata = {
       &s3c_device_usb,
       &s3c_device_lcd,
       &s3c_device_wdt,
       &s3c_device_i2c0,
       &s3c_device_iis,
       &s3c_device_rtc,
       &s3c_device_ts,
      };

      static void __init smdk2410_init(void)
      {
       s3c_i2c0_set_platdata(NULL);
       s3c24xx_fb_set_platdata(&s3c2410_fb_info);
       set_s3c2410ts_info(&smdk2410_ts_cfg);
       platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices));
       smdk_machine_init();
      }


    2). 增加ts内核驱动配置及源码

      将s3c2410ts.c拷备到新内核arch/arm/mach-s3c2410/include/mach/目录下,s3c2410ts.h拷到arch/arm/mach-s3c2410/include/mach/目录下。

      修改arch/arm/mach-s3c2410/include/mach/目录下Kconfig,增加:

        choice
           prompt "S3C2410 touchscreen driver"
           default S3C2410_TS
           depends on ARCH_S3C2410

           config S3C2410_TS
           tristate "touchscreen added by zhangw"

         endchoice

      修改arch/arm/mach-s3c2410/include/mach/目录下Makefile,增加:

        obj-$(CONFIG_S3C2410_TS)        += s3c2410ts.o

      修改s3c2410ts.c:

        头文件引用修改:蓝色部分是修改的

        //zhangw #include <linux/config.h>
        #include <linux/module.h>
        #include <linux/moduleparam.h>
        #include <linux/kernel.h>
        #include <linux/sched.h>
        #include <linux/init.h>
        #include <linux/device.h>
        #include <linux/miscdevice.h>
        #include <linux/delay.h>
        #include <linux/poll.h>
        #include <linux/spinlock.h>
        #include <linux/interrupt.h>
        #include <linux/delay.h>
        #include <linux/clk.h>
        #include <asm/atomic.h>
        //zhangw #include <linux/devfs_fs_kernel.h>

        #include <mach/hardware.h>
        #include <asm/io.h>
        #include <mach/regs-gpio.h>

        #include <plat/clock.h>
        #include <linux/platform_device.h>

      添加宏定义:

        #define SA_INTERRUPT          IRQF_DISABLED

      屏蔽宏:

        #ifdef CONFIG_PM
        #undef CONFIG_PM
        #endif

        #ifdef CONFIG_DEVFS_FS
        #undef CONFIG_DEVFS_FS
        #endif

      屏蔽函数:

        //clk_use(adc_clock);

    修改后,编译内核,烧写内核。启动后触摸屏可用。

原创粉丝点击