linux-2.6.32.2内核在mini2440上移植
更新时间:2023-12-01 13:42:01 阅读量: 教育文库 文档下载
移植环境(红色粗字体字为修改后内容,蓝色粗体字为特别注意内容)
3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,256M 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, \, 将其修改为 MACHINE_START(MINI2440, \
提示:开发板运行后,在命令行终端输入:cat /proc/cpuinfo 可以看到我们添加的开发板信息,当然这个信息可以定制成我们需要的信息。 (2)修改时钟源频率
在 上面我们刚刚复制并修改过的mach-mini2440.c文件中,定位到163行附近,把其中的16934400(代表原SMDK2440 目标板的晶振是16.9344MHz)改为mini2440 开发板上实际使用的12000000(代表mini2440 开发板上的晶振12MHz,元器件标号为X2),如下所示: static void __init smdk2440_map_io(void) {
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc)); s3c24xx_init_clocks(12000000);
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs)); }
(3)从SMDK2440 到MINI2440
因为我们要制作自己的mini2440 平台体系,因此把mach-mini2440.c 中所有的smdk2440 字样改为mini2440,可以使用批处理命令修改,在vim 的命令模式下输入:
%s/smdk2440/mini2440/g
上面这句的意思是:把所有和“smdk2440”匹配的字符串全部替换为“mini2440”,前面的“%s“代表字符串匹配,最后的“g”代表global,是全局的意思,不过这里采用另一种办法,在gedit里用查找替换,比较方便,操作如下:
gedit->搜索->替换,在打开的对话框中,在搜索一栏输入“smdk2440”,在替换为一栏输入“mini2440”然后点击全部替换按钮,即可完成。
除此之外,还有一个地方需要改动,在mini2440_machine_init(void)函数中,把smdk_machine_init()函数调用注释掉,因为我们后面会编写自己的初始化函数,不需要调用smdk2440 原来的,定位到173行,修改如下:
static void __init mini2440_machine_init(void) {
s3c24xx_fb_set_platdata(&mini2440_fb_info); s3c_i2c0_set_platdata(NULL);
platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices)); //smdk_machine_init(); }
(4)编译测试
在 Linux 源代码根目录下执行
[root@localhost linux-2.6.32.2]# make mini2440_defconfig #
# configuration written to .config #
[root@localhost linux-2.6.32.2]# make mini2440_defconfig 使用Linux 官方自带的mini2440 配置。 [root@localhost linux-2.6.32.2]# make uImage
编译内核,时间较长,最后会生成uImage。把生成的内核文件uImage(位于arch/arm/boot 目录)下载到板子的内存中运行,可以看到内核已经可以正常启动了,如下所示,但此时大部分硬件驱动还没加,并且也没有文件系统,因此还无法登陆。 [u-boot@MINI2440]# usbslave
USB host is connected. Waiting a download. Now, Downloading [ADDRESS:31000000h,TOTAL:2067310] RECEIVED FILE SIZE: 2067310 (672KB/S, 3S) [u-boot@MINI2440]# go 0x31000000
## Starting application at 0x31000000 ...
Uncompressing Linux............................................................. ................................................................... done, bootin g the kernel.
Linux version 2.6.32.2 (root@localhost.localdomain) (gcc version 4.4.3 (ctng-1.6 .1) ) #4 Thu May 26 18:51:55 CST 2011
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177 CPU: VIVT data cache, VIVT instruction cache Machine: mini2440 devolopment board
Memory policy: ECC disabled, Data cache writeback CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, (c) 2004 Simtec Electronics
S3C244X: core 405.000 MHz, memory 101.250 MHz, peripheral 50.625 MHz CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256 Kernel command line: noinitrd console=ttySAC0,115200 init=/linuxrc mem=64M root =/dev/nfs rw nfsroot=10.1.0.128:/nfsboot ip=10.1.0.129:10.1.128:10.1.0.1:255.25 5.255.0::eth0:off ... ...
【4】内核配置菜单中的mini2440 选项和实际代码是如何关联的
在 开始移植其他驱动之前,我们再了解一些看起来比较“神秘”的常识,那就是运行make menuconfig 时,内核配置菜单中的mini2440 选项是如何出现的。需要确保前面已经执行了make mini2440_defconfig 加载了缺省配置,因为在x86平台下下执行此操作,系统默认的是x86平台,而且还要在顶层Makefile里作了如下修改:
export KBUILD_BUILDHOST := $(SUBARCH) ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
现在在终端中进入到linux-2.6.32.2根目录下执行: [root@localhost linux-2.6.32.2]# make menuconfig 出现下图所示内核配置根菜单
正在阅读:
linux-2.6.32.2内核在mini2440上移植12-01
2016水利知识竞赛03-16
2017年11月党支部会议纪要02-12
文化公园植物配置调研报告04-26
应急准备 - 提高突发公共危机事件应对能力的重要抓手10-11
今年是2032年作文500字06-28
爱的声音作文500字07-15
2015年下半年河南省口腔执业医师:牙本质过敏的药物治疗方法模拟05-31
缝纽扣作文600字07-15
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 内核
- 移植
- mini2440
- linux
- 32.2
- 2.6