微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux中I2C设备驱动程序的研究与实现

嵌入式Linux中I2C设备驱动程序的研究与实现

时间:02-13 来源:互联网 点击:

外在转换数据空间时, 读函数将使用copy_to_user 把内核空间的数据拷贝到用户空间。

3.4 AT24C08 的单设备多驱动的实现方式

单设备多驱动是本文的一个创新点。设计中实现了分3 个设备驱动一对1 块AT24C08 进行操作。设备驱动1 对AT24C08的第1 个块操作,设备驱动2 对第2 个块操作,设备驱动3 对第3 和第4 个块进行操作。对块的分开操作体现在对设备地址的探测上,由于保存设备地址信息的是二元数组addr_data,所以在多驱动对单一的AT24C08 操作时就需要在该二元数组中指明每个设备驱动程序所控制的设备地址。对于控制第1 个块的设备驱动1,通过数组normal_addr 指出要进行操作的设备地址为0x50,如下所示:

static unsigned short normal_addr[]={ 0x50,I2C_CLIENT_END};

再通过其对数组addr_data 进行初始化, 这样, 设备驱动1就能检测到数组中所指出的AT24C08 的第1 个块,而跳过其他的块, 达到了只对单一特定块操作的目的。对于设备驱动2 来说, 只需把数组normal_addr 中地址改为AT24C08 的第2 个块的地址0x51 即可。同理,对设备驱动3,只需把normal_addr 中的单一地址改为两个地址即可,如下所示:

static unsigned short normal_addr [] = { 0x52,0x53, I2C_CLIENT_END};

这样就可使设备驱动只探测到后两个块,而跳过其他块,以达到对单一AT24C08 中多个块操作的目的。然后再用insmod命令加载编译好的三个.ko 驱动模块, 获得3 个不同的设备号后,接着根据所获得的设备号使用mknod 命令创建3 个不同的字符型设备节点, 最后通过用户层的3 个测试程序分别打开已创建的这3 个不同的设备节点就能分别对不同的块进行读写操作,至此就实现了单设备多驱动的控制方式。

同样除了分3 个驱动外, 驱动开发者也可以编写4 个设备驱动分别对每1 个块进行操作, 或者就只编写1 个设备驱动对4 个块一起操作,也适用于绑定非连续块进行操作,比如用一个设备驱动控制第1 和第3 个块。总之驱动开发人员可以根据不同的需要进行不同的组合方式。

3.5 AT24C08 设备驱动程序的验证与测试

设备驱动程序的验证, 需要通过用户层的测试程序来实现,测试程序如下:

  fd=open(/dev/at, O_RDWR); //打开设备文件,获得设备文件的文件描述符。

  scanf(%u, start_address); //输入测试单元起始地址。

  write(fd,buf,sizeof(buf)); //把以页写入方式把输入的16 个数据写入内核空间。

4 结束语

作为当前最流行的总线技术之一,I2C 总线具有结构小巧,使用简单高效的特点,目前在各种设计中已得到广泛的应用。本文分析了Linux 下I2C 的体系结构,较为详尽的说明了I2C驱动程序中的一些重要数据结构以及这些数据结构之间的关系,并论述了I2C 驱动程序体系的运行机制, 最后以一个EEPROM 芯片AT24C08 为例,详细的给出了一个具体设备驱动的基本开发过程, 并说明了设备驱动中的两个重要接口,I2C 核心层接口和用户应用层接口。更重要的是本文还提供了一种单设备多驱动的实现方式,这将带给驱动开发人员一定的启示。另外,本文还进行了设备驱动程序的测试与验证工作, 保证了设备驱动程序编写的正确性。本文的设备驱动设计方法也将对其他相关I2C设备驱动的设计提供良好的借鉴作用。

本文作者创新点:实现单设备多驱动的驱动模式。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top