系統對 Device Tree Overlays 的支持方式

来源:https://www.cnblogs.com/JiuHuan/archive/2020/05/23/12942021.html
-Advertisement-
Play Games

Device Tree Overlays、 dtbo、設備樹堆疊功能 ...


問題來源:

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ​鏈接大家都用過,比如 Windows 中的快捷方式就是一種鏈接,可是 Linux 里又分硬鏈接和軟鏈接,它們表示什麼意思,又有什麼區別呢,本文來給大家做一個解釋。 Inode 索引節點 要想理解硬鏈接和軟鏈接的區別,首先要明白什麼是 Inode。Inode 是 Index node,索引節點的意思 ...
  • [toc] 在RHEL系列中,Bash中的快捷鍵是由readline庫來提供,預設是emacs風格的鍵綁定。 使用set命令可以查看當前的模式 快捷鍵的一些說明 Control鍵:PC鍵盤上的Ctrl鍵 Meta鍵:PC鍵盤上的ALT鍵,如果你鍵盤上沒有這個鍵,可以使用ESC鍵代替 ctrl開頭的快 ...
  • 1. --convert-links :把一個website的相對鏈接改成絕對鏈接,使之mirror的網站以網站的方式運行 wget --mirror -c -U "Mozilla" --convert-links -p https://docs.scrapy.org/en/latest/ 2.如果 ...
  • 私有雲技術 使用腳本部署OpenStack平臺 需要兩台主機,一臺控制節點,一臺計算節點 控制節點:安裝MySQL、Keystone、Glance、Nova、Neutron、Dashboard等服務,主要作為認證、鏡像管理節點,以及提供Nova和Neutron服務的管理節點。提供Dashboard界 ...
  • k3s介紹 K3S是一個輕量級的K8S集群,它是Rancher Lab開發的一個新的產品, 目的是在資源有限的設備上面跑K8S。它的最大特點就是小,二進位包只有40MB,只需要512MB的記憶體就能跑起來。K3S目的是在一些資源受限的設備上面把Kubernetes跑起來,主要的應用場景包括Edge,I ...
  • Linux 下三種提高工作效率的文件處理技巧 在 Linux 下工作,打交道最多的就是文件了,畢竟 Linux 下工作一切皆文件嘛。Linux 也為大家提供了多種用於處理文件的命令,合理使用這些命令可以大大節省你的時間,並讓我們的工作負擔不再那麼沉重。 尋找文件的技巧 當我們查找文件時,第一時間想到 ...
  • Mac 安裝 homebrew: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 報錯: Failed to connect to raw.githu ...
  • 在docker容器里運行的服務必須前臺運行,如果後臺運行會導致容器一啟動就退出了,原因是容器內部本身就只有一個進程在跑,如果你後臺運行,就沒有進程在前臺,所以docker會認為該容器已經宕機;其實我們可以理解為容器內部前臺跑的程式是支撐整個容器為運行態的重要骨架; ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...