LINUX I2C ADAPTER實現分析(I2C部分分析之三)

前兩篇我們分析了I2C總體框架、I2C總線,本節主要分析下I2C ADAPTER部分,其實也就是

I2C控制器部分。在I2C模塊中,有兩個設備類型:i2c adapter、i2c client,其中i2c client可以理解為設備驅動模型中的設備,與註冊到總線上的i2c驅動綁定,而i2c adapter也屬於註冊到i2c總線上的設備,但其不需要與i2c驅動綁定。其主要為i2c驅動提供訪問i2c設備的方法,同時一個i2c設備需要依附於i2c adapter(在設備模型中,i2c adapter是依附於其上的i2c client的父device)。

本章我們主要說明i2c adapter的註冊、註銷、i2c adapter提供的方法等。I2c adapter相關的

結構體之前已經介紹,此處不再贅述。

I2c adapter的方法(或i2c adapter的算法)

I2c adapter的方法用於設置該adapter的傳輸方法、支持的傳輸模式選擇等,對應的結構體為i2c_algorithm,該結構體的定義如下,主要內容如下:

  1. 若該adapter支持i2c傳輸方式,則該adapter需要實現master_xfer接口,用以支持通過i2c時序傳輸數據(讀寫),
  2. 若該adapter支持smbus傳輸方式,則該adapter需要實現smbus_xfer接口,用以支持通過smbus時序傳輸數據,若不支持smbus傳輸方式,則通過master_xfer模擬smbus時序實現數據通信。
  3. functionality接口主要用於返回該adapter支持的方法,如支持I2C_FUNC_I2C、I2C_FUNC_10BIT_ADDR、I2C_FUNC_SMBUS_EMUL等,當調用某一個adapter的通信方法前,需先調用該functionality接口,獲取該adapter支持的通信方式等。

如下為i2c imx adapter的方法定義,該i2c adpater支持i2c的通信方法,且支持smbus時序的通信方式,但是使用i2c的通信方法模擬smbus時序通信。

LINUX I2C ADAPTER實現分析(I2C部分分析之三)

i2c_adapter註冊

I2c adapter的註冊主要實現的功能也比較明晰,主要實現如下幾個方面的內容:

  1. 首先判斷i2c adapter的各成員是否設置合理(如是否設置成員變量)
  2. 設置i2c_adapter的device類型的成員變量dev,設置dev的type為i2c_adapter_type,此處設置i2c_adapter_type的目的用於與i2c client進行區分,因i2c client、i2c adaper均需要註冊到i2c_bus上,而在i2c_bus模塊僅i2c_client、i2c_driver才能進行綁定操作,此處設置dev的type就是防止將i2c adapter與i2c_driver進行匹配。(i2c_adapter_type中定義了一個adpater所支持的默認屬性(對應於sysfs下對應adapter目錄下的屬性文件)以及定義的release方法。
  3. 設置的i2c_adapter所屬的bus為i2c_bus;
  4. 針對每一個註冊到i2c總線上的驅動,在該adapter上進行i2c設備的探測,並對探測到的i2c設備進行綁定操作。這也屬於i2c client的一種註冊方式:針對spd(存儲內存模型相關信息的eeprom設備)、hwmon等類的設備,可以在內核初始化時進行i2c設備的註冊操作,而在i2c

adapter註冊或者相應i2c driver註冊時,通過i2c driver的detect函數指針以及i2c driver支持的i2c地址列表信息,自動完成i2c client的探測,並將探測到的i2c client註冊到i2c總線上。

但針對這一種i2c設備的註冊方式有幾個前提條件(僅在滿足如下兩個條件的情況下,才能夠支持此類i2c設備的註冊):

  • driver需要支持detect函數;
  • I2c adapter與i2c driver均需要標註其支持自動探測i2c設備的類,且它們支持的類型存在交集時方可支持探測(如均標註支持hwmon、spd的探測等)

i2c_adapter的流程圖如下所示

LINUX I2C ADAPTER實現分析(I2C部分分析之三)

i2c_verify_adapter

該接口用於判斷註冊到i2c總線上的一個設備是否為adapter設備,主要是判斷該adpater對應device類型的成員變量dev的type成員是否為i2c_adapter_type。

LINUX I2C ADAPTER實現分析(I2C部分分析之三)

i2c_del_adapter

該接口用於從i2c總線上刪除一個adpater,該接口實現的功能大致如下:

  1. 遍歷註冊到i2c總線上的所有驅動,針對驅動上已綁定的所有i2c client,完成i2c client的註銷操作(包括調用設備驅動模型中的device_unregister進行註銷等);
  2. 針對所有通過應用層sysfs中的接口創建的client設備,也完成i2c client的註銷操作
  3. 調用device_unregister操作,完成該adapter的註銷操作。針對i2c部分的註銷操作,並將所有依附至該adapter上的i2c client,均進行註銷操作。

以上便是i2c adpater相關的註冊與註銷部分的介紹。下一篇分析i2c client、i2c driver的註銷。


分享到:


相關文章: