您的位置:首页 > 运维架构 > 网站架构

linux的I2C驱动架构分析记录

2011-08-05 10:42 316 查看
Lianyiquan

2011-7-25

I2C驱动框架:总线驱动和设备驱动

总线驱动的两个数据结构:i2c_adapter、i2c_algorithm

设备驱动的两个数据结构:i2c_driver、i2c_client

以上四个数据结构的定义在linux内核根目录下include/linux/i2c.h中。

I2C总线驱动总体分析

1. 设计模块加载与卸载函数i2c_adapter_xxx_init()、i2c_adapter_xxx_exit()

2. 设计适配器的通信方法函数i2c_adpater_xxx_xfer()

3. 设计适配器支持的功能函数functionality()

I2C设备驱动总体分析

1. 填充i2c_driver和i2c_client结构体

I2C 总线驱动 I2C core

I2C core是Linux内核用来维护和管理的I2C的核心部分,其中维护了两个静态的List,分别记录系统中的I2C driver结构和I2C adapter结构。I2C core提供接口函数,允许一个I2C adatper,I2C driver和I2C client初始化时在I2C core中进行注册,以及退出时进行注销。同时还提供了I2C总线读写访问的一般接口(具体的实现在与I2C控制器相关的I2C adapter中实现),主要应用在I2C设备驱动中。

I2C控制器的驱动 I2C adapter

I2C adapter是针对不同类型I2C控制器硬件,实现比较底层的对I2C总线访问的具体方法。I2C adapter 构造一个对I2C core层接口的数据结构,并通过接口函数向I2C core注册一个控制器。 I2C adapter主要实现对I2C总线访问的算法,iic_xfer() 函数就是I2C adapter底层对I2C总线读写方法的实现。同时I2C adpter 中还实现了对I2C控制器中断的处理函数。

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设备驱动程序,在驱动中完成对特定的数据格式的解释以及实现一些专用的功能。

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功能的底层实现。

编写I2C设备驱动也有两种方法。一种是利用系统给我们提供的i2c-dev.c来实现一个i2c适配器的设备文件。然后通过在应用层操作i2c适配器来控制i2c设备。另一种是为i2c设备,独立编写一个设备驱动。注意:在后一种情况下,是不需要使用i2c-dev.c的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: