本文檔爲做者在學習I2C總線驅動過程當中的總結。提供一些對SylixOS I2C驅動框架的理解經驗。適用於學習I2C總線驅動或I2C設備驅動的技術工程師。數據結構
SylixOS I2C驅動框架主要由3部分組成,即I2C總線驅動、I2C核心層和I2C設備驅動。I2C核心層是I2C驅動和I2C設備驅動的中間樞紐,它以通用的、與平臺無關的接口實現了I2C驅動中設備與適配器的溝通(已經存在,包含lw_i2c_adapter,lw_i2c_device,lw_i2c_funcs結構體)。I2C總線驅動填充lw_i2c_adapter和lw_i2c_funcs結構體;I2C設備驅動填充lw_i2c_device結構體。框架
如圖 21所示:函數
圖 21 I2C驅動框架學習
I2C核心提供了I2C總線驅動和設備驅動的註冊、註銷方法,I2C通訊方法funcs上層的、與具體適配器無關的代碼以及探測設備、檢測設備地址的上層代碼等。spa
編寫I2C設備或者I2C驅動須要用到的結構體,都已在覈心層定義。核心層還提供了三種類型API接口(API_I2cAdapterCreate,API_I2cDeviceCreate,API_I2cDeviceTransfer等等)用於建立I2C適配器,建立I2C設備,調用I2C相應適配器下的總線傳輸函數。接口
I2C總線驅動是I2C適配器的軟件實現,提供I2C適配器與從設備間完成數據通訊的能力。 I2C總線驅動由i2c_adapter和i2c_funcs來描述。文檔
包含初始化I2C總線,操做函數集(總線傳輸Transfer函數,總線控制MasterCtl函數)。源碼
I2C設備驅動是對I2C從設備的軟件實現,一個具體的I2C設備驅動包括兩個部分:一部分是i2c_device,用於將設備掛接於i2c總線;另外一部分是設備自己的驅動i2c_driver。 I2C設備驅動程序由i2c_device和i2c_driver來描述。ast
包含初始化I2C設備,操做函數集(例如:RTC設置時間SetTime函數,RTC獲取時間GetTime函數)。模板
I2C核心層代碼位於SylixOS/system/device/i2c目錄下,如圖 22所示:
圖 22 I2C核心層代碼目錄
i2cBus.h I2C總線模型,包含總線傳輸控制消息塊結構體,I2C總線適配器結構體,I2C總線傳輸函數集結構體。
i2cDev.h I2C總線掛載的設備結構,包含I2C設備類型結構體,I2C適配器基本操做聲明,I2C 設備基本操做聲明,I2C 設備傳輸控制操做聲明。
i2cLib.c I2C設備操做庫,定義i2cDev.h中聲明的函數。
I2C總線層與I2C設備層代碼通常之內核模塊方式動態加載進內核,能夠在driver_module/i2c_drv目錄下查看。
Lw_i2c_adapter結構體表明I2C總線控制器,如圖 23所示:
圖 23 I2C總線適配器
Lw_i2c_funcs對應一套通訊方法,如圖 24所示:
圖 24 I2C總線傳輸函數集
I2CFUNC_pfuncMasterXfer函數實現總線上數據傳輸,與具體的適配器有關。
I2CFUNC_pfuncMasterXfer函數實現模板,如圖 25所示:
圖 25 I2C傳輸函數實現模板
上面調用的函數用於完成適配器的底層硬件操做,與I2C適配器和CPU的具體硬件直接相關,須要由工程師根據芯片的數據手冊來實現。在內核源碼中,針對不一樣的I2C適配器都有I2CFUNC_pfuncMasterXfer的實現,風格與模板不盡相同,可是能夠用該模板做爲參考來看源代碼,受益不淺。
Lw_i2c_device表明I2C從設備,如圖 26所示:
圖 26 I2C設備類型
增長/刪除I2C適配器,如圖 27所示:
圖 27 I2C適配器基本操做
增長/刪除I2C設備,如圖 28所示:
圖 28 I2C設備基本操做
I2C傳輸,發送和接收,如圖 29所示:
圖 29 I2C設備傳輸控制操做
最終會調用到適配器實現的I2CFUNC_pfuncMasterXfer函數來完成數據傳輸工做。