I2C子系统之总结

来源:互联网 发布:windows安全配置 编辑:程序博客网 时间:2024/06/01 08:53

I2C子系统的结构是符合内核总的驱动模型。

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

1.i2c bus

2.adapter device

3.client device

4.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,而adapter在驱动注册的时候已经初始化了adapter的算法

i2c->adap.algo    = &s3c24xx_i2c_algorithm;

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

这个algo才是用于实现不同i2c adapter的发送数据功能的。


然后说下主机的发送

主机的发送是通过msg结构来实现的。

需要发送的数据保存在msg.buf中,其它如发送数据的长度

从机地址等信息则保存在msg.len msg.addr等中。

系统发送根据msg条数来发送信息,msg之间不会发送stop信号

之后当最后一则msg发送完毕才会发送一个stop信号。

而系统实现的write 和read这两个操作每次固定只能发送一个msg。

使得调用一次write read之后就会产生一个stop信号。

这对某些器件的某些操作来说是不合法的时序,比如说at24c02的random read操作

发送多则msg可以通过ioctl来实现,所以at24c02的random read只能通过

ioctl操作实现。









原创粉丝点击