I2C驅動體系結構三:理解I2C Adapter的拓撲意義

一、理解I2C Adapter的總線意義

前面說到,針對i2c adapter,我們在設備模型驅動中的數據結構是struct i2c_adapter,沒有與之對應的struct device_driver;這個原因先不說,我先談談對i2c adapter的物理意義上在系統上的拓撲結構的理解。

1、i2c adapter與i2c bus

前面我們說了,我們把I2C Controller理解爲I2C Adapter與I2C Bus,實際上I2C Adapter這個概念比較具有實際的物理意義,I2C Bus這個“總線”概念是比較抽象的(雖然比較抽象,但是還是具有物理意義的);我們認爲與“總線”有個對應的i2c_bus_type,其實更是隻是軟件意義上的“總線”,與我們實際物理意義上的“總線”還是有不一致的地方,比如,針對I2C Controller而言,如果一個硬件系統有多個I2C Controller,我們會認爲應該具備多個“I2C 總線”;對應多個軟件系統上的struct bus_type實例;實際上對於軟件系統,始終只有一個struct bus_type i2c_bus_type的實例。所以,我們不能理所當然地認爲struct bus_type i2c_bus_type就是物理意義上的i2c bus;我的理解是struct bus_type這個數據結構就是單純的軟件概念,是模型設備模型的概念,不要與物理意義的“總線”綁定起來理解。

軟件上的struct bus_type結構更像是借用了物理意義上的“總線”概念,而並非對應着具體的物理總線意義;它有2種角色:

A:作爲同一軟件子系統中struct device和struct device_driver數據結構的“容器”,以鏈表的形式保存該子系統的struct device 和 struct device_driver

B:作爲設備模型驅動架構核心流程的載體,struct device和struct device_driver匹配關係的“仲裁者”;如果你熟悉代理模式,從某種意義上說,它具備代理者的角色;struct bus_type中的回調函數成員變量承載了這種機制。

簡單來說,儘量拋棄struct bus_type與物理實際意義的bus之間具備一一對應關係的這種認知;很大程度上,這種認知會導致對設備模型驅動架構認知上的偏差。

前面兩章,我重點向大家強調了struct bus_type與物理總線的對應關係,在這裏,反而要大家拋棄這種認知。這是因爲前面兩章我希望大家能夠從軟件架構上理解i2c硬件系統;希望這種“強迫對應”的關係能給大家樹立一個整體系統的理解,讓你不至於割裂地理解系統的軟件和硬件。並且更多地是從硬件的視角看待軟件,從硬件的視角看待整個軟硬件系統。在此時,我們可以糾正前面具備誤導的理解,雖然看起來前面的描述看起來似乎很嚴謹,很整齊,並且具有自以爲是的美感。

簡單來說,struct bus_type是設備驅動模型中針對某種子系統的"struct device"和"struct device_driver"的"總線";而不是物理設備對應的物理總線。

那麼,對於i2c硬件子系統而言,硬件"總線"的概念在軟件哪裏體現呢?實際上,我們再次理解一下"總線",從軟件理解上看,子系統的"總線"是理解爲一個"對象"呢還是理解爲一種"關係"呢?在i2c軟件子系統中,實際將"總線"理解重點理解爲"關係",這個關係是指:i2c從設備需要"知道"是哪個i2c控制器對它進行操作(不是i2c控制器對哪些i2c從設備進行控制);所以,這種關係是在"struct i2c_client::adpater"成員變量中體現的。

另外,struct i2c_adapter::userspace_clients成員雖然體現了i2c_adapter掛載了哪些i2c_client,但是實際上從代碼上可知,實際不代表特別重要的物理意義,主要是用於在刪除系統i2c_adapter時,能夠同時刪除與之關聯的i2c_client.

 

(圖一)

二、理解i2c slave的在系統中的拓撲意義

1、物理意義

1-1、i2c slave表示系統中,下掛在i2c controller的子設備,是實際的功能設備,比如i2c接口的溫度感應器等;

1-2、i2c slave一定對應一個i2c controller,一個i2c controller可以下掛多個i2c slave設備;

2、軟件意義

2-1、i2c slave對應的軟件結構就是struct i2c_client;

2-2、一個i2c_client需要“知道”其對應的i2c_adapter,struct i2c_client::adapter就是表達該意義,對於i2c_client的i2c協議控制就是通過該變量進行操作,從i2c協議控制流程上講,可以認爲i2c_client是具有i2c_adapter的代理者的味道;

2-3、從軟件資源管理的角度看,struct i2c_adapter需要"知道"其下掛的i2c_client,struct i2c_adapter::userspace_client是表達該意義,當軟件進行i2c_adapter卸載操作時,需要將其下掛的i2c_client卸載,該變量就承擔記錄i2c_client的責任。

以上意義可以用 圖一 表達。

 

 

 

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