赞
踩
Linux系统定义了I2C驱动体系结构。在Linux系统中,I2C驱动由三部分组成,即I2C核心、I2C总线驱动和I2C设备驱动。这三部分相互协作,形成了非常通用、可适应性很强的I2C框架。
I2C核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(即“Algorithm”)上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。
I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可由CPU控制,甚至可以直接集成在CPU内部。
I2C总线驱动主要包含了I2C适配器数据结构i2c_adapter、I2C适配器的Algorithm数据结构i2c_algorithm和控制I2C适配器产生通道信号的函数。
经由I2C总线驱动的代码,可以控制I2C适配器以主控方式产生开始位、停止位、读写周期,以及以从设备方式被读写、产生ACK等。
I2C设备驱动(也称为客户驱动)是对I2C硬件体系结构中设备端的实现。设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。
I2C设备驱动主要包含了数据结构i2c_driver和i2c_client,需要根据具体设备实现其中的成员函数。
在Linux内核中,所有的I2C设备都在sysfs文件系统中显示,存于/sys/bus/i2c/目录,以适配器地址和芯片地址的形式列出。例如:
$ tree /sys/bus/i2c/
|—— devices
| |—— 0-0058 -> ../../../devices/platform/PHYT0003:00/i2c-0/0-0058
| |—— 0-0059 -> ../../../devices/platform/PHYT0003:00/i2c-0/0-0059
| |—— 0-005a -> ../../../devices/platform/PHYT0003:00/i2c-0/0-005a
| |—— i2c-0 -> ../../../devices/platform/PHYT0003:00/i2c-0
| |—— i2c-1 -> ../../../devices/platform/PHYT0003:01/i2c-1
……
|—— drivers
| |—— 88PM860x
| | |—— bind
| | |—— uevent
| | |—— unbind
| |—— ab3100
| | |—— uevent
| |—— at24
| | |—— bind
| | |—— i2c-INT0002:00 -> ../../../../devices/platform/PHYT0003:00/i2c-0/i2c-INT0002:00
| | |—— module -> ../../../../module/at24
| | |—— uevent
| | |—— unbind
……
|—— drivers_autoprobe
|—— drivers_probe
|—— uevent
在Linux内核源代码中的drivers目录下有一个i2c目录,在i2c目录下又包含如下文件和文件夹:
实现了I2C核心功能。
注:i2c-core.c在2017年5月31日被拆分成了i2c-core-base.c、i2c-core-slave.c、i2c-core-smbus.c、i2c-core-of.c、i2c-core-acpi.c,出于易于维护考虑。
实现了I2C适配器设备文件的功能,每一个I2C适配器都被分配一个设备。通过适配器访问设备文件时的主设备号都为89,次设备号为0~255。应用程序通过“i2c-%d”(i2c-0、i2c-1、……)文件名并使用文件操作接口open、write、read、ioctl和close等来访问这个设备。
i2c-dev.c并不是针对特定的设备而设计的,只是提供了通用的read、write和ioctl等接口,应用层可以借用这些接口访问挂接在适配器上的I2C存储空间或寄存器,并控制I2C设备的工作方式。
这个文件包含了一些I2C主机控制器的驱动,如i2c-tegra.c、i2c-omap.c、i2c-versatile.c、i2c-s3c2410.c等。
实现了一些I2C总线适配器的通信方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。