1. U-Boot核心作用解析
1.1 硬件初始化:构建内核运行的基石
作为嵌入式系统的第一道程序,U-Boot的首要任务就是为Linux内核准备好可运行的硬件环境。这个过程远比想象中复杂:
-
DDR内存初始化:这是最关键的步骤之一。U-Boot需要正确配置内存控制器时序参数,包括tRFC、tRP、tRCD等关键时序值。以RK3568为例,其DDR初始化代码需要根据具体使用的内存颗粒型号(如美光MT40A1G16KD-062E)来设置PHY参数。
-
存储设备初始化:包括eMMC/SD卡控制器配置。U-Boot需要识别存储设备的CID/CSD寄存器,获取块大小、容量等信息。例如,对于支持HS400模式的eMMC,需要先降速到HS200模式完成初始化,再切换到HS400。
-
时钟树配置:现代SoC通常有复杂的时钟架构。以RK3568为例,U-Boot需要配置CPLL、GPLL、NPLL等PLL,并为各个外设分配合适的时钟源和分频系数。
提示:硬件初始化阶段如果失败,通常会表现为串口无输出或输出乱码。此时需要用示波器检查各电源轨电压和时钟信号。
1.2 内核引导:系统启动的接力棒
完成硬件初始化后,U-Boot需要从存储介质加载内核镜像:
-
镜像定位:根据存储介质的不同,定位方式各异:
- eMMC:通常从固定偏移量(如0x4000)读取分区表
- SD卡:可能需要先读取MBR分区表
- 网络启动:通过TFTP协议从服务器获取
-
镜像验证:现代系统通常会对镜像进行校验:
- 检查FitImage的CRC32校验和
- 验证内核签名(如果启用安全启动)
-
内存加载:将内核镜像解压到DDR的指定地址。例如,RK3568通常使用0x00280000作为内核加载地址。
1.3 开发调试:工程师的瑞士军刀
U-Boot提供的命令行接口是嵌入式开发不可或缺的工具:
-
内存操作:
md/mw命令可以直接读写物理内存,这对调试硬件寄存器特别有用。例如:bash复制md.l 0xff770000 1 # 读取RK3568 CRU模块的寄存器 -
存储操作:当文件系统损坏时,可以直接
