首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux-2.6.32.2内核在mini2440上的移植(一)---构建自主开发环境

Linux-2.6.32.2内核在mini2440上的移植(一)---构建自主开发环境

移植环境
1,主机环境:VMare下CentOS 5.5 ,1G内存。
2,集成开发环境:Elipse IDE
3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。
4,开发板:mini2440,2M nor flash,128M nand flash。
5,u-boot版本:u-boot-2009.08
6,linux 版本:linux-2.6.32.2
7,参考文章:
【1】嵌入式linux应用开发完全手册,韦东山,编著。
【2】http://blogold.chinaunix.net/u3/101649/showart_2276906.html
【3】Mini2440 之Linux 移植开发实战指南
1.1,构建自主开发环境
我们在进行u-boot移植时,在u-boot-2009.08在mini2440上的移植(六)---增加引导内核功能提到过机器码(MACH_TYPE),在引导测试时,为了便于测试,使用的是友善官方移植好的linux内核。现在我们将从这里着手,逐步开始linux内核的移植。
【1】下载并解压内核源码
在命令行终端中可以通过下列方式下载,当然用其它下载工具下载
[root@localhost ~]# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.gz
然后解压:
[root@localhost ~]# cd ./linux-test/
[root@localhost linux-test]# tar -zxf ../linux-2.6.32.2.tar.gz
[root@localhost linux-test]# ls
linux-2.6.32.2  linux-2.6.39  yaffs2  yaffs2.tar.gz
[root@localhost linux-test]# cd linux-2.6.32.2
[root@localhost linux-2.6.32.2]#

【2】指定交叉编译变量
我们移植目的是让 Linux-2.6.32.2 可以在mini2440 上运行。首先,我们要使得Linux-2.6.32.2 的缺省目标平台成为ARM 的平台,修改总目录下的Makefile。
用gedit打开/Makefile,定位到183行,修改如下:
# Alternatively CROSS_COMPILE can be set in the environment.
# Default value for CROSS_COMPILE is not to prefix executables
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH  ?= arm
CROSS_COMPILE ?= arm-linux-
# Architecture as present in compile.h
其中,ARCH 是指定目标平台为arm,CROSS_COMPILE 是指定交叉编译器,这里指定的是系统默认的交叉编译器,如要使用其它的,则要把编译器的全路径在这里写出。注意,在arm和arm-linux-后不要留空格,否则在编译时会出现错误。
接下来,要测试一下linux 的编译是否能正常通过。执行:
[root@localhost linux-2.6.32.2]# make s3c2410_defconfig
使用缺省内核配置文件,s3c2410_defconfig 是SMDK2440 的缺省配置文件
[root@localhost linux-2.6.32.2]# make
编译时间较长... ... 。编译通过,在此我们先不必烧写到开发板验证它的正确性。
【3】建立自己的目标平台
(1)关于机器码
以上编译是用的 Linux 内核本身支持的目标平台配置,它对应于SMDK2440。现在我们要参考SMDK2440 加入自已的开发板平台,我们使用的是mini2440,因此取名为MINI2440。需要说明的是,Linux-2.6.32.2 本身已经包含了mini2440 的支持,这样就出现了重名。那怎么办呢?在此我们依然使用MINI2440 这个名称,只不过在后面的移植步骤中,把原始内核自带的mini2440 代码部分直接删除就可以了,以免和我们自己移植的混淆。
首先,很关键的一点,内核在启动时,是通过bootloader 传入的机器码(MACH_TYPE)确定应启动哪种目标平台的,友善之臂已经为mini2440 申请了自己的机器码为1999,它位于linux-2.6.32.2/arch/arm/tools/mach_types 文件中,如下面所示:
打开/arch/arm/tools/mach-types,定位到1989行,可以看到文件中有相应的机器码的定义定义如下(黑体部分):
exeda   MACH_EXEDA  EXEDA   1994
mx31sf005  MACH_MX31SF005  MX31SF005  1995
f5d8231_4_v2  MACH_F5D8231_4_V2 F5D8231_4_V2  1996
q2440   MACH_Q2440  Q2440   1997
qq2440   MACH_QQ2440  QQ2440   1998
mini2440  MACH_MINI2440  MINI2440  1999
colibri300  MACH_COLIBRI300  COLIBRI300  2000
jades   MACH_JADES  JADES   2001
spark   MACH_SPARK  SPARK   2002
benzina   MACH_BENZINA  BENZINA   2003
在U-boot/include/asm-arm/mach-types.h 文件的1985行附近(u-boot-2009.08),可以看到mini2440 的机器码定义如下面所示:
#define MACH_TYPE_Q2440 1997
#define MACH_TYPE_QQ2440 1998
#define MACH_TYPE_MINI2440 1999  //mini2440的机器码
#define MACH_TYPE_COLIBRI300 2000
#define MACH_TYPE_JADES 2001
这需要两者相匹配,如果内核的机器码和bootloader 传入的不匹配,就会经常出现下面的错误:
Uncompressing Linux................................................................................................................................. done, booting
the kernel.
运行到这不就停住了。
接下来, 我们注意到linux-2.6.32.2/arch/arm/mach-s3c2440 目录下有个mach-mini2440.c 文件,它其实就是国外爱好者为mini2440 移植添加的主要内容了,但我们不用它,把它直接删除。将linux-2.6.32.2/arch/arm/mach-s3c2440/目录下的mach-smdk2440.c 复制一份。命名为mach-mini2440.c ,并打开文件定位到末尾处,找到
MACHINE_START(S3C2440, "SMDK2440") , 将其修改为
MACHINE
返回列表