linux-2.6.31内核移植到TX2440 |
linux平台为:RatHat
交叉编译器:arm920t-eabi
u-boot是如何引导linux的呢?简单地说,就是在u-boot中用bootm命令执行
uImage格式的内核映象文件。而这种行又有两种方式,一个是启动到u-boot的运
行界面后,手动地下载uImage内核文件到SDRAM的某一地址处,然后通过手动地
运行bootm命令来完成启动。一个就是配置CONFIG_BOOTDELAY和
CONFIG_BOOTCOMMAND两个宏,让u-boot自动地在启动时找到uImage内核文件,自
动启动。
1.解压内核原码后,修改内核根目录下的Makefile文件中的下面两行,使内核支
持的为ARM体系结构,同时设置我们的交叉编译工具:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
2. 修改平台的时钟频率,以满足 OK2440V3 的工作频率。修改内核源码
“arch/arm/mach-s3c2440/mach-smdk2440.c”文件中的s3c24xx_init_clocks,
把 16.9344MHz 改为 12MHz,因为 OK2440V3 使用的是 12MHz 的外部时钟源输入
。如下所示:
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.在内核目录下执行下列操作,生成我们的配置文件:
make s3c2410_defconfig
执行完后出现:
# configuration written to .config
(注:同样,这里也可以用另外两种方法来完成,一是用cp命令拷贝
s3c2410_defconfig这个文件到根目录下覆盖.config文件,一个就是执行make
menuconfig后,用里面的load选项装载这个配置文件,然后保存就可。
arch/arm/configs/s3c2410_defconfig)
4. 执行命令make menuconfig,会出现内核的配置界面,就可根据自已的
需要,裁减内核。在这里我们主要是要去掉2400/2410/2412/2442/2443的支持,
仅支2440持就可。
System Type --->
ARM system type (Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442,
S3C2443) --->
......
......
S3C2400 Machines --->
S3C2410 Machines --->
S3C2412 Machines --->
S3C2440 Machines --->
S3C2442 Machines --->
S3C2443 Machines --->
......
.....
分别进入上面的这6项,除s3c2440里面的配置如下外,其它的全部取消配置:
[ ] Simtec Electronics ANUBIS
[ ] Simtec IM2440D20 (OSIRIS) module
[ ] HP iPAQ rx3715
[*] SMDK2440
[ ] NexVision NEXCODER 2440 Light Board
[*] SMDK2440 with S3C2440 CPU module
[ ] MINI2440 development board
配置完后注意保存。
5.然后就可以在根目录下直接执行make命令,编译linux内核,最后在
arch/arm/boot/下面会生成我们需要的zImage文件。make zImage
(这个过程比较长,如果对配置内核熟悉的话,可以取消掉一些不必要的
其它配置)
6.制作uImage文件:进入u-boot的tools目录下,有个mkimage工具,这就是我们
制作uImage需要的工具。
在tools止录下执行./mkimage,我们可以得到它的用法和各选项的含义:
$ ./mkimage
Usage: ./mkimage -l image
-l ==> list image header information
./mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n
name -d data_file[:data_file...] image
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
./mkimage [-D dtc_options] -f fit-image.its fit-image
把编译生成的内核映象文件zImage拷贝到u-boot的tools目录下,执行下
面的命令,得到u-boot可以识别的uImage文件:
./mkimage -n 'linux-2.6.31' -A arm -O linux -T kernel -C none -a
0x30008000 -e 0x30008040 -d zImage uImage.img
$ ./mkimage -n 'linux-2.6.31' -A arm -O linux -T kernel -C none -a
0x30008000 -e 0x30008040 -d zImage uImage.img
Image Name: linux-2.6.31
Created: Fri Dec 18 22:59:09 2009
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1997104 Bytes = 1950.30 kB = 1.90 MB
Load Address: 30008000
Entry Point: 30008040
注意上面的-a和-e,-a是uImage文件的加载地址,-e是uImage的执行入口
地址,-e在-a后面的0x40处,这个空间是uImage的头文件,bootm命令识别是否
是uImage,就靠它了。
-a 0x30008000 -e 0x30008040
7. 修改u-boot 的 board/samsung/ok2440v3/ok2440v3.c文件,如下:
/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
(这一步是让u-boot的机器码和linux的机器码匹配,具体为什么这样修改,
请看我的另一篇日记<>)。
修改完毕后,重新编译u-boot,下载到nand中,重启,用bdinfo命令可看
到机器码的信息如下:
OK2440V3 # bdinfo
arch_number = 0x0000016A ---机器码为362
env_t = 0x00000000
boot_params = 0x30000100
DRAM bank = 0x00000000
-> start = 0x30000000
-> size = 0x04000000
ethaddr = (not set)
ip_addr = 10.0.0.110
baudrate = 115200 bps
OK2440V3 #
8. 修改u-boot中我们的开发板的配置文件/include/configs/ok2440v3.h,
增加如下宏定义,使其能向内核传递参数(在这里主要是console参数,否则无
法在控制台看到启动信息):
#define CONFIG_SETUP_MEMORY_TAGS
#define CONFIG_INITRD_TAG
#define CONFIG_CMDLINE_TAG
#define CONFIG_BOOTARGS "root=ramfs devfs=mount
console=ttySA0,115200"
上面的操作完成后,重新编译u-boot,下载到nand中,重新启动u-boot后
,把我们编译生成的uImage文件下载到内存的0x30008000地址处,就可以用
bootm命令来手动引导内核了(执行bootm 0x30008000)。