S3C2440驅動簡析——I2C驅動(1)

      這次來研究內核自帶I2C驅動的代碼,在深入代碼之前,首先簡單瞭解一下I2C核心數據結構的相互關係。由此來展開,也許能夠對驅動代碼有更好地理解。軟件數據結構的設計、數據結構之間的關係就至少應該描述硬件物理連接的這種組織關係。Linux的i2c 框架中各個部分的關係如下圖所示:

 

 

 

內核中 i2c 相關代碼可以分爲三個層次:
1. i2c 框架:i2c.h 和i2c-core.c 爲i2c 框架的主體,提供了核心數據結構的定義、i2c 適配器驅動和設備驅動的註冊、註銷管理,i2c 通信方法上層的、與具體適配器無關的代碼、檢測設備地址的上層代碼等;i2c-dev.c 用於創建i2c 適配器的/dev/i2c/%d 設備節點,提供i2c 設備訪問方法等。
2. i2c 總線適配器驅動:定義描述具體i2c 總線適配器的i2c_adapter 數據結構、實現在具體i2c 適配器上的i2c 總線通信方法,並由i2c_algorithm 數據結構進行描述。
3. i2c 設備驅動:定義描述具體設備的i2c_client 和可能的私有數據結構、藉助i2c 框架的i2c_probe 函數實現註冊設備的attach_adapter 方法、提供設備可能使用的地址範圍、以及設備地址檢測成功後創建i2c_client 數據結構的回調函數。

 

 

I2C主要數據結構如下:

 

1. 一個 i2c 設備的驅動程序由i2c_driver 數據結構描述,定義於include/linux/i2c.h:


 

attach_adapter 回調函數在安裝i2c 設備驅動程序模塊時、或者在安裝i2c 適配器驅動
程序模塊時被調用,用於檢測、認領設備併爲設備分配i2c_client 數據結構。

 

detach_client 方法在卸載適配器或設備驅動程序模塊時被調用,用於從總線上註銷設備、並釋放i2c_client 及相應的私有數據結構。

 

inc_use 和dec_use 所指向的函數用於改變i2c 設備驅動程序模塊的引用計數。注意不要直接調用i2c_driver數據結構中的這兩個方法,而要通過如下函數調用路徑:
i2c_use_client > i2c_inc_use_client > inc_use
i2c_release_client > i2c_dec_use_client > dec_use

 

 

2. 一個 i2c 設備由i2c_client 數據結構進行描述:

在安裝適配器或者設備的驅動程序時通過設備驅動程序 i2c_driver 中的attach_adapter 函數檢測設備地址。如果檢測成功則調用設備驅動程序提供的回調函數創建描述設備的i2c_client 數據結構,並將其中的driver指針指向設備驅動程序的i2c_driver 數據結構。這樣將來就可以使用i2c_driver 中的註銷設備和控制引用計數的方法了。

 

 

3. 一個 i2c 適配器由i2c_adapter 數據結構描述:

 

在 i2c_adapter 數據結構中設計了clients 指針數組,指向該總線上每個設備的i2c_client 數據結構。由於一條i2c 總線上最多隻有I2C_CLENT_MAX 個設備,所以可以使用靜態數組(題外話,如果相關數據結構的個數是未知的,鏈表顯然是更好的選擇)。lock 信號量用於實現對i2c 總線的互斥訪問:在訪問i2c 總線上的任一設備期間當前進程必須首先獲得該信號量,並且在阻塞等待i2c 操作完成期間不釋放。

 

 

4.具體 i2c 適配器的通信方法由i2c_algorithm 數據結構進行描述:

 

master_xfer/smbus_xfer 指針指向i2c 適配器驅動程序模塊實現的i2c 通信協議或者smbus 通信協議。由下文分析可見在用戶進程通過i2c-dev 提供的/dev/i2c/%d 設備節點訪問i2c 設備時,最終是通過調用master_xfer 或者smbus_xfer 指向的方法完成的。

 

slave_send/recv 函數用於實現當i2c 適配器扮演slave 角色時的傳輸方法。 

 

 

由於內容統一的關係,在一篇文章裏又記錄數據結構,又貼出驅動代碼,這樣個人感覺比較亂。所以我還是選擇把I2C驅動這一塊內容分成三部分,本文討論數據結構爲第一部分,在接下來的I2C驅動文章《S3C2440驅動簡析——I2C驅動(2)》裏,將會深入i2c-dev.c驅動代碼。第三部分是深入i2c-core.c,以瞭解實際底層操作的過程。

 

欲知後事如何,請聽下回分解~

 

 

本系列博文鏈接:

I2C驅動(1)http://blog.csdn.net/jarvis_xian/archive/2011/05/27/6449939.aspx
I2C驅動(2)http://blog.csdn.net/jarvis_xian/archive/2011/05/27/6451168.aspx
I2C驅動(3)http://blog.csdn.net/jarvis_xian/archive/2011/05/28/6452431.aspx
I2C驅動(4)http://blog.csdn.net/jarvis_xian/archive/2011/05/30/6455697.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章