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

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

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

摘要: I2C 作为一种目前通用的总线技术,已广泛应用于EEPROM、实时钟、小型LCD 等设备与CPU 的接口中。分析了嵌入式Linux 中I2C 驱动程序的体系结构,I2C 驱动程序中一些重要数据结构之间的关系以及I2C 驱动程序的运行机制。最后,结合具体的EEPROM 芯片AT24C08 说明了在嵌入式Linux 下开发I2C设备驱动程序的一般流程。另外还创新了一般的驱动方法,实现了单设备多驱动的驱动模式。

引言

I2C是“Inter Integrated Circuit Bus”的缩写,中文译成“内部集成电路总线”, 它是Philips 公司于20 世纪80 年代研发成功的一种具有多端控制功能的双线双向串行数据总线标准, 其具有模块化、电路结构简单等优点。在嵌入式系统中,I2C总线已经成为器件接口的标准之一, 常用于连接RAM、EEPROM 以及LCD 控制器等设备。另外,总线的数据传输是以字节为单位的。

目前,标准的I2C的传输速率可以达到100kbit/s,能支持128 个设备,增强型I2C传输速率可达400kbit/s,能支持多达1024 个设备,高速模式下的I2C 传输速率更高达3.4Mbit/s。

1 Linux 驱动程序

驱动程序是指系统内核与系统硬件之间的接口。Linux 中的每一个外围物理设备等都有一个专门用于控制该设备的设备驱动程序。设备驱动可以完成初始化、释放以及检测硬件设备;差错和故障处理;负责内核与硬件、应用程序与硬件之间的数据传输与通信的一些重要工作。在嵌入式系统中,设备驱动为嵌入式操作系统和应用程序访问硬件设备提供统一的接口。通过它, 操作系统和应用程序就可以轻松地操作和驱动硬件架构的分层。

2 Linux 的I2C 体系结构

2.1 Linux 下I2C 体系结构分析

Linux 的I2C 体系结构由3 大部分组成:

(1)I2C框架:I2C.h 和I2C-core.c 为I2C框架的主体,提供了核心数据结构的定义、I2C 适配器驱动和设备驱动的注册、注销方法,I2C 通信方法(algorithm)上层的、与具体适配器无关的代码、以及检测设备地址的上层代码等。作为核心的I2C-core.c 还为总线驱动设备提供了一些统一的调用接口进行读写和设置操作, 另外它还提供了将各种支持的总线设备驱动添加到这个体系中的方法, 以及当不再使用这些总线驱动时从体系中删除的方法。

(2)I2C 总线驱动I2C总线驱动是对I2C 硬件体系结构中适配器端的实现,I2C 总线驱动主要包含了I2C 适配器数据结构I2C_adapter, 以及描述在具体I2C 适配器上的总线通信方法i2c_algorithm 数据结构。

(3)I2C 设备驱动:I2C 设备驱动是对I2C 硬件体系结构中设备端的实现, 设备一般挂接在受CPU 控制的I2C 适配器上, 通过I2C 适配器与CPU 交换数据。I2C 设备驱动主要包含了数据结构i2c_driver 和i2c_client。

这三部分的关系如图1 所示。

图1Linux 中I2C 体系结构

2.2 I2C驱动程序中的重要数据结构

在I2C 框架的i2c.h 这个头文件中对4 个关键的结构体进行了定义, 它们分别是i2c_adapter、i2c_algorithm、i2c_driver 和i2c_client。结构体i2c_adapter 是一个I2C控制器的逻辑抽象,并且作为最核心的数据结构提供了I2C适配器的驱动。i2c_algorithm对应一套通信方法, 其封装了对一个I2C 控制器的读写操作, 并且提供的通信函数可以控制适配器上产生特定的访问周期,这套通信方法由驱动开发者来完成。i2c_driver 则是对应于一套驱动方法,用于辅助作用的数据结构,不对应任何物理实体,仅是提供了I2C 设备i2c_client 的驱动。而i2c_client 对应于真实的物理设备,描述具体设备可能的私有数据结构。

2.3I2C驱动程序中重要数据结构之间的关系

对于上述的4 个结构体来说, 其中的i2c_driver 和i2c_client 是与具体I2C 设备相关的,而i2c_adapter 和i2c_algorithm则共同构成I2C 总线适配器驱动。一个algorithm 可以适用于多个I2C 总线上的不同adapters, 但具体的每个adapter 只能对应于一个algorithm。在i2c_adapter 数据结构中设计了clients指针数组, 用于记录该总线上每个设备的i2c_client 数据结构。

另外, 定义内核中全局静态指针数组adapters 和drivers 分别记录已注册的I2C 适配器驱动和I2C 设备驱动程序。值得注意的是同一个i2c_adapter 中的不同的i2c_client 可能使用同一个i2c_driver,而分属于不同i2c_adapter 中的两个i2c_client 也可能使用同一个i2c_driver。

3 一个具体的I2C 设备驱动程序的开发

AT24C08 是由ATMEL 公司出品的一款EEPROM 存储器。

作为一个标准的I2C 设备AT24C08 有4 个块存储区, 一个块有256 个数据存储单元,整个AT24C08 具有1024 个存储单元。由于每个数据存储单元可存1 字节的数据,所以整块AT24C08 的存

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

网站地图

Top