U-Boot启动流程:判断寄存器与引导方式设置

需积分: 46 312 下载量 187 浏览量 更新于2024-08-09 收藏 324KB PDF 举报
本篇文档主要讨论了U-Boot(一个开源的嵌入式启动加载器)中的启动判断寄存器读取与配置过程,以及针对不同类型的存储设备启动方式的选择。首先,通过`ldr`指令从`PRO_ID_BASE`寄存器位置读取启动信息,该信息通常存储了启动方式设置,例如NAND Boot、SD/MMC Boot、NOR Boot或UART/USB Boot等,通过位运算提取OM[5:1]位来确定驱动方式。 具体操作步骤如下: 1. 通过`ldr r0, =PRO_ID_BASE`获取启动信息基地址。 2. 使用`ldr r1, [r0,#OMR_OFFSET]`加载启动信息,偏移量通常为0x04,得到的寄存器值会包含启动方式设置。 3. 使用`bic r2, r1, #0xffffffc1`操作清除高5位(除了最低位),得到OM[5:1],这代表了驱动选择的依据,如512B 4-cycle NAND Boot、2KB 5-cycle ECC NAND Boot等。 接下来,根据不同的启动方式值,通过`cmp`和`moveq`指令将对应的驱动类型写入`INFORM3`寄存器,以便U-Boot根据这些设置执行相应的设备初始化。 文档还提及了U-Boot的入口点 `_start`,它位于`cpu/s5pc11x/start.S`文件中。该入口点包括异常中断向量的处理,如reset异常、软件中断、预取异常、数据异常等,通过`.word`指令定义了向量地址,并且在 `_irq`处设置了中断处理程序的入口点`do_irq`,用于统一处理各种中断事件。 值得注意的是,文档还提到在`_start`之前填充了一些固定长度的数据,以确保代码段的对齐,如16字节的对齐。此外,`reset`异常处理部分涉及了对一些地址变量的初始化,如`_TEXT_BASE`,其值为0xc3e00000,这是一个虚拟地址,可能与特定硬件平台的配置有关。 本资源主要关注的是嵌入式系统启动过程中的寄存器操作,以及U-Boot如何根据启动判断寄存器内容配置硬件驱动,同时展示了U-Boot的基本结构和异常处理机制。这对于理解嵌入式系统启动流程和调试工作具有重要意义。