首先說明下為什么寫這篇文章,網(wǎng)上有許多博客也是介紹I2C驅(qū)動在linux上移植的實(shí)現(xiàn),但是筆者認(rèn)為他們相當(dāng)一部分沒有分清所寫的驅(qū)動時(shí)的驅(qū)動模型,是基于device tree, 還是基于傳統(tǒng)的Platform模型,有些文章只是把代碼移植到平臺上調(diào)試測試下,并沒有理清內(nèi)部邏輯調(diào)用關(guān)系,所以覺得有必要把兩種驅(qū)動模型闡述剖析清楚,本文閱讀者必須以在單片機(jī)上調(diào)試過IIC總線為前提,能夠分析從芯片datasheet和其工作原理和總線的基本操作,雖然I2C硬件體系結(jié)構(gòu)比較簡單,但是I2C體系結(jié)構(gòu)在Linux中的實(shí)現(xiàn)卻相當(dāng)復(fù)雜,作為驅(qū)動工程師,編寫具體的I2C驅(qū)動時(shí),主要工作如下:
1)、提供I2C適配器的硬件驅(qū)動,探測,初始化I2C適配器(如申請I2C的I/O地址和中斷號),驅(qū)動CPU控制的I2C適配器從硬件上產(chǎn)生各種信號以及處理I2C中斷(I2C總線驅(qū)動);
2)、提供I2C控制的algorithm, 用具體適配器的xxx_xfer()函數(shù)填充i2c_algorithm的master_xfer指針,并把i2c_algorithm指針賦給i2c_adapter的algo指針(I2C總線驅(qū)動),用于產(chǎn)生I2C訪問從設(shè)備周期所需要的信號;
3)、實(shí)現(xiàn)I2C設(shè)備驅(qū)動中的i2c_driver接口,用具體yyy的yyy_probe(),yyy_remove(),yyy_suspend(),yyy_resume()函數(shù)指針和i2c_device_id設(shè)備ID表賦給i2c_driver的probe,remove,suspend,resume和id_table指針(I2C設(shè)備驅(qū)動);
4)、實(shí)現(xiàn)I2C設(shè)備所對應(yīng)類型的具體驅(qū)動,i2c_driver只是實(shí)現(xiàn)設(shè)備與總線的掛接(I2C設(shè)備驅(qū)動)。
Step1,必須理清platform_device和platform_driver之間的匹配方式