Linux I2C核心、匯流排與裝置驅動
阿新 • • 發佈:2018-12-16
I2C匯流排僅僅使用SCL、 SDA這兩根訊號線就實現了裝置之間的資料互動,極大地簡化了對硬體資源和PCB板佈線空間的佔用。因此, I2C匯流排非常廣泛地應用在EEPROM、實時鐘、小型LCD等裝置與CPU的介面中
Linux的I2C體系結構分為3個組成部分。(1) I2C核心
I2C核心提供了I2C匯流排驅動和裝置驅動的註冊、登出方法, I2C通訊方法(即Algorithm)上層的與具體介面卡無關的程式碼以及探測裝置、檢測裝置地址的上層程式碼等,如圖15.1所示。(2) I2C匯流排驅動
I2C匯流排驅動是對I2C硬體體系結構中介面卡端的實現,介面卡可由CPU控制,甚至可以直接整合在CPU內部。I2C匯流排驅動主要包含I2C介面卡資料結構i2c_adapter 、 I2C介面卡的Algorithm資料結構i2c_algorithm和控制I2C介面卡產生通訊訊號的函式。
經由I2C匯流排驅動的程式碼,我們可以控制I2C介面卡以主控方式產生開始位、停止位、讀寫週期,以及以從裝置方式被讀寫、產生ACK等。(3) I2C裝置驅動
I2C裝置驅動(也稱為客戶驅動)是對I2C硬體體系結構中裝置端的實現,裝置一般掛接在受CPU控制的I2C介面卡上,通過I2C介面卡與CPU交換資料。I2C裝置驅動主要包含資料結構i2c_driver和i2c_client,我們需要根據具體裝置實現其中的成員函式。
I2C體系結構在Linux中的實現複雜。
當工程師拿到實際的電路板時,面對複雜的Linux I2C子系統,應該如何下手寫驅動呢?究竟有哪些是需要親自做的,哪些是核心已經提供 的呢?理清這個問題非常有意義,可以使我們在面對具體問題時迅速抓住重點。
- 介面卡驅動可能是Linux核心本身還不包含的;
- 掛接在介面卡上的具體裝置驅動可能也是Linux核心還不包含的
因此,工程師要實現的主要工作如下。
- 提供
- I2C介面卡的硬體驅動,
- 探測、初始化I2C介面卡(如申請I2C的I/O地址和中斷號)、
- 驅動CPU控制的I2C介面卡從硬體上產生各種訊號以及處理I2C中斷等。
- 提供
- I2C介面卡的Algorithm,用具體介面卡的xxx_xfer()函式填充i2c_algorithm的master_xfer指標,並把i2c_algorithm指標賦值給i2c_adapter的algo指標。