移植Linux内核2.6.32.2到QQ2440开发板

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 目录下.