I2C
总线仅仅使用
SCL
、
SDA
两根信号线就实现了设备之间的数据交互 , 极
大地简化对硬件资源和 PCB 板布线空间的占用。因此, I2C 总线被非常广泛
地应用在 EEPROM 、实时钟、小型 LCD 等设备与 CPU 的接口中。
Linux 定义了系统的 I2C 驱动体系结构 , 在 Linux 系统中 , I2C 驱动由 3 部
分组成 , 即 I2C 核心 、 I2C 总线驱动和 I2C 设备驱动 。 这 3 部分相互协作
,
形成了非常通用、可适应性很强的
I2C
框架。
本章第 1 节将对 Linux I2C 体系结构进行分析 , 讲明 3 个组成部分各自的
功能及相互联系。第 2 节将对 Linux I2C 核心进行分析,解释 i2c-core.c 文件
的功能和主要函数的实现。第
3
、
4
节将分别详细介绍
I2C
总线驱动和
I2C
设备驱动的编写方法 , 给出可供参考的设计模板 。 第 5 、 6 节将以第 3 、 4 节
给出的设计模板为基础 , 讲解 S3C2410 ARM 处理器 I2C 总线驱动及挂接在上
的
SAA7113H
视频模拟
/
数字转换芯片设备驱动的编写方法。
15.1 Linux I2C 体系结构
Linux 的 I2C 体系结构分为 3 个组成部分:
•
I2C
核心
I2C 核心提供了 I2C 总线驱动和设备驱动的注册 、 注销方法 , I2C 通信方法 ( 即
“ algorithm ” , 笔者认为直译为 “ 运算方法 ” 并不合适 , 为免引起误解 , 下
文将直接使用 “
algorithm
” ) 上层的 、 与具体适配器无关的代码以及探测设备
、
检测设备地址的上层代码等。
• I2C 总线驱动
I2C
总线驱动是对
I2C
硬件体系结构中适配器端的实现,适配器可由
CPU
控
制,甚至直接集成在 CPU 内部。
I2C 总线驱动主要包含了 I2C 适配器数据结构 i2c_adapter 、 I2C 适配器的
algorithm
数据结构
i2c_algorithm
和控制
I2C
适配器产生通信信号的函数。
经由 I2C 总线驱动的代码,我们可以控制 I2C 适配器以主控方式产生开始位
、
停止位、读写周期,以及以从设备方式被读写、产生 ACK 等。
•
I2C
设备驱动
I2C 设备驱动是对 I2C 硬件体系结构中设备端的实现 , 设备一般挂接在受 CPU
控制的 I2C 适配器上,通过 I2C 适配器与 CPU 交换数据。
I2C
设备驱动主要包含了数据结构
i2c_driver
和
i2c_client
, 我们需要根据具体
设备实现其中的成员函数。
图
15.1 Linux I2C
体系结构
在 Linux 2.6 内核中,所有的 I2C 设备都被在 sysfs 文件系统中显示,存在于
/sys/bus/i2c/ 目录,以适配器地址和芯片地址的形式列出,如:
$ tree /sys/bus/i2c/
/sys/bus/i2c/
|-- devices
|
|-- 0-0048 -> ../../../devices/legacy/i2c-0/0-0048
|
|-- 0-0049 -> ../../../devices/legacy/i2c-0/0-0049
|
|-- 0-004a -> ../../../devices/legacy/i2c-0/0-004a
|
|-- 0-004b -> ../../../devices/legacy/i2c-0/0-004b
|
|-- 0-004c -> ../../../devices/legacy/i2c-0/0-004c