I2C子系统之总结


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读写测试
I2C子系统之ioctl() 
I2C子系统之at24c02简介
I2C子系统之总结
I2C子系统之内核中I2C子系统的结构
I2C子系统之I2C bus初始化——I2C_init()
I2C子系统之platfor_device初始化——smdk2440_machine_init()
I2C子系统之platform_driver初始化——I2C_adap_s3c_init()
I2C子系统之I2C总线时钟频率设置
I2C子系统之adapter device和client device注册——I2C_add_number_adapter()
I2C子系统之__I2C_first_dynamic_bus_num变量的相关分析
I2C子系统之 adapter driver注册——I2C_dev_init()
I2C子系统之write()

相关内容