i2c驱动现在一般用子系统的框架来做,如果用直接写寄存器的方式写代码会比较简单,但这些寄存器对于不同的厂家的arm芯片,有不同的定义,这就降低了驱动的可移植性,而另一方面用子系统的方式则提高了i2c驱动的可移植性
2 linux下I2C驱动程序的分析
2.1 Linux 系统下的I2C 驱动程序从逻辑上可以分为3 个部分:
1. I2C 总线的驱动 I2C core :实现对I2C 总线、I2C adapter 及I2C driver 的管理。
2. I2C 控制器的驱动 I2C adapter :针对不同类型的I2C 控制器,实现对I2C 总线访问的具体方法。
3. I2C 设备的驱动 I2C driver :针对特定的I2C 设备,实现具体的功能,包括read, write 以及ioctl 等对用户层操作的接口。
2.2 I2C 总线驱动 I2C core
I2C core 是Linux 内核用来维护和管理的I2C 的核心部分,其中维护了两个静态的List,分别记录系统中的I2C driver 结构和I2C adapter 结构。I2C core 提供接口函数,允许一个I2C adatper,I2C driver 和I2Cclient 初始化时在I2C core 中进行注册,以及退出时进行注销。同时还提供了I2C 总线读写访问的一般接口(具体的实现在与I2C 控制器相关的I2C adapter 中实现),主要应用在I2C 设备驱动中。
2.3 I2C 控制器的驱动 I2C adapter
I2C adapter 是针对不同类型I2C 控制器硬件,实现比较底层的对I2C 总线访问的具体方法。I2C adapter 构造一个对I2C core 层接口的数据结构,并通过接口函数向I2C core 注册一个控制器。
I2C adapter 主要实现对I2C 总线访问的算法,iic_xfer() 函数就是I2C adapter 底层对I2C 总线读写方法的实现。同时I2C adpter 中还实现了对I2C 控制器中断的处理函数。
2.4 I2C 设备的驱动 I2C driver
I2C driver 中提供了一个通用的I2C 设备的驱动程序,实现了字符类型设备的访问接口,对设备的具体访问是通过I2C adapter 来实现的。I2C driver 构造一个对I2C core 层接口的数据结构,通过接口函数向 I2C Core注册一个I2C 设备驱动。同时I2C driver 构造一个对用户层接口的数据结构,并通过接口函数向内核注册为一个主设备号为89 的字符类型设备。
I2C driver 实现用户层对I2C 设备的访问,包括open,read,write,ioctl,release 等常规文件操作,我们可以通过open 函数打开 I2C 的设备文件,通过ioctl 函数设定要访问从设备的地址,然后就可以通过 read和write 函数完成对I2C 设备的读写操作。
通过 I2C driver 提供的通用方法可以访问任何一个I2C 的设备,但是其中实现的read,write及ioctl 等功能完全是基于一般设备的实现,所有的操作数据都是基于字节流,没有明确的格式和意义。为了更方便和有效地使用I2C 设备,我们可以为一个具体的I2C 设备开发特定的I2C 设备驱动程序,在驱动中完成对特定的数据格式的解释以及实现一些专用的功能。
3 I2C 设备驱动程序的一般结构
一个具体的 I2C 设备驱动需要实现两个方面的接口,一个是对I2C core 层的接口,用以挂接I2C adapter 层
来实现对I2C 总线及I2C 设备具体的访问方法,包括要实现attach_adapter,detach_client,command
等接口函数。另一个是对用户应用层的接口,提供用户程序访问I2C 设备的接口,包括实现open,release,read,write 以及最重要的ioctl 等标准文件操作的接口函数。
对 I2C core 层的接口函数的具体功能解释如下:
attach_adapter:I2C driver 在调用I2C_add_driver() 注册时,对发现的每一个I2C adapter(对应一条I2C 总线)都要调用该函数,检查该I2C adapter 是否符合I2C driver 的特定条件,如果符合条件则连接此I2C adapter,并通过I2C adapter 来实现对I2C 总线及I2C 设备的访问。
detach_client:I2C driver 在删除一个I2C device 时调用该函数,清除描述这个I2C device 的数据结构,这样以后就不能访问该设备了。command:针对设备的特点,实现一系列的子功能,是用户接口中的ioctl 功能的底层实现。
阅读(1423) | 评论(0) | 转发(1) |