Linux驅動層學習:Linux 設備樹

設備樹是一種數據結構,包含多個節點,用于描述硬件設備及其配置信息,它通常用于嵌入式系統中,尤其是在Linux操作系統中,幫助操作系統識別和管理硬件資源,設備樹不是代碼,而是一種用數據描述硬件信息的方式

設備樹通常是以一種樹形結構來表示硬件各個部分的層次關系

設備樹(Device Tree),將這個詞分開就是“設備”和“樹”,描述設備樹的文件叫做 DTS(Device Tree Source),這個 DTS 文件采用樹形結構描述板級設備,也就是開發板上的設備信息,比如CPU 數量、 內存基地址、IIC 接口上接了哪些設備、SPI 接口上接了哪些設備等等
在這里插入圖片描述
樹的主干就是系統總線,IIC 控制器、GPIO 控制器、SPI 控制器等都是接
到系統主線上的分支。IIC 控制器有分為 IIC1 和 IIC2 兩種,其中 IIC1 上接了 FT5206 和 AT24C02這兩個 IIC 設備,IIC2 上只接了 MPU6050 這個設備。DTS 文件的主要功能就是按圖所示的結構來描述板子上的設備信息,DTS 文件描述設備信息是有相應的語法規則要求的

設備樹的結構:
設備樹的結構采用類似樹形結構,包含多個節點,每個節點代表一個硬件設備或設備的某些特性。每個節點可以包含一些屬性,描述該設備的詳細信息。
例如:
節點:代表硬件設備,比如CPU、內存、串口、存儲、網絡接口等。
屬性:描述該設備的特性或配置信息,如設備的地址、類型、IRQ(中斷請求)、驅動程序等。

設備樹的語法:
設備樹通常使用一種簡潔的描述語言(Device Tree Source,簡稱DTS)來表示。DTS文件是純文本文件,后綴通常為.dts,它們被編譯成二進制的設備樹二進制格式(Device Tree Blob,簡稱DTB),該二進制文件會被操作系統加載和使用。
簡單的設備樹示例:
在這里插入圖片描述

為什么要有設備樹?

1、硬件和內核解耦
以前,硬件信息(比如CPU型號、內存地址、外設位置)直接寫在內核代碼里。換一塊硬件板子,就得重新改內核、重新編譯。設備樹把硬件信息抽離出來,變成一個單獨的文件(.dts),內核只需讀取這個文件就能適配不同硬件。

2、支持多種硬件平臺
比如樹莓派3和樹莓派4的硬件不同,但可以用同一個內核+不同的設備樹文件啟動,內核無需為每塊板子單獨寫代碼。

3、方便維護
廠商更新硬件時,只需修改設備樹文件(描述硬件),不用動內核代碼(驅動邏輯)。

設備樹的作用
1、告訴內核硬件在哪里
比如:“CPU是四核的”、“內存從地址0x80000000開始”、“I2C控制器在地址0x40005000,連著觸摸屏和溫度傳感器”。

2、描述硬件之間的關系
比如:“USB控制器掛載在PCI總線的第3個插槽”、“GPIO引腳12連接了LED燈”。

3、配置硬件參數
比如:“屏幕分辨率是1920x1080”、“以太網MAC地址是00:11:22:33:44:55”。

假設嵌入式板子上有一個LED燈,連接在GPIO的第5個引腳,沒有設備樹時,需要在驅動代碼里硬編碼gpio5,換到gpio6就得改代碼、重新編譯內核;
有設備樹時,設備樹文件里寫gpios = <&gpio 5 0>; 驅動代碼只需讀取設備樹中的gpios屬性,自動適配到gpio5。換引腳時只需改設備樹,內核代碼不用動

設備樹就像硬件的“身份證”+“說明書”,讓內核能動態識別硬件,而不是把硬件信息寫死在內核里。它的核心作用:解耦硬件配置和內核代碼,讓Linux能靈活適配不同硬件

示例代碼  alphaled 節點 alphaled { #address-cells = <1>; #size-cells = <1>; compatible = "atkalpha-led"; status = "okay"; reg = < 0X020C406C 0X04 /* CCM_CCGR1_BASE */ 0X020E0068 0X04 /* SW_MUX_GPIO1_IO03_BASE */ 0X020E02F4 0X04 /* SW_PAD_GPIO1_IO03_BASE */ 0X0209C000 0X04 /* GPIO1_DR_BASE */ 0X0209C004 0X04 >; /* GPIO1_GDIR_BASE */ }; 

在這里插入圖片描述
這個節點描述的是一個LED燈的硬件控制信息
它需要告訴內核:“LED燈的位置在哪里?如何配置硬件寄存器才能控制它亮滅?” 就像給內核一張 “LED操作手冊” ,說明控制這個LED需要操作哪些寄存器(開關)。

#address-cells = <1>; 
#size-cells = <1>;
作用:指定“地址”和“長度”用幾個數字表示(單位是32位,即4字節)。
這里都用1個數字。類比:假設你要描述一本書的位置:地址 = 書架編號(1個數字)長度 = 占用的格子數(1個數字)為何重要:后續的 reg 屬性依賴這兩個值來解析地址和長度。
compatible = "atkalpha-led"; 
作用:匹配內核中的驅動程序!內核會尋找支持 "atkalpha-led" 
的驅動來操作這個設備。類比:告訴內核:“這個LED要用說明書編號為‘atkalpha-led’的驅動來操作”。關鍵點:驅動代碼里必須有對應的兼容性標識,否則設備無法被識別!
status = "okay"; 
作用:啟用這個設備。如果設為 "disabled",內核會忽略它。類比:給設備通電(okay)或斷電(disabled)。
reg = < 0X020C406C 0X04   // CCM_CCGR1(時鐘控制寄存器)0X020E0068 0X04   // SW_MUX_GPIO1_IO03(引腳復用控制)0X020E02F4 0X04   // SW_PAD_GPIO1_IO03(引腳電氣屬性配置)0X0209C000 0X04   // GPIO1_DR(GPIO數據寄存器)0X0209C004 0X04   // GPIO1_GDIR(GPIO方向寄存器)
>;
作用:列出控制這個LED所需的所有寄存器地址和長度(單位:字節)。逐項解釋:CCM_CCGR1 (0X020C406C)
控制時鐘的開關。LED所在的GPIO模塊需要時鐘才能工作,類似“總電源開關”。SW_MUX_GPIO1_IO03 (0X020E0068)
配置引腳功能。比如將某個引腳設置為“GPIO模式”而非其他功能(如UART)。SW_PAD_GPIO1_IO03 (0X020E02F4)
配置引腳的電氣屬性,如上拉/下拉電阻、驅動強度等。GPIO1_DR (0X0209C000)
GPIO數據寄存器。寫01控制引腳輸出電平(低電平亮/滅,高電平反之)。GPIO1_GDIR (0X0209C004)
GPIO方向寄存器。設置引腳為輸入(0)或輸出(1),這里需設為輸出模式。類比:你要控制一臺電視,需要知道:電源開關位置(CCM_CCGR1)遙控器配對方式(SW_MUX)音量默認設置(SW_PAD)換臺按鈕(GPIO_DR)按鈕功能分配(GPIO_GDIR)為什么需要這么多寄存器?
硬件控制是精細活:
在嵌入式系統中,控制一個LED可能需要多個步驟:開時鐘:GPIO模塊需要時鐘信號才能工作。配引腳功能:確保這個引腳被用作GPIO,而不是其他功能(比如串口)。配電氣屬性:避免信號干擾,確保穩定。設GPIO方向:輸出模式才能控制電平。寫數據寄存器:輸出高/低電平控制LED亮滅。

通常,Linux內核提供了更簡潔的GPIO控制方法,比如:

led {
compatible = “gpio-leds”;
led-gpios = <&gpio1 3 GPIO_ACTIVE_LOW>; // 直接指定GPIO引腳 };

內核會自動處理時鐘、復用等配置,無需手動寫寄存器地址。

文檔寫法是**“底層直操作”**,通常用于特定需求或學習目的。

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

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

相關文章

金蝶云星空與釘釘高效數據集成案例分享

金蝶云星空數據集成到釘釘的技術案例分享 在企業信息化系統中&#xff0c;數據的高效流動和實時反饋是提升業務效率的關鍵。本文將聚焦于一個具體的系統對接集成案例&#xff1a;如何將金蝶云星空的數據集成到釘釘&#xff0c;并實現審核狀態的回傳提示。 本次集成方案名為“…

圖形渲染(一)——Skia、OpenGL、Mesa 和 Vulkan簡介

1.Skia —— 2D 圖形庫 Skia 是一個 2D 圖形庫&#xff0c;它的作用是為開發者提供一個高層次的繪圖接口&#xff0c;方便他們進行 2D 圖形渲染&#xff08;比如繪制文本、形狀、圖像等&#xff09;。Skia 本身不直接管理 GPU 或進行底層的渲染工作&#xff0c;而是通過 底層圖…

GIT提錯分支,回滾提交

1. 準備示例 假設我們有三次提交&#xff1a; test1&#xff1a;需要在 master 分支提交test2、test3&#xff1a;需要在 develop 分支提交 遠端線上記錄 2. 步驟 選擇需要回退的記錄&#xff1a; 選中需要回退的 commit&#xff0c;選擇 Reset Current Branch to Here...。…

【原創】在ubuntu中搭建gradle開發環境

檢查Linux版本 rootwww:~# hostnamectlStatic hostname: www.0x88.comIcon name: computer-vmChassis: vmMachine ID: 30fa955a36be492ca459599ef20bc508Boot ID: 37084dbe36f44adaa075e8f9a98f132eVirtualization: kvm Operating System: Ubuntu 22.04.5 LTSKernel: Linux 5.…

【JavaEE進階】MyBatis入門

目錄 &#x1f334;前言 &#x1f332;什么是MyBatis? &#x1f333;準備工作 &#x1f6a9;創建工程 &#x1f6a9;配置數據庫連接字符串 &#x1f6a9;數據準備 &#x1f6a9;編寫持久層代碼 &#x1f343;單元測試 &#x1f334;前言 在應?分層學習時,我們了解到…

以太網詳解(八)傳輸層協議:TCP/UDP 協議

文章目錄 傳輸層協議概述為什么需要傳輸層&#xff1f;傳輸層功能網絡層與傳輸層在實現 “端到端” 傳輸的異同兩類服務:面向連接/無連接服務 傳輸控制協議 TCPTCP 協議數據單元格式TCP 的重傳機制快重傳和快恢復快重傳舉例快恢復算法 用戶數據報協議 UDPUDP 概述UDP 基本工作過…

Electron 客戶端心跳定時任務調度庫調研文檔 - Node.js 任務調度庫技術調研文檔

Electron 客戶端心跳定時任務調度庫調研文檔 - Node.js 任務調度庫技術調研文檔 本文將對七個流行的定時任務調度庫&#xff1a;node-cron、rxjs、bull、node-schedule、agenda、bree、cron。這些庫都可以用來處理定時任務&#xff0c;但它們的特點和適用場景有所不同。我們將從…

DeepSeek 開放平臺無法充值 改用其他平臺API調用DeepSeek-chat模型方法

近幾天DeepSeek開放平臺無法充值目前已經關閉狀態&#xff0c;大家都是忙著接入DeepSeek模型 &#xff0c;很多人想使用DeepSeek怎么辦&#xff1f; 當然還有改用其他平臺API調用方法&#xff0c;本文以本站的提供chatgpt系統為例&#xff0c;如何修改DeepSeek-chat模型API接口…

pix2text 使用經驗

給同行打雞血 &#x1f60a; 構建結構化的數理領域知識庫&#xff1a; 提高可訪問性和可搜索性 Markdown和LaTeX格式&#xff1a;這兩種格式易于在線發布和共享&#xff0c;有助于提高數學內容的可訪問性。搜索引擎優化&#xff1a;將PDF內容轉換為標記語言&#xff0c;可以…

Linux(centos)系統安裝部署MySQL8.0數據庫(GLIBC版本)

安裝前檢查服務器glibc版本&#xff0c;下載對應版本包 rpm -qa | grep glibc mysql安裝包及依賴包已整理好&#xff0c;下載地址&#xff1a;https://pan.quark.cn/s/3137acc814c0&#xff0c;下載即可安裝 一、下載MySQL mysql安裝包及依賴包已整理好&#xff0c;下載地址…

6.2.圖的存儲結構-鄰接矩陣法

一.鄰接矩陣法存儲不帶權圖&#xff1a; 結點不帶權值&#xff1a; 1.左圖的無向圖中&#xff0c;A到B直達的有一條路&#xff0c;所以A行B列的值為1&#xff1b; 左圖的無向圖中&#xff0c;A到F沒有直達的路&#xff0c;所以A行F列的值為0&#xff1b; 結論&#xff1a;無…

【VB語言】EXCEL中VB宏的應用

【VB語言】EXCEL中VB宏的應用 文章目錄 [TOC](文章目錄) 前言一、EXCEL-VB1.實驗過程2.代碼 二、EXCEL-VB 生成.c.h文件1.實驗過程2.代碼 四、參考資料總結 前言 1.WPS-VB擴展包 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 一、EXCEL-VB 1.實驗過…

用deepseek學大模型05邏輯回歸

deepseek.com:邏輯回歸的目標函數&#xff0c;損失函數&#xff0c;梯度下降 標量和矩陣形式的數學推導&#xff0c;pytorch真實能跑的代碼案例以及模型,數據&#xff0c;預測結果的可視化展示&#xff0c; 模型應用場景和優缺點&#xff0c;及如何改進解決及改進方法數據推導。…

2025年02月17日Github流行趨勢

項目名稱&#xff1a;OmniParser 項目地址url&#xff1a;https://github.com/microsoft/OmniParser 項目語言&#xff1a;Jupyter Notebook 歷史star數&#xff1a;8971 今日star數&#xff1a;969 項目維護者&#xff1a;yadong-lu, ThomasDh-C, aliencaocao, nmstoker, kris…

RocketMQ 5.0安裝部署

0.前言 在微服務架構逐漸成為主流的今天&#xff0c;消息隊列如同數字世界的快遞員&#xff0c;承擔著系統間高效通信的重要使命。 Apache RocketMQ 自誕生以來&#xff0c;因其架構簡單、業務功能豐富、具備極強可擴展性等特點被眾多企業開發者以及云廠商廣泛采用。歷經十余…

Ubuntu 22.04.5 LTS 安裝企業微信,(2025-02-17安裝可行)

一、依賴包(Ubuntu 20.04/Debian 11) 點擊下載https://www.spark-app.store/download_dependencies_latest 1、 下載最新的依賴包。 請訪問星火應用商店依賴包下載頁面, 下載最新的依賴包。2、解壓依賴包 </

如何使用 HPjtune 分析 Java GC 日志并優化 JVM 性能

HPjtune 是一款用于分析 Java 應用程序垃圾回收&#xff08;GC&#xff09;日志的工具&#xff0c;主要用于優化 JVM 性能。雖然 HPjtune 本身并不直接生成 HTML 格式的報告&#xff0c;但可以通過結合其他工具或方法將分析結果導出為 HTML 格式。以下是實現這一目標的步驟和方…

國產FPGA開發板選擇

FPGA開發板是學習和開發FPGA的重要工具&#xff0c;選擇合適的開發板對學習效果和開發效率至關重要。隨著國產FPGA的發展&#xff0c;淘寶上的許多FPGA開發板店鋪也開始進行國產FPGA的設計和銷售&#xff0c;本文將對國產FPGA和相關店鋪做個簡單梳理&#xff0c;幫助有需要使用…

Java高頻面試之SE-22

hello啊&#xff0c;各位觀眾姥爺們&#xff01;&#xff01;&#xff01;本baby今天又來了&#xff01;哈哈哈哈哈嗝&#x1f436; Java中的Optional了解多少&#xff1f; 在 Java 中&#xff0c;Optional 是 Java 8 引入的一個容器類&#xff0c;用于顯式處理可能為 null 的…

使用OBS和nginx實現直播流

使用OBS和nginx實現直播流&#xff0c;如 1&#xff0c;下載OBS OBS用于視頻錄制和直播的免費開源軟件。在 Windows、Mac 或 Linux 上快速輕松地下載并開始流式傳輸。官網下載 2&#xff0c;下載nginx 注意nginx需要下載帶gryghon版本&#xff0c;這個才有rtmp模塊&#xff0…