野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9780|回复: 1

实战2 编译u-boot镜像

[复制链接]
发表于 2016-3-19 20:31:19 | 显示全部楼层 |阅读模式
本帖最后由 xcoder 于 2016-3-19 20:35 编辑

实战2 编译u-boot镜像

前文介绍了pcDuino启动过程中需要的几个镜像,对于boot阶段,boot0已经有厂商固化,因此需要开发人员只需提供SPL和u-boot,下面介绍二者编译过程。
image001.png

图2.1 pcDuino启动过程
2.1 下载u-boot源代码
使用git工具命令clone一份u-boot源码,clone下来的u-boot源码位于目录/home/ubuntu/pcduino/u-boot-sunxi内。

  1.   # cd  /home/ubuntu/pcduino
  2.   # git clone  https://github.com/linux-sunxi/u-boot-sunxi.git
复制代码

2.2配置目标板
  1. #  cd /home/ubuntu/pcduino/u-boot-sunxi
  2.   #  make CROSS_COMPILE=arm-linux-gnueabihf-   Linksprite_pcDuino3_config O=build
复制代码
u-boot支持上千个目标板,因此在编译u-boot之前要选择并配置我们关注的目标板,这些目标板的描述记录在u-boot源码根目录下文件boards.cfg中,如图2.2所示。
image002.png

图2.2 u-boot支持的目标板

每一个目标板使用单独一行进行描述,行首的#号起到注释作用;每一行包含9个字段,字段间使用一个或多个空白符(空格或TAB)分隔这些字段含义如下表:
表2.1 u-boot配置文件字段描述
  
Status
  
  
Arch
  
  
CPU:SPLCPU
  
  
SoC
  
  
Vendor
  
  
Board name
  
  
Target
  
  
Options
  
  
Maintainers
  
  
状态,标明当前配置是否有效
  
  
处理器所属架构
  
  
处理器核类型
  
  
SoC类型
  
  
生厂商
  
  
电路板名称
  
  
编译目标
  
  
附属选项
  
  
维护人员信息
  

其中Options字段格式为:
<board config name>[: options]
每个选项的格式为(默认值为1):
option[=value]
假设Options字段定义如下:
FOO:HAS_BAR,BAZ=64
那么,目标板配置脚本会创建头文件include/config.h同时,会在这个文件定义如下宏:
  1. #define  CONFIG_HAS_BAR  1
  2. #define  CONFIG_BAZ      64
复制代码
由于我们使用的Linksprite_pcDuino3配置:
  1. Active arm armv7  sunxi - sunxi Linksprite_pcDuino3  sun7i: LINKSPRITE_PCDUINO3,SPL,SUNXI_GMAC,FAST_MBUS -
复制代码

Options字段定义:
sun7iINKSPRITE_PCDUINO3,SPL,SUNXI_GMAC,FAST_MBUS
则会生成文件include/config.h,文件中定义如下一组宏:
  1. #define  LINKSPRITE_PCDUINO3  1
  2. #define  SPL                     1
  3. #define  SUNXI_GMAC             1
  4. #define FAST_MBUS              1
复制代码

对于不被使用的字段使用“-”填充。
u-boot支持不同的架构处理器,每款处理器有自己一套指令集,运行在处理器上的程序必须使用该处理器支持的指令集,交叉编译器能够将源码编译成应处理支持的二进制机器码,在编译u-boot时,使用变量CROSS_COMPILE指定交叉编译器,这个变量在Makefile文件中使用。
image003.png

图2.3 工具链配置
第327行,CC变量由CROSS_COMPILE和gcc组成,即CC=arm-linux-gnueabihf-gcc,因此凡是引用$(CC)的地方实际上是在使用arm-linux-gnueabihf-gcc。
默认情况下,编译生成的目标文件与源码混在一起,使用O=build参数可将编译生成的目标文件单独放在build目录下,从而使得源代码“干净”。
执行配置目标板命令后,在build目录下生成一些目录和文件
image004.png


图2.4 配置目标板生成文件或目录
简要介绍一下这些文件:
    build/Makefile:Makefile文件,描述了个源文件/模块编译的依赖关系
    build/include/asm/arch:软连接文件,连接到具体架构头文件目录
    build/include/asm/proc:软连接文件,连接到具体架构头文件目录
    build/include/config.h:顶级配置文件,内容是根据boards.cfg配置自动生成,包含了板级、处理器和SoC等宏定义,此外还有一些通用的头文件。
    build/include/config.mk:定义一些变量,在根目录Makefile中被引用
    build/source:软连接文件,指向u-boot源码目录

2.3编译u-boot
执行如下命令:
  1. # make  CROSS_COMPILE=arm-linux-gnueabihf- O=build
复制代码
经过一些列的编译过程,最终生成几个重要目标文件,
build/u-boot: ELF(Executable and Linking Format)格式文件,除了包含所有的可执行的代码段数据段等,还包含了一些调试信息。使用命令arm-linux-gnueabihf-readelf可以查看文件一些具体信息。如查看ELF文件头内容:
image005.png

图2.5 u-boot文件格式
build/u-boot.bin: 使用arm-linux-gnueabihf-objcopy工具,将ELF格式的u-boot文件去除所有调试信息,只保留可执行的二进制机器码。
build/u-boot.img: 该文件由64字节头和u-boot.bin文件组成。使用工具build/tools/mkimage: 可以实现增加头信息操作。头信息用于描述镜像的名称、类型、加载地址、执行入口地址等。
build/spl/u-boot-spl: 前文提到的SPL镜像文件, 也是ELF格式。
build/spl/u-boot-spl.bin:由u-boot-spl文件转换得到,纯BIN格式文件。
image006.png


图2.6 u-boot各镜像文件生成过程
查看build/u-boot.bin和build/spl/u-boot-spl.bin这两BIN文件大小,可以看到u-boot-spl.bin明显小于u-boot.bin,这印证了前文所述的SPL是精简过的u-boot。
  1.   #ls -l  build/u-boot.bin build/spl/u-boot-spl.bin
  2.   -rwxrwxr-x 1  ubuntu ubuntu  20277  7月 25 18:29  build/spl/u-boot-spl.bin
  3.   -rw-rw-r-- 1  ubuntu ubuntu 237204  7月 25 18:29  build/u-boot.bin
复制代码








回复

使用道具 举报

 楼主| 发表于 2016-3-19 20:37:49 | 显示全部楼层
A20芯片上电启动的时候,如果从SD卡启动,boot0会从SD卡8KB偏移处读取SPL,SPL运行后会再次从SD卡32KB偏移处读取u-boot并拷贝到DDR中。A20约定的SD卡布局如下:
表2.2 SD卡布局
  起始位置(KB)
  
  大小(KB)
  
  功能
  
  0
  
  8
  
  分区表
  
  8
  
  24
  
  SPL
  
  32
  
  512
  
  u-boot
  
  544
  
  128
  
  u-boot环境变量
  
  672
  
  352
  
  保留
  
  1024
  
  -
  
  其余分区
  

下图描述了几个boot的工作过程,
[1] A20上电后,boot0运行,核查启动设备,这里考虑从SD卡启动情况
[2] boot0拷贝SPL到SoC内置RAM中,并将控制权交给SPL
[3] SPL运行,初始化一些外设以及DDR,将u-boot拷贝到DDR中,并将控制权交给u-boot
[4] u-boot运行,从SD卡其它分区加载、运行linux镜像
image007.png

                              
图2.7 SD卡启动过程
需要特别指出的是,A20中boot0加载的SPL并不是文件u-boot-spl.bin,而是在其基础上增加32字节头的sunxi-spl.bin文件,sunxi-spl.bin生成过程如下:
image008.png

图2.8 sunxi-spl.bin生成过程
mksunxiboot工具将u-boot-spl.bin转换成sunxi-spl.bin并进行24KB字节填充,即最终得到的sunxi-spl.bin大小为24KB。
另外,图2.8中的u-boot对应的文件为u-boot.img。所以为了能够从SD卡启动,需要从SD卡8KB偏移处烧入文件sunxi-spl.bin,从SD卡32KB偏移处烧入文件u-boot.img。为了方便开发人员,在编译过程中已经将sunxi-spl.bin和u-boot.img拼接成一个文件u-boot-sunxi-with-spl.bin
image009.png

图2.8 u-boot-sunxi-with-spl.bin生成过程
只要一次性将这个文件写入SD卡8KB偏移处即可,由于sunxi-spl.bin的24KB的填充,使得二者有效部分都位于预定位置。
2.4小结
本章主要介绍了u-boot的下载、编译过程。此外讲解了u-boot的目标板配置方式和具体配置项含义,最后结合pcDuino板启动,讲解了sunxi u-boot的特别之处,最终编译生成的u-boot-sunxi-with-spl.bin包含了图2.1中的SPL和u-boot。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-27 01:26 , Processed in 0.039316 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表