U-boot在开发板上移植过程详解(4)

来源:互联网 发布:ubuntu 14.04 lts安装 编辑:程序博客网 时间:2024/05/16 10:35
 

我们知道bootloader是分为两部分的,具体到u-boot中,这两部分实现分别在:stage1代码通常放在cpu/xxxx/start.S文件中,stage2代码通常放在lib_xxxx/bo

ard.c文件中.具体的讲解,我这里就不细讲了,若有不懂,自己到前边的博客里去翻吧。在开始之前,有必要介绍一下相应的软件版本:

主  机:Fedora 9
编译器:arm-linux-gcc-4.4.3
u-boot:u-boot-2009.08.tar.bz2

     好了,现在开始真正的移植操作:

     1)建立自己的开发板项目并测试编译

     因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫smdk2440

#tar -jxvf u-boot-2009.08.tar.bz2   
#cd u-boot-2009.08/board/samsung/   
#mkdir smdk2440                            //创建smdk2440文件夹
#cp -rf smdk2410/* smdk2440/   //将2410下所有的代码复制到2440下
#cd smdk2440                   //进入smdk2440目录
#mv smdk2410.c smdk2440.c      //将smdk2440下的smdk2410.c改名为smdk2440.c
#cd http://www.cnblogs.com/../                  //回到u-boot根目录
#cp include/configs/smdk2410.h include/configs/smdk2440.h //建立2440头文件

      这里这样做,隐含了一个事实就是,2440和2410的资源差不多,所以就以2410项目的代码作为模板,以后根据需要再修改。这个做完了修改刚才创建的smdk2440下的Makefile文件,找到COBJS    := smdk2410.o flash.o  将smdk2410.o改为smdk2440.o(原因,我们都知道是不) 。下面修改u-boot跟目录下的Makefile文件,找到smdk2410_config的地方,在它下面按照smdk2410_config的格式建立smdk2440_config的编译选项,另外还要指定交叉编译器。如下所示: 

CROSS_COMPILE ?= arm-linux-        //指定交叉编译器为arm-linux-gcc
smdk2410_config    :    unconfig   //2410编译选项格式
    @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0
smdk2440_config    :    unconfig     //2440编译选项格式
    @$(MKCONFIG) $(@:_config=) arm arm920t smdk2440 samsung s3c24x0
说明:arm    :CPU的架构(ARCH)
     arm920t:CPU的类型
     smdk2440 :对应在board目录下建立新的开发板项目的目录
     samsung:新开发板项目目录的上级目录,如直接在board下建立新的开发板项目的目录,则这里就为NULL
     s3c24x0:CPU型号

     保存退出,在终端下运行:

#make my2440_config          //如果出现Configuring for my2440 board...则表示设置正确
#make                        //编译后在根目录下会出现u-boot.bin文件,则u-boot移植的第一步就算完成了

     说明:其实经过上面的make时,是会发生错误的,解决方法如下:

问题一:board.c:127: error: inline function 'coloured_LED_init' cannot be declared weak
board.c:129: error: inline function 'red_LED_on' cannot be declared weak
board.c:131: error: inline function 'red_LED_off' cannot be declared weak
board.c:133: error: inline function 'green_LED_on' cannot be declared weak
board.c:135: error: inline function 'green_LED_off' cannot be declared weak
board.c:137: error: inline function 'yellow_LED_on' cannot be declared weak
board.c:139: error: inline function 'yellow_LED_off' cannot be declared weak
board.c:141: error: inline function 'blue_LED_on' cannot be declared weak
board.c:143: error: inline function 'blue_LED_off' cannot be declared weak
make[1]: *** [board.o] 错误 1
make[1]: Leaving directory `/root/workspace/u-boot-2009.08/lib_arm'
make: *** [lib_arm/libarm.a] 错误 2

解决方法:

打开lib_arm/board.c,定位到127行开始,将其注释掉:

void inline __coloured_LED_init (void) {}
//void inline coloured_LED_init (void) __attribute__((weak, alias("__coloured_LED_init")));
这里注释掉了'coloured_LED_init' 的部分,自己做时对照注释掉后面几个带__attribute__的部分即可

问题二:cpu/arm920t/start.o: In function `start_code':
/root/workspace/u-boot-2009.08/cpu/arm920t/start.S:117: undefined reference to `coloured_LED_init'

/root/workspace/u-boot-2009.08/cpu/arm920t/start.S:118: undefined reference to `red_LED_on'
make: *** [u-boot] 错误 1

解决方法:

打开cpu/arm920t/start.S,搜索“coloured_LED_init”定位到117行,找到如下代码:

     bl coloured_LED_init
     bl red_LED_on

这两行是AT91RM9200DK开发板的LED初始化,注释掉即可。

     经过上面的修改,make clean/make就可以在u-boot的根目录下看到u-boot.bin文件,则u-boot移植的第一步就算完成了。但是,这里u-boot对自己的smdk2440开发板还没有任何用处,只是搭建了一个smdk2440开发板u-boot的框架,要使其功能实现,还要根据smdk2440开发板的具体资源情况来对u-boot源码进行修改.

     2)根据u-boot启动步骤来分析或者修改添加u-boot源码,使之适合自己的开发板

    一般在嵌入式系统软件开发中,在所有源码文件编译完成之后,链接器要读取一个链接分配文件,在该文件中定义了程序的入口点,代码段、数据段等分配情况等。那么我们的s3c2440开发板u-boot的这个链接文件就是cpu/arm920t/u-boot.lds,打开该文件部分代码如下:

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm) //定义生成文件的目标平台是arm
ENTRY(_start) //定义程序的入口点是_start

      从这里我们知道程序的入口点是_start,那么我们定位到u-boot第一个要运行的程序cpu/arm920t/start.S,查找到_start的位置如下:

.globl _start
_start:    b       start_code

 

     从这里知道,程序要从start_code处开始执行,由此可以看到,start_code处才是u-boot启动代码的真正开始处。以上就是u-boot的stage1入口的过程。知道了程序的入口处,也就是stage1的入口地址,下面就开始针对我们s3c2440的板子来修改u-boot,让其为我们的硬件初始化做准备,当然啦,这就是下面几集的内容了。后面继续分解。