Linux I2C子系统分析-I2C设备驱动

接下来以一个实际的例子来看I2C设备驱动,就以drivers/i2c/i2c-dev.c为例。

先看它的初始化和注销函数

首先调用register_chrdev注册了一个字符设备,这是老的字符驱动注册方式。然后到了接下来的主角,i2c_add_driver,在I2C子系统中,I2C设备驱动就是采用这个函数注册,注销一个I2C设备驱动使用下面的i2c_del_driver函数,那就具体看看这个I2C设备驱动注册函数。

再来看看i2c设备驱动注销函数

也没什么,最后调用的就是驱动的注销函数driver_unregister函数。

来看传递给注册和注销i2c驱动函数的参数什么,i2cdev_driver它是structi2c_driver结构类型,i2c设备驱动就是使用这个结构类型描述,这个结构类型定义在include/linux/i2c.h

来看i2c-dev.c中是怎么定义的

这是老的方式,所以它只是给attach_adapterdetach_adapter赋了值,由于这里是老的方式,所以我们也就不去具体看这个函数了,我们直接去看它的数据传输部分吧。

这是i2c设备读函数,我们看它是调用的i2c_master_recv函数去操作的,去看这个函数

i2c设备写函数

这两个函数最终都是调用的i2c_transfer函数去完成数据的传输,只是他们的msgflags不一样,读操作的flags要加上I2C_M_RD这个标志。

再看它们两个共同的i2c_transfer函数

我们看就是调用总线的master_xfer方法,我们在前面分析使用gpio模拟i2c总线时,看过这样一句 .master_xfer =bit_xfer, ,所以最终调用的是这个函数来完成数据传输。使用i2c_master_recvi2c_master_send函数一次只能传输一个msg,由于它一次只能传输一个msg,所以它的传输方向不能改变,也就是一次只能完成读或写操作,并且读操作时还不能传递设备的基地址,所以通常是不会用这两个函数的,直接的做法时,构造两个msg,一个msg的数据为操作设备基地址,另外一个msg才是我们真正要读写的数据,最后调用i2c_transfer函数去完成数据的传送。











posted @ 2012-01-19 16:03  移动应用开发  阅读(374)  评论(0编辑  收藏  举报