免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1069 | 回复: 0
打印 上一主题 下一主题

开发板L inux 2.6 .30.4 内核移植实验 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-21 08:41 |只看该作者 |倒序浏览

GEC2440&L inux 2.6 .30.4 内核移植实验
概述 :
对于嵌入式 linux 系统来说,有各种体系结构的处理器和硬件平台,用户根据自己
的需要定制的硬件平台 , 只要是硬件平台有一点点变化 , 就需要做一些移植工作 , linu x
内核移植是嵌入式 linux 系统中最常见的一项工作。
由于 linux 内核具备可移植性的特点,并且已经支持了很多种目标板,这样,用户
很容易从中找到跟自己硬件平台类似的目标板 , 参考内核已经支持的目标板来进行移植
工作。
linux-2. 6 内核已经支 持 S3C244 0 处理器的多种硬件板 , 由 于 S3C241 0 跟 S3C244 0
同属于 ARM920T 系列芯片 , 且寄存器等硬件电路基本一致 , 我们可以参考 SMDK24 1 0
参考板来移植 2440 开发板
实验步骤 :
( 1 )准备工作
( 2 )修改顶层 Makefile
( 3 )修改 falsh 分区
( 4 )配置编译内核
一、准备工作
建立工作目录,下载内核源码: 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
二、修改内核源码顶层 Makefile Makefile Makefile 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.1 1 的 /board/samsun/gec2440/gec2440. c 设置 了 MACH_TYP E 的类型 为
MACH_TYPE_SMDK24 1 0 ,查看 u-boot 里的 include/asm-arm/mach-types.h 文件,有下
面定义:
#define MACH_TYPE_SMDK24 1 0 1 93
// 针对 2440 的 MACH_TYPE 码的值定义为 1 93
而 linux 内核源码的 arch/arm/tools/mach-types 文件有如下定义:
smdk24 1 0 MACH_SMDK24 1 0 SMDK24 1 0 1 93
即 u-boot 和 linux 内核的同样类型的机器码都为 1 93 。
那么我们就修改 kernel 的 MACH_TYPE 代码引用部分,确定 kernel 的 MACH_TYPE 。
如下:
修改 arch/arm/mach-s3c2440/mach-smdk2440.c : // 修改文件最后面
MACHINE_START(S3C2440, "SMDK2440")
修改为:
MACHINE_START( SMDK24 1 0 , "SMDK2440")
修改 arch/arm/kernel/head.S // 在 ENTRY(stext) 下添加如下代码 ( 红色部分 )
ENTRY(stext)
mov r0, #0
mov r1, #0xc1 // MACH_TYPE_SMDK24 1 0 值 1 93 换成十六进制就是 0x c1
ldr r2, =0x30000100 //Linux kernel parameter
第二种改法:
查 linux 内核源码的 arch/arm/tools/mach-types 文件有如下定义:
smdk24 4 0 MACH_SMDK24 4 0 SMDK24 4 0 1 008
做如下修改
# vi arch/arm/mach-s3c2440/mach-smdk2440.c
MACHINE_START(S3C2440, "SMDK2440")
修改为:
MACHINE_START( SMDK24 4 0 , "SMDK2440")
修改 arch/arm/kernel/head.S // 在 ENTRY(stext) 下添加如下代码 ( 红色部分 )
ENTRY(stext)
mov r0, #0
mov r1, #0x 3f0 // MACH_TYPE_SMDK2440 值 1008 换成十六进制就是 0x3f0
ldr r2, =0x30000100 //Linux kernel parameter
这种改法中会出现如下问题:
定义在 arch/arm/mach-s3c24 1 0/mach-smdk24 1 0.c 中的设备驱动没能链接进来。

四 、设置 flash flash flash flash 分区
1 、找到修改的内核文件, 此处 需 要修改 以下 文件 :
arch/arm/plat-s3c24xx/common-smdk.c ; 修
2 、确定内核分区表


????

我们可以根据以上的分区信息来配置我们的系统.
3.1 3.1 3.1 3.1 修改分区信息 ( 默认 8 8 8 8 个分区 , 具体分区数目可以根据项目而定 , 本初设置为 3 3 3 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, // 分区大小 256 k
.offset = 0, // 本分区起始地址 0x 0
},
[1] = {
.name = "Kernel",
.offset = 1 6 *SZ_16K, // 本分区起始地址 0x 4 0000
.size = 3 *SZ_ 1M , // 分区大小 3 M
},
[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 s3c24 1 0_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 3.2 3.2 3.2 .修改时钟 ( ( ( ( 终端输出若有乱码则需修改 ) ) ) )
在 arch/arm/mach-s3c2440/mach-smdk2440.c 中修改 smdk2440_m
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_u
}
3.3 3.3 3.3 3.3 修改 nand nand nand nand Flash Flash Flash Flash 的校验方式 , 去掉 ECC ECC ECC ECC 校验 , 否则上电启动会
者 I/O I/O I/O I/O 读取错误。
在 drivers/mtd/nand/s3c24 1 0.c 中
将 chip->ecc.mode = NAND_ECC_ SOFT ;
将 chip->ecc.mode = NAND_ECC_ SOFT ;
改为 chip->ecc.mode = NAND_ECC_ NONE ;
五 、配置编译内核
# make s3c24 1 0_defconfig
# make menuconfig
在 s3c24 1 0_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
# 接下来做的是针对文件系统的设置,实验时目标板上要上的文件系统是 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 、触摸 DM 900 0 网卡、 L 屏、 USB 、音频等驱动。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP