第15章 Linux I2C核心、总线与设备驱动之Linux I2C体系结构

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值