歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> I2C子系統之總結

I2C子系統之總結

日期:2017/3/1 10:12:45   编辑:Linux編程

I2C子系統的結構是符合內核總的驅動模型。

I2C 子系統主要包含4大部件

1.i2c bus2.adapter device3.client device4.adapter driver

其中i2c bus是用於管理的,並非是通信總線。i2c bus上掛著adapter(主機) device、client(從機) device、adapter driver。

為了統一操作,adapter device、client device、adapter driver並非直接通過注冊函數注冊到i2c bus上的。而是通過platform來實現

首先將包含adapter相關信息的platform_device注冊到platform bus上。

然後再將platform_device對應的platform_driver注冊到platform上。

此時,platform_device和platform_driver將會匹配成功,然後會調用platform_driver中的probe函數。

最後在probe函數中實現向i2c bus注冊adapter device的操作。

而adapter driver想i2c bus的注冊操作則在i2c字符驅動注冊中實現。

系統把i2c設備統一作為字符設備來處理,並且通過通用的fops來操作。

adapter driver驅動注冊後在/dev下就創建好了adapter對應的設備文件。

而所有的adapter通過系統調用後調用到的都是同樣的字符設備操作集fops中的方法。

那不同的adapter使用的操作方法肯定不同,這個怎麼實現呢?實現方法具體如下。

首先通過系統調用open()調用到通用fops中的open()方法i2cdev_open()。

在i2cdev_open()中根據open(“/dev/i2c-x”,)的第一個參數可以找到adapter的設備號。

找到這個設備號就可以找到具體的adapter,eradapter在驅動注冊的時候已經初始化了adapter的算法

i2c->adap.algo = &s3c24xx_i2c_algorithm;

在platform_driver的probe方法中初始化好了。

這個algo才是用於實現不同i2c adapter的發送數據功能的。

然後說下主機的發送

主機的發送是通過msg結構來實現的。

需要發送的數據保存在msg.buf中,其它如發送數據的長度

從機地址等信息則保存在msg.len msg.addr等中。

系統發送根據msg條數來發送信息,msg之間不會發送stop信號

之後當最後一則msg發送完畢才會發送一個msg信號。

而系統實現的write 和read這兩個操作每次固定只能發送一個msg。

使得調用一次write read之後就會產生一個stop信號。

這對某些器件的某些操作來說是不合法的時序,比如說at24c02的random read操作

發送多則msg可以通過ioctl來實現,所以at24c02的random read只能通過

ioctl操作實現。

相關閱讀:

I2C子系統之at24c02讀寫測試 http://www.linuxidc.com/Linux/2012-08/68256.htm
I2C子系統之ioctl() http://www.linuxidc.com/Linux/2012-08/68257.htm
I2C子系統之at24c02簡介 http://www.linuxidc.com/Linux/2012-08/68258.htm
I2C子系統之總結 http://www.linuxidc.com/Linux/2012-08/68259.htm
I2C子系統之內核中I2C子系統的結構 http://www.linuxidc.com/Linux/2012-08/68260.htm
I2C子系統之I2C bus初始化——I2C_init() http://www.linuxidc.com/Linux/2012-08/68261.htm
I2C子系統之platfor_device初始化——smdk2440_machine_init() http://www.linuxidc.com/Linux/2012-08/68262.htm
I2C子系統之platform_driver初始化——I2C_adap_s3c_init() http://www.linuxidc.com/Linux/2012-08/68263.htm
I2C子系統之I2C總線時鐘頻率設置 http://www.linuxidc.com/Linux/2012-08/68264.htm
I2C子系統之adapter device和client device注冊——I2C_add_number_adapter() http://www.linuxidc.com/Linux/2012-08/68265.htm
I2C子系統之__I2C_first_dynamic_bus_num變量的相關分析 http://www.linuxidc.com/Linux/2012-08/68266.htm
I2C子系統之 adapter driver注冊——I2C_dev_init() http://www.linuxidc.com/Linux/2012-08/68267.htm
I2C子系統之write() http://www.linuxidc.com/Linux/2012-08/68268.htm

Copyright © Linux教程網 All Rights Reserved