ARM Linux 設備樹

Linux 設備驅動開發詳解:基于最新的Linux 4.0內核, 機械工業出版社, 宋寶華, 2015

1. 設備樹的起源
? 背景: ARM架構中大量板級代碼冗余,硬編碼在mach-xxx目錄,設備樹(Device Tree)引入結構化描述硬件。

? 目的: 減少內核冗余代碼,通過設備樹文件(.dts)傳遞硬件信息,由Bootloader加載至內核。

? 核心思想: 設備樹以節點和屬性形式描述硬件拓撲,如CPU、內存、外設、中斷等。


2. 設備樹的組成與結構
2.1 核心文件
? DTS (Device Tree Source): 文本格式描述硬件,支持.dtsi包含(類似C頭文件)。

? DTC (Device Tree Compiler): 編譯工具,將DTS轉換為DTB。

? DTB (Device Tree Blob): 二進制文件,由內核解析。

? 綁定文檔(Binding): 說明節點屬性規范(如Documentation/devicetree/bindings)。

2.2 設備樹結構
? 節點(Node): 表示設備或總線,如根節點/,子節點cpu@0

? 屬性(Property): 鍵值對描述硬件特性,如reg = <地址 長度>interrupts

? 標簽(Label)與Phandle: 通過&label引用節點,如&gpio0表示GPIO控制器。

2.3 設備樹示例

/ {compatible = "acme,coyotes-revenge"; // 根節點兼容性#address-cells = <1>; // 地址占1個cell#size-cells = <1>;    // 長度占1個cellcpus {cpu@0 { compatible = "arm,cortex-a9"; reg = <0>; };cpu@1 { compatible = "arm,cortex-a9"; reg = <1>; };};serial@101f0000 {compatible = "arm,pl011";reg = <0x101f0000 0x1000>; // 寄存器地址和長度interrupts = <1 0>;        // 中斷號及觸發方式};
};

3. 關鍵概念解析
3.1 兼容性(Compatible)
? 根節點兼容性: 匹配機器類型,如vexpress-v2p-ca9

// 內核中匹配設備
if (of_machine_is_compatible("arm,vexpress")) { ... }

? 設備節點兼容性: 驅動匹配依據,如compatible = "arm,pl011"

3.2 地址編碼
? reg屬性: 格式reg = <地址1 長度1 地址2 長度2 ...>

? #address-cells和#size-cells: 定義子節點地址/長度的cell數量。

external-bus {#address-cells = <2>; // 地址占2個cell(片選+偏移)#size-cells = <1>;     // 長度占1個cellethernet@0,0 { reg = <0 0 0x1000>; };
};

3.3 中斷連接
? 中斷控制器: 聲明interrupt-controller#interrupt-cells

? 中斷屬性: 使用interrupt-parentinterrupts指定中斷號和觸發方式。

intc: interrupt-controller@10140000 {compatible = "arm,pl190";#interrupt-cells = <2>; // 2個cell(中斷號+標志)
};
serial@101f0000 {interrupts = <1 0>; // 中斷號1,觸發方式0
};

3.4 GPIO、時鐘、Pinmux
? GPIO控制器: 聲明gpio-controller#gpio-cells

? GPIO使用: 通過gpios屬性引用控制器。

gpio@101f3000 {gpio-controller;#gpio-cells = <2>; // GPIO號+極性
};
button {gpios = <&gpio0 1 GPIO_ACTIVE_LOW>;
};

4. BSP和驅動的變更
4.1 平臺設備的替代
? 舊方式: 手動注冊platform_device,硬編碼資源。

? 新方式: 設備樹自動展開platform_device,資源來自.dts

4.2 驅動匹配機制
? OF匹配表: 驅動通過.of_match_table匹配設備節點。

static const struct of_device_id my_drv_of_match[] = {{ .compatible = "vendor,device" },{},
};
MODULE_DEVICE_TABLE(of, my_drv_of_match);

4.3 平臺數據的屬性化
? 舊方式: 通過platform_data結構傳遞數據。

? 新方式: 從設備樹屬性讀取,如of_property_read_u32()

// 讀取屬性值示例
of_property_read_u32(np, "clock-frequency", &clk_freq);

4.4 實例:GPIO按鍵驅動

gpio-keys {compatible = "gpio-keys";button {label = "Up";gpios = <&gpio0 1 0>;linux,code = <KEY_UP>;};
};

驅動通過OF API解析屬性:

of_get_gpio_flags(pp, 0, &flags); // 獲取GPIO號和極性
of_property_read_u32(pp, "linux-code", &key_code); // 讀取鍵值

5. 常用OF API
? 節點操作:

? of_find_compatible_node(): 查找兼容節點。

? of_get_child_count(): 獲取子節點數量。

? 屬性讀取:

? of_property_read_u32_array(): 讀取32位數組。

? of_property_read_string(): 讀取字符串。

? 資源解析:

? of_get_named_gpio(): 獲取GPIO號。

? of_irq_get(): 獲取中斷號。


6. 總結
? 設備樹優勢:解耦硬件描述與內核代碼,提升可維護性。

? 核心元素:節點、屬性、兼容性、地址編碼、中斷連接。

? 驅動適配:通過OF匹配表和API解析設備樹數據。

通過設備樹,ARM Linux實現了硬件描述的標準化,降低了BSP開發復雜度,成為嵌入式開發的必備知識。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79479.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79479.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79479.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

每日c/c++題 備戰藍橋杯(洛谷P1015 [NOIP 1999 普及組] 回文數)

洛谷P1015 [NOIP 1999 普及組] 回文數 題解 題目描述 P1015 回文數 是NOIP 1999普及組的經典模擬題。題目要求如下&#xff1a; 給定一個數N&#xff08;十進制&#xff09;和進制K&#xff08;2≤K≤16&#xff09;&#xff0c;將N轉換為K進制表示后&#xff0c;通過以下操…

Linux線程深度解析:從基礎到實踐

Linux線程深度解析&#xff1a;從基礎到實踐 一、線程基礎概念 1. 進程與線程定義 進程&#xff1a;一個正在運行的程序&#xff0c;是操作系統資源分配的最小單位&#xff08;擁有獨立的地址空間、文件描述符等資源&#xff09;&#xff0c;狀態包括就緒、運行、阻塞。線程…

php學習筆記(全面且適合新手)

以下是專為 PHP 7.4 初學者設計的全面學習文檔&#xff0c;涵蓋基礎語法、細節語法和進階語法&#xff0c;結合 PHP 7.4 新特性與實戰案例&#xff0c;幫助系統掌握 PHP 開發&#xff1a; 為什么特地做7.4的筆記而不做8的&#xff1f;因為公司用的7.4&#xff0c;哈哈 一、基…

開源分布式數據庫(TiDB)

TiDB是由PingCAP 開發的開源分布式數據庫&#xff0c;兼容 MySQL 協議&#xff0c;集成了 HTAP&#xff08;混合事務和分析處理&#xff09;的能力&#xff0c;能夠同時處理在線事務和實時分析任務。 2015 年&#xff0c;TiDB 在 GitHub 創建&#xff0c;2025 年&#xff0c;Ti…

SpringBoot+Mybatis通過自定義注解實現字段加密存儲

&#x1f60a; 作者&#xff1a; 一恍過去 &#x1f496; 主頁&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社區&#xff1a; Java技術棧交流 &#x1f389; 主題&#xff1a; SpringBootMybatis實現字段加密 ?? 創作時間&#xff1a; 2025年04月…

Windows 10系統中找回MySQL 8的root密碼

以下是 在Windows 10系統中找回MySQL 8的root密碼 的詳細步驟&#xff1a; 步驟1&#xff1a;停止MySQL服務 按 Win R 輸入 services.msc&#xff0c;打開「服務」管理器。找到 MySQL80&#xff08;或其他自定義服務名&#xff09;&#xff0c;右鍵選擇 停止。 步驟2&#xf…

【計網】互聯網的組成

回顧&#xff1a; 互聯網(Internet)&#xff1a;它是一個專有名詞&#xff0c;是一個特定的互連網&#xff0c;它是指當下全球最大的、最開放的、由眾多網絡相互連接而形成的特定的的互連網&#xff0c;采用TCP/IP協議族作為通信規則。 一、互聯網的組成部分 從互聯網的工作方…

【vue3】黑馬程序員前端Vue3小兔鮮電商項目【八】

黑馬程序員前端Vue3小兔鮮電商項目【八】登錄頁面 登錄頁面的主要功能就是表單校驗和登錄登出業務。 賬號密碼 accountpasswordcdshi0080123456cdshi0081123456cdshi0082123456cdshi0083123456cdshi0084123456cdshi0085123456cdshi0086123456cdshi0087123456cdshi0088123456 …

C++學習:六個月從基礎到就業——C++11/14:右值引用與移動語義

C學習&#xff1a;六個月從基礎到就業——C11/14&#xff1a;右值引用與移動語義 本文是我C學習之旅系列的第三十九篇技術文章&#xff0c;也是第三階段"現代C特性"的第一篇&#xff0c;主要介紹C11/14中引入的右值引用和移動語義。查看完整系列目錄了解更多內容。 引…

基于Qlearning強化學習的電梯群控系統高效調度策略matlab仿真

目錄 1.算法仿真效果 2.算法涉及理論知識概要 2.1 Q-learning強化學習原理 2.2 基于Q-learning的電梯群控系統建模 3.MATLAB核心程序 4.完整算法代碼文件獲得 1.算法仿真效果 matlab2022a仿真結果如下&#xff08;完整代碼運行后無水印&#xff09;&#xff1a; 仿真操作…

31.軟件時序控制方式抗干擾

軟件時序控制方式扛干擾 1. 軟件時序控制抗干擾的時間邏輯2. 應用案例 1. 軟件時序控制抗干擾的時間邏輯 &#xff08;1&#xff09;將受軟件控制的功能或軟件檢測到的狀態一一羅列&#xff1b; &#xff08;2&#xff09;將其中的潛在干擾和敏感信號分開&#xff1b; &#x…

Ubuntu環境下使用uWSGI服務器【以flask應用部署為例】

0、前置內容說明 首先要知道WSGI是什么&#xff0c;關于WSGI服務器的介紹看這篇&#xff1a;WSGI&#xff08;Web Server Gateway Interface&#xff09;服務器 由于從Python 3.11開始限制了在系統級 Python 環境中使用 pip 安裝第三方包&#xff0c;以避免與系統包管理器&am…

d3_v7繪制折線圖

<!DOCTYPE html> <html><head><meta charsetutf-8><title>需求</title><script src"https://d3js.org/d3.v7.min.js"></script><style>* {margin: 0;padding: 0;}html, body {width: 100%;height: 100%;displ…

Hotspot分析(1):單細胞轉錄組識別信息基因(和基因模塊)

這一期我們介紹一個常見的&#xff0c;高分文章引用很高的一個單細胞轉錄組分析工具Hotspot&#xff0c;它可針對單細胞轉錄組數據識別有意義基因或者基因module&#xff0c;類似于聚類模塊。所謂的”informative "的基因是那些在給定度量中相鄰的細胞之間以相似的方式表達…

爬蟲準備前工作

1.Pycham的下載 網址&#xff1a;PyCharm: The only Python IDE you need 2.Python的下載 網址&#xff1a;python.org&#xff08;python3.9版本之后都可以&#xff09; 3.node.js的下載 網址&#xff1a;Node.js — 在任何地方運行 JavaScript&#xff08;版本使用18就可…

基于Springboot旅游網站系統【附源碼】

基于Springboot旅游網站系統 效果如下&#xff1a; 系統登陸頁面 系統主頁面 景點信息推薦頁面 路線詳情頁面 景點詳情頁面 確認下單頁面 景點信息管理頁面 旅游路線管理頁面 研究背景 隨著互聯網技術普及與在線旅游消費習慣的深化&#xff0c;傳統旅游服務模式面臨效率低、…

利用KMP找出模式串在目標串中所有匹配位置的起始下標

問題關鍵&#xff1a;完成首次匹配之后需要繼續進行模式匹配。 到這一步后&#xff0c;我們不能直接將j 0然后開始下一輪匹配&#xff0c;因為已經匹配過的部分&#xff08;藍色部分&#xff09;中仍然可能存在與模式串重疊的子串&#xff1a; 解決辦法&#xff1a; 找到藍…

RR(Repeatable Read)級別如何防止幻讀

在 MySQL 數據庫事務隔離級別中&#xff0c;RR&#xff08;可重復讀&#xff09; 通過 MVCC&#xff08;多版本并發控制&#xff09; 和 鎖機制 的組合策略來避免幻讀問題。 一、MVCC機制&#xff1a;快照讀與版本控制 快照讀&#xff08;Snapshot Read&#xff09; 每個事務啟…

Android運行時ART加載類和方法的過程分析

目錄 一,概述 二,ART運行時的入口 一,概述 既然ART運行時執行的都是翻譯DEX字節碼后得到的本地機器指令了&#xff0c;為什么還需要在OAT文件中包含DEX文件&#xff0c;并且將它加載到內存去呢&#xff1f;這是因為ART運行時提供了Java虛擬機接口&#xff0c;而要實現Java虛…

Javase 基礎加強 —— 02 泛型

本系列為筆者學習Javase的課堂筆記&#xff0c;視頻資源為B站黑馬程序員出品的《黑馬程序員JavaAI智能輔助編程全套視頻教程&#xff0c;java零基礎入門到大牛一套通關》&#xff0c;章節分布參考視頻教程&#xff0c;為同樣學習Javase系列課程的同學們提供參考。 01 認識泛型…