RK平台U-Boot开发系列:启动源检测原理

电子说

1.4w人已加入

描述

芯片上电后,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 决定设备尝试顺序

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分