courses:embedded_system:uboot
                U-boot指令综合训练
Bootloader是在操作系统运行之前的一段程序。这段程序完成如下功能:初始化硬件设备、建立内存空间映射表,从而建立适当的系统软硬件环境,为调用操作系统内核做好准备。U-boot是嵌入式Linux的常用引导加载程序之一。
U-boot为Universal Boot Loader的缩写,其源码目录、编译形式与Linux内核相似。开发目标是支持尽可能多的嵌入式处理器和嵌入式操作系统。
主要功能
- 系统引导
 - 支持NFS挂载
 - 基本辅助功能,如操作系统接口功能
 - 支持目标板环境参数多种存储方式,如Flash、NVRAM等
 - CRC32校验
 - 支持各类设备驱动
 - 上电自检
 - 特殊功能,如XIP内核引导
 
工作模式
| 启动加载模式 | 正常工作模式,将嵌入式操作系统从Flash中加载到SDRAM中运行 | 
| 下载模式 | 将内核映像或者根文件系统映射等从PC机下载到目标板的Flash中 | 
启动流程
分为stage1和stage2两个阶段。
state1:
CPU体系结构的代码,如设备初始化代码,通常放在stage1中,多用汇编语言编写,短小精悍。
- 定义可执行映像的全局入口
 - 设置异常向量
 - 设置CPU速度、时钟频率及中断控制寄存器
 - 初始化内存控制器
 - 将ROM中的程序复制到RAM中
 - 初始化堆栈
 - 转到RAM中执行
 
stage2:
通常用C语言实现,以实现复杂的功能,更好的可读性和可移植性。
- 调用一系列初始化函数
 - 初始化Flash设备
 - 初始化系统内存分配函数
 - 若目标系统有NAND设备,则初始化该设备
 - 若目标系统有显示设备,则初始化该设备
 - 初始化相关网络设备,填写IP地址等
 - 进入命令循环,接受用户从串口输入的命令,进行相应工作
 
U-boot训练准备工作
当需要更换或更新内核系统时,需要进入下载模式。U-boot的所有操作均通过指令完成。
1、将串口线与实验箱的DBUG调试串口连接、启动模式拨至NAND,配置好超级终端(hypertrm)或其他串口工具;
2、实验箱上电,在串口工具串口显示初始化加载信息,倒计时5s内按任意键进入下载模式;
3、选择q进入主菜单,验证相关boot命令。
常用命令
信息查询
| 命令 | 功能 | 
|---|---|
 h\he\hel\help  | 帮助 | 
 bdinfo  | 打印板载结构信息 | 
 printenv  | 打印环境变量 | 
 version  | 显示U-boot、编译器、连接器的版本信息 | 
存储器操作
| 命令 | 功能 | 
|---|---|
 base  |  打印或设置地址及偏移,如 base 0, base 0x30000000  | 
	
 md <address> <length>  |  显示内存,如 md 30000000 20  | 
	
 mw <address> <value> <length>  |  修改内存,如 mw 20000000 123456 10  | 
	
 mm <address>  |  存储区修改,如 mm 20000000  | 
	
 nm <address>  | 交互式存储区修改 | 
执行命令
| 命令 | 功能 | 
|---|---|
 bootm  |  从存储器启动应用程序映像,如 bootm 30000000 进入Linux系统  | 
	
 go <address>  |  开始某段地址处的应用程序,如 go 20000000  | 
	
下载命令
| 命令 | 功能 | 
|---|---|
 loadb <address>  |  经串口线加载二进制文件,键入命令后,需从串口发送二进制文件,如 loadb 20000000  | 
	
 go <address>  |  开始某段地址处的应用程序,如 go 20000000  | 
	
 tftpboot <address> <hostIP: bf_name> | 使用TFTP协议经由网络加载映像文件 | 
环境变量
| 命令 | 功能 | 
|---|---|
 printevn  | 打印环境变量 | 
 setenv  | 设置环境变量 | 
 saveenv  | 保存环境变量 | 
 run  | 运行环境变量中的命令 | 
