linux i2c通訊架構中的重要結構體

2021-10-07 09:07:13 字數 1338 閱讀 3268

linux中i2c子系統包含i2c核心層,i2c主機驅動層,i2c裝置驅動層

i2c核心主要是提供了主機驅動的註冊/登出方法,i2c通訊方法(alogrithm),以及上層的與具體介面卡硬體無關的**以及探測裝置,檢測裝置位址的上層**,**檔案目錄:kernel/drivers/i2c/i2c-core.c

i2c主機驅動層是i2c的主裝置程式,是i2c介面卡的實現**,介面卡是受cpu直接控制的,一般直接整合在cpu內部,因此這部分**是cpu晶元廠家去實現的。如果板子上的硬體i2c資源不夠用的時候,用gpio口去模擬i2c的介面卡**的話,這一部分**就需要用到兩個的gpio口資源去實現i2c的通訊波形,俗稱軟體i2c,一般用在微控制器這種硬體資源少的控制器中,傳輸速率相比硬體i2c較慢。

i2c裝置驅動層是指i2c的從裝置,是指掛接在i2c介面卡上的從裝置,通過i2c協議和cpu實現資料交換,這部分驅動是從裝置晶元廠家去實現的。

總結下來,在i2c子系統中,有六個非常重要的結構體,是我們在寫主機裝置和從裝置驅動的過程中需要重點關注的,下面對這六個結構體的意義和重要成員做如下注釋

/kernel/include/linux/i2c.h

struct i2c_adapter;//每個i2c控制器對應乙個i2c_adapter結構體的例項,注意algo指標,他將為i2c_adapter提供最重要的i2c訪問週期波形的實現函式,沒有他,i2c_adapter將沒有辦法正常工作

struct i2c_alogrithm;//這個結構體中的master_xfer函式是主控制器驅動的大部分工作,用來產生i2c波形,在i2c主控制器驅動中一定要實現

struct i2c_driver;//每個從裝置驅動都對應著乙個i2c_driver結構體的例項,為匯流排驅動匹配裝置驅動提供依據,承擔著從裝置驅動 的硬體初始化,資源釋放,開關機流程等重要流程的實現重任

struct i2c_client;//i2c_client例項用於描述乙個真實的物理裝置,這些資訊目前有兩種方法提供,第一是通過i2c_board_info結構體來填充,第二種方式是通過裝置樹來填充,當前大多數是傾向於後者來實現

struct i2c_timing;//這個結構體用來描述關於i2c通訊過程中兩根線波形的上公升沿和下降沿時間以及同步時鐘頻率的,因為硬體在上件上拉電阻的阻值大小不同,這些引數需要跟著調整。如果這些引數不對的話,將沒有辦法產生正常的波形,主從裝置將會通訊失敗

/kernel/include/uapi/linux/i2c.h

struct i2c_msg//在i2c通訊過程,資料都是以msg形式傳送給從裝置,每乙個msg對應著乙個i2c_msg的例項,表明msg傳送的方向,緩衝區以及緩衝區長度等,注意這個結構體是定義在了uapi下面的檔案中,也就是說使用者空間也是可以訪問這個結構體的例項的。

linux i2c 驅動分析

static struct platform driver s3c2410 i2c driver static struct platform driver s3c2440 i2c driver static int init i2c adap s3c init void return ret st...

linux i2c驅動總結

最近幾天一直在看i2c的驅動架構,看到目前的感覺是說明白吧又不是很透徹,說不明白吧又知道點,總之有點不明白。明白的 1 adapter驅動,i2c控制器驅動,如果要開發i2c控制器的,這部分是要實現的。這部分要填充struct i2c adapter 結構圖和struct alogrithm結構體....

linux i2c匯流排驅動

技術就是這樣,看一百遍不如做十遍。在對i2c做了乙個簡單的記錄之後發現比單看要理解更深刻,當然在記錄完i2c驅動之後,最希望自己能夠堅持自己實現at24c02的讀寫驅動與測試應用程式。由於是做記錄,少不了借用網路各種優秀資源,下圖是某部落格中找到的i2c框架。1 hardware層,cpu的i2c ...