问题来源:

野火 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. 最大比例 公约数复用 【蓝桥真题】 (c++)

    最大比例 X星球的某个大奖赛设了M级奖励.每个级别的奖金是一个正整数.并且,相邻的两个级别间的比例是个固定值.也就是说:所有级别的奖金数构成了一个等比数列.比如:16,24,36,54其等比值为:3/ ...

  2. 【集群实战】fatab开机挂载失败案例

    1. nfs挂载加入fstab案例 NFS客户端实现fstab开机自启动挂载 现象:nfs开机挂载卸载了/etc/fstab中,结果无法开机自动挂载nfs 解答:1. nfs客户端命令放在/etc/r ...

  3. Django中的content_type表

    models.py from django.db import models from django.contrib.contenttypes.models import ContentType # ...

  4. BlackNurse攻击:4Mbps搞瘫路由器和防火墙

    研究人员宣称,最新的知名漏洞BlackNurse,是一种拒绝服务攻击,能够凭借仅仅15到18Mbps的恶意ICMP数据包就将防火墙和路由器干掉. 该攻击会滥用Internet控制报文协议(ICMP)第 ...

  5. UDT的Sender和Receiver

    Sender算法 数据结构和变量: Sender's Loss List:发送方的loss list用来存储丢失包的序列号,序列号来自于两个地方,一是receiver通过NAK包反馈回来,二是超时事件 ...

  6. 图论--2-SAT--POJ Ikki's Story IV - Panda's Trick

    Description liympanda, one of Ikki's friend, likes playing games with Ikki. Today after minesweeping ...

  7. ACM卡常处理办法(虽然我到现在没遇到)

    今天做预流推送,一样的代码.别人500MS(OI选手)而我5S,百思不得其解,然后我知道了还有卡常这一说. 我们今天就来看一看吧: 1.循环展开: 在缓存和寄存器允许的情况下一条语句内大量的展开运算会 ...

  8. B. Modulo Sum dp

    https://codeforces.com/contest/577/problem/B 先读懂题意,substring 这个是子串说明不可以跳 subsequence这个是子序列可以跳 这个题目是一 ...

  9. 龙贝格算法 MATLAB实现

    龙贝格算法主要是不断递推和加速,直到满足精度要求 递推: 加速: 得到T表: MATLAB代码: function I = Romberg(f, a, b, epsilon) I = 0; h = b ...

  10. 【Linux基础总结】Shell 基础编程

    Shell 基础编程 重启虚拟机遇到磁盘损坏如何解决 Shell编程中变量的声明.引用及作用域 Shell程序 概述 以文件形式存放批量的Linux命令集合,该文件能够被Shell解释执行,这种文件就 ...