Linux基礎系列之 i2c架構簡析

2021-06-29 00:53:40 字數 3698 閱讀 5661

[i2c匯流排的訊號狀態]

1、  空閒狀態:sda和scl都是高電平;

2、  開始條件(s):scl為高電平時,sda由高電平向低電平跳變,開始傳輸資料;

3、  結束條件(p):scl為高電平時,sda由低電平向高電平跳變,結束傳輸資料;

4、  資料有效:在scl的高電平期間,sda保持穩定,資料有效。sda的改變只能發生在scl的低電平期間;

5、  ack訊號:資料傳輸的過程中,接收器件每接收乙個位元組資料要產生乙個ack訊號,向傳送器件發出特定的低電平脈衝,表示已經收到資料。

先看下原始碼目錄:drivers/i2c/

•  i2c-core.c

這個檔案實現了i2c核心的功能以及/proc/bus/i2c*介面。

•  i2c-dev.c

實 現了i2c介面卡裝置檔案的功能,每乙個i2c介面卡都被分配乙個裝置。通過介面卡訪問裝置時的主裝置號都為89,次裝置號為0~255。應用程式通過 「i2c-%d」 (i2c-0, i2c-1, ..., i2c-10, ...)檔名並使用檔案操作介面open()、write()、read()、ioctl()和close()等來訪問這個裝置。

i2c-dev.c並沒有針對特定的裝置而設計,只是提供了通用的read()、write()和ioctl()等介面,應用層可以借用這些介面訪問掛接在介面卡上的i2c裝置的儲存空間或暫存器並控制i2c裝置的工作方式。

•  chips資料夾

這個目錄中包含了一些特定的i2c裝置驅動,如dallas公司的ds1337實時鐘晶元、epson公司的rtc8564實時鐘晶元和i2c介面的eeprom驅動等。

•  busses資料夾

這個檔案中包含了一些i2c匯流排的驅動,如s3c2410的i2c控制器驅動為i2c-s3c2410.c。

•  algos資料夾

實現了一些i2c匯流排介面卡的algorithm演算法;

**中涉及到4個結構體:2c_driver、i2c_client、i2c_adapter和i2c_algorithm

•  i2c_adapter與i2c_algorithm

i2c_adapter 對應於物理上的乙個介面卡,而i2c_algorithm對應一套通訊方法。乙個i2c介面卡需要i2c_algorithm中提供的通訊函式來控制適配 器上產生特定的訪問週期。缺少i2c_algorithm的i2c_adapter什麼也做不了,因此i2c_adapter中包含其使用的 i2c_algorithm的指標。

i2c_algorithm中的關鍵函式master_xfer()用於產生i2c訪問週期需要的訊號,以i2c_msg(即i2c訊息)為單位。i2c_msg結構體也非常關鍵。

**清單 i2c_msg結構體

1 struct i2c_msg ;

•  i2c_driver與i2c_client

i2c_driver對應一套驅動方法,是純粹的用於輔助作用的資料結構,它不對應於任何的物理實體。i2c_client對應於真實的物理裝置,每個i2c裝置都需要乙個i2c_client來描述。i2c_client一般被包含在i2c字元裝置的私有資訊結構體中。

i2c_driver 與i2c_client發生關聯的時刻在i2c_driver的attach_adapter()函式被執行時。attach_adapter()會探測 物理裝置,當確定乙個client存在時,把該client使用的i2c_client資料結構的adapter指標指向對應的i2c_adapter, driver指標指向該i2c_driver,並會呼叫i2c_adapter的client_register()函式。相反的過程發生在 i2c_driver 的detach_client()函式被呼叫的時候。

•  i2c_adpater與i2c_client

i2c_adpater 與i2c_client的關係與i2c硬體體系中介面卡和裝置的關係一致,即i2c_client依附於i2c_adpater。由於乙個介面卡上可以連 接多個i2c裝置,所以乙個i2c_adpater也可以被多個i2c_client依附,i2c_adpater中包括依附於它的i2c_client 的鍊錶;

struct i2c_client ;
driver/i2c/i2c-core.c:

static int __init i2c_init(void)

static struct i2c_driver dummy_driver = ;

i2c_add_driver() --> i2c_register_driver --> driver_register -> bus_add_driver() --> driver_attach --> bus_for_each_dev --> while遍歷device列表 執行__driver_attach()

__driver_attach執行;

呼叫匯流排上match函式判斷裝置和驅動是否匹配

,若匹配則返真,找到對應的裝置,繼續執行後面的程式,若沒有找到,則返回假,函式執行結束。

driver端:

裝置驅動init 函式裡面i2c_add_driver > i2c_register_driver註冊驅動並去匹配相應的裝置並呼叫驅動註冊的probe函式;

i2c_check_functionality:檢視adapte的2c_algorithm支援型別,對應定義在/i2c/busses/i2c-xx.c裡面;對應的傳輸函式也在i2c_algorithm結構體裡面;

static const struct i2c_algorithm ***_i2c_algo = ;
i2c/busses/i2c-xx.c:

註冊在platform上的乙個虛擬裝置,並通過probe函式初始化乙個i2c_adapter,通過函式i2c_add_numbered_adapter註冊這個adapeter,這樣介面卡的algorithm也就對應好了;

i2c_add_numbered_adapter -> i2c_register_adapter

master_xfer函式實現模板:

static int i2c_adapter_***_xfer(structi2c_adapter *adap, struct i2c_msg *msgs, int num)  

else

} i2c_adapter_***_stop(); /*產生停止位*/

}

框架圖:

總結:

執行順序:

(1)    i2c-core.c 完成i2c bus的註冊;

(2)    bus/i2c-***.c 通過probe函式註冊adapter,並新增相應的algorithm;

(3)    register adapter device的同時會新增boardinfo i2c裝置device type為i2c_client_type;

(4)    i2c-dev.c:新增adapter 字元裝置,建立裝置檔案提供上層相應的操作介面;

(5)    相應i2c驅動,通過add_i2c_driver,匹配bus上相應裝置,走入相應的probe;

I2C匯流排架構 之 裝置驅動

i2c裝置驅動是i2c框架中最接近應用層的,其上接應用層,下接i2c核心。也是驅動開發人員需要實現的 在此驅動中我們只需負責以下步驟 以ap3216c為例 a.新增硬體資訊 裝置樹 b.搭建驅動框架 c.構建i2c driver,並註冊到linux d.註冊字元裝置 e.向應用層提供i2c裝置操作介...

linux裝置驅動之I2C

裝置結構體i2c client中addr的低8位表示裝置位址。裝置位址由讀寫位 器件型別和自定義位址組成,第7位是r w位,0表示寫,1表示讀,所以i2c裝置通常有兩個位址,即讀位址和寫位址型別器件由中間4位組成,這是由半導體公司生產的時候就已經固化了。自定義型別由低3位組成。由使用者自己設定,通常...

linux裝置驅動之I2C

裝置結構體i2c client中addr的低8位表示裝置位址。裝置位址由讀寫位 器件型別和自定義位址組成,第7位是r w位,0表示寫,1表示讀,所以i2c裝置通常有兩個位址,即讀位址和寫位址型別器件由中間4位組成,這是由半導體公司生產的時候就已經固化了。自定義型別由低3位組成。由使用者自己設定,通常...