rk emmc/sd 引导分析

本文详细介绍了RK平台的启动流程,包括从BootROM加载idblock0,再到加载DDR初始化代码及u-boot的过程。此外,还提供了rkflash-boot工具代码,用于快速烧录u-boot.bin,适用于RK3128、RK3288等设备。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

没找到 rk 官方的说明文档, 以下主要通过分析 u-boot, rkflashtool 以及写有引导的 emmc 得来. 文末提供 rkflash-boot 工具代码, 用于烧写引导, 在 rk3128, rk3288 上验证过.

1.  引导流程:

bootrom (CPU) ->
从 emmc 上加载 idblock0 ->
根据 idblock0 加载 emmc 上的 ddr 初始化代码->
根据 idblock0 加载u-boot代码

2.  存储结构:
idblock0 存储于第 64 个扇区, ddr 初始化代码和 u-boot 的扇区偏移量存储于 idblock0, ddr 初始化代码一般存储于 idblock3 后面. 如图


3.  idblock0 定义:

1
2
3
4
5
6
7
8
9
10
11
typedef   PACKED1  struct   _Sector0Info {    /* 总共512Bytes */
     UINT      fwSig;
     UCHAR     reserved[4];
     UINT      uiRc4Flag;   /* ddr and loader bin rc4 flaf - 1:  no rc4, 0: rc4 */
     USHORT    usBootCode1Offset;
     USHORT    usBootCode2Offset;
     UCHAR     reserved1[490];
     USHORT    usFlashDataSize;     /* 扇区为单位 */
     USHORT    usFlashBootSize;
     UCHAR     reserved2[2];
}PACKED2 Sector0Info;

(以上参考 u-boot/board/rockchip/common/rkloader/idblock.h)

其中 fwSig 为签名, 必须为  0x0ff0aa55
uiRc4Flag 为 ddr-init 和 u-boot 的加密标志, 一般为 0;
usBootCode1Offset 和 usBootCode2Offset 为 ddr-init 的扇区偏移地址, 一般为 4;
usFlashDataSize 为 ddr-init 占用的扇区数, 必须 4 对齐;
usFlashBootSize 为 ddr-init 和 u-boot 一共占用的扇区数, 必须 4 对齐.
u-boot 的偏移量为 usBootCode1Offset + usFlashDataSize.

idblock0 存储到 emmc/sd 前需要先经 rc4 加密, 密码为 7c4e0304550509072d2c7b38170d1711
可参考 u-boot 函数 P_RC4(), 该函数位于  u-boot/board/rockchip/common/platform/rc4_enc.c


4.  其它 idblock:
其它 idblock 定义可参考 u-boot/board/rockchip/common/rkloader/idblock.h
其中idblock3 存储了设备的序列号和 mac 地址.
其它 idblock 在 u-boot 阶段读取解析, 不需要 rc4 加密, 这些数据不写也可以正常引导至 u-boot.


5. usb 秒写 u-boot.bin:

    rkflash-boot 根据 rkflashtool 修改, 用于烧写 u-boot. 可秒写 u-boot.bin , 方便调试.

    代码:

    https://download.youkuaiyun.com/download/mxm12/10415566

    用法:

         rkflash-boot u-boot.bin [ddrinit] [usbplug]

    maskrom 方式时, 需要参数 ddrinit, usbplug 文件路径

    loader 方式时, 只需要传 u-boot.bin 路径


   为什么 upgrade_tool 下载引导很慢?

   因为 upgrade_tool 多写了 4 次引导 , 不只是 64 扇区, 还包括 64 + n* 1024 (n = 1~4) 号扇区.












 

### RK U-Boot测试 EMMC 功能的方法 为了验证 RK U-Boot 对于 EMMC 的功能支持情况,可以通过以下方法完成测试: #### 1. **烧写 u-boot 到开发板的 SD 卡** 首先需要将编译好的 `u-boot` 文件烧录至 SD 卡中。完成后,设置开发板从 SD 卡启动并观察是否能够正常进入 U-Boot 交互界面[^1]。 #### 2. **确认 U-Boot 是否加载必要的固件文件** 在 RK3399 平台或其他基于 ARM 的 Rockchip 芯片上,U-Boot 包含多个重要的固件文件,例如 `bl31.elf`(必须存在)、以及可选的 `bl32.bin` 和 `tee.bin` 等 TrustZone 固件[^2]。这些文件对于系统的初始化至关重要,在测试过程中应确保它们被正确加载。 #### 3. **将 U-Boot 写入到 EMMC 存储中** 进入 U-Boot 交互模式后,执行命令将 U-Boot 写入到 EMMC 设备中。这一步骤通常涉及使用特定的设备地址和分区配置。例如: ```bash mmc write ${loadaddr} 0x800 0x200 ``` 上述命令表示将内存地址 `${loadaddr}` 开始的数据写入到 EMMC 的第 `0x800` 扇区起始位置,长度为 `0x200` 扇区。 #### 4. **验证 EMMC 启动能力** 设置开发板从 EMMC 启动,并检查其能否顺利进入 U-Boot 控制台。如果一切正常,则说明 EMMC 的基本功能无误;否则可能涉及到硬件连接问题或者软件兼容性问题。 --- ### 常见问题分析 以下是针对 RK U-Boot 测试 EMMC 功能时可能出现的一些常见问题及其解决思路: #### 1. **无法识别 EMMC 设备** 如果在 U-Boot 下运行 `mmc info` 或者其他相关指令时发现未检测到任何有效的存储介质,可能是由于物理接口损坏或者是驱动层存在问题所致。建议重新核查硬件连线状况,并更新最新版本的 U-Boot 源码尝试修复潜在缺陷[^5]。 #### 2. **数据传输失败** 当试图往 EMMC 写入数据却遭遇错误提示的时候,应该仔细审查所使用的参数设定是否有偏差。另外也要注意目标区域是否存在保护机制阻止修改操作发生。 #### 3. **启动异常中断** 若系统未能按照预期顺序依次调用 BOOTROM -> idbloader.img -> uboot.itb 完成整个引导链条构建的话,那么很可能是某些中间环节缺失关键组件导致链路断裂现象出现。 --- ### 提供一段简单的脚本用于自动化部署流程演示 下面给出了一段简化版的 Shell 脚本来辅助完成上述提到的部分任务步骤: ```sh #!/bin/sh # 加载环境变量 env default -a && saveenv # 显示当前 MMC 设备状态 mmc dev 0 mmc info # 将镜像加载到 RAM 缓冲区内存指定偏移处 fatload mmc 0:1 $loadaddr u-boot.itb # 把刚才读取的内容刷回到实际磁盘对应扇区范围上去 mmc write $loadaddr 0x800 0x200 ``` 此脚本仅作为参考用途,请依据实际情况调整适配后再投入使用。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值