搭建一个和linux开发者知识共享和学习的平台
分类: 嵌入式
2024-06-17 09:50:39
设备树 overlay(以下译作 “叠加”)是一种动态配置硬件设备的机制。在非 x86 架构的嵌入式系统里,硬件设备的配置信息通常以设备树的形式提供给软件,比如 bootloader、操作系统内核等。设备树是一种描述硬件设备结构和属性的数据结构,它将设备的硬件特性以及操作系统所需的配置信息以一种统一的方式表示出来。 叠加设备树
再来写一个叠加设备树文件:
qemu
基础设备树和叠加设备树都不加 -@ 编译,测试结果跟 “基础设备树不加 -@” 的情况一样。
测试结果
下表列出了 -@ 应用于基础设备树和叠加设备树的 4 种可能情况对应的测试结果:
基础设备树 -@
叠加设备树 -@
功能正常
y
y
y
y
n
y
n
y
n
n
n
n
测试结果表明,在基础设备树不加 -@ 编译的情况下,设备树叠加不能正确工作。那么这就是{banned}最佳后的结论了吗?答案是否定的。
另一种写法
target-path 节点
现在我们稍微修改一下 overlay.dts 文件:
一定要用 -@ 来编译
dtc 软件包
发行版提供的 dtc 软件包不只包含我们{banned}最佳常用的 dtc 工具,还包括一些很实用的小工具,如 fdtdump、fdtoverlay 等。
fdtdump
前文中用 dtc 工具把 dtb 格式转换成 dts 格式,也可以直接用 fdtdump 工具,更加简便。
fdtoverlay
测试设备树叠加能否正常工作,也不用非得到 u-boot 命令行下测试,使用 dtc 软件包中的 fdtoverlay 这个主机侧的工具可以非常方便地进行测试。
传统的叠加层是通过在根节点中创建片段节点来创建的。每个片段节点必须具有一个 target 属性,其值是一个标签引用,或者一个 target-path 字符串属性,其值为一个节点的绝对路径。然后,片段节点必须有一个名为 __overlay__ 的子节点,当应用叠加层时,该子节点的属性和子节点将与基础设备树进行合并。
这种写法在需要叠加的片段节点非常多的情况下非常繁琐,每个片段节点需要手工编号,从 0 一直写到 n:
这种情况我们没有引用带标签的外部节点,而是用的全路径的语法糖写法,生成的叠加层片段节点里正确生成了 target-path 属性,注意目标文件里没有生成 __fixups__ 子节点,这与我们预料的一致。
总结
综上所述,设备树叠加机制提供了一种灵活、高效和可维护的方式来配置和修改设备树,使系统能够适应不同的硬件配置和应用需求,并简化了设备树的更新和维护过程。
首发地址:https://tinylab.org/devicetree-overlay-internals