RK平台U-Boot开发系列:启动源检测原理 电子说
| 芯片上电后,BootROM 怎么知道从 eMMC 启动还是从 SD 卡启动?这段看似简单的 "决策" 背后,涉及了引脚电平采样、OTP 配置和优先级仲裁。本文将完整解析启动源检测的全过程。 |
一、启动源检测流程

二、硬件检测方式
2.1 BOOT 模式引脚
RK3576 有多个 BOOT 模式引脚,上电时 CPU 会采样这些引脚的电平:
| 引脚 | 电平 | 启动源 |
| BOOT0 | L | eMMC(默认) |
| BOOT0 | H | USB 下载模式 |
| BOOT1:BOOT0 | 00 | eMMC |
| BOOT1:BOOT0 | 01 | SD 卡 |
| BOOT1:BOOT0 | 10 | SPI NAND/NOR |
| BOOT1:BOOT0 | 11 | UFS |
实际电路设计:
典型EVB设计: BOOT0 → 10kΩ下拉电阻(默认L,从eMMC启动) 按键 → 接VCC(按下拉高,进入USB下载)建议量产设计: 保留BOOT按键或testpoint,方便产线烧录和现场恢复
2.2 OTP 配置
OTP 中烧录了默认启动源信息,如果 OTP 非空,优先级高于引脚采样:
OTP中的启动源位(举例): 00 → eMMC 01 → SD卡 10 → SPI NAND 11 → UFS烧录方式:在产线通过RKDevTool写入
2.3 默认优先级
当没有外部干预时,BootROM 按以下顺序尝试:

三、BROM 到 U-Boot 的信息传递
BootROM 检测到启动源后,将信息写入 SRAM 中的特定地址:
3.1 BROM_BOOTSOURCE_ID_ADDR
// arch/arm/include/asm/arch-rockchip/bootrom.h#define BROM_BOOTSOURCE_ID_ADDR 0xFFFFFFE0 // 或其他固定地址#define BROM_BOOTSOURCE_MASK 0x7 // 低3位有效#define BROM_BOOTSOURCE_EMMC 2#define BROM_BOOTSOURCE_SD 5#define BROM_BOOTSOURCE_UFS 7
3.2 在 U-Boot 中读取
// arch/arm/mach-rockchip/spl.cconst char *board_spl_was_booted_from(void){ u32 bootdevice_brom_id = readl(BROM_BOOTSOURCE_ID_ADDR); // 检查是否进入了USB下载模式 if ((bootdevice_brom_id & BROM_DOWNLOAD_MASK) == BROM_DOWNLOAD_MASK) bootdevice_brom_id = BROM_BOOTSOURCE_USB; bootdevice_brom_id = bootdevice_brom_id & BROM_BOOTSOURCE_MASK; // 通过boot_devices表映射到设备树路径 if (bootdevice_brom_id < ARRAY_SIZE(boot_devices)) return boot_devices[bootdevice_brom_id]; return NULL;}
3.3 RK3576 的 boot_devices 表
// arch/arm/mach-rockchip/rk3576/rk3576.cconst char * const boot_devices[BROM_LAST_BOOTSOURCE + 1] = { [BROM_BOOTSOURCE_EMMC] = "/mmc@2a330000", // BROM ID 2 [BROM_BOOTSOURCE_SD] = "/mmc@2a310000", // BROM ID 5 [BROM_BOOTSOURCE_UFS] = "/ufs@2a2d0000", // BROM ID 7};
四、定制启动源检测
修改 boot_devices 表
如果板卡使用了不同的设备树路径:
// 例如:使用UFS作为主存储const char * const boot_devices[...] = { [BROM_BOOTSOURCE_EMMC] = "/mmc@2a330000", [BROM_BOOTSOURCE_SD] = "/mmc@2a310000", [BROM_BOOTSOURCE_UFS] = "/ufs@2a2d0000", // 确保UFS路径正确};
修改 SPL 启动顺序
在 DTS 中控制 SPL 自己的设备枚举顺序:
// arch/arm/dts/rk3576-u-boot.dtsichosen { u-boot,spl-boot-order = &sdmmc, &spi_nand, &spi_nor, "same-as-spl";};
五、常见问题
| 现象 | 可能原因 |
| 板卡从 USB 启动而非 eMMC | BOOT 引脚被拉高,检查硬件设计 |
| 同一批板卡有的能启动有的不能 | BOOT 引脚虚焊 / 电平不稳 |
| 烧录 OTP 后反而不启动了 | OTP 中的启动源配置错误 |
| BROM 读到的 ID 与 Uboot 检测不一致 | boot_devices 表未匹配当前 SoC |
六、小结
启动源检测是 BootROM 的第一个关键决策点:
1.硬件决定优先级 — BOOT 引脚 > OTP > 默认顺序
2.ID 传递到 U-Boot — BROM 将启动源 ID 写入 SRAM 特定地址
3.boot_devices 表转译 — 数字 ID 映射到设备树路径
4.DTS 控制 SPL 顺序 — spl-boot-order 决定设备尝试顺序
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !