TE2440II内核移植笔记--redxu

TE2440开发板内核移植笔记

 

参考:http://bbs.witech.com.cn/thread-468-1-1.html

宿主机:fedora9

目标机:s3c2440

交叉编译器:arm-linux-gcc-4.3.2

交叉编译器路径:/usr/local/arm/4.3.2

要移植的内核版本:linux-2.6.32.2

文件系统类型: yaffs2 ( 后续移植

移植内核要求:驱动包括nandflash,usblcdrtc.

笔记作者:redxu

 

 

  1. 下载内核linux-2.6.32.2.tar.gz(http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.gz 中可以找到) ,然后还需要下载yaffs2 文件系统,目的是为了给内核打补丁。下载地址为:http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/yaffs2.tar.gz?view=tar ( 此步骤很重要,如果yaffs2 不正确,可能引起无法正常编译通过)

  2. 将下载的文件存放在/usr/src/ 中。

  3. 分别解压缩:

[root@WEB188 src]# tar xzf linux-2.6.32.2.tar.gz

[root@WEB188 src]# tar xzf yaffs2.tar.gz

 

(一)为内核增加yaffs2 补丁

[root@WEB188 src]# cd yaffs2 

[root@WEB188 yaffs2]# ./patch-ker.sh c ../linux-2.6.32.2/

Updating ../linux-2.6.32.2//fs/Kconfig             

Updating ../linux-2.6.32.2//fs/Makefile

 

(二)修改机器码。进入内核目录,修改机器码跟bootloader 的机器码一致(TE2440为193

[root@WEB188 yaffs2]# cd ../linux-2.6.32.2

[root@WEB188 linux-2.6.32.2]#vi arch/arm/tools/mach-types

首先屏蔽以下行:

smdk2410 ARCH_S3C2410 S3C2410 193

然后将以下行:

s3c2440 ARCH_S3C2440 S3C2440 362 

修改为:

s3c2440 ARCH_S3C2440 S3C2440 193

 

(三)指定目标板machine 、编译器和编译器路径。修改Makefile 文件,注意将CROSS_COMPILE 对应到你系统中交叉编译器地址

[root@WEB188 yaffs2]# vi Makefile

将两行:

ARCH ?= $(SUBARCH)

CROSS_COMPILE ?=

修改为以下两行:

ARCH ?= arm

CROSS_COMPILE ?=/usr/local/arm/4.3.2/bin/arm-linux-

 

/*********************************************************************/

一步不要加,在高版本的内核中已经取消了对devfs的支持,源代码/arch/arm/mach-s3c2440/dev.c都已经没有了。

四)增加devfs 文件管理器的支持。(在linux自启动的时候会自动根据设备状况自动挂在到/dev里。)

    [root@WEB188 linux-2.6.32.2]# vi fs/Kconfig

    找到以下行:

    menu "Pseudo filesystems"

    在此行后面增加以下内容:

    config DEVFS_FS

    bool "/dev file system support (OBSOLETE)"

    default y

    config DEVFS_MOUNT

    bool "Automatically mount at boot"

    default y

    depends on DEVFS_FS

      /*********************************************************************/

      五)修改晶振频率( 可解决打印信息乱码问题 ) 。修改文件arch/arm/mach-s3c2440/mach-smdk2440.c

       

       

      [root@WEB188 linux-2.6.32.2]# vi arch/arm/mach-s3c2440/mach-smdk2440.c

       

      将如下行:

      s3c24xx_init_clocks(16934400);

      修改为:

      s3c24xx_init_clocks(12000000);

       

      (六)修改MTD 分区。打开文件arch/arm/plat-s3c24xx/common-smdk.c ,此处注意两个地方:一、必须跟bootloader 分区一样,二、文件系统fs_yaffs 必须在第4 个分区,即索引号为3 。其他一些分区信息可以不要,如下:

      [root@WEB188 linux-2.6.32.2]# vi arch/arm/plat-s3c24xx/common-smdk.c

      找到static struct mtd_partition smdk_default_nand_part[] 的结构体,将内容修改为:

      [0] = {

      .name = "boot",

      .size = 0x00020000,

      .offset = 0

      },

      [1] = {

      .name = "bootParam",

      .size = 0x00060000,

      .offset = 0x00020000,

      },

      [2] = {

      .name = "Kernel",

      .size = 0x00300000,

      .offset = 0x00500000,

      },

      [3] = {

      .name = "fs_yaffs",

      .size = 0x03c00000,

      .offset = 0x00800000,

      },

      [4] = {

      .name = "eboot",

      .size = 0x00080000,

      .offset = 0x04400000,

      },

      [5] = {

      .name = "WINCE",

      .size = 0x03b80000,

      .offset = 0x04480000,

      }


       

      (七)关闭ECC 校验。修改文件drivers/mtd/nand/s3c2410.c

       

      [root@WEB188 linux-2.6.32.2]# vi drivers/mtd/nand/s3c2410.c

       

      将以下行:

      chip->ecc.mode = NAND_ECC_SOFT;

      修改为:

      chip->ecc.mode = NAND_ECC_NONE;

       

      (八)修改nandflash 驱动,支持K9F1G08nandflash 。文件为:drivers/mtd/nand/nand_bbt.c

       

       

      [root@WEB188 linux-2.6.32.2]# vi drivers/mtd/nand/nand_bbt.c

      将以下两个部分进行修改

      static struct nand_bbt_descr largepage_memorybased = {

      .options = 0,

      .offs = 0,

      .len = 1, // 原始值为2 ,改成1

      .pattern = scan_ff_pattern

      };

      static struct nand_bbt_descr largepage_flashbased = {

      .options = NAND_BBT_SCAN2NDPAGE,

      .offs = 0,

      .len = 2, // 原始值为2 ,改成1

      .pattern = scan_ff_pattern

      };

       

      (九)把s3c2410 的默认配置写入config 文件(有的yaffs2 可能会出错)。

      [root@WEB188 linux-2.6.32.2]# make s3c2410_defconfig

      HOSTCC scripts/basic/fixdep

      HOSTCC scripts/basic/docproc

      HOSTCC scripts/basic/hash

      HOSTCC scripts/kconfig/conf.o

      HOSTCC scripts/kconfig/kxgettext.o

      SHIPPED scripts/kconfig/zconf.tab.c

      SHIPPED scripts/kconfig/lex.zconf.c

      SHIPPED scripts/kconfig/zconf.hash.c

      HOSTCC scripts/kconfig/zconf.tab.o

      HOSTLD scripts/kconfig/conf

      fs/yaffs2/Kconfig:179: unknown option "boot"

      make[1]: *** [s3c2410_defconfig] 错误 1

      make: *** [s3c2410_defconfig] 错误 2

       

          以上出现错误,主要是补丁造成,修改fs/yaffs2/Kconfig179 行,将boot 改成bool ,即改成如下:

      bool "Disable yaffs2 block refreshing"

      [root@WEB188 linux-2.6.32.2]# make s3c2410_defconfig

      #

      # configuration written to .config

      #

      (十)配置内核,注意System Type 中,S3C2440 中只选择以下内容即可。

      [root@WEB188 linux-2.6.32.2]# make menuconfig

      配置CPU 选项(记得跟S3C2440 Machines 平级的其它以及子项都不选)

      System Type --->

      S3C2440 Machines --->

      [*] SMDK2440

      [*] SMDK2440 with S3C2440 CPU module

      配置yaffs2 选项

      File systems --->

      [*] Miscellaneous filesystems --->

      <*> YAFFS2 file system support

      -*- 512 byte / page devices

      -*- 2048 byte (or larger) / page devices

      [*] Autoselect yaffs2 format

      [*] Cache short names in RAM

       

      (十一)最后等着基本内核大功告成把。

      [root@WEB188 linux-2.6.32.2]# make zImage

       

       

      (十二)移植USB host 驱动,仅仅需要修改配置即可

      [root@WEB188 linux-2.6.32.2]# make menuconfig

      Device Drivers --->

      [*] USB support --->

      {*} Support for Host-side USB

      [*] USB device filesystem (DEPRECATED)

      [*] USB device class-devices (DEPRECATED)

      <*> OHCI HCD support

      <*> USB Mass Storage support

       

      [*] HID Devices --->

      {*} Generic HID support

      [*] /dev/hidraw raw HID device support

       

      SCSI device support --->

      <*> SCSI device support

      [*] legacy /proc/scsi/ support

      <*> SCSI disk support

      <*> SCSI tape support

       

      (十三)移植RTC 驱动

      [root@WEB188 linux-2.6.32.2]# make menuconfig

      Device Drivers --->

      <*> Real Time Clock --->

      [*] Set system time from RTC on startup and resume

      (rtc0) RTC used to set the system time

      [ ] RTC debug support

      *** RTC interfaces ***

      [*] /sys/class/rtc/rtcN (sysfs)

      [*] /proc/driver/rtc (procfs for rtc0)

      [*] /dev/rtcN (character devices)

      <*> Samsung S3C series SoC RTC

      然后添加对设备的支持

      [root@WEB188 linux-2.6.32.2]# vi arch/arm/mach-s3c2440/mach-smdk2440.c

      smdk2440_devices 增加一行&s3c_device_rtc, 。最终效果如下:

      static struct platform_device *smdk2440_devices[] __initdata = {

      &s3c_device_usb,

      &s3c_device_lcd,

      &s3c_device_wdt,

      &s3c_device_i2c0,

      &s3c_device_iis,

      &s3c_device_rtc,// 新增的一行

      };

       


      (十四).移植LCD (我用的是群创的7寸屏)

       

      打开文件arch/arm/mach-s3c2410/mach-smdk2410.c

       

      [root@WEB188 linux-2.6.32.2]# vi arch/arm/mach-s3c2410/mach-smdk2410.c

      在以下两个结构体中static struct s3c2410fb_display smdk2440_lcd_cfg[] __initdatastatic struct s3c2410fb_mach_info smdk2440_fb_info __initdata ,改成如下代码

      /* LCD driver info */

      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,

          .width        = 800,
          .height        = 480,

          .pixclock    = 40000, /* HCLK 60 MHz, divisor 10 */
          .xres        = 800,
          .yres        = 480,
          .bpp        = 16,
          .left_margin    = 41,
          .right_margin    = 68,
          .hsync_len    = 32,
          .upper_margin    = 26,
          .lower_margin    = 6,
          .vsync_len    = 2,
      };

      static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = {
          .displays    = &smdk2440_lcd_cfg,
          .num_displays    = 1,
          .default_display = 0,
          .lpcsel = 0xf82,


          /* currently setup by downloader */
          .gpccon        = 0xaa955659,
          .gpccon_mask    = 0xffc003cc,
          .gpcup        = 0x0000ffff,
          .gpcup_mask    = 0xffffffff,
          .gpdcon        = 0xaa95aaa1,
          .gpdcon_mask    = 0xffc0fff0,
          .gpdup        = 0x0000faff,
          .gpdup_mask    = 0xffffffff,


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

       

      移植到此,基本满足了我的需要了。在向板子下载kernel,rootfs的时候要注意一点,一定要把nand清理干净!

       

       

      评论 1
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

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

      抵扣说明:

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

      余额充值