Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 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读写测试 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