移植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/ 下有许多已有的配置文件 执行后,在终端打印出如下信息: [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. 配置内核 终端中打印出: [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文件 OK,将生成的zImage文件烧到开发板上就可以了,只是现在这个内核还不能支持yaffs文件系统,待以后完善。
|