mini2440的 linux内核移植
参考网上的资料将linux-2.6.30.5的内核移植到了mini2440开发板,现把移植过程整理下来备忘。
电脑主机系统:Ubuntu 9.04 mini2440开发板bootloader:supervivi
交叉编译器使用友善之臂提供的符合EABI标准的交叉编译器 arm-linux-gcc-4.3.2
1.首先到到 http://www.kernel.org/去下载内核源码。我是下载的linux-2.6.30.5.tar.bz2
2.将内核源码解压,可以解压到任意你想放源码文件的地方
tar xvzf linux-2.6.30.5.tar.gz
3.进入内核源码,修改顶层Makefile文件中的编译器选项。
gedit Makefile 打开Makefile
将makefile里的
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
修改为
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
4.修改内核中平台的时钟频率(mini2440开发板使用12M晶振)。
修改内核源码 “arch/arm/mach- s3c2440/mach-smdk2440.c” 文件的 163 行,
把 16.9344MHz 修改为12MHz
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000); //修改为 12000000,默认为 16934400
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
5.修改对nand的分区信息。要让内核知道nand flash的分区信息,设置成跟bootloader一致。
在arch/arm/plat-s3c24xx/common-smdk.c中修改smdk_default_nand_part[],注意这个一定
要跟bootloader的一致。在我的板子中修改如下:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "supervivi",
.size = 0x000000030000,
.offset = 0,
},
[1] = {
.name = "Kernel",
.offset = 0x000000050000,
.size = 0x000000200000,
},
[2] = {
.name = "root",
.offset = 0x000000250000,
.size = 0x000003DAC000,
}
};
此处我通过supervivi查看到的分区信息写进去竟然不对,我通过mini2440原来的内核启动信息查
到分区信息如下:
Creating 3 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x000000000000-0x000000030000 : "supervivi"
0x000000050000-0x000000250000 : "Kernel"
0x000000250000-0x000003ffc000 : "root"
另外这个文件还要修改smdk_nand_info如下:
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls = 0, //default is 20
.twrph0 = 30, //default is 60
.twrph1 = 0, //defualt is 20
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
//有的文章介绍说这个文件还要修改但查看友善之臂的内核发现并没有改,
因此我也没有修改,最终也没出现问题.
6.修改机器码。
mini2440 使用的 supervivi 的机器码是782,这里需要修改机器码,否则会出现不能启动的情况。
机器码保存在内核源码的 “arch/arm/tools/mach-types” 文件中,在大概 379 行,把原来的 362
改为782保存即可。
7. 修改drivers/mtd/nand/s3c2410.c,去掉nand flash 的ECC。(此步未做,通过)
如果内核是通过U-BOOT 写到Nand Flash的, U-BOOT 通过的软件ECC算法产生ECC校 验码,
这与内核校验的ECC码不一样, 内核中的ECC码是由S3C2410中Nand Flash控制器产生 的。所以,
我在这里选择禁止内核ECC校验。
搜索关键字NAND_ECC_SOFT,s3c2410_nand_init_chip函数里,修改NAND_ECC_SOFT
为 NAND_ECC_NONE
8.增加Yaffs2文件系统的支持
首先到 http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/网站下 载一个 yaffs 文件系统的补丁。
得到补丁包后,解压补丁,然后打上 yaffs2 的补丁,方法如下:
#tar xvfz cvs-root.tar.gz (解压得到补丁目录 cvs)
#cd cvs/yaffs2/ (进到 yaffs2 的补丁目录下)
# ./patch-ker.sh c /work/transplantation/trans_show/linux-2.6.30.5
(执行补丁脚本,打补丁到内核中,其中/work/transplantation/trans_show/linux-2.6.30.5
为内核源码的地址)
此时到内核源码的“fs/”目录下面您将看到新添加了一个名为“yaffs2/”的目录,同时 fs/目录下面的
Makefile 文件和 Kconfig 文件也添加了 yaffs2 的配置和编译条件。
9.配置内核
调用自带的一个默认配置单, 该配置单在内核源码的 “arch/arm/configs/”
目录下面,名为:“s3c2410_defconfig”,该配置文件里面选择了几乎所有的和 S3C24XX 系列
CPU 相关的 配置选项,我们完全可以在该配置单的基础上进行配置。
# cp arch/arm/configs/s3c2410_defconfig .config
# make menuconfig
(1).General setup --->
[*] Configure standard kernel features (for small systems) --->
选上这项,否则文件系统中的一些选项不会出现
(2). System Type ---->
[*] S3C2410 DMA support [*] Support ARM920T processor
S3C2440 Machines --->
[*] SMDK2440
[*] SMDK2440 with S3C2440 CPU module
(3).[*] Enable loadable module support --->
[*] Module unloading
(4).Device Drivers --->
<*> Memory Technology Device (MTD) support --->
[*] MTD partitioning support
<*> NAND Device Support --->
<*> NAND Flash support for S3C2410/S3C2440 SoC
[ ] S3C2410 NAND Hardware ECC //这个要去掉
[*] Network device support --->
[*] Ethernet (10 or 100Mbit) --->
<*> DM9000 support
< > Real Time Clock --->
(5).File systems----->
Miscellaneous filesystems --->
<*>YAFFS2 file system support
(6).kernel Features----->
[*]Use the ARM EABI to compile the Kernel
保存退出
10.编译内核 make zImage
编译完成后下载内核启动即可。