[经验分享] 基于Rockchip平台OpenHarmony动态DTS实现 原创

诚迈-陆志刚 显示全部楼层 发表于 2024-7-23 16:14:51
基于Rockchip平台OpenHarmony动态DTS实现
(文章已获得诚迈科技资深研发工程师-潘第杰授权)
概念

在Linux中,动态更换DTB,通常指的是在运行时通过加载或替换DTB文件来改变设备树的行为或配置。设备树是描述硬件设备及其连接方式的数据结构,在嵌入式系统中特别常见,它允许系统在不修改内核的情况下动态配置硬件和设备驱动。

在运行时可以加载新的或替换现有的DTB文件,从而改变设备树的配置。这种能力使得系统能够根据需要动态调整硬件配置,而无需重新编译内核或重启系统。典型的操作包括加载不同的硬件配置文件、添加或移除设备节点、调整设备参数等。

场景描述

假设一个硬件平台在V1版本时使用了A器件,而在V2版本中,该器件被更新为B设备。如果平台软件团队只维护一套Linux代码库,通过使用设备树覆盖,可以根据硬件版本动态选择合适的.dtb文件,从而使同一套代码同时满足V1和V2硬件版本的需求,极大地增加了项目的灵活性和可维护性。

总之,设备树覆盖为Linux内核提供了一种高效、灵活的设备管理机制,特别适用于需要动态调整硬件配置或支持多个硬件版本的场景


1.png


方案描述

启动方式

Rockchip采用uboot+extlinux方式启动引导内核,其中extlinux是syslinux的一种,用于辅助启动内核,通过extlinux.conf文件来决定启动选项和参数,文件格式参考:
  1. default rockchip-kernel-5.10
  2. prompt 0
  3. timeout 50

  4. label rockchip-v1
  5.         kernel /extlinux/Image
  6.         fdt /extlinux/rockchip-v1.dtb
  7.         append earlycon=uart8250,mmio32,0xfe660000 root=PARTUUID=614e0000-0000-4b53-8000-1d28000054a9 rw rootwait rootfstype=ext4

  8. label rockchip-v2
  9.         kernel /extlinux/Image
  10.         fdt /extlinux/rockchip-v2.dtb
  11.         append earlycon=uart8250,mmio32,0xfe660000 root=PARTUUID=614e0000-0000-4b53-8000-1d28000054a9 rw rootwait rootfstype=ext4

  12. label rockchip-kernel-5.10
  13.         kernel /extlinux/Image
  14.         fdt /extlinux/toybrick.dtb
  15.         append earlycon=uart8250,mmio32,0xfe660000 root=PARTUUID=614e0000-0000-4b53-8000-1d28000054a9 rw rootwait rootfstype=ext4
复制代码
  1. SEARCH_STRING="rockchip"
  2. DTB_FILES=$(find ${dtb_path} -name "*.dtb" | grep "$SEARCH_STRING")

  3. echo "default rockchip-kernel-5.10" > ${EXTLINUX_CONF}
  4. echo "prompt 0" >> ${EXTLINUX_CONF}
  5. echo "timeout 50" >> ${EXTLINUX_CONF}
  6. echo  >> ${EXTLINUX_CONF}

  7. for dtb_file in $DTB_FILES; do
  8.         echo  "$dtb_file"
  9.         dtb_base=$(basename "$dtb_file" .dtb)
  10.         echo  "${dtb_base}"
  11.         echo "label ${dtb_base}" >> ${EXTLINUX_CONF}
  12.         echo "        kernel /extlinux/${image}" >> ${EXTLINUX_CONF}
  13.         echo "        fdt /extlinux/${dtb_base}.dtb" >> ${EXTLINUX_CONF}
  14.         cmdline="append earlycon=uart8250,mmio32,${uart} root=PARTUUID=614e0000-0000-4b53-8000-1d28000054a9 rw rootwait rootfstype=ext4"
  15.         echo "        ${cmdline}" >> ${EXTLINUX_CONF}
  16.         echo  >> ${EXTLINUX_CONF}
  17. done

  18. echo "label rockchip-kernel-5.10" >> ${EXTLINUX_CONF}
  19. echo "        kernel /extlinux/${image}" >> ${EXTLINUX_CONF}
  20. echo "        fdt /extlinux/${TOYBRICK_DTB}" >> ${EXTLINUX_CONF}
  21. cmdline="append earlycon=uart8250,mmio32,${uart} root=PARTUUID=614e0000-0000-4b53-8000-1d28000054a9 rw rootwait rootfstype=ext4"
  22. echo "        ${cmdline}" >> ${EXTLINUX_CONF}
  23. echo  >> ${EXTLINUX_CONF}
复制代码
  1. static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg)
  2. {
  3. ...
  4. label_override = env_get("pxe_label_override");

  5. if (!m)
  6.         return NULL;

  7. list_for_each(pos, &cfg->labels) {
  8.         label = list_entry(pos, struct pxe_label, list);

  9.         sprintf(label->num, "%d", i++);
  10.         if (menu_item_add(m, label->num, label) != 1) {
  11.                 menu_destroy(m);
  12.                 return NULL;
  13.         }
  14.         if (cfg->default_label &&
  15.             (strcmp(label->name, cfg->default_label) == 0))
  16.                 default_num = label->num;
  17.         if (label_override && !strcmp(label->name, label_override))
  18.                 override_num = label->num;

  19. }
  20. ...
  21. }
复制代码

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部