1
广州广嵌电子科技有限公司
>>http://www.gec-lab.org(系统组编辑)
GEC2440&Linux 2.6.30.4 内核移植实验
概述:
对于嵌入式 linux系统来说,有各种体系结构的处理器和硬件平台,用户根据自己
的需要定制的硬件平台,只要是硬件平台有一点点变化,就需要做一些移植工作,linux
内核移植是嵌入式 linux系统中最常见的一项工作。
由于 linux内核具备可移植性的特点,并且已经支持了很多种目标板,这样,用户
很容易从中找到跟自己硬件平台类似的目标板,参考内核已经支持的目标板来进行移植
工作。
linux-2.6内核已经支持S3C2440处理器的多种硬件板,由于S3C2410跟S3C2440
同属于 ARM920T系列芯片,且寄存器等硬件电路基本一致,我们可以参考 SMDK2410
参考板来移植 2440开发板
实验步骤:
(1)准备工作
(2)修改顶层 Makefile
(3)修改 falsh 分区
(4)配置编译内核
一、准备工作
建立工作
目录
工贸企业有限空间作业目录特种设备作业人员作业种类与目录特种设备作业人员目录1类医疗器械目录高值医用耗材参考目录
,下载内核源码:linux-2.6.30.4.tar.bz2。步骤如下:
Mkdir
cd /root/build_kernel
tar jxvf linux-2.6.30.4.tar.gz
解压后会在当前目录下生成一个 linux-2.6.30.4的内核源码目录
安装交叉工具链,步骤如下:
#mkdir /usr/local/arm
#cd /usr/local/arm
#tar jxvf eabi-0529.tar.bz2
解压后会在当前目录下生成一个 eabi的工具链目录
#mv eabi 4.1.2
修改环境变量,添加新工具链的路径信息,步骤如下:
#vi /etc/bashrc
在 bashrc脚本的最后一行添加工具链的路劲信息:
#export PATH=/usr/local/arm/4.1.2/bin:$PATH
使 bashrc脚本生效
#source /etc/bashrc
二、修改内核源码顶层 MakefileMakefileMakefileMakefile
修改内核目录树根下的的 Makefile,指明体系结构是 arm,交叉编译工具是 arm-linux-。
#vi Makefile
找到 ARCH和 CROSS_COMPILE,修改
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/4.1.2/bin/arm-linux-
2
广州广嵌电子科技有限公司
>>http://www.gec-lab.org(系统组编辑)
保存退出。
三、修改机器码
在 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 中的设备驱动没能链接进来。
3
广州广嵌电子科技有限公司
>>http://www.gec-lab.org(系统组编辑)
四、设置 flashflashflashflash分区
1、找到修改的内核文件,此处需要修改以下文件:
arch/arm/plat-s3c24xx/common-smdk.c ;修改分区信息
2、确定内核分区
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
0x04000000-------
0x00340000-------
0x00040000 -------
0x00030000 -------
0x00000000 _______
我们可以根据以上的分区信息来配置我们的系统.
3.13.13.13.1修改分区信息(默认 8888个分区,具体分区数目可以根据项目而定,本初设置为 3333个)
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
rootfs
kernel
Uboot参数
u-boot
4
广州广嵌电子科技有限公司
>>http://www.gec-lab.org(系统组编辑)
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.23.23.23.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.33.33.33.3 修改 nandnandnandnand FlashFlashFlashFlash的校验方式,去掉 ECCECCECCECC校验,否则上电启动会提示 ECCECCECCECC错误或
者 I/OI/OI/OI/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等
5
广州广嵌电子科技有限公司
>>http://www.gec-lab.org(系统组编辑)
#接下来做的是针对文件系统的设置,实验时目标板上要上的文件系统是 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、音频等驱动。