I2C子系统之总结

2014-11-24 10:58:32 来源: 作者: 浏览: 0

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操作实现。


相关阅读:


-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: