问题来源:

野火 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. optparse--强大的命令行参数处理包

    optparse,它功能强大,而且易于使用,可以方便地生成标准的.符合Unix/Posix 规范的命令行说明. optparse的简单示例: from optparse import OptionPa ...

  2. 《数据分析实战:基于EXCEL和SPSS系列工具的实践》一1.4 数据分析的流程

    本节书摘来华章计算机<数据分析实战:基于EXCEL和SPSS系列工具的实践>一书中的第1章 ,第1.4节,纪贺元 著 更多章节内容可以访问云栖社区"华章计算机"公众号查 ...

  3. 加分二叉树 vijos1991 NOIP2003第三题 区间DP/树形DP/记忆化搜索

    描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一 ...

  4. JSbridge 在Vue的封装与交互

    原文转自: 点我 写在 JSbridge.js let isAndroid = navigator.userAgent.indexOf('Android') > -1 || navigator. ...

  5. 关于RMQ问题的四种解法

    什么是RMQ问题:     RMQ (Range Minimum/Maximum Query):对于长度为n的数组A,回答若干询问RMQ(A,i,j)(i,j<=n-1),返回数组A中下标在i, ...

  6. Python(Redis 中 String/List/Hash 类型数据操作)

    1.下载 redis 模块 pip install redis 2.redis 数据库两种连接方式 简单连接 decode_responses=True,写入和读取的键值对中的 value 为 str ...

  7. CRT 连接AWS-EC2

    crt使用.pem登录AWS服务器 网上看到方案如下,看到大部分人都成功了,一头雾水,我的crt不需要pub文件.... chmod xxx.pem ssh-keygen -p -f xxx.pem ...

  8. Shell脚本(一)入门

    开始学习Shell脚本. #!/bin/bash ]; then echo "you are not root" else echo "you are root" ...

  9. HDU1300Pearls

    传送门 描述: 有几种不同的珍珠.每种珍珠都有它的单价.当然质量高的珍珠价格一定也是高的. 为了避免买家只买1个珍珠.就要求不论是买了多少个珍珠都是需要在购买数量上加10.之后乘上单价. 例如:买5个 ...

  10. 异常: java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener

    如果出现这个错误信息,如果你的项目是Maven结构的,那么一般都是你的项目的Maven Dependencies没有添加到项目的编译路径下 解决办法: ①选中项目->右键Properties-& ...