I2C子系统之总结
2012-08-14 23:15
204 查看
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的算法
在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操作实现。
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操作实现。
相关文章推荐
- i2c子系统学习总结
- 协议[I2C]_I2C子系统之总结
- Linux下i2c驱动调试总结
- Linux内核I2C子系统驱动(三)
- Linux内核中SPI/I2c子系统剖析
- input子系统一 i2c设备
- 协议[I2C]_I2C子系统之platfor_device初始化——smdk2440_machine_init()
- Linux驱动子系统之I2C(4)
- 子系统拆分的一点总结
- beaglebone增加PCF8563时钟芯片 i2c驱动子系统分析
- tcc893x基于Linux内核的I2C总结(I2C基础、I2C适配器驱动分析)
- linux驱动子系统--I2C
- linux内核的I2C子系统详解1——I2C总线概览、驱动框架概览
- Linux驱动子系统之I2C
- Linux驱动子系统之I2C(2)
- linux内核I2C驱动子系统分析(一)
- Linux驱动子系统之I2C(4)
- Linux驱动开发、18-I2C子系统之用户态驱动设计
- i2c知识总结及协议解析
- linux设备模型之i2c子系统