驅動開發硬核特訓 · Day 6 : 深入解析設備模型的數據流與匹配機制 —— 以 i.MX8M 與樹莓派為例的實戰對比

🔍

B站相應的視屏教程
📌 內核:博文+視頻 - 從靜態綁定驅動模型到現代設備模型


主題:深入解析設備模型的數據流與匹配機制 —— 以 i.MX8M 與樹莓派為例的實戰對比

在上一節中,我們從驅動框架的歷史演進出發,分析了早期的靜態綁定驅動模型及其局限性,并逐步過渡到現代 Linux 設備模型架構。本節將聚焦于設備模型運行時的數據結構與匹配流程,結合實際平臺(NXP i.MX8M 與 Raspberry Pi),從設備樹的編寫、設備注冊、驅動匹配、probe 調用等多個角度展開,理論與實戰融合講解設備模型的本質運作方式。


📘 第一部分:設備模型的本質問題 —— 驅動如何找到設備?

在設備模型中,驅動程序不再"直接控制硬件",而是等待系統提供設備信息,再由總線驅動匹配機制完成“驅動與設備的配對”,最終執行 probe()

因此,理解設備模型的核心本質,就是要搞清楚:

“驅動是怎么和設備匹配的?設備又是怎么被注冊到系統中的?”

我們將通過 i.MX8M 和 Raspberry Pi 兩個平臺,來回答這個問題。


📘 第二部分:設備節點的來源 —— 設備樹(Device Tree)

? 什么是設備樹?

設備樹(DTS)是一種用于描述硬件信息的數據結構,編譯為 DTB 后在內核啟動初期被解析,生成內核中的 struct device_node 樹形結構。內核隨后根據設備樹中的節點內容,注冊相應的 platform_device

📎 i.MX8M 示例(LCDIF3 控制器)

lcdif3: lcd-controller@32fc6000 {compatible = "fsl,imx8mp-lcdif1";reg = <0x32fc6000 0x10000>;interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;clocks = <&clk IMX8MP_CLK_MEDIA_APB_ROOT>, ...;status = "okay";
};

📌 內核會根據 compatible 字符串創建一個 platform_device,名字類似 lcdif3.32fc6000

📎 Raspberry Pi 示例(I2C 控制器)

i2c1: i2c@7e804000 {compatible = "brcm,bcm2835-i2c";reg = <0x7e804000 0x1000>;interrupts = <2 21>;clock-frequency = <100000>;status = "okay";
};

設備樹被內核解析后,注冊為 platform_device,后續等待匹配合適的驅動。


📘 第三部分:驅動如何聲明匹配信息?

驅動需要提供一個 of_match_table,用于告訴設備模型:“我支持哪些設備”。

static const struct of_device_id lcdifv3_dt_ids[] = {{ .compatible = "fsl,imx8mp-lcdif1" },{ }
};
MODULE_DEVICE_TABLE(of, lcdifv3_dt_ids);static struct platform_driver lcdifv3_driver = {.probe = lcdifv3_probe,.remove = lcdifv3_remove,.driver = {.name = "imx-lcdifv3",.of_match_table = lcdifv3_dt_ids,},
};

🔍 注意:只有匹配成功,probe 才會被調用


📘 第四部分:匹配過程是如何完成的?

? 匹配的參與者:

組件數據結構
設備struct platform_device
驅動struct platform_driver
匹配規則struct of_device_id[]
總線中轉調度器struct bus_type

在這里插入圖片描述

? 匹配流程

  1. 設備樹解析階段,生成 platform_device(如 lcdif3
  2. 驅動注冊時,添加到 platform_bus_typedriver_list
  3. 內核自動遍歷設備與驅動,調用 bus_type->match()
  4. 匹配成功后:
    • 設置 pdev->dev.driver = &driver
    • 調用 driver->probe(pdev) 完成初始化

📘 第五部分:數據結構流動分析(從 DTS 到 probe)

📌 流程圖:

DTS → of_node (設備樹節點)↓
of_platform_populate()↓
platform_device_register()↓
/sys/devices/platform/xxx  ←→ /sys/bus/platform/devices/xxx↓
platform_bus_type.match()↓
platform_driver.probe()

📎 代碼對應點(以 LCDIF3 為例):

關鍵節點對應代碼
compatible = “fsl,imx8mp-lcdif1”of_device_id 中匹配
reg/clocks 等資源of_address_to_resource() 等函數讀取
probe 中訪問資源platform_get_resource() / devm_ioremap_resource()

📘 第六部分:i.MX8M vs 樹莓派平臺對比

對比維度NXP i.MX8MRaspberry Pi
SoC 架構多個 LCDIF 控制器 + VPUBroadcom BCM283x
DTS 中定義fsl,imx8mp-lcdif1brcm,bcm2835-i2c
驅動模塊名imx-lcdifv3i2c-bcm2835
驅動結構完整 platform_driver + match同樣采用 of_match_table 匹配
熱插拔支持支持 runtime pm / suspend / resume同樣支持 PM、sysfs、modprobe 熱加載

📌 雖然 SoC 不同,但設備模型使用方式完全統一


📘 第七部分:常見問題與調試技巧

? Q1: 為什么 probe 沒被調用?

  • 沒有寫 of_match_table
  • compatible 寫錯,無法匹配
  • 驅動未被編譯進內核或未加載
  • status = "disabled" 導致設備未注冊

? Q2: 如何確認設備已注冊?

  • 查看 /sys/bus/platform/devices/
  • 使用 dmesg 檢查設備是否出現
  • dev_info() 等日志確認 probe 是否執行

? Q3: 如何查看匹配關系?

modinfo xxx.ko  # 查看 compatible alias
ls /sys/bus/platform/drivers/xxx

📘 第八部分:實戰建議

  • 永遠在驅動中寫上正確的 of_match_table
  • 使用 devm_* 系列管理資源,避免內存泄漏
  • 善用 dev_dbg()dev_err() 等接口打印調試信息
  • 多觀察 /sys/ 目錄,理解設備與驅動的 sysfs 映射關系
  • 多平臺共享一個驅動時,合理利用 of_device_id.data 攜帶平臺定制參數

? 總結與回顧

本篇深入分析了設備模型中從 DTS → 設備注冊 → 驅動匹配 → probe 執行的完整過程。通過對比 i.MX8M 與樹莓派平臺,我們看到了設備模型在不同平臺間的通用性與強大抽象能力

📌 核心關鍵詞:

  • 設備樹注冊 → platform_device 創建
  • 驅動注冊 → platform_driver with of_match_table
  • 內核總線 → bus_type 匹配 → 調用 probe

這正是現代 Linux 驅動開發的標準范式。

下一篇我們將從 資源管理角度(時鐘、中斷、寄存器、GPIO)展開,講解 platform_get_resource()devm_*()of_property_read_*() 等函數在實際項目中的最佳使用方式。

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

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

相關文章

Blender安裝基礎使用教程

本博客記錄安裝Blender和基礎使用&#xff0c;可以按如下操作來繪制標靶場景、道路標識牌等。 目錄 1.安裝Blender 2.創建面板資源 步驟 1: 設置 Blender 場景 步驟 2: 創建一個平面 步驟 3: 將 PDF 轉換為圖像 步驟 4-方法1: 添加材質并貼圖 步驟4-方法2&#xff1a;創…

智能手機功耗測試

隨著智能手機發展,用戶體驗對手機的續航功耗要求越來越高。需要對手機進行功耗測試及分解優化,將手機的性能與功耗平衡。低功耗技術推動了手機的用戶體驗。手機功耗測試可以采用powermonitor或者NI儀表在功耗版上進行測試與優化。作為一個多功能的智能終端,手機的功耗組成極…

從代碼學習深度學習 - 多頭注意力 PyTorch 版

文章目錄 前言一、多頭注意力機制介紹1.1 工作原理1.2 優勢1.3 代碼實現概述二、代碼解析2.1 導入依賴序列掩碼函數2.2 掩碼 Softmax 函數2.3 縮放點積注意力2.4 張量轉換函數2.5 多頭注意力模塊2.6 測試代碼總結前言 在深度學習領域,注意力機制(Attention Mechanism)是自然…

學術版 GPT 網頁

學術版 GPT 網頁 1. 學術版 GPT 網頁非盈利版References https://academic.chatwithpaper.org/ 1. 學術版 GPT 網頁非盈利版 arXiv 全文翻譯&#xff0c;免費且無需登錄。 更換模型 System prompt: Serve me as a writing and programming assistant. 界面外觀 References …

MarkDown 輸出表格的方法

MarkDown用來輸出表格很簡單&#xff0c;比Word手搓表格簡單多了&#xff0c;而且方便修改。 MarkDown代碼&#xff1a; |A|B|C|D| |:-|-:|:-:|-| |1|b|c|d| |2|b|c|d| |3|b|c|d| |4|b|c|d| |5|b|c|d|顯示效果&#xff1a; ABCD1bcd2bcd3bcd4bcd5bcd A列強制左對齊&#xf…

MetaGPT深度解析:重塑AI協作開發的智能體框架實踐指南

一、框架架構與技術突破 1.1 系統架構設計 graph TBA[自然語言需求] --> B(需求解析引擎)B --> C{角色路由系統}C --> D[產品經理Agent]C --> E[架構師Agent]C --> F[工程師Agent]D --> G[PRD文檔]E --> H[架構圖]F --> I[代碼文件]G --> J[知識共…

自用:在使用SpringBoot做學生信息管理系統時遇到的問題

1、在做完查詢測試時&#xff0c;一直報出404找不到錯誤&#xff0c;原因是沒有為各個層的實現類添加注解 2、改完之后發現測試沒有數據&#xff0c;是因為我寫的返回值類型為空&#xff0c;應該返回一個List< Student > 3、我沒有想到要寫Result實體類&#xff0c;因為不…

SQLite + Redis = Redka

Redka 是一個基于 SQLite 實現的 Redis 替代產品&#xff0c;實現了 Redis 的核心功能&#xff0c;并且完全兼容 Redis API。它可以用于輕量級緩存、嵌入式系統、快速原型開發以及需要事務 ACID 特性的鍵值操作等場景。 功能特性 Redka 的主要特點包括&#xff1a; 使用 SQLi…

202529 | RocketMQ 簡介 + 安裝 + 集群搭建 + 消費模式 + 消費者組

RocketMQ簡介 RocketMQ 簡介 Apache RocketMQ 是一款開源的 分布式消息中間件&#xff08;Message Queue, MQ&#xff09;&#xff0c;由阿里巴巴團隊研發并捐贈給 Apache 基金會&#xff0c;現已成為頂級項目。它專為 高吞吐、低延遲、高可靠 的分布式場景設計&#xff0c;廣…

Go語言--語法基礎4--基本數據類型--整數類型

整型是所有編程語言里最基礎的數據類型。 Go 語言支持如下所示的這些整型類型。 需要注意的是&#xff0c; int 和 int32 在 Go 語言里被認為是兩種不同的類型&#xff0c;編譯器也不會幫你自動做類型轉換&#xff0c; 比如以下的例子會有編譯錯誤&#xff1a; var value2 in…

競拍商城:電商創新的博弈場與未來趨勢

競拍商城&#xff1a;電商創新的博弈場與未來趨勢 在傳統電商趨于同質化的今天&#xff0c;競拍商城憑借其獨特的交易機制和用戶激勵模式&#xff0c;成為電商領域的新寵。通過結合拍賣的博弈屬性與電商的便捷性&#xff0c;競拍商城不僅重塑了消費體驗&#xff0c;更催生了全…

Linux : 多線程互斥

目錄 一 前言 二 線程互斥 三 Mutex互斥量 1. 定義一個鎖&#xff08;造鎖&#xff09; 2. 初始化鎖 3. 上鎖 4. 解鎖 5. 摧毀鎖 四 鎖的使用 五 鎖的宏初始化 六 鎖的原理 1.如何看待鎖&#xff1f; 2. 如何理解加鎖和解鎖的本質 七 c封裝互斥鎖 八 可重入…

論文閱讀筆記——Reactive Diffusion Policy

RDP 論文 通過 AR 提供實時觸覺/力反饋&#xff1b;慢速擴散策略&#xff0c;用于預測低頻潛在空間中的高層動作分塊&#xff1b;快速非對稱分詞器實現閉環反饋控制。 ACT、 π 0 \pi_0 π0? 采取了動作分塊&#xff0c;在動作分塊執行期間處于開環狀態&#xff0c;無法及時響…

swagger 注釋說明

一、接口注釋核心字段 在 Go 的路由處理函數&#xff08;Handler&#xff09;上方添加注釋&#xff0c;支持以下常用注解&#xff1a; 注解名稱用途說明示例格式Summary接口簡要描述Summary 創建用戶Description接口詳細說明Description 通過用戶名和郵箱創建新用戶Tags接口分…

STM32 HAL庫 OLED驅動實現

一、概述 1.1 OLED 顯示屏簡介 OLED&#xff08;Organic Light - Emitting Diode&#xff09;即有機發光二極管&#xff0c;與傳統的 LCD 顯示屏相比&#xff0c;OLED 具有自發光、視角廣、響應速度快、對比度高、功耗低等優點。在嵌入式系統中&#xff0c;OLED 顯示屏常被用…

Web開發-JavaEE應用動態接口代理原生反序列化危險Invoke重寫方法利用鏈

知識點&#xff1a; 1、安全開發-JavaEE-動態代理&序列化&反序列化 2、安全開發-JavaEE-readObject&toString方法 一、演示案例-WEB開發-JavaEE-動態代理 動態代理 代理模式Java當中最常用的設計模式之一。其特征是代理類與委托類有同樣的接口&#xff0c;代理類…

K8s是常用命令和解釋

K8s高頻命令 獲取資源信息&#xff0c;如獲取 Pod、Service、Deployment等資源狀態信息 kubectl get創建資源如創建Pod、Service、Deployment等資源 kubectl create刪除資源&#xff0c;如刪除Pod、Service、Deployment等資源 kubectl delete 應用配置文件&#xff0c;如引用D…

【模態分解】EMD-經驗模態分解

算法配置頁面&#xff0c;也可以一鍵導出結果數據 報表自定義繪制 獲取和下載【PHM學習軟件PHM源碼】的方式 獲取方式&#xff1a;Docshttps://jcn362s9p4t8.feishu.cn/wiki/A0NXwPxY3ie1cGkOy08cru6vnvc

TDengine 語言連接器(Go)

簡介 driver-go 是 TDengine 的官方 Go 語言連接器&#xff0c;實現了 Go 語言 database/sql 包的接口。Go 開發人員可以通過它開發存取 TDengine 集群數據的應用軟件。 Go 版本兼容性 支持 Go 1.14 及以上版本。 支持的平臺 原生連接支持的平臺和 TDengine 客戶端驅動支持…

鏈接世界:計算機網絡的核心與前沿

計算機網絡引言 在數字化時代&#xff0c;計算機網絡已經成為我們日常生活和工作中不可或缺的基礎設施。從簡單的局域網&#xff08;LAN&#xff09;到全球互聯網&#xff0c;計算機網絡將數以億計的設備連接在一起&#xff0c;推動了信息交換、資源共享以及全球化的進程。 什…