简述:一般的嵌入式
linux
系统从
SD
卡或
eMMC
启动的过程都是上电时从硬件固化的
ROM
中读取数据,引导加载
MLO
到
RAM
中运行,进一步将
uboot.img
引导加载到
DDR
中运行。之后由
uboot
来引导内核镜像、设备树以及驱动模块,最后内核来引导加载根文件系统,完成整个系统的加载。
为了方便的调试系统,也有从串口获取
MLO
和
u-boot.img
文件,随后
uboot
启动完成终端输入命令
,
通过
TFTP
协议获取内核镜像以及设备树驱动等文件,最后使用
NFS
网络文件系统的共享目录挂载根文件系统。
所以本文先介绍
uboot
引导启动的过程,其他博客介绍制作最新的
BBB
启动
SD
卡和远程挂载系统。
-
BBB的启动顺序区别于
boot
键是否按下,按照现在网上最流行的说法,
当
boot
键未按下时启动顺序:
eMMC
、
SD
、
UART0
、
USB0
;
当
boot
键按下时启动顺序是:
SPI0
、
SD
、
USB0
、
UART0.
AM335X
的启动流程:
ROM->MLO(SPL)->uboot.img
ROM阶段:
引导加载程序,板子上电后自动执行这些固化在板子中的代码,存放在
176KB
的
ROM
中,完成如选择哪种启动方式(
NAND,SDcard,UART…
)等功能
,
然后跳转到
SPL
阶段。
ROM Code
主要功能如下:
(
1
)配置设备并初始化主要的外设
(
2
)建立堆栈
(
3
)配置开门狗定时器
1
(设置到三分钟)
(
4
)配置
PLL
和系统时钟
(
5
)为下一阶段启动做准备
(
6
)为下一阶段启动检查启动源(
SPL
)
(7)把下一启动阶段的
bootloader
代码(
MLO
)移动到内存中准备运行
MLO(
SPL)阶段:
SPL
过程读取
MLO
文件,
MLO
文件会被映射到
64K
的
Internal SRAM
中,其实
MLO
文件是一个精简版的
u-boot,
由
U-Boot
生成,但功能有限,用以硬件初始化,关闭看门狗,关闭中断,设置
CPU
时钟频率、速度等操作。然后跳转到
uboot
阶段,
SPL
是启动
U-Boot
前的一个阶段,并且必须从启动源(
MMC
、
USB
、
SD
、
UART
等)加载到内部
RAM
中。
SPL
只有极少的功能,
SPL
主要的职责就是初始化
DDR
,时钟等最小系统,以读取
u-boot.img
并加载到
DDR
中。
u-boot阶段:
启动
uboot,
可配置选择引导的内核、设备树、驱动,设置
NFS
网络文件系统启动等操作,
u-boot
引导阶段,通过
uEnv.txt
和
boot.src
文件配置额外参数,
uEnv.txt
可以编辑,一般通过该文件指定内核等。当然在
uboot
刚加载时按下键盘空格键可以中断引导,切换至用户交互终端模式进行配置。
u-boot
启动的第一个阶段会初始化一些普通外设,所以是可以使用键盘的。
注:
ROM code
是板子固化的,
MLO
和
u-boot.img
是编译
uboot
时生成的,可以拷贝或者串口传输到开发板上,本文之后介绍适合
BBB
开发板的
uboot
制作过程。
采用三个阶段启动系统的原因:
一个全功能的
U-Boot
可能会超过
400KB
,因此不可能直接将它加载进内部
RAM
中直接运行,因此要分阶段。首先,第一步的
ROM Code
(固化代码)不可能太复杂,
ROM
大小是一个限制,最重要的还是因为其所能获取的系统信息太少,所以处理器只能使用简单的方法去寻找能完成复杂功能的代码,而后将处理器初始化工作交给它来完成。其次,
SPL
(
MLO
)也不能很复杂,因为
ROM Code
只能将它加载到处理器内部
RAM
中运行,一般处理器的内部
RAM
都要小于
128KB
,其大小注定其不能完成很复杂的功能,所以
SPL
需要初始化
DDR
再加更复杂的代码加载到
DDR
中运行。到了在
DDR RAM
中执行的
Bootloader
(
U-Boot
),其功能就比较完善了,此时就可以启动操作系统了。
uboot
引导参数配置:
boot.scr: This file is a U-Boot script. It contains instructions for U-Boot. Using these instruction, the kernel is loaded into memory, and (optionally) a ramdisk is loaded. boot.scr can also pass parameters to the kernel. This file is a compiled script, and cannot be edited directly. In some cases, boot.scr loads further instructions and configuration parameters from a text file.
uEnv.txt: A file with additional boot parameters. This file can be read by boot.scr, or by the boot sequence if there is no script file. uEnv.txt is a regular text file that can be edited. This file should have Unix line ending, so a compatible program must be used when editing this file.
U-Boot
启动的时候如果不打断会调用
bootcmd
包含的命令来执行,通常
bootcmd
会调用
bootscript
脚本也就是
boot.scr
里面的命令进行执行,
boot.scr
通常也会先读取
uEnv.txt
确定额外参数,因为
boot.src
文件必须通过
boot.cmd
文件编译而来,
uEnv.txt
则是可以任意编辑,这样可配置性就大大提高了。如果没有
boot.src
文件,
U-Boot
有默认配置的
bootcmd
命令。
结论:配置
BeagleBone
的
Uboot
只需修改
uEnv.txt
文件来配置额外参数。