问题来源:

野火 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 段。

    备注:此处分析基于 linux 4.14 。 linux 4.19 已经将 configfs 放入 filesystem 。

  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

系统对 Device Tree Overlays 的支持方式的更多相关文章

  1. Enable SPI 1.0 and 1.1 with device tre overlays on BeagleBone

    For most people the above image means absolutely nothing, but for that one guy that has been searchi ...

  2. Device trees, Overlays and Parameters of Raspberry Pi

    Raspberry Pi's latest kernels and firmware, including Raspbian and NOOBS releases, now by default us ...

  3. 基于tiny4412的Linux内核移植(支持device tree)(三)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  4. 基于tiny4412的Linux内核移植(支持device tree)(一)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  5. 基于tiny4412的Linux内核移植(支持device tree)(二)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  6. Device Tree(三):代码分析【转】

    转自:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html Device Tree(三):代码分析 作者:linuxer 发布于:201 ...

  7. ARM Linux 3.x的设备树(Device Tree)

    http://blog.csdn.net/21cnbao/article/details/8457546 宋宝华 Barry Song <21cnbao@gmail.com> 1.     ...

  8. ARM Linux 3.x的设备树(Device Tree)

    1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pai ...

  9. Device Tree(三):代码分析

    一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请参考引入Device Tree的原因) 2.Device Tree的基础概 ...

随机推荐

  1. Spring Cloud 系列之 Stream 消息驱动(二)

    本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Stream 消息驱动(一) 本篇文章讲解 Stream 如何实现消息分组和消息分区. 消息分组 如果有多个消息消费者 ...

  2. POJ1077 八数码问题

    题目:八数码 网址:http://poj.org/problem?id=1077 在一个3×3的网格中,1~8这8个数字和一个"X"恰好不重不漏地分布在这3×3的网格中. 例如: ...

  3. MySQL5.7 并行复制

    MySQL5.7 并行复制 1.缘由: 某天看到主从复制延时的告警有点频繁,就想着是不是彻底可以解决一下. 一般主从复制,有三个线程参与,都是单线程:Binlog Dump(主) ----->I ...

  4. iterm2终端manpage高亮显示

    iterm2 据说是macOS平台上最好用的终端工具,今天下载来用了一下,发现确实很好.但是在使用man命令显示manpage的时候,颜色配置不是很让人满意,就像下面这样: 其实这样也是不错的,但是用 ...

  5. java集合的简单用法

    typora-root-url: iamge [TOC] 1.集合接口 1.1将集合的接口与实现分离 ​ 与现代的数据结构类库的常见情况一样,Java集合类库也将接口(interface)与实现(im ...

  6. RF(IF 判断)

    1.关键字 Run Keyword If,格式如下: ELSE   必须大写 ELSE   前面需要加 "..." 表示缩进 Run Keyword If a == b log T ...

  7. Nginx模块开发(1)————类helloworld

    Nginx看了一点了,准备写个helloworld试试,觉得只看书的话很多东西都乱乱的,晕晕的,印象不深. 我的helloworld模块的目的就是:能够在浏览器里输入http://你的ip地址/lcw ...

  8. Nacos作为配置中心时,多个服务共用一个dataId的配置

    写在前面 本文是对我之前一篇文章<Spring Cloud+nacos+Feign,实现注册中心及配置中心>的补充.此文章中简单写了如何将Nacos作为配置中心.在使用配置中心时,我们会遇 ...

  9. Web 跨域请求问题的解决方案- CORS 方案

    1.什么是跨域 跨域是指跨域名的访问,以下情况都属于跨域: 跨域现象 实例 域名不相同 www.baidu.com与www.taobao 一级域名相同,但是端口不相同 www.baidu.com:80 ...

  10. Android P HIDL demo代码编写 (原创)

    之前的文章已经分析了HIDL服务的注册和调用,这篇文章来总结下一个HIDL的服务如何编写. 缩写HAL文件 首先要确认放置文件夹和接口的包名,因为这跟后面使用脚本生成一部分代码有关,一般默认的放在ha ...