U-Boot

4.1 U-Boot 简介

U-Boot属于BootLoader的一种,而BootLoader是在操作系统内核运行之前运行,也就是引导硬件从上电到操作系统的过程,BootLoader就是这么一段小程序。

宏观的看,BootLoader主要的工作就是初始化硬件设备、建立内存空间的映射表,最终创建一个适当的系统软硬件环境。 微观的看BootLoader程序会先初始化 DDR 等外设,然后将 Linux 内核从 flash(NAND、NOR FLASH、SD、MMC 等)拷贝到DDR 中,最后启动 Linux 内核。当然了,BootLoader的实际工作要复杂的多,但是它最主要的工作就是启动 Linux 内核。

4.2 U-Boot 目录结构

以U-boot-2021.04 源码为例

.
├── api             //封装一些平台无关的操作,如字符串打印,显示,网络,内存
├── arch            //以平台架构区分
│   ├──arm
│   │   └──cpu
│   │   │   └──armv7
│   │   │   │   └──sunxi   //cpu相关的一些操作,如定时器读取
│   │   │   │   │   └──u-boot-spl.lds  //spl的放置方法
│   │   └──dts
│   │   │   └──sun8i-v40-bananapi-m2-berry.dtb   // a40i芯片的一些配置
│   │   │   └──sun8i-r40.dtsi
│   │   └──lib      //一些库文件
│   │   └──mach-sunxi
│   │   │   └──board.c          //board_init_f
│   │   │   └──dram_sunxi_dw.c     //ddr的操作,复位,时钟,延时,odt,etc.
│   │   │   └──dram_helpers.c   //ddr的设置及读写测试
├── board
│   ├──sunxi
│   │   └──board.c              //sunxi_board_init 入口
├── cmd             //Uboot命令行的一些命令
├── common          //含spl
├── configs         //menuconfig里的默认配置,比如各类驱动适配
│   ├── bananapi_m2_berry_defconfig
├── disk            //硬盘分区的驱动
├── doc
├── drivers         //外设驱动
├── dts
├── examples
├── fs              //多种文件系统
├── include
│   ├──configs
│   │   └──sunxi_common.h   //预配置的参数,如串口号等
│   │   └──suniv.h
├── lib             //加密压缩等算法
├── net             //nfs,tftp等网络协议
├── post
├── scripts

4.3 U-Boot 配置

在Buildroot根目录下输入

make uboot-menuconfig

Uboot-menuconfig

进行配置后执行编译

make uboot

即可以得到u-boot-sunxi-with-spl.bin

4.4 U-Boot 分区

采用 NAND FLASH 方案,分区在 MTDPARTS_DEFAULT 中定义,具体位置为

-> Command line interface
    -> Filesystem commands
        -> MTD partition support

具体的分区方案如下所示

CONFIG_MTDPARTS_DEFAULT="mtdparts=sunxi_nand:128k(spl_a),768k(bootloader_a),128k(dtb_a),6m(kernel_a),-(filesystem_a)"
分区序号 分区大小 分区属性 地址空间及分区名字
mtd0 128KB spl 0x00000000-0x20000:"spl"
mtd1 768KB bootloader 0x20000-0xE0000:"bootloader"
mtd2 128KB dtb设备树 0xE0000-0x100000:"dtb"
mtd3 6MB kernel内核 0x100000-0x700000:"kernel"
mtd4 剩余空间 rootfs文件系统 0x700000-end :"roootfs"

4.5 参考资料

关于更多 U-Boot 配置相关的可以参考以下链接