驅動開發硬核特訓 · Day 10 (理論上篇):設備模型 ≈ 運行時的適配器機制

🔍

B站相應的視屏教程
📌 內核:博文+視頻 - 總線驅動模型實戰全解析
敬請關注,記得標為原始粉絲。


在 Linux 驅動開發中,設備模型(Device Model)是理解驅動架構的核心。而從軟件工程的角度看,它與**適配器模式(Adapter Pattern)**之間也存在著驚人的相似性。本文嘗試從理論出發,構建“設備模型 ≈ 運行時的適配器機制”的認知,并通過邏輯圖與結構分析,將這一理念講透講透。


一、適配器模式回顧:統一接口的橋梁

在這里插入圖片描述

在軟件設計模式中,**適配器模式(Adapter Pattern)**的作用是:將一個類的接口轉換成客戶端所期待的另一個接口

  • 目標接口(Target):客戶端期待調用的接口
  • 源接口(Adaptee):已有的但不兼容的接口
  • 適配器(Adapter):中間橋梁,讓客戶端可以透明使用源接口

我們以 USB 轉串口為例:

Client(PC) <--> USB接口↓ 適配器
設備(串口芯片) <--> UART接口

在代碼中,Adapter 就是包裝 Adaptee 的對象,讓它“看起來”滿足了 Target 接口。


二、Linux 設備模型的運行時角色

Linux 的設備模型其實也完成了“統一接口”的橋接動作:

  • platform_device / i2c_client 等設備描述結構(相當于 Adaptee)
  • platform_driver / i2c_driver 等驅動結構(相當于 Adapter)
  • driver core(驅動核心)通過總線匹配機制連接設備與驅動(Adapter 注冊給一個 Bus,用于查找匹配)

當你寫下如下代碼時:

platform_driver_register(&my_driver);

實際上就是在告訴內核:我有一個驅動,它能適配某些符合匹配條件的設備,請你在運行時自動“配對”他們。

這正是“運行時適配器機制”的體現!


三、匹配機制的本質:驅動適配器為誰服務?

1. 核心概念類比:

軟件工程術語Linux 設備模型
Target接口驅動模型中的標準接口(probe等)
Adaptee類各種硬件設備(platform、I2C等)
Adapter適配器驅動結構體(platform_driver等)
適配者注冊driver_register / i2c_add_driver
自動裝配匹配邏輯總線匹配函數(of_match、id_table)

2. 匹配的流程圖:

           ┌────────────┐│ 設備樹Node │  ←──── 用戶定義設備信息└────┬───────┘│▼┌──────────────┐│ platform_device │ ←─── 內核解析設備樹,注冊└────┬──────────┘│▼┌──────────────┐│  platform_bus │ ←─── 總線負責配對邏輯└────┬──────────┘│probe匹配機制│▼┌──────────────┐│ platform_driver │ ←── 驅動是適配器└──────────────┘

四、為什么說它是“運行時”的適配器?

適配器模式在傳統軟件設計中通常是編譯期設計好適配關系,但在 Linux 驅動中,設備與驅動的綁定是:

  • 在設備注冊(如 platform_device)后,在 driver core 的設備鏈表中查找驅動
  • 或者在驅動注冊后,從已知設備中查找與之匹配的設備
  • 依據的是 名字匹配 / compatible 字符串

因此,這是 運行時動態匹配與綁定,它不是寫死的關系,而是通過總線模型中的匹配函數靈活控制。


五、多個總線的統一模型:都是適配器

我們常見的 driver 類型:

  • platform_driver
  • i2c_driver
  • spi_driver
  • usb_driver
  • pci_driver

它們都繼承了一個共同的父結構:

struct device_driver {const char *name;struct bus_type *bus;...
};

它們都注冊給對應的 bus_typebus_type 就是 Adapter 插口類型的定義者

換句話說,不同總線驅動之間的差異只是適配規則的差異,核心邏輯是一樣的:我聲明我能處理什么設備(通過 compatible 或 ID 表),然后內核會自動調用 probe 函數完成初始化。


六、設備模型中的三大核心角色

為了理解更深入,我們整理出設備模型三大核心結構體的適配關系:

設備模型角色軟件設計模式對應Linux結構體功能描述
被適配者Adapteeplatform_device / i2c_client硬件描述
適配器Adapterplatform_driver / i2c_driver驅動邏輯
適配管理器AdapterManagerbus_type匹配規則、注冊匹配與解綁回調

這三者構成了一個完整的“運行時適配”生態。


七、適配器模式的優勢在驅動模型中的體現

適配器優勢驅動模型的體現
將不兼容接口統一包裝硬件種類繁多,統一由 driver core 適配
解耦:客戶端與底層對象分離用戶只關心 probe 中的行為,與具體設備解耦
支持運行時靈活綁定動態添加/刪除驅動與設備都是天然支持的

八、真實場景舉例:平臺驅動模型

假設你有如下設備樹片段:

lcdif1: lcd-controller@32e80000 {compatible = "fsl,imx8mp-lcdif1";reg = <0x32e80000 0x10000>;interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;...
};

你注冊了如下 platform_driver:

static const struct of_device_id lcdif_match[] = {{ .compatible = "fsl,imx8mp-lcdif1" },{ /* sentinel */ }
};static struct platform_driver lcdif_driver = {.probe = lcdif_probe,.remove = lcdif_remove,.driver = {.name = "lcdif",.of_match_table = lcdif_match,},
};

整個過程就是典型的 運行時適配器匹配:設備為 Adaptee,驅動為 Adapter,由 bus_type 來橋接匹配


九、總結與過渡

我們可以得出核心觀點:

Linux 的驅動模型不是傳統靜態接口封裝,而是構建了一個運行時的適配器機制系統,通過 bus / device / driver 三者的動態配對完成模塊化的解耦架構。

  • 驅動 ≈ Adapter
  • 總線 ≈ AdapterManager(匹配策略)
  • 設備 ≈ Adaptee
  • probe 函數 ≈ Target 接口執行器

下一篇內容將全面深入 platform_driver、i2c_driver 結構與實際設備樹如何映射為設備對象,驅動如何實現匹配,sysfs 如何生成等具體實現細節,并圍繞 PCA9450 PMIC 進行實戰代碼分析。

敬請期待 Day 10 博文下篇:《設備模型 ≈ 運行時的適配器機制(下)——以 V4L2 攝像頭驅動為例》


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

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

相關文章

arm_math.h、arm_const_structs.h 和 arm_common_tables.h

在 ??FOC&#xff08;Field-Oriented Control&#xff0c;磁場定向控制&#xff09;?? 中&#xff0c;arm_math.h、arm_const_structs.h 和 arm_common_tables.h 是 CMSIS-DSP 庫的核心組件&#xff0c;用于實現高效的數學運算、預定義結構和查表操作。以下是它們在 FOC 控…

Android: gradient 使用

在 Android 中使用 gradient&#xff08;漸變&#xff09; 通常是通過 drawable 文件來設置背景。下面是可以直接用的幾種用法匯總&#xff0c;包括線性漸變、徑向漸變、掃描漸變&#xff08;sweep&#xff09;等&#xff1a; ? 1. Linear Gradient&#xff08;線性漸變&#…

打造AI應用基礎設施:Milvus向量數據庫部署與運維

目錄 打造AI應用基礎設施&#xff1a;Milvus向量數據庫部署與運維1. Milvus介紹1.1 什么是向量數據庫&#xff1f;1.2 Milvus主要特點 2. Milvus部署方案對比2.1 Milvus Lite2.2 Milvus Standalone2.3 Milvus Distributed2.4 部署方案對比表 3. Milvus部署操作命令實戰3.1 Milv…

AI Agent 在醫療健康領域的深度應用剖析

引言 隨著人工智能技術的迅猛發展&#xff0c;AI Agent 在醫療健康領域展現出了巨大的應用潛力。它猶如一位智能助手&#xff0c;憑借其強大的數據處理和分析能力&#xff0c;滲透到醫療健康的各個環節&#xff0c;從疾病診斷、治療方案制定到患者康復監控&#xff0c;都發揮著…

樹莓派超全系列教程文檔--(28)boot文件夾內容

boot文件夾內容 boot 文件夾內容bootcode.binstart*.elffixup*.datcmdline.txtconfig.txtissue.txtinitramfs*ssh 或 ssh.txt設備樹blob文件 ( *.dtb )內核文件 ( *.img )overlays 文件夾 文章來源&#xff1a; http://raspberry.dns8844.cn/documentation 原文網址 boot 文件…

SvelteKit 最新中文文檔教程(20)—— 最佳實踐之性能

前言 Svelte&#xff0c;一個語法簡潔、入門容易&#xff0c;面向未來的前端框架。 從 Svelte 誕生之初&#xff0c;就備受開發者的喜愛&#xff0c;根據統計&#xff0c;從 2019 年到 2024 年&#xff0c;連續 6 年一直是開發者最感興趣的前端框架 No.1&#xff1a; Svelte …

【LangChain核心組件】Memory:讓大語言模型擁有持續對話記憶的工程實踐

目錄 一、Memory架構設計解析 1. 核心組件關系圖 2. 代碼中的關鍵實現 二、對話記憶的工程實現 1. 消息結構化存儲 2. 動態提示組裝機制 三、Memory類型選型指南 四、生產環境優化實踐 1. 記憶容量控制 2. 記憶分片策略 3. 記憶檢索增強 五、典型問題調試技巧 1. …

適應 AI 時代的軟件開發流程:用 AI + TDD 構建可維護項目

?? 適應 AI 時代的軟件開發流程:用 AI + TDD 構建可維護項目 本文面向有系統開發經驗的工程師,分享如何結合 Git 管理、AI 協作、YAML 驅動與 TDD 開發方式,高效構建一個可維護、可協作、可交付的嵌入式或通用工程項目。適合 BLE 模塊、協議棧組件、物聯網控制系統等項目落…

使用 chromedriver 實現網絡爬蟲【手抄】

1、引用 selenium 包 <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.29.0</version> </dependency> <dependency><groupId>org.seleniumhq.seleniu…

Python項目--基于Python的自然語言處理文本摘要系統

1. 項目概述 自然語言處理(NLP)是人工智能領域中一個重要的研究方向&#xff0c;而文本摘要作為NLP的一個重要應用&#xff0c;在信息爆炸的時代具有重要意義。本項目旨在開發一個基于Python的文本摘要系統&#xff0c;能夠自動從長文本中提取關鍵信息&#xff0c;生成簡潔而全…

【Vue #3】指令補充樣式綁定

一、指令修飾符 Vue 的指令修飾符&#xff08;Directive Modifiers&#xff09;是 Vue 模板語法中的重要特性&#xff0c;它們以半角句號 . 開頭&#xff0c;用于對指令的綁定行為進行特殊處理 修飾符作用如下&#xff1a; 簡化事件處理&#xff08;如阻止默認行為、停止冒泡…

Reinforcement Learning強化學習--李宏毅機器學習筆記

個人學習筆記&#xff0c;如有錯誤歡迎指正&#xff0c;也歡迎交流&#xff0c;其他筆記見個人空間 強化學習 vs 監督學習 監督學習&#xff08;Supervised Learning&#xff09;&#xff1a;你有輸入和明確的輸出標簽&#xff0c;例如圖像分類。 強化學習&#xff08;Rein…

Windows VsCode Terminal窗口使用Linux命令

背景描述&#xff1a; 平時開發環境以Linux系統為主&#xff0c;有時又需要使用Windows系統下開發環境&#xff0c;為了能像Linux系統那樣用Windows VsCode&#xff0c;Terminal命令行是必不可少內容。 注&#xff1a;Windows11 VsCode 1.99.2 下面介紹&#xff0c;如何在V…

軟件測試之測試數據生成(Excel版)

這是Excel生成測試數據的函數使用 1.時間 1.1.時間 例生成2022-05-01之前一年內任意時間點: =TEXT("2022-05-01"-RAND()-RANDBETWEEN(1,365),"yyyy-mm-dd hh:mm:ss")1.2.年月日 yyyy-mm-dd 以當前時間生成10年的日期 =TEXT(NOW()-RAND()-RANDBETWE…

libwebsocket建立服務器需要編寫LWS_CALLBACK_ADD_HEADERS事件處理

最近在使用libwebsocket&#xff0c;感覺它搭建Http與websocket服務器比較簡單&#xff0c;不像poco庫那么龐大&#xff0c;但當我使用它建立websocket服務器后&#xff0c;發現websocket客戶端連接一直沒有連接成功&#xff0c;不知道什么原因&#xff0c;經過一天的調試&…

從 PyTorch 到 ONNX:深度學習模型導出全解析

在模型訓練完畢后&#xff0c;我們通常希望將其部署到推理平臺中&#xff0c;比如 TensorRT、ONNX Runtime 或移動端框架。而 ONNX&#xff08;Open Neural Network Exchange&#xff09;正是 PyTorch 與這些平臺之間的橋梁。 本文將以一個圖像去噪模型 SimpleDenoiser 為例&a…

Hadoop集群部署教程-P6

Hadoop集群部署教程-P6 Hadoop集群部署教程&#xff08;續&#xff09; 第二十一章&#xff1a;監控與告警系統集成 21.1 Prometheus監控體系搭建 Exporter部署&#xff1a; # 部署HDFS Exporter wget https://github.com/prometheus/hdfs_exporter/releases/download/v1.1.…

【Altium】AD-生成PDF文件圖紙包含太多的空白怎么解決

1、 文檔目標 AD設計文件導出PDF時&#xff0c;圖紙模板方向設置問題 2、 問題場景 AD使用Smart PDF導出PDF時&#xff0c;不管你怎么設置頁面尺寸&#xff0c;只要從橫向轉為縱向輸出&#xff0c;輸出的始終是橫向紙張&#xff08;中間保留縱向圖紙&#xff0c;兩邊大量留白…

大廠面試:六大排序

前言 本篇博客集中了冒泡&#xff0c;選擇&#xff0c;二分插入&#xff0c;快排&#xff0c;歸并&#xff0c;堆排&#xff0c;六大排序算法 如果覺得對你有幫助&#xff0c;可以點點關注&#xff0c;點點贊&#xff0c;謝謝你&#xff01; 1.冒泡排序 //冒泡排序&#xff…

大模型開發:源碼分析 Qwen 2.5-VL 視頻抽幀模塊(附加FFmpeg 性能對比測試)

目錄 qwen 視頻理解能力 messages 構建 demo qwen 抽幀代碼分析 驗證兩個實際 case 官網介紹圖 性能對比&#xff1a;ffmpeg 抽幀、decord 庫抽幀 介紹 聯系 對比 測試結果 測試明細 ffmpeg 100 qps 測試&#xff08;CPU&#xff09; decord 100 qps 測試&#x…