mini2440-i2c驅動分析

在s3c2440的i2c驅動框架中, 分2個部分的內容, 一部分是i2c-adapter初始化, 一部分是i2c-driver的初始化. 針對s3c2440自帶的eeprom, 走讀一下代碼, 看看哪些東西值的我們學習和借鑑.

s3c2440上有若干個i2c-adapter, 每一個對應一條i2c總線, 每個總線上可以掛多個i2c 設備, 讀寫這些設備的方式是操作i2c-adapter的寄存器.掛在同一個i2c-adapter下的i2c設備通過同一個 adapter的發送算法對數據進行操作.

換言之: 一個adapter對應一條總線, 對應一組算法, 操作這條總線下的設備.

那麼很容易理解, 要操作i2c設備, adapter的初始化至關重要. 而adapter是用平臺設備註冊到系統

  1. adapter的平臺設備 mach-mini2440.c

    對於熟悉平臺設備的人說, 這段代碼非常簡單, 定義一個平臺設備, 定義了i2c-adapter物理內存地址和中斷線, 需要注意是,並把它註冊到平臺設備鏈表上.

    這些是資源, 但是i2c還需要有一個屬性信息需要定義, 

    下面這個結構體, 定義了i2c-adapter使用的總線號, 從地址(如果做從需要使用), 工作頻率, 延時信息,

    這些信息註冊爲平臺設備的平臺數據, 以便驅動程序使用.

  2. adapter的平臺驅動  i2c-s3c2440.c

通過平臺總線的match過程, 調用probe函數

s3c24xx_i2c_probe中, 主要完成以下幾個工作:

  • 首先定義了一個s3c24xx_i2c, 此結構體用於描述一個adapter, 其中初始化此adapter的數據傳輸算法

  • 獲取i2c系統時鐘, 並使能

  • ioremap映射物理地址, 及申請中斷

  • 設置adapter的設備關係(父設備是平臺設備), 及初始化(gpio設置,  根據平臺設備的平臺數據設置CON頻率, 設置S3C2410_IICADD地址寄存器)

  •  設置總線, 並掃描總線上的i2c設備, 生成i2c client設備描述結構體, 並把i2c client註冊稱爲adapter的子設備

  •  設備平臺設備的私有數據爲

從整個過程看, 就是註冊adapter, 並初始化的過程. 比較特殊的是, 當adapter初始化完成後, 還需要掃描所屬這個總線的i2c設備, 並註冊成爲自己的子設備. i2c設備註冊, 同樣是通用的設備模型, 那麼在同樣存在match和probe的過程.

通過上述這樣的操作, 系統就使能了某個adapter, 以及使能了內置在__i2c_board_list下, 並且屬於這條總線的i2c設備

 

數據傳輸過程(發送和接收):

內核定義了一個函數:

只要i2c client和i2c driver可以匹配成功, 那麼adapter默認就在i2c-client中, i2c驅動中,只需要構造msgs指定msgs的num就可以完成數據發送

最後奉獻一張自己畫的圖, 一張圖抵過千言萬語:

理解了這些, 那麼就可以從頭開始暴力寫一個自己的驅動框架了:
1)定義一個struct i2c_adapter, 初始化,調用i2c_register_adapter加入到i2c bus
2) 定義i2c_devinfo用於描述一個i2c cient, 調用i2c_new_device創建i2c client
3) 寫一個i2c driver, 註冊到i2c 總線

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章