BeagleBoneBlack学习(1)——启动流程与u-boot编译

本文部分内容来自http://processors.wiki.ti.com/index.php/AM335x_U-Boot_User‘s_Guide,另一部分内容由Jesse Guo创作,原始出处为http://jexbat.com/2016/BBB-bootmode/,最后一部分参考zy812248258,http://blog.csdn.net/zy812248258/article/details/39252733,在此向作者表示感谢

BeagleBone 的核心处理器是 AM3358,AM335x 有四个不同的启动阶段:

(1)ROM Code(处理器内部固化代码) 
(2)SPL(Secondary Program Loader) 
(3)U-BOOT 
(4)Linux Kernel

为什么 AM335x 有多个启动阶段呢?直接从启动源加载 U-Boot 启动不是很方便?

一个全功能的U-Boot可能会超过400KB,因此不可能直接将它加载进内部RAM中直接运行,因此要分阶段。首先,第一步的 ROM Code (固化代码)不可能太复杂,ROM大小是一个限制,最重要的还是因为其所能获取的系统信息太少,所以处理器只能使用简单的方法去寻找能完成复杂功能的代码,而后将处理器初始化工作交给它来完成。其次,SPL (MLO)也不能很复杂,因为 ROM Code 只能将它加载到处理器内部 RAM 中运行,一般处理器的内部 RAM 都要小于128KB,其大小注定其不能完成很复杂的功能,所以 SPL 需要初始化 DDR 再加更复杂的代码加载到 DDR 中运行。到了在 DDR RAM 中执行的 Bootloader(U-Boot),其功能就比较完善了,此时就可以启动操作系统了。

第一阶段:ROM Code

ROM Code 是芯片上电复位之后第一块自动运行的代码。ROM Code 固化在芯片中不能被用户修改。 ROM Code 存储在片上地址 0x40000000-0x40040000 处。 
这里写图片描述

ROM Code 主要功能如下:

(1)配置设备并初始化主要的外设 
(2)建立堆栈 
(3)配置开门狗定时器1(设置到三分钟) 
(4)配置 PLL 和系统时钟 
(5)为下一阶段启动做准备 
(6)为下一阶段启动检查启动源(SPL) 
(7)把下一启动阶段的 bootloader 代码(MLO)移动到内存中准备运行

ROM Code 针对不同的启动源有不同的启动过程,但最终还是为了把启动源的代码(MLO)搬运至内部 RAM 中运行,AM335X的内部RAM的大小只有128KB(从datasheet上看应该是64KB的Dedicated RAM和64KB的Shared RAM),而且由于各种各样的原因只剩下109KB可用。ROM Code 可以从以下设备中加载SPL:

(A)Memory devices non XIP (NAND/SDMMC) 
从这类设备加载SPL时要有Image header(头信息),Image header的长度为8字节,包括加载地址(入口地址)和需要拷贝的SPL image的大小,二者各4字节。ROM Code会根据Image header中的信息将SPL image加载入内存中执行。此处SPL image指MLO文件。

(B)Peripheral devices (UART) 
此种启动模式下,ROM Code会将SPL image加载入内部SRAM的0x402f0400地址处并执行,注意此时SPL image不包括头信息。此处SPL image指u-boot-spl.bin文件。

这里我们主要解析下针对 MMC/SD 卡设备,它的启动过程是怎么样的。

(1)初始化 MMC/SD 驱动 
(2)检测是内存还是SD卡 
(3)配置地址 
(4)判断存储设备是 RAW 模式还是 FAT 模式 
(5)如果是 RAW 模式就按照参考手册 Table 26-20 所定义的地址搬运代码至内部 RAM 中 
(6)如果是 FAT 模式,就读取主引导记录并读取启动扇区查找 MLO 文件,并搬运到 RAM 中执行 
这里写图片描述

第二阶段:SPL

第二阶段叫做 SPL,但有些时候也叫 MLO。SPL 是启动 U-Boot 前的一个阶段,并且必须从启动源(MMC、USB、SD、UART等)加载到内部 RAM 中。SPL 只有极少的功能,SPL 主要的职责就是初始化 DDR,时钟等最小系统,以读取 U-Boot 并加载到 DDR 中。

第三阶段:U-Boot

U-boot 主要的工作就是正确加载 Kernel。和 SPL 类似,U-boot 也是要加载下一个阶段的 image,但是 U-Boot 提供了更多外设的支持和更多的调试工具。所以,U-Boot 也要进行各个模块的配置,上述 SPL 配置的部分,除了 DDR 外,U-Boot 也会根据需求重新配置(这里重置主要是U-Boot 是一个开源工程,其要兼容某些特殊的芯片,从而需要做重载)。此外,U-Boot 也会对网口,SD卡等根据需求进行配置。 完成配置后,U-Boot 会从相应的存储器或者外设读取 Kernel,并传递参数给 Kernel,运行 Kernel。

U-Boot 允许用户通过串行终端在内核启动环境中做一些强大的基于命令的控制。用户可以控制很多启动参数和内核启动命令。另外 U-Boot 环境变量是可配置的,这些变量保存在存储媒介的 uEnv.txt 中。 更多内容可以查看 AM335x U-Boot 用户指南。

第四阶段:启动 linux 内核

uImage 是与描述内核头信息交换过的内核镜像。这个头信息是一个 64kB的信息块,包含了目标架构、操作系统、内核尺寸、入口等信息。U-boot 启动 uImage的时候,头信息会在命令行输出。 
这里写图片描述
在读出头文件之后,U-Boot 开始启动 Linux 内核。

其他

AM335x 能从不同的源启动:MMC/SD,NAND,NOR,UART,ETHERNET,USB,SPI和I2C。能从哪个源启动由启动阶段决定。比如,SPL/U-Boot 只能从能被 ROM Code 识别的源启动。 ROM 和 SPL bootloader在内部 RAM 中运行,U-boot 和内核在 DDR 中运行。 更多信息可以看《技术参考指南》的第二章。 
这里写图片描述

BeagleBone 启动

BBB 板子上的 AM3335x 处理器上可以通过配置选择不同的接口启动,如数据手册 第二十六章所写。BBB 通过 S2 这个按键选择不同的启动顺序,默认情况下(S2 没有按下)启动过程如下:

(1)MMC1(板载 eMMC) 
(2)MMC0(microSD) 
(3)UART0 
(4)USB0

如果按下 S2 按钮,启动过程如下:

(1)SPI0 
(2)MMC0(microSD) 
(3)UART0 
(4)USB0

BeagleBone U-boot 编译

(1)在进行任何操作之前,先清除源码树:make distclean

(2)编译之前的配置工作:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 O=am335x_beaglebone_black am335x_boneblack_defconfig  
 
 
  • 1
  • 1

make之后的第一个参数向Makefile指明了编译的目标体系结构,第二个参数向Makefile指明了使用哪个编译工具链,第三个参数告诉make程序,这个编译任务要分配4个线程来并行进行,以加快编译速度,通常这个数依据自己的处理器的核数来选择,一般选择2倍核数,第四个参数告诉Makefile编译时产生的中间文件以及最后的结果都存放在源码树根目录下的am335x_beaglebone_black文件夹中,这对于使用同一个源码树来编译多个不同配置的u-boot时是一个很好的选择。最后一个参数向Makefile指明了要使用哪个文件来进行具体的配置,在configs目录下,最后所有的配置都将写进源码树根目录下面的.config文件中。

(3)编译:make(编译MLO与uboot);make spl/u-boot-spl.bin(单独编译MLO)

(4)在u-boot/am335x_beaglebone_black文件夹下生产MLO与u-boot,各文件描述如下: 
这里写图片描述

u-boot——ELF格式的可执行文件,由于里面含有调试程序所选的信息,所以该格式的可执行文件体积最大。

u-boot.bin——可以直接写入Flash的二进制可执行文件,直接被运行。

u-boot.srec——u-boot映像的S-Record格式

u-boot.map——这个文件包含了u-boot可执行文件的映像符号表

MLO——这个文件也是一个引导加载程序,用于加载u-boot.img到SDRAM。

这里写图片描述

u-boot-spl.bin——这个文件实际上就是纯粹的SPL程序,和上图的MLO文件相比,MLO=头部信息+u-boot-spl.bin。

具体使用那个文件根据自己的需要选择。

(1)从SD卡启动时,应该把MLO、u-boot.img文件放到boot分区。

(2)从串口启动时,应该传送u-boot-spl.bin、u-boot.img文件。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值