Linux内核移植
实验步骤:
(1)准备工作
(2)修改顶层Makefile
(3)修改falsh 分区
(4)配置编译内核
下面以Linux2.6.30.4内核移植到gec2440为例:
一、准备工作:
建立工作目录,下载内核源码并解压:linux-2.6.30.4.tar.bz2。步骤如下:
Mkdir
cd /root/build_kernel
tar -xvf linux-2.6.30.4.tar.gz
cd linux-2.6.30.4
解压后会在当前目录下生成一个linux-2.6.30.4 的内核源码目录
安装交叉工具链,然后修改环境变量,添加新工具链的路径信息,步骤如下:
#vi /etc/bashrc
在bashrc 脚本的最后一行添加工具链的路劲信息:
#export PATH=/usr/local/arm/4.1.2/bin:$PATH
使bashrc 脚本生效
#source /etc/bashrc
二、修改内核源码顶层 Makefile
修改内核目录树根下的的Makefile,指明体系结构是arm,交叉编译工具是arm-linux- 。
#vi Makefile
找到ARCH 和CROSS_COMPILE,修改
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/4.1.2/bin/arm-linux-
保存退出。
三、修改机器码
在u-boot-2009.11 的/board/samsun/gec2440/gec2440.c 设置了MACH_TYPE 的类型为
MACH_TYPE_SMDK2410,查看u-boot 里的include/asm-arm/mach-types.h 文件,有下
面定义:
#define MACH_TYPE_SMDK2410 193
//针对2440 的MACH_TYPE 码的值定义为193
而linux 内核源码的arch/arm/tools/mach-types 文件有如下定义:
smdk2410 MACH_SMDK2410 SMDK2410 193
即u-boot 和linux 内核的同样类型的机器码都为193。
那么我们就修改kernel 的MACH_TYPE 代码引用部分,确定kernel 的MACH_TYPE。
如下,修改arch/arm/mach-s3c2440/mach-smdk2440.c :
//修改文件最后面
将MACHINE_START(S3C2440, "SMDK2440") 修改为:MACHINE_START(SMDK2410, "SMDK2440")
修改arch/arm/kernel/head.S
//在ENTRY(stext)下添加如下代码(红色部分)
ENTRY(stext)
mov r0, #0
mov r1, #0xc1 // MACH_TYPE_SMDK2410 值193 换成十六进制就是0xc1
ldr r2, =0x30000100 //Linux kernel parameter
第二种改法:
查linux 内核源码的arch/arm/tools/mach-types 文件有如下定义:
smdk2440 MACH_SMDK2440 SMDK2440 1008
做如下修改
# vi arch/arm/mach-s3c2440/mach-smdk2440.c
将MACHINE_START(S3C2440, "SMDK2440")修改为:MACHINE_START(SMDK2440, "SMDK2440")
修改arch/arm/kernel/head.S
//在ENTRY(stext)下添加如下代码(红色部分)
ENTRY(stext)
mov r0, #0
mov r1, #0x3f0 // MACH_TYPE_SMDK2440 值1008 换成十六进制就是0x3f0
ldr r2, =0x30000100 //Linux kernel parameter
这种改法中会出现如下问题:
定义在arch/arm/mach-s3c2410/mach-smdk2410.c 中的设备驱动没能链接进来。
四、设置 flash分区
1、找到修改的内核文件,此处需要修改以下文件:
arch/arm/plat-s3c24xx/common-smdk.c ;修改分区信息
2、确定内核分区表
3.1、修改分区信息(默认 8个分区,具体分区数目可以根据项目而定,本初设置为 3个)
vi arch/arm/plat-s3c24xx/common-smdk.c
修改内核分区信息(本示例分设四个分区)。
意义:要让内核知道nand flash 的分区信息,设置成跟bootloader 一致。修改如下:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "U-Boot",
.size = 16*SZ_16K, //分区大小256k
.offset = 0, // 本分区起始地址0x0
},
[1] = {
.name = "Kernel",
.offset = 16*SZ_16K, // 本分区起始地址0x40000
.size =3*SZ_1M, // 分区大小3M
},
[2] = {
.name = "Rootfs",
.offset = MTDPART_OFS_APPEND, // 紧接上一分区地址
// 本区起始地址0x340000
.size = MTDPART_SIZ_FULL, // 使用剩余全部空间
} //本分区大小0x3cc0000
}; // 62208K
name: 代表分区名字
size: 代表flash 分区大小(单位:字节)
offset: 代表flash 分区的起始地址(相对于0x0 的偏移)
保存退出。
另外在该文件中修改smdk_nand_info 如下:
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls =0, //default is 20 参数设置需参看datasheet,上有描述
.twrph0 =30, //default is 60
.twrph1 =0, //defualt is 20
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
3.2、修改时钟 (终端输出若有乱码则需修改)
在arch/arm/mach-s3c2440/mach-smdk2440.c 中修改smdk2440_map_io 如下
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000); //default is 0
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
3.3、修改 nand Flash的校验方式,去掉 ECC校验,否则上电启动会提示ECC错误或者 I/O读取错误。
在drivers/mtd/nand/s3c2410.c 中
将chip->ecc.mode = NAND_ECC_SOFT; 改为 chip->ecc.mode = NAND_ECC_NONE;
五、配置编译内核
#make s3c2410_defconfig
#make menuconfig
在s3c2410_defconfig 基础上,增删的内核配置项如下:
这里约定“#”后面的是注释部分。
Boot options --> Default kernel command string:
noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200 (接下行)
rootfstype=jffs2
#说明:mtdblock2 代表第3 个flash 分区,它是预设的rootfs 分区
# console=ttySAC0,115200 使kernel 启动期间的信息全部输出到串口0 上.
# 2.6 内核对于串口的命名改为ttySAC0,但这不影响用户空间的串口编程。
# 用户空间的串口编程针对的仍是/dev/ttyS0 等
#接下来做的是针对文件系统的设置,实验时目标板上要上的文件系统是cramfs
与jffs2,故做如下配置
File systems -->
<> Second extended fs support
#去除对ext2 的支持
Miscellaneous filesystems -->
[*] JFFS2 XATTR support (EXPERIMENTAL)
#支持jffs2 和cramfs 文件系统
Network File Systems --> #支持NFS 文件系统
[ ] NFS client support for the NFSv3 ACL protocol extension
[*]NFS client support for NFS version 4 (EXPERIMENTAL)
<*> NFS server support
Kernel Features --->
[*] Use the ARM EABI to compile the kernel
# 一定要选上, 否则会出现内核恐慌(内核指针跑飞)
保存退出,产生.config 内核配置文件,该文件会在make 的时候被调用。
编译内核:make
编译完成后会在arch/arm/boot/目录下生产zImage 内核映象。zImage 映象是可引导的,
压缩的内核映象,就是我们要移植到开发板上的内核映象文件。
uImage 镜像制作:
[root@localhost tools]# ./mkimage -n 'linux-2.6.30.4' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d /root/build_kernel/linux-2.6.30.4/arch/arm/boot/zImage /root/build_kernel/linux-2.6.30.4/arch/arm/boot/uImage
上述步骤仅添加了外设flash 与串口等一些基本的驱动,实现一个能在开发板上运行的内核镜像。根据项目要求,需要继续移植的还有:
CD、触摸DM9000 网卡、L 屏、USB、音频等驱动。
详细文档下载链接: http://download.csdn.net/detail/klcf0220/5749067
http://download.csdn.net/detail/klcf0220/5823991
S5PV210的Linux-2.6.35内核移植: http://download.csdn.net/detail/klcf0220/5751173
S5PV210的u-boot移植:http://download.csdn.net/detail/klcf0220/5823953