本文是基于JZ2440板进行内核移植,结合了《嵌入式Linux应用开发完全手册》内核移植和其他文章的总结出的。
一、利用打补丁的方式实现内核移植
$ tar xjf linux-2.6.22.6.tar.bz2 –C ./
$ cd inux-2.6.22
$ patch -p1 <.../linux-2.6.22.6_jz2440.patch
$ mv …/4.3寸LCD_mach-smdk2440.c arch/arm/mach-s3c2440/mach-smdk2440.c
$ cp config_ok .config
$ make uImage
将在arch/arm/boot目录生成zImage文件。后面只要将uImage烧写到板子就完成移植了。
二、移植前准备
$ tar xjf linux-2.6.22.6.tar.bz2 –C ./
$ cd linux-2.6.22
三、内核的移植
1.修改顶层Makefile
在185行
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改成:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
2.修改平台时钟
平台时钟要看你的开发板上外接的晶振是多少。
$ gedit arch/arm/mach-s3c2440/mach-smdk2440.c
在327行
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
//s3c24xx_init_clocks(16934400); //注释这句,加入下一句
s3c24xx_init_clocks(12000000);
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
3.修改机器码
在arch/arm/tools/mach-type 中s3c2440的机器码一定要与u-boot中的一致,
linux内核的机器码在:arch/arm/tools/mach-types
u-boot的机器码是在:include/asm-arm/mach-types.h
$ gedit arch/arm/tools/mach-types
s3c2410 ARCH_S3C2410 S3C2410 182
smdk2410 ARCH_SMDK2410 SMDK2410 193
s3c2440 ARCH_S3C2440 S3C2440 362
$ gedit include/asm-arm/mach-types.h
#define MACH_TYPE_S3C2410 182
#define MACH_TYPE_SMDK2410 193
#define MACH_TYPE_S3C2440 362
4.移植nandflash驱动(修改NAND Flash分区)
$ gedit arch/arm/plat-s3c24xx/common-smdk.c
根据bootlorder 里面的分区情况进行更改。会涉及到如下结构:
static struct platform_device __initdata *smdk_devs[]= {};
static struct mtd_partition smdk_default_nand_part[] ={};
$ gedit 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,
&s3c2440_device_sdi,
};
5.修改MTD分区
$ gedit arch/arm/plat-s3c24xx/common-smdk.c
static struct mtd_partition smdk_default_nand_part[] ={
[0] = {
.name = "kernel",
.size = SZ_2M,
.offset = 0,
},
[1] = {
.name = "jffs2",
.offset= MTDPART_OFS_APPEND,
.size = SZ_8M,
},
[2] = {
.name = "yaffs",
.offset= MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
其中MTDPART_OFS_APPEND表示当前分区紧接着上一个分区,MTDPART_SIZ_FULL表示当前分区的大小为剩余flash空间。
6.配置内核
$ cp arch/arm/configs/s3c2410_defconfig .config
$ make menuconfig
7.移植YAFFS文件系统
一般而言,在NOR Flash上使用JFFS2文件系统,在NANDFlash上使用YAFFS文件系统。
$ cd /.../Development/yaffs2
$ ./patch-ker.shc /…/linux-2.6.22.6
8.编译内核
$mv .../4.3寸LCD_mach-smdk2440.c arch/arm/mach-s3c2440/mach-smdk2440.c(这一步是为了把4.3寸LCD的源码覆盖原来的3.5寸源码)
$ cp config_ok .config
$ make uImage
将在arch/arm/boot目录生成zImage文件
9.烧写内核
将文件拷到tftp文件夹。
$ tftp 0x32000000 zImage
或$ nfs 0x30000000192.168.1.106:/home/ubuntu/nfs/zImage
$ nand erase 00x200000
$ nand write.jffs2 0x32000000 0 $ (filesize)
10.启动内核
可以使用以下命令启动NAND Flash上的内核
$ nboot 0x32000000 0 0
$ bootm 0x3200000
要想开发板上电后内核自动启动,可以设置bootcmd环境变量。
$ set bootcmd ‘nboot0x32000000 0 0; bootm 0x32000000’
$saveenv