分享

新内核移植示例

 ebookman 2012-03-02

移植linux-2.6.28内核(假设已下载linux-2.6.28.tar.gz)

 

1. 解压源代码

我将已下载的linux-2.6.28.tar.gz放置在/usr/local/arm目录下,所以,进入/usr/local/arm目录,解压内核源代码:

#cd /usr/local/arm

#tar zxvf linux-2.6.28.tar.gz

#cd linux-2.6.28

2. 更改Makefile

#ARCH              ?= $(SUBARCH)

#CROSS_COMPILE  ?=

ARCH                ?= arm

CROSS_COMPILE    ?= arm-linux-

或者:CROSS_COMPILE       ?= /usr/local/arm/3.4.1/bin/arm-linux-

我是将交叉编译器安装在/usr/local/arm目录下的。

3. 生成默认配置 --->arch/arm/configs/ 下有许多已有的配置文件

#make s3c2410_defconfig

执行后,在终端打印出如下信息:

 

[root@localhost linux-2.6.28]# 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

#

# configuration written to .config

#

[root@localhost linux-2.6.28]#

 

4. 增加devfs文件系统支持linux2.6.28已经去掉devfs,为了内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统,修改fs的Kconfig文件。linux-2.6.28/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

 

5. 修改晶振( 可解决打印信息乱码问题 )

文件:arch/arm/mach-s3c2440/mach-smdk2440.c

/*s3c24xx_init_clocks(16934400);*/

s3c24xx_init_clocks(12000000);

 

6. 添加sdi设备,&s3c_device_sdi, 解决SD卡匹配问题,否则,插入SD卡没反应。

文件:arch/arm/mach-s3c2440/mach-smdk2440.c

 

static struct platform_device *smdk2440_devices[] __initdata = {

         &s3c_device_usb,

         &s3c_device_lcd,

         &s3c_device_wdt,

         &s3c_device_i2c,

         &s3c_device_iis,

         &s3c_device_sdi,  //添加这一行,否则,插入SD卡没反应

};

 

7. 修改MTD分区

文件: arch/arm/plat-s3c24xx/common-smdk.c

需要和bootloader中的分区信息相同,否则,启动时出错。

static struct mtd_partition smdk_default_nand_part[] = {

 

         [0] = {

                   .name        = "Boot",

                   .size  = 0x00030000,

                   .offset       = 0

         },

 

         [1] = {

                   .name        = "MyApp",

                   .size  = 0x00100000,

                   .offset       = 0x00030000,

         },

 

         [2] = {

                   .name        = "Kernel",

                   .size  = 0x002d0000,

                   .offset       = 0x00130000,

         },

 

         [3] = {

                   .name        = "fs_cramfs_20M",

                   .size  = 0x01400000,    //20M

                   .offset       = 0x00400000,

         },

 

         [4] = {

                   .name        = "fs_yaffs_38M",

                   .size  = 0x02600000,    //38M

                   .offset       = 0x01800000,

         },     

 

         [5] = {

                   .name        = "WINCE_2M",    //2M

                   .size  = 0x00200000,

                   .offset       = 0x03e00000,

         }

 

};

 

8. 关闭ECC校验

文件:drivers/mtd/nand/s3c2410.c

函数:s3c2410_nand_init_chip

/*chip->ecc.mode = NAND_ECC_SOFT; */

chip->ecc.mode = NAND_ECC_NONE;

 

9.  配置内核

#make xconfig

 

终端中打印出:

 

[root@localhost linux-2.6.28]# 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

#

# configuration written to .config

#

[root@localhost linux-2.6.28]# make xconfig

 

  CHECK   qt

 

sed < scripts/kconfig/lkc_proto.h > scripts/kconfig/lkc_defs.h 's/P(/([^,]*/),.*/#define /1 (/*/1_p)/'

 

  HOSTCC  scripts/kconfig/kconfig_load.o

 

/usr/lib/qt-3.3/bin/moc -i scripts/kconfig/qconf.h -o scripts/kconfig/qconf.moc

 

  HOSTCXX scripts/kconfig/qconf.o

 

  HOSTLD  scripts/kconfig/qconf

 

scripts/kconfig/qconf arch/arm/Kconfig

 

 

 

 

然后弹出配置界面:


 

其中有几项一定要修改的,分别是:

a. 启动

|---Boot options| |---Default kernel command string: [root=/dev/mtdblock3 rootfstype=cramfs init=/linuxrc console=ttySAC0,115200 devfs=mount mem=64]

分析:

/dev/mtdblock3 : 表示MTD分区的第3个分区存储根文件系统

rootfstype=cramfs : 分区是cramfs类型,这项不加应该关系不大

init=/linuxrc : 启动的首个脚本即根目录下的linuxrc

console=ttySAC0,115200 : 使用串口1作为串口调试,波特率设置为115200; 现在已经摒弃了以前使用ttyS0的写法

devfs=mount : 在/sbin/init运行之前能自动挂载/dev为devfs文件系统

mem=64 : 存储器大小为64M

 

b. 增加devfs文件系统支持


这几项都是必选的

 

c. 芯片及系统类型


支持2440时,这一项也是必选的,否则会编译不过

d. DMA  Engine support

需要将此项选择,否则编译会出错。


e. MMC/SD/SDIO card support

选中此项进行对MMC/SD/SDIO的支持


 

f. 去掉Ethernet (1000 Mbit)和Ethernet (10000 Mbit)

也可不去,为了压缩内核大小,我去掉了这两项。

 


10.  保存配置并退出xconfig,生成zImage文件

 

#make zImage

 

OK,将生成的zImage文件烧到开发板上就可以了,只是现在这个内核还不能支持yaffs文件系统,待以后完善。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多