二、内核移植


1 修改Makefile文件

进入内核文件夹,vim Makefile。 修改:
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
为:
ARCH ?= arm

CROSS_COMPILE ?=arm-linux- 

注意:arm、arm-linux-后不要留空格


测试linux编译是否能通过:

(1)make s3c2410_defconfig 或 cp arch/arm/configs/s3c2410_defconfig .config

这里,使用了s3c2410_defconfig这个已经配置好的文件。这个文件适用于s3c2440。

执行这个文件后可以生成一个 .config的文件

(2)make

看是否能通过


2、建立自己的目标平台

(1)机器码

 a、在linux-2.6.32.2/arch/arm/tools/mach_types 文件中

      b、将linux-2.6.32.2/arch/arm/mach-s3c2440/目录下的mach-smdk2440.c 复制一份。命名为mach-mini2440.c ,

 找到MACHINE_START(S3C2440, "SMDK2440") , 修改为MACHINE_START(MINI2440, "my board")。

      c、修改时钟

在mach-mini2440.c( 就是我们刚刚通过复制mach-smdk2440.c 得到的)的第160 行static void __init smdk2440_map_io(void)函数中,把其中的16934400(代表原SMDK2440 目标板上的晶振是16.9344MHz)改为mini2440 开发板上实际使用的12000000(代表mini2440 开发板上的晶振12MHz,元器件标号为X2)

      d、从SMDK2440 到MINI2440

因为我们要制作自己的mini2440 平台体系,因此把mach-mini2440.c 中所有的smdk2440 字样改为mini2440,可以使用批处理命令修改,在vim 的命令模式下输入:%s/smdk2440/mini2440/g
上面这句的意思是:把所有和“smdk2440”匹配的字符串全部替换为“mini2440”,前、面的“%s“代表字符串匹配,最后的“g”代表global,是全局的意思。

除此之外,还有一个地方需要改动,在mini2440_machine_init(void)函数中,把smdk_machine_init()函数调用注释掉,因为我们后面会编写自己的初始化函数,不需要调用smdk2440 原来的。

最后编译测试

在 Linux 源代码根目录下执行
#make mini2440_defconfig ;使用Linux 官方自带的mini2440 配置
#make zImage ;编译内核,时间较长,最后会生成zImage
重新编译并把生成的内核文件zImage(位于arch/arm/boot 目录)下到板子中,可以看到内核已经可以正常启动了


3、移植Nand 驱动并更改分区信息

1、在自己的mach-mini2440.c 中照此添加实现,同时需要参考友善之臂原厂内核中的Nand 分区表。因此,在mach-mini2440.c 中加入以下代码:(放在最前面,头文件的下面)

static struct mtd_partition mini2440_default_nand_part[] = {
[0] = {
.name = "supervivi", //这里是bootloader 所在的分区,可以放置u-boot, supervivi 等内容,对应/dev/mtdblock0
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = "param", //这里是supervivi 的参数区,其实也属于bootloader 的一部分,如果u-boot 比较大,可以把此区域覆盖掉,不会影响系统启动,对应/dev/mtdblock1
.offset = 0x00040000,
.size = 0x00020000,
},
[2] = {
.name = "Kernel", //内核所在的分区,大小为5M,足够放下大部分自己定制的巨型内核了,比如内核使用了更大的Linux Logo 图片等,对应/dev/mtdblock2
.offset = 0x00060000,
.size = 0x00500000,
},
[3] = {
.name = "root", //文件系统分区,友善之臂主要用来存放yaffs2 文件系统内容,对应/dev/mtdblock3
.offset = 0x00560000,
.size = 1024 * 1024 * 1024, //
},
[4] = {
.name = "nand", //此区域代表了整片的nand flash,主要是预留使用,比如以后可以通过应用程序访问读取/dev/mtdblock4 就能实现备份整片nand flash 了。
.offset = 0x00000000,
.size = 1024 * 1024 * 1024, //
}
};
//这里是开发板的nand flash 设置表,因为板子上只有一片,因此也就只有一个表
static struct s3c2410_nand_set mini2440_nand_sets[] = {
[0] = {
.name = "NAND",
.nr_chips = 1,
.nr_partitions = ARRAY_SIZE(mini2440_default_nand_part),
.partitions = mini2440_default_nand_part,
},
};
//这里是nand flash 本身的一些特性,一般需要对照datasheet 填写,大部分情况下按照以下参数填写即可
static struct s3c2410_platform_nand mini2440_nand_info = {
.tacls = 20,
.twrph0 = 60,
.twrph1 = 20,
.nr_sets = ARRAY_SIZE(mini2440_nand_sets),
.sets = mini2440_nand_sets,
.ignore_unset_ecc = 1,
};

4、yaffs移植

a、为内核打上yaffs2 补丁

#cd yaffs2
#./patch-ker.sh c /home/linux-2.6.32.2

上述命令完成:1、修改fs/Kconfig

  2、修改fs/Makefile

  3、在fs下创建yaffs2目录

b、配置和编译带YAFFS2 支持的内核

make menuconfig

file system———“Miscellaneous filesystems”——“YAFFS2 file system support”



你可能感兴趣的:(二、内核移植)