I2C总线仅仅使用SCL(时钟信号线)、SDA(双向数据线)这两根信号线实现设备之间的数据交互,简化对硬件资源和PCB板布线空间的占用。I2C总线广泛地应用在EEPROM(电可擦除可编程只读存储器)、实时时钟(RTC)、小型LCD等设备与CPU的接口中。
Linux系统中定义I2C驱动体系结构。在Linux系统中,I2C驱动由3部分组成,即I2C核心、I2C总线驱动和I2C设备驱动。这3个部分相互协作,形成非常通用、可适应性很强的I2C框架。
1、Linux的I2C体系结构分析,3个组成部分各自的功能及相互联系。
2、Linux的I2C核心分析,i2c-core.c文件的功能和主要函数的实现。
3、I2C适配器驱动和I2C设备驱动的编写方法。
4、Tegra (图睿)ARM处理器的I2C总线驱动,以挂接在I2C总线上的AT24XX系列EEPROM为例分析I2C设备驱动。
15.1 Linux I2C体系结构
Linux的I2C体系结构分为3个组成部分。
(1)I2C核心
I2C核心提供I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(Algorithm)上层的与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等,如图15.1所示。

图15.1 Linux的I2C体系结构
(2)I2C总线驱动
I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可由CPU控制,甚至可直接集成在CPU内部。I2C总线驱动主要包含I2C适配器数据结构i2c_adapter、I2C适配器的Algorithm数据结构i2c_algorithm和控制I2C适配器产生通信信号的函数。
经由I2C总线驱动的代码,我们可以控制I2C适配器以主控方式产生开始位、停止位、读写周期,以及以从设备方式被读写、产生ACK(应答)等。
(3)I2C设备驱动
I2C设备驱动(也称为客户驱动)是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。
I2C设备驱动主要包含数据结构i2c_driver和i2c_client,需要根据具体设备实现其中的成员函数。
在Linux 2.6内核中,所有的I2C设备都在sysfs文件系统中显示,存在于/sys/bus/i2c/目录下,以适配器地址和芯片地址的形式列出,例如:
test@ubuntu2018:/sys/bus/i2c$ tree
.
├── devices
│ └── i2c-0 -> ../../../devices/pci0000:00/0000:00:1c.7/0000:06:00.0/0000:07:00.0/i2c-0
├── drivers
│ ├── 88PM860x
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── aat2870
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── ab3100
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── adp5520
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── as3711
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── axp20x
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── da903x
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── da9052
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── da9055-pmic
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── da9063
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── dummy
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── elants_i2c
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── htcpld-chip
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── intel_soc_pmic_i2c
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── ipmi_ssif
│ │ ├── bind
│ │ ├── module -> ../../../../module/ipmi_ssif
│ │ ├── uevent
│ │ └── unbind
│ ├── lp8788
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── max14577
│ │ ├── bind
│ │ ├── uevent
│ │ └── unbind
│ ├── max77693
│ │ ├── b

本文详细介绍了Linux I2C驱动的体系结构,包括I2C核心、I2C总线驱动和I2C设备驱动的组件与功能。I2C核心提供注册和通信方法,总线驱动控制硬件产生通信信号,设备驱动实现与CPU的数据交换。文章还探讨了如何在Linux内核中编写I2C适配器和设备驱动,以及它们之间的关系和交互。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



