ice00 2010-08-30
好长时间没写了,实际上这个工作在很早的时候就完成了,但是一直没有写下来,今天花点时间把Linux内核移植的步骤详细的总结一下,方便自己知识的积累:
一. 移植环境
主机:虚拟机 Fedora9
目标机:友善之臂 QQ2440开发板
交叉编译器:arm-linux-3.4.1
二. 移植linux-2.6.32.2内核到QQ2440开发板
1.获得内核: http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.bz2
2.解压内核: tar –jxvf linux-2.6.32.2.tar.bz2
3.修改参数:
1、 进入内核目录,修改makefile
ARCH ?=arm
CROSS_COMPILE ?=arm-linux-
然后执行如下的命令,使用arch/arm/configs/s3c2410_defconfig文件来配置内核,它生成.config配置文件,以后就可以直接使用”make menuconfig”修改配置了。
make s3c2410_defconfig
最后是编译生成内核,执行”make”命令将在顶层目录下生成内核映像文件vmlinux;执行”make uImage”除生成vmlinux外,还在arch/arm/boot目录下生成U-Boot格式的内核映像文件uImage;执行”make zImage”除生成vmlinux外,还在arch/arm/boot目录下生成vivi引导的内核映像文件zImage。
2、 修改平台输入时钟由于QQ2440板子 系统时钟源为 12M 无源晶振
找到内核源码arch/arm/mach-s3c2440/mach-smdk2440.c文件,
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000);//原来是16934400
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
3、 修改MTD分区信息
修改文件arch/arm/plat-s3c24xx/common-smdk.c。
第一,修改分区信息(64M):
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.offset = 0x00000000,
.size = 0x00030000,
},
[1] = {
.name = "kernel",
.offset = 0x00050000,
.size = 0x00200000,
},
[2] = {
.name = "root",
.offset = 0x00250000,
.size = 0x03dac000,
}
};
4、 修改S3C2440 的机器号
由于Bootloader 传递给Linux 内核的机器号为782(根据实际的情况)
修改 arch/arm/tools/mach-types 文件
s3c2440 ARCH_S3C2440 S3C2440 782
5、 给内核打yaffs2文件系统的补丁
从http:/www.aleph1.co.uk/cgi-bin/viewcvs.cgi/获取源代码文件cvs-root.tar,解压源码目录并进入目录
cd /…/…/cvs/yaffs2
./patch-ker.sh c /
上面命令完成下面三件事情:
(1) 修改内核fs/Kconfig
增加一行:source "fs/yaffs2/Kconfig"
(2) 修改内核fs/Kconfig
增加一行:ojb-$(CONFIG_YAFFS_FS) +=yaffs2/
(3) 在内核fs/目录下创建yaffs2 目录
将yaffs2 源码目录下面的Makefile.kernel 文件复制为fs/yaffs2/Makefie;
将yaffs2 源码目录的Kconfig 文件复制到内核fs/yaffs2 目录下;
将yaffs2 源码目录下的*.c *.h 文件复制到内核fs/yaffs2 目录下.