Chinaunix首页 | 论坛 | 博客
  • 博客访问: 206848
  • 博文数量: 32
  • 博客积分: 306
  • 博客等级: 二等列兵
  • 技术积分: 337
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-15 10:02
文章分类
文章存档

2013年(21)

2011年(11)

我的朋友

分类: LINUX

2011-11-21 00:00:00

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)。
阅读(1672) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~