少于 1 分钟阅读 次阅读

功能名称:HW-ID DTB


参考资料

  1. 程序 SDK 根目录下RKDocs/common/u-boot/Rockchip_Developer_Guide_UBoot_Nextdev_CN.pdf,见 P60
  2. 正点原子开发手册02【正点原子】ATK-DLRK3568_Android系统开发手册V1.2.pdf,见 P137

原理说明

HW-ID DTB 功能通过硬件识别(如 GPIO 或 ADC)来动态选择设备树(DTB)。在系统启动时,u-boot 会根据硬件状态(如拨码开关的 GPIO 电平或 ADC 的电压值)加载对应的设备树,从而实现对不同硬件配置的支持。

  • GPIO 硬件识别:通过读取 GPIO 引脚的状态,判断硬件配置并选择对应的设备树。
  • ADC 硬件识别:通过读取 ADC 的电压值范围,确定硬件配置并选择设备树。

开发流程

  1. 修改设备树文件u-boot/arch/arm/dts/rk3568-u-boot.dtsi中,确保 GPIO 或 ADC 硬件检测节点的配置正确:

    • GPIO 检测:在&pinctrl和对应的&gpio节点中添加属性u-boot,dm-splu-boot,dm-pre-reloc,使这些节点在 u-boot 早期阶段就可以被访问。
    • 属性说明
      • u-boot,dm-spl:表示该节点在 SPL 阶段可用。
      • u-boot,dm-pre-reloc:表示该节点在设备重定位之前可用。

    示例代码:

    &pinctrl {
        u-boot,dm-spl;
        u-boot,dm-pre-reloc;
        status = "okay";
    };
    
    &gpio2 {
        u-boot,dm-spl;
        u-boot,dm-pre-reloc;
    };
    
    • ADC 检测:默认情况下,ADC 硬件检测功能已经使能,无需额外配置。
  2. 编译设备树 为每个硬件配置生成对应的设备树文件(DTB),并使用自定义命名区分这些设备树。例如:

    • rk3568_hwid1.dtb
    • rk3568_hwid2.dtb
  3. 打包设备树 使用mkmultidtb.py脚本将所有设备树文件(DTB)打包到resource.img中。具体操作参考《使用 mkmultidtb.py 打包多个设备树》。打包完成后,resource.img会自动放置到./kernel目录下,覆盖原有的resource.img
  4. 注意mkmultidtb.py脚本只是打包并替换了./kernel目录下的resource.img,而./kernel目录下的boot.img中包含的resource.img还是旧的,不是mkmultidtb.py脚本打包出来的,且./kernel目录下的boot.img中不包含最终烧录所需的ramdisk.img,所以需要进行下一步得到烧录用的真正boot.img
  5. 生成boot.img

    • 确保kernel目录下的resource.img已被正确替换。
    • 进入 SDK 根目录,执行以下命令:
      make bootimage -j16
      
    • 该命令会将resource.img打包为包含ramdisk.imgboot.img,生成的boot.img路径为:
      <sdk>/out/target/product/<产品名称>/boot.img
      
  6. 烧写镜像 使用烧录工具将生成的boot.img烧写到开发板的boot分区中,确保系统能够加载正确的设备树。

问题与解决方案

  • 替换kernel目录下的resource.img后,执行make bootimage -j16命令时,<sdk>/out/target/product/rk3568_HW/boot.img文件有时不会更新。

可能原因

  1. Makefile 依赖未触发make系统可能未检测到resource.img的变化,导致未重新生成boot.img
  2. 编译缓存问题:编译系统可能使用了旧的中间文件,未正确更新。

解决方案

  1. 重新编译内核: 进入 sdk 根目录后:
    ./build.sh -CK
    

留下评论