日志

系统对 Device Tree Overlays 的支持方式

 来源    2020-05-23    0  

问题来源:

野火 iMX 6ULL 开发板资料。
https://tutorial.linux.doc.embedfire.com/zh_CN/latest/linux_basis/fire-config_brief.html

5.3. fire-config机制

一般而言,fire-config旨在提供一些常见的系统功能配置服务,在进行配置过程中, 这可能会导致/boot/uEnv.txt或者是其他各种标准的linux配置文件被自动更改了, 某些选项需要重启才能生效,如果您修改了其中一个,fire-config 会在<Finish> 按钮被选择时,询问您是否要立即重启,如果您希望配置马上生效,确定重启系统即可。

5.4. Device Tree Overlays

fire-config工具集成了Device Tree Overlays机制,用来管理一些硬件资源的分配和模块的加载, 从而缓解多个驱动程序争用系统资源的问题。

在传统开发模式中,这个机制通常是由设备树来完成的:在开发之前根据项目需求, 提前确定系统中所有用到的硬件设备。在设备树中把所有的外围设备信息以设备树特定的语法进行描述, 在设备树被编译为dtb文件后,被linux内核加载使用。

可以看到,在传统开发过程,一旦硬件资源发生变化,就要重新修改、编译、下载设备树。比较极端的情况是: 当项目中要支持多种的硬件模块,而不同模块间往往会共用某些系统资源(如IO引脚)。 一旦系统要兼容模块任意组合使用,那么随着模块数量增加,需要编译的设备树数量将爆炸增长。

因此,使用传统设备树是不利于项目的维护和扩展的。内核为了解决这个提出了一套新的解决方案, 那就是Device Tree Overlays,中文上可理解为”设备树插件”。 它的核心原理是,通过扩展传统的设备树语法,使得各个硬件模块的信息可以独立地用新的设备树语法来描述。 这样一来,传统的主设备树中只需要保留最基础的硬件信息(主要是cpu和内存),其他模块单独编译成”设备树插件”。 在系统实际使用时,根据实际应用情景,需要用到哪些硬件模块就把对应的设备树插件加入到主设备树即可。

“设备树插件”无疑提高了系统的可维护性和减少了大量的重复工作,目前, 我们已经把常见的硬件模块都编译成了”设备树插件”,比如LCD、HDMI、WiFi等等。 用户可以通过fire-config工具轻松地实现对硬件模块的便捷管理。

原本问题:

5.3 节 最后一句: 如果您希望配置马上生效,确定重启系统即可。

既然是“插件”,为什么要重启? 不是热拔插的么?

究竟在哪里加载 overlay 文件进内核的?

  1. uboot 加载的?
  2. 内核加载的?
  3. 操作系统加载的?

Device Tree Overlays 是怎么运行的?

有朋友问我 Device Tree Overlays 是什么,怎么没听说过。确实百度很少找到资料。
我给出的中文名叫 设备树堆叠功能。不一定准确。
内核描述在 Documentation/devicetree/overlay-notes.txt

Device Tree Overlays 核心定义:

在 kernel 启动以后系统加载时候修改或者增加部分dts,最终把整个系统需要的设备驱动全部加载进去。

用处:

动态修改设备树。
在用户空间配置内核对象 Device Tree。

uboot 启动内核

从 <Device Tree Overlays 核心定义> 来看,不是uboot的操作。
bootm <uImage_addr> <initrd_addr> <dtb_addr>
内核对 dtb 文件的解析位置
start_kernel -->setup_arch(&command_line) -->setup_machine_fdt(__fdt_pointer) -->unflatten_device_tree()
overlays 的调用位置
  1. drivers/of/overlay.c 核心代码。
    // Create and apply an overlay
    int of_overlay_create(struct device_node *tree);
    // Removes an overlay
    int of_overlay_destroy(int id);
    // Removes all overlays from the system
    int of_overlay_destroy_all(void);

  2. 查找到 of_overlay_create 被 drivers/of/configfs.c 使用。
    configfs.c 最后一行 late_initcall(of_cfs_init) 标记 of_cfs_init 加入到 内核 .init 段。

  3. .init 段被调用位置
    start_kernel -->rest_init() -->kernel_init() --> kernel_init_freeable() -->do_basic_setup() -->do_initcalls()
    注意: kernel_init_freeable() 是 kernel_init() 第一行。
    kernel_init 在完成一系列初始化之后启动第一个用户进程。内核启动过程就结束了。

  4. 调用 of_cfs_init 会在 /sys/kernel/config/ 目录下创建 /sys/kernel/config/device-tree/overlay 文件(内存文件系统)。

configfs.c 的具体分析见参考文章
https://blog.csdn.net/liujiliei/article/details/105276551

内核启动流程。

void __init start_kernel(void)
{
....
setup_arch(&command_line);
....
rest_init();
}

结论
/boot/overlay 目录下的 *.dtbo 文件并不是内核启动过程中加载和处理的。
那么就要看是不是 UBOOT 和 操作系统init进程做的了。 稍后进行。
野火iMX 6ULL
  1. 通过启动日志看。uboot 有对 dtb 进行操作。
    加载 /boot/uEnv.txt 对启用的 *.dtbo 文件进行处理。
  2. fire-config 有使用到 dtoverlay 这个工具。

root@npi:/usr/bin# file dtoverlay
root@npi:/usr/bin# dtoverlay: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=47010de3c4a3ddde326dfaf701ca908ad41f34e9, not stripped
root@npi:/usr/bin# dtoverlay --help

  • unknown option '--help'
    Usage:
    dtoverlay [=...]
    Add an overlay (with parameters)
    dtoverlay -D [] Dry-run (prepare overlay, but don't apply -
    save it as dry-run.dtbo)
    dtoverlay -r [] Remove an overlay (by name, index or the last)
    dtoverlay -R [] Remove from an overlay (by name, index or all)
    dtoverlay -l List active overlays/params
    dtoverlay -a List all overlays (marking the active)
    dtoverlay -h Show this usage message
    dtoverlay -h Display help on an overlay
    dtoverlay -h .. Or its parameters
    where is the name of an overlay or 'dtparam' for dtparams
    Options applicable to most variants:
    -d Specify an alternate location for the overlays
    (defaults to /boot/overlays or /flash/overlays)
    -v Verbose operation

Adding or removing overlays and parameters requires root privileges.

树莓派网站也找到 dtoverlay 的描述 2.2.10 节。
https://www.raspberrypi.org/documentation/configuration/device-tree.md

搜索 dtoverlay 找到不少使用案例,不需要重启即可生效。
例如:
https://blog.csdn.net/qq_30968657/article/details/52044876
基本可以断定是 dtoverlay 工具是真实使用 device tree overlay 完成的。

友善Nanopi neo core2
在该产品/boot 目录下发现 overlay 相关内容。
分析 npi-config 使用的是 fdtput fdtget fdtdump 直接操作 /boot/*.dtb 文件。  
并没有使用到 /boot/overlay/* 目录下的 *.dtbo (overlay文件)文件。

正确使用 device tree overlays

直接操作

通过外文网站获取到一些内容:
device tree overlays 的实际用法是,系统启动后 root 用户修改dtb文件,不需要重启!即可生效。
在 /sys/kernel/config/device-tree/overlays/ 目录下创建目录,创建完成后目录内自动会有三个文件 dtbo path status
直接复制 已经编译好的 *.dtbo 文件覆盖 dtbo 文件.
并对 status 赋值 1 即可(好像是不需要的,cp文件覆盖直接生效,如果 status 是只读文件 获取当前 dtbo 是否OK)。

root@npi:/sys/kernel/config/device-tree/overlays# mkdir test
root@npi:/sys/kernel/config/device-tree/overlays# cd test
root@npi:/sys/kernel/config/device-tree/overlays/test# ls
root@npi:/sys/kernel/config/device-tree/overlays/test# dtbo path status
root@npi:/sys/kernel/config/device-tree/overlays/test# cat status
root@npi:/sys/kernel/config/device-tree/overlays/test# unapplied
root@npi:/sys/kernel/config/device-tree/overlays/test# cp /lib/firmware/test.dtbo dtbo
root@npi:/sys/kernel/config/device-tree/overlays/test# cat status
root@npi:/sys/kernel/config/device-tree/overlays/test# applied

加载完成后,dtbo 内的设备会自动由系统安装。可以在 /dev 看到具体内容。

工具操作

参考树莓派的使用方式:
https://www.raspberrypi.org/documentation/configuration/device-tree.md

dtdiff dtoverlay dtparam 应该是一组工具。 这里不再描述。

参考文章:

https://blog.csdn.net/u014135607/article/details/79949571
https://blog.csdn.net/liujiliei/article/details/105276551
https://github.com/ikwzm/dtbocfg
https://www.raspberrypi.org/documentation/configuration/device-tree.md

相关文章
基于tiny4412的Linux内核移植(支持device tree)(三)
日志作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
基于tiny4412的Linux内核移植(支持device tree)(二)
日志作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
1
基于tiny4412的Linux内核移植(支持device tree)(一)
日志作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
linux-kernel – 在linux中,Open firmware device tree和flattened device tree之间有什么区别
问答在linux中,Open firmware device tree和flattened device tree之间有什么区别. 如何识别linux内核正在使用哪个Device树OF DT或FDT.:: ...
1
Dart:使用零持续时间计时器是将工作延迟到事件循环的支持方式
问答我通过实验发现创建一个持续时间为0的计时器允许我将工作推迟到事件队列中.我非常喜欢这个功能,因为它可以避免很多令人讨厌的重入问题.这种有意识的功能是否会改变?它可以添加到文档中吗?如果没有,是否有支持 ...
2
windows – 检查我的托管服务帐户的安装位置的支持方式是什么?
问答我创建了一个托管服务帐户(不是gMSA),并使用Install-ADServiceAccount将其安装在2012服务器上. 现在我希望能够检查我的MSA安装位置(整个域) 查看MSA属性,我在任何地 ...
1
linux-device-driver – 通过Device Tree中的Chosen节点传递Bootargs,不适用于Beaglebone Black
问答根据我的理解,所选节点用于向内核发送引导参数. 以下是现有设备代码的选定节点(am335x-bone-common.dtsi). chosen { stdout-path = &uart0; ...
1
[dts]Device Tree格式解析
日志转自:http://blog.csdn.net/airk000/article/details/21345159  目录: 1. 作用 2. 基本数据格式 3. 一些基本概念 4. 工作方式     ...
Device Tree常用方法解析
日志Device Tree常用方法解析 Device Tree在Linux内核驱动中的使用源于2011年3月17日Linus Torvalds在ARM Linux邮件列表中的一封邮件,他宣称“this w ...
(DT系列二)device tree的书写规范
日志devicetree的书写规范 下面从节点,属性,reg,ranges,中断控制器等几个方面叙述devicetree的书写规范. 1,dts的基本元素:节点 .dts(或者其include的.dtsi ...
1
设备树(device tree)学习笔记
日志作者信息 作者:彭东林 邮箱:pengdonglin137@163.com 1.反编译设备树 在设备树学习的时候,如果可以看到最终生成的设备树的内容,对于我们学习设备树以及分析问题有很大帮助.这里我们 ...
1
Device Tree常用方法解析转
日志转自:https://blog.csdn.net/airk000/article/details/21345159 Device Tree常用方法解析 Device Tree在Linux内核驱动中的使 ...
linux device tree源代码解析转
日志转自:http://blog.csdn.net/Tommy_wxie/article/details/42806457 //Basedon Linux v3.14 source code Linux设 ...
1
device tree --- #address-cells and #size-cells property转
日志转自:https://www.cnblogs.com/youchihwang/p/7050846.html device tree source Example1 / { #address-cells ...
用Qemu模拟vexpress-a9 (五) --- u-boot引导kernel,device tree的使用
日志环境介绍 Win7 64 + Vmware 11 + ubuntu14.04 32 u-boot 版本:u-boot-2015-04 Linux kernel版本:linux-3.16.y busyb ...
程序配置的原则和实践以及 Spring Boot 支持方式
日志原则 软件需要在不同的环境中部署,代码是保持不变的,但是不同的运行环境存在差异,所以需要使用配置适应不同的环境.比如: 数据库,Redis,以及其他 后端服务 的配置: 第三方服务的证书,如 oAut ...
1
device tree --- label
日志[label:] <device node name>[@ unit-address] 為 device node 取 label name, 可以在其它位置使用 &label 存 ...
1
Device Tree Usage( DTS文件语法)
日志http://elinux.org/Device_Tree_Usage Device Tree Usage Top Device Tree page This page walks through h ...
1
device tree --- #address-cells and #size-cells property
日志device tree source Example1 / { #address-cells = <0x1>; // 在 root node 下使用 1 個 u32 來代表 address ...
1
[device tree] How to decompile a compiled .dtb (device tree blog) into .dts (device tree source).
日志$ ./out/target/product/project_name/obj/KERNEL_OBJ/scripts/dtc/dtc -I dtb -O dts -o decompiled.dts ~ ...