驅動開發硬核特訓 · Day 30(上篇):深入理解 I2C 總線驅動模型(以 at24 EEPROM 為例)

作者:嵌入式Jerry
視頻教程請關注 B 站:“嵌入式Jerry”


一、寫在前面

在上一階段我們已經深入理解了字符設備驅動與設備模型之間的結合方式、sysfs 的創建方式以及平臺驅動模型的實際運用。今天我們邁入總線驅動模型的世界,聚焦于 I2C 總線驅動模型,并選取一個典型、真實且廣泛使用的驅動設備 —— at24 EEPROM,進行完整分析。

本篇內容將從 I2C 總線模型的架構出發,講清楚:

  • 驅動如何注冊到 I2C 總線上?
  • I2C client 是如何匹配的?
  • at24 是如何成為標準驅動代表的?
  • 如何配置設備樹節點?
  • 如何驗證實際讀寫?

并配套提供真實代碼與調試示例。


二、I2C 總線驅動模型架構簡介

在 Linux 內核中,I2C 總線驅動模型是基于總線-設備-驅動的三層結構之上實現的:

        I2C 總線(i2c_adapter) ←→  I2C 設備(i2c_client) ←→  I2C 驅動(i2c_driver)
  • i2c_adapter:抽象了一個物理 I2C 控制器(主機控制器)
  • i2c_client:抽象了掛在某條 adapter 上的 I2C 外設
  • i2c_driver:抽象了對某種類型 I2C 設備的驅動代碼

這和設備模型中的 bus_typedevicedevice_driver 是一致的,i2c-core 就是 bus_type 的實現,負責完成 match 和 probe。


在這里插入圖片描述

三、典型案例介紹:at24 EEPROM

我們選擇 i2c 子系統中的一個經典外設:at24 系列 EEPROM。它們遵循 I2C 協議,容量常見為 16Kbit/32Kbit/64Kbit,支持頁寫和順序讀。

在 Linux 內核中,驅動文件為:

drivers/misc/eeprom/at24.c

其本質是一個標準 i2c_driver 驅動。


四、設備樹配置

在 NXP i.MX8MP 平臺中,at24 EEPROM 可以通過設備樹添加,典型配置如下:

&i2c3 {status = "okay";clock-frequency = <400000>;eeprom@50 {compatible = "atmel,24c16";reg = <0x50>;pagesize = <16>;};
};

解釋:

  • compatible:用于匹配驅動
  • reg:I2C 地址(7 位)
  • pagesize:頁寫大小(單位:字節)

五、驅動入口分析

at24.c 中的核心驅動結構如下:

static const struct of_device_id at24_of_match[] = {{ .compatible = "atmel,24c16", .data = (void *)AT24_DEVICE_MAGIC },{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, at24_of_match);static struct i2c_driver at24_driver = {.driver = {.name = "at24",.of_match_table = of_match_ptr(at24_of_match),},.probe_new = at24_probe,.remove = at24_remove,.id_table = at24_ids,
};
module_i2c_driver(at24_driver);

🔍 核心點解析:

  • 使用 of_match_table 進行設備樹匹配;
  • 使用 module_i2c_driver 宏注冊;
  • probe 函數負責初始化工作,注冊字符設備。

六、字符設備注冊邏輯

at24 實現為字符設備,允許用戶從 /dev 直接讀寫 EEPROM 數據。

ret = devm_device_add_groups(&client->dev, at24_groups);
cdev_init(&at24->cdev, &at24_fops);
ret = cdev_add(&at24->cdev, at24->devt, 1);
device_create(...);

最終會創建出:

/dev/eeprom
/sys/class/eeprom/eeprom0

文件操作如下:

static const struct file_operations at24_fops = {.owner = THIS_MODULE,.llseek = no_llseek,.read = at24_read,.write = at24_write,.open = at24_open,
};

七、匹配過程剖析

整個驅動匹配過程:

  1. at24 驅動通過 of_match_table 注冊支持 "atmel,24c16"
  2. i2c-core 掃描設備樹時發現此節點
  3. 創建 i2c_client,并匹配 i2c_driver
  4. 調用 at24_probe(),完成驅動綁定

八、調試驗證操作

加載驅動后會創建字符設備:

ls /dev/eeprom

我們可以直接寫入:

echo "hello" > /dev/eeprom

再讀取:

hexdump -C /dev/eeprom

若權限不足,可添加 udev 規則或通過 root 權限訪問。


九、at24 驅動完整結構總覽

+-----------------------------+
|        I2C Adapter         |
|   (控制器,如i.MX8MP)   |
+-------------+-------------+|v
+-------------+-------------+
|         I2C Client        | ←─────────────── 由設備樹注冊
|     i2c_client @ 0x50     |
+-------------+-------------+|v
+-------------+-------------+
|         I2C Driver        | ←─────────────── drivers/misc/eeprom/at24.c
|       i2c_driver: at24    |
+-------------+-------------+|v
+-------------+-------------+
|       Character Device    | ←─────────────── /dev/eeprom
|    file_operations: fops  |
+---------------------------+

🔟 總結與思考

通過 at24 EEPROM 的驅動分析,我們掌握了 I2C 總線驅動模型的完整機制:

關鍵組成說明
i2c_adapter控制器抽象,如 i2c3
i2c_client掛載在 adapter 上的設備
i2c_driver與 client 匹配的驅動
device tree提供匹配入口
字符設備提供用戶訪問接口

相比 platform 模型,I2C 總線驅動具有自動枚舉能力,更適合標準器件(如 EEPROM、音頻 codec、傳感器等)。


? 今日任務鞏固

  1. I2C 總線模型中,clientdriver 如何匹配?
  2. at24 驅動中,字符設備注冊在哪個函數中?
  3. 如何通過設備樹指定 I2C 地址與頁大小?
  4. EEPROM 驅動是否需要實現 read/write
  5. 與 platform_driver 模型的區別有哪些?

📢 后續預告

在下一篇(Day 30 下篇)中,我們將圍繞 lm48100q 音頻 codec 展開,深入講解 音頻子系統 + I2C 驅動模型 的高級應用與集成技巧,敬請期待!


本文由 嵌入式Jerry 原創發布,轉載請注明出處
視頻教程請關注 B 站:“嵌入式Jerry”

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

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

相關文章

超詳細講解注意力機制、自注意力機制、多頭注意力機制、通道注意力機制、空間注意力機制

在如今的機器學習和深度學習領域&#xff0c;注意力機制絕對是一個熱度居高不下的話題。事實上&#xff0c;注意力機制并不是一個全新的概念&#xff0c;早在多年前就已經被提出并應用。比如在圖像分類任務中&#xff0c;SENet 和 ECA-Net 等模型中都運用了注意力機制&#xff…

Wireshark基本使用

本文會對Wireshark做簡單介紹&#xff0c;帶大家熟悉一下Wireshark的界面&#xff0c;以及如何使用過濾器。 接著會帶大家查看TCP五層模型下&#xff0c;帶大家回顧各層首部的格式。 最后會演示 Wireshark 如何抓取三次握手和四次揮手包的過程。 目錄 一.Wireshark簡介 二…

加速項目落地(Trae編輯器)

目錄 vscode安裝python支持 vscode常用插件 Trae編輯器 兩個界面合成 補充&#xff08;QT開發的繁瑣&#xff09; AI編程哪家強&#xff1f;Cursor、Trae深度對比&#xff0c;超詳細&#xff01; - 知乎 Trae兼容vscode的插件&#xff0c;我們可以先在vscode里面裝好再一…

stable diffusion的attention-map:提取和可視化跨注意力圖

項目&#xff1a; wooyeolbaek/attention-map-diffusers: &#x1f680; Cross attention map tools for huggingface/diffusers 參考&#xff1a;【可視化必備技能&#xff08;1&#xff09;】SD / Flux 文生圖模型的 Attention Map 可視化-CSDN博客

多環串級PID

文章目錄 為什么要多環程序主函數內環外環 雙環PID調參內環Kp調法Ki調法 外環Kp 以一定速度到達指定位置封裝 為什么要多環 單環只能單一控制速度或者位置&#xff0c;如果想要同時控制多個量如速度&#xff0c;位置&#xff0c;角度&#xff0c;就需要多個PID 速度環一般PI…

基于Kubernetes的Apache Pulsar云原生架構解析與集群部署指南(上)

#作者&#xff1a;閆乾苓 文章目錄 概念和架構概述主要特點消息傳遞核心概念Pulsar 的消息模型Pulsar 的消息存儲與分發Pulsar 的高級特性架構BrokerBookKeeperZooKeeper 概念和架構 概述 Pulsar 是一個多租戶、高性能的服務器到服務器消息傳遞解決方案。Pulsar 最初由雅虎開…

電子電氣架構 --- 如何有助于提安全性并減少事故

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 鈍感力的“鈍”,不是木訥、遲鈍,而是直面困境的韌勁和耐力,是面對外界噪音的通透淡然。 生活中有兩種人,一種人格外在意別人的眼光;另一種人無論…

rest_framework學習之認證 權限

權限 DRF提供如下幾種常見權限&#xff1a; IsAuthenticated, 認證通過 IsAdminUser, 管理員權限 IsAuthenticatedOrReadOnly, 登錄用戶增刪改 非登錄用戶只能查詢 AllowAny&#xff0c;無需認證&#xff08;默認&#xff09; 在rest_framework的APIView基礎類中&#xf…

【使用switch結構輸出季節】2021-11-23

緣由用switch語句設計程序一年有12個月-編程語言-CSDN問答 void 使用switch結構輸出季節(int y) {//緣由https://ask.csdn.net/questions/7577096?spm1005.2025.3001.5141std::cout << y << "\t";switch (y){case 3: case 4: case 5:std::cout <<…

主備Smart Link + Monitor Link組網技術詳細配置

1.實驗拓撲 2.使用設備 eNSP模擬建議下行設備三臺使用S3700模擬&#xff08;全部使用S5700可能會出現流量丟失等異常問題。&#xff09; 3.實驗配置 [SW1]dis cu # sysname SW1 # vlan batch 100 110 # interface Ethernet0/0/1port link-type accessport default vlan 100 …

【hadoop】案例:Sqoop遷移倉庫數據

1 數據導出&#xff1a;Hive導入MySQL [hadoophadoop1 sqoop]$ bin/sqoop export \ > --connect jdbc:mysql://localhost/weather \ > --username root \ > --password 123456 \ > --table mean_temperature \ > --export-dir /user/hive/warehouse/mydb/mean…

Mysql-OCP PPT課程講解并翻譯

#跳過介紹&#xff0c;直接從干貨開始記錄 第一章 安裝mysql

springboot+vue實現在線網盤(云盤)系統

今天教大家如何設計一個網盤&#xff08;云盤&#xff09;系統系統 , 基于目前主流的技術&#xff1a;前端vue&#xff0c;后端springboot。 同時還帶來的項目的部署教程。 視頻演示 springbootvue實現在線網盤&#xff08;云盤&#xff09;系統 圖片演示 一. 系統概述 用過百…

JAVA:Spring Boot 集成 Lua 的技術博客

1、簡述 在現代開發中,Lua 以其輕量級、高性能以及易嵌入的特點廣泛用于腳本擴展、游戲開發以及配置處理場景。將 Lua 與 Spring Boot 集成,可以在 Java 項目中實現動態腳本功能,增強項目的靈活性和動態配置能力。 樣例代碼: https://gitee.com/lhdxhl/springboot-example…

uniapp-商城-43-shop 后臺管理 頁面

后臺管理較為簡單&#xff0c;主要用于后臺數據的管理&#xff0c;包含商品類別和商品信息&#xff0c;其實還可以擴展到管理用戶等等 1、后臺首頁 包含 分類管理 商品管理 關于商家等幾個欄目 主要代碼&#xff1a; <template><view class"manage">…

食物數據分析系統vue+flask

食物數據分析系統 項目概述 食物數據分析系統是一個集食物營養成分查詢、對比分析和數據可視化于一體的Web應用。系統采用前后端分離架構&#xff0c;為用戶提供食物營養信息檢索、食物對比和營養分析等功能&#xff0c;幫助用戶了解食物的營養成分&#xff0c;做出更健康的飲…

學習基本樂理知識

本文主要內容 如何練習吉他 樂理知識補充 ps&#xff1a;本文知識均來自up主 ‘吉他大學霸’ 感謝開源 -^- 練習吉他步驟 打怪升級 右手--> 左手--> 音階--> 拓展 第一階段&#xff1a; 追求手腳配合不出錯、手姿勢不出錯、手不會按錯彈錯。連續不錯的遍數達標就可以進…

吊球技術(劈吊、滑板等)

羽毛球吊球技術&#xff08;劈吊、滑板等&#xff09;是單打和雙打中重要的得分手段&#xff0c;需要通過系統性練習掌握。以下是分步驟的詳細訓練方法&#xff1a; 一、核心技術原理對比 技術類型擊球點拍面控制發力特點適用場景正手劈吊高點偏前斜切&#xff08;拍面45&…

Java實現桶排序算法

1. 桶排序原理圖解 桶排序是一種基于分桶思想的非比較排序算法&#xff0c;適用于數據分布較為均勻的場景。其核心思想是將數據分散到有限數量的“桶”中&#xff0c;每個桶再分別進行排序&#xff08;通常使用插入排序或其他簡單的排序算法&#xff09;。以下是桶排序的步驟&a…

OpenCv實戰筆記(3)基于opencv實現調用攝像頭并實時顯示畫面

一、實現效果 二、實現原理 使用 OpenCV 打開攝像頭&#xff0c;持續捕獲視頻幀&#xff0c;并在一個窗口中實時顯示這些幀&#xff0c;直到用戶按下 ESC 鍵退出。整體流程&#xff1a;打開攝像頭&#xff08;cv::VideoCapture&#xff09;>創建圖像顯示窗口&#xff08;cv…