【驱动】I2C驱动分析(二)-驱动框架
I2C驅動框架簡介
I2C 驅動屬于總線-設備-驅動模型的,與I2C總線設備驅動模型相比,大體框架是一樣,系統的整體框架如下所示。
- 最上層是應用層,在應用層用戶可以直接用open read write對設備進行操作,
- 往下是設備驅動層,這個就是外圍的比如一些用I2C總線連接到SOC的傳感器或者EEPROM的驅動程序,這個一般由普通驅動工程師負責,
- 再往下的I2C-Core是核心層,這個是Linux內核源碼里面本來就有的,這里面主要是一些驅動和設備的注冊函數以及i2c_transfer函數,
- 再往下就是I2C控制器驅動,這個一般是由芯片原廠的程序員負責編寫,
- 再往下就是具體的硬件了。
用戶空間
/dev/i2c-*提供了用戶空間與內核空間之間的接口,允許用戶空間應用程序通過設備文件(如)與I2C驅動進行通信。用戶空間應用程序可以使用標準的I2C系統調用(如ioctl())來發送和接收I2C消息。
在Linux內核代碼文件/include/linux/i2c-dev.c中針對每個適配器生成一個主設備號為89的設備節點,實現了文件操作接口,用戶空間可以通過i2c設備節點訪問i2c適配器。適配器的編號從0開始,和適配器的設備節點的次設備號相同。
i2c適配器的設備節點是/dev/i2c-x,其中x是數字,代表適配器的編號。由于適配器編號是動態分配的(和注冊次序有關),所以想了解哪一個適配器對應什么編號,可以查看/sys/class/i2c-dev/目錄下的文件內容。
內核空間
I2C driver
I2C設備驅動層是Linux內核中負責管理和控制特定I2C設備的關鍵組件。它通過與I2C核心層協同工作,提供了與I2C設備進行通信、注冊、注銷、探測、移除等功能的接口。驅動程序負責初始化設備、處理設備的讀寫操作、響應中斷事件等,以實現對I2C設備的控制和管理。通過I2C設備驅動層,用戶空間應用程序和其他內核組件可以方便地與I2C設備進行交互,并實現各種應用需求。
下面詳細介紹I2C設備驅動層的主要組成和功能:
-
設備注冊和注銷:
I2C設備驅動層提供了函數接口,允許驅動程序注冊和注銷I2C設備。注冊過程中,驅動程序需要提供設備的描述信息,如設備名、設備地址等,以便核心層能夠識別和管理設備。通過注冊,驅動程序將設備與I2C總線關聯起來,并為設備分配唯一的設備編號。注銷過程中,驅動程序通知核心層不再需要管理該設備。 -
設備探測和移除:
當I2C總線上連接的設備被插入或移除時,I2C設備驅動層的探測和移除函數將被調用。探測函數負責初始化設備并準備設備進行通信。它接收一個i2c_client結構體指針作為參數,該結構體包含設備的地址、適配器指針等信息。探測函數通常會執行設備的初始化和配置操作,并將設備添加到設備模型中,以便其他組件可以訪問設備。移除函數在設備被移除時執行,它負責清理設備和相關資源,并從設備模型中注銷設備。 -
設備操作接口:
I2C設備驅動層提供了一組函數接口,允許用戶空間應用程序或其他內核組件與I2C設備進行通信和操作。這些接口包括讀取寄存器、寫入寄存器、發送和接收數據等操作。驅動程序通過這些接口與設備進行交互,讀取或寫入設備的寄存器,發送和接收設備的數據。 -
設備節點和文件系統接口:
在Linux內核中,I2C設備通過設備節點(Device Node)在文件系統中表示。I2C設備驅動層負責創建和管理設備節點,使用戶空間應用程序可以通過文件系統接口來訪問和控制設備。設備節點通常位于/sys/bus/i2c/devices目錄下,每個設備節點對應一個已注冊的I2C設備。用戶空間應用程序可以打開設備節點,并使用標準的讀寫操作來與設備進行通信。 -
中斷和工作隊列:
I2C設備驅動層還提供了處理中斷和異步操作的機制,以滿足實時性要求。當設備產生中斷時,驅動程序可以注冊中斷處理函數來響應中斷事件,并進行相應的處理。此外,驅動程序還可以使用工作隊列(Work Queue)機制,在延遲執行的上下文中處理任務,以避免阻塞關鍵代碼路徑。
I2Ccore
I2C core是Linux內核中負責管理和控制I2C總線的基礎層,提供了一組API和數據結構,用于注冊、注銷和管理I2C控制器、適配器以及與其連接的I2C設備。
-
I2C控制器注冊:I2C核心層允許I2C控制器驅動程序在系統啟動時注冊。控制器驅動程序通過向I2C核心層提供適當的信息和回調函數來完成注冊過程。一旦注冊成功,核心層將管理該控制器的狀態并提供相應的接口。
-
I2C適配器管理:I2C核心層負責管理系統中的所有I2C適配器。它提供了適配器的注冊和注銷接口,以便適配器驅動程序可以將適配器添加到系統中或將其移除。核心層還維護了適配器的狀態信息,例如適配器的名稱、地址范圍等。
-
I2C設備注冊和管理:I2C核心層允許I2C設備驅動程序注冊與I2C總線連接的設備。設備驅動程序通過提供設備地址、設備ID等信息來完成注冊過程。一旦注冊成功,核心層將為該設備分配一個唯一的設備編號,并提供一組函數接口,使驅動程序能夠與該設備進行通信。
-
I2C消息傳輸:I2C核心層提供了用于發送和接收I2C消息的函數接口。驅動程序可以使用這些接口來創建和配置I2C消息,包括設備地址、寄存器地址、數據等信息,并通過適配器驅動程序將消息發送到I2C總線上。核心層還處理I2C消息的ACK/NACK響應,并提供錯誤處理機制。
-
I2C設備節點:I2C核心層通過
/sys/bus/i2c/devices目錄下的設備節點來表示已注冊的I2C設備。每個設備節點包含設備的唯一編號、設備地址等信息,驅動程序可以使用這些設備節點來訪問和控制對應的I2C設備。
I2C algorithm
I2C algorithm是在軟件層面上實現I2C總線通信的一系列步驟和流程。它通過初始化、發起通信、傳輸數據、等待應答、終止通信等操作來實現與I2C設備的通信和控制。在Linux內核中,I2C算法提供了通用的接口和函數,使驅動程序可以方便地使用和擴展I2C功能。
以下是I2C算法的主要步驟和流程:
-
初始化:
在使用I2C總線之前,需要初始化I2C控制器和相關的硬件資源。這包括設置I2C控制器的時鐘頻率、配置引腳和電氣特性等。在Linux內核中,通常通過I2C子系統的初始化函數來完成這些操作。 -
選擇總線:
在多個I2C總線存在的情況下,需要選擇要使用的I2C總線。通常,每個I2C總線都由一個獨立的控制器和相關的硬件資源管理。選擇總線的方法可以是根據硬件連接關系,或者根據設備的地址范圍等。 -
發起通信:
在進行I2C通信之前,需要發起通信請求。通信請求包括設備地址、讀寫操作、寄存器地址(如果適用)以及數據長度等信息。在Linux內核中,可以使用i2c_transfer()函數發起通信請求。 -
生成起始信號:
為了開始一次I2C通信,主設備(通常是控制器)需要發送起始信號。起始信號表示一次新的通信開始,并引導設備進行相應的響應。 -
傳輸數據:
在I2C通信中,數據傳輸通過時鐘信號和數據信號線進行。主設備通過時鐘信號控制數據的傳輸速率,而數據信號線上的電平則表示傳輸的二進制數據。主設備和從設備通過時鐘同步進行數據的傳輸。 -
等待應答:
在主設備發送數據字節后,它會等待從設備的應答信號。應答信號可以是從設備拉低數據線,表示準備接收下一個字節;或者釋放數據線,表示拒絕接收數據。 -
終止通信:
在完成一次I2C通信后,需要發送終止信號來結束通信。終止信號表示一次通信的結束,并將總線釋放給其他設備。 -
錯誤處理:
在I2C通信過程中,可能會發生錯誤,如設備無響應、數據傳輸失敗等。在Linux內核中,I2C算法提供了相應的錯誤處理機制,允許驅動程序檢測和處理通信錯誤。
I2C adapter
I2C適配器是一種硬件設備,用于在計算機系統中提供I2C總線的物理接口和信號轉換功能。它充當I2C主控制器的角色,負責管理和控制連接在I2C總線上的從設備。適配器提供物理接口、信號轉換、主控制器功能、多總線支持等特點和功能,通過相應的驅動程序與操作系統進行通信。簡單來說,一根i2c總線就是一個I2C adapter。
I2C適配器的作用如下:
-
物理接口:
I2C適配器提供了計算機系統與I2C總線之間的物理接口。它通常包括多個I2C總線連接點,每個連接點可以連接一個或多個I2C設備。I2C適配器的物理接口可以是標準的I2C引腳,如SDA(Serial Data Line)和SCL(Serial Clock Line),也可以是其他物理接口,如GPIO(General Purpose Input/Output)引腳。 -
信號轉換:
I2C適配器負責將計算機系統的電平和信號轉換為符合I2C總線規范的電平和信號。它可以將計算機系統的電平轉換為I2C總線所需的電平,如將3.3V或5V電平轉換為I2C的標準電平(通常為3.3V)。此外,適配器還負責將計算機系統的時鐘信號和數據信號轉換為I2C總線所需的時鐘和數據信號。 -
主控制器功能:
I2C適配器充當I2C總線的主控制器,負責發起和管理I2C通信。它可以向從設備發送讀取和寫入命令,接收從設備的應答信號,并控制數據的傳輸速率和時序。適配器還負責生成起始信號和終止信號,以標識一次通信的開始和結束。 -
多總線支持:
一些I2C適配器支持多個獨立的I2C總線。這允許在同一個計算機系統上連接多個I2C總線,并通過適配器進行獨立的控制和管理。每個總線可以具有不同的時鐘頻率、地址范圍和連接設備。 -
驅動程序支持:
I2C適配器通常需要相應的驅動程序來與操作系統進行通信。驅動程序負責將適配器的功能暴露給操作系統,并提供對適配器的控制和配置接口。在Linux內核中,提供了一組通用的I2C適配器驅動程序接口,使開發人員能夠編寫適配器特定的驅動程序。 -
軟件工具支持:
為了方便使用和調試,一些I2C適配器提供了相應的軟件工具。這些工具可以用于掃描和探測已連接的I2C設備、讀取和寫入設備的寄存器、顯示設備的狀態和信息等。
硬件層
I2C device
I2C設備是連接在I2C總線上的從設備,通過I2C總線與主控制器進行通信和控制。每個設備都有一個唯一的地址,并支持讀取和寫入操作。設備具有寄存器和功能,可以存儲配置參數、狀態信息和數據。不同類型的設備具有不同的功能和特性,主控制器可以通過適當的驅動程序與設備進行交互。
在使用I2C設備時,主控制器通過發送設備地址、讀取或寫入命令以及相關的數據來與設備進行通信。設備根據接收到的命令和數據執行相應的操作,并將結果返回給主控制器。主控制器可以通過適當的軟件驅動程序和庫函數來管理和控制連接的I2C設備。
本文參考
https://blog.csdn.net/u013171226/article/details/131761869
https://zhuanlan.zhihu.com/p/645018040
https://www.zhihu.com/tardis/bd/ans/3056478847?source_id=1001
https://www.jianshu.com/p/6d162195f4a7
總結
以上是生活随笔為你收集整理的【驱动】I2C驱动分析(二)-驱动框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CPLEX通过Python API获取G
- 下一篇: MySQL驱动扯后腿?Spring Bo