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 出现下图所示内核配置根菜单

本文来源:https://www.bwwdw.com/article/un2t.html

Top