拨码开关选择不同设备树开发指南
功能名称:HW-ID DTB
参考资料
- 程序 SDK 根目录下:
RKDocs/common/u-boot/Rockchip_Developer_Guide_UBoot_Nextdev_CN.pdf,见 P60 - 正点原子开发手册:
02【正点原子】ATK-DLRK3568_Android系统开发手册V1.2.pdf,见 P137
原理说明
HW-ID DTB 功能通过硬件识别(如 GPIO 或 ADC)来动态选择设备树(DTB)。在系统启动时,u-boot 会根据硬件状态(如拨码开关的 GPIO 电平或 ADC 的电压值)加载对应的设备树,从而实现对不同硬件配置的支持。
- GPIO 硬件识别:通过读取 GPIO 引脚的状态,判断硬件配置并选择对应的设备树。
- ADC 硬件识别:通过读取 ADC 的电压值范围,确定硬件配置并选择设备树。
开发流程
-
修改设备树文件 在
u-boot/arch/arm/dts/rk3568-u-boot.dtsi中,确保 GPIO 或 ADC 硬件检测节点的配置正确:- GPIO 检测:在
&pinctrl和对应的&gpio节点中添加属性u-boot,dm-spl和u-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 硬件检测功能已经使能,无需额外配置。
- GPIO 检测:在
-
编译设备树 为每个硬件配置生成对应的设备树文件(DTB),并使用自定义命名区分这些设备树。例如:
rk3568_hwid1.dtbrk3568_hwid2.dtb
- 打包设备树
使用
mkmultidtb.py脚本将所有设备树文件(DTB)打包到resource.img中。具体操作参考《使用 mkmultidtb.py 打包多个设备树》。打包完成后,resource.img会自动放置到./kernel目录下,覆盖原有的resource.img。 - 注意:
mkmultidtb.py脚本只是打包并替换了./kernel目录下的resource.img,而./kernel目录下的boot.img中包含的resource.img还是旧的,不是mkmultidtb.py脚本打包出来的,且./kernel目录下的boot.img中不包含最终烧录所需的ramdisk.img,所以需要进行下一步得到烧录用的真正boot.img。 -
生成
boot.img- 确保
kernel目录下的resource.img已被正确替换。 - 进入 SDK 根目录,执行以下命令:
make bootimage -j16 - 该命令会将
resource.img打包为包含ramdisk.img的boot.img,生成的boot.img路径为:<sdk>/out/target/product/<产品名称>/boot.img
- 确保
- 烧写镜像
使用烧录工具将生成的
boot.img烧写到开发板的boot分区中,确保系统能够加载正确的设备树。
问题与解决方案
- 替换
kernel目录下的resource.img后,执行make bootimage -j16命令时,<sdk>/out/target/product/rk3568_HW/boot.img文件有时不会更新。
可能原因
- Makefile 依赖未触发:
make系统可能未检测到resource.img的变化,导致未重新生成boot.img。 - 编译缓存问题:编译系统可能使用了旧的中间文件,未正确更新。
解决方案
- 重新编译内核:
进入 sdk 根目录后:
./build.sh -CK
留下评论