Linux 下I2C 驱动架构全面分析

I2C 概述

I2C只有两条线,一条串行数据线SDA,一条是时钟线SCL。使用SCL、SDA这两根数据线就实现了设备之间的数据交互。I2C总线广泛用于EEPROM,实时时钟RTC,小型LCD等设备与CPU的接口中。


I2C架构概述

Linux 的IIC分3个部分组成:

I2C核心:I2C核心提供了总线驱动,设备驱动的注册、注销方法。I2C通信方法(algorithm),与具体适配器无关的上层代码,以及探测设备、检测设备地址的上层代码。

I2C总线驱动:总线(适配器adapter)是对I2C硬件体系结构中适配器端的实现,包括I2C硬件(寄存器、中断、时钟)初始化,I2C发送与接收的处理函数。

I2C设备驱动:I2C设备驱动(客户端client)是对I2C硬件体系结构中设备端的实现,设备一般挂接在I2C适配器上,通过I2C适配器与CPU交互数据。

Linux 下I2C 驱动架构全面分析_第1张图片

架构层次分类

第一层:提供I2C adapter的硬件驱动,探测、初始化i2c adapter(如申请i2c的io地址和中断号),驱动adapter 在硬件上产生(start、stop、ack)以及处理I2C中断。

第二层:提供i2c adapter的algorithm,用具体的适配器xxx_xfer()函数来填充i2c_algorithm的master_xfer函数指针,并把赋值后的i2c_algorithm再赋值给i2c_adapter的algo指针。

第三层:实现i2c设备驱动中的i2c_driver接口。实现设备device与总线(adapter)的挂接。

第四层:实现i2c设备对应的具体device驱动,i2c_driver只是实现设备与总线的挂接,而挂接在总线上的i2c设备千差万别,所以要实现具体设备device的write(),read(),ioctl()等方法;赋值给file_operations,然后注册字符设备驱动。

第一层、第二层属于i2c总线驱动(bus),第三层、第四层属于设备驱动层(device driver)。


i2C_adapter 与i2c_algorithm

i2C_adapter对应于物理上的一个适配器,而i2c_algorithm对应一套通信方法,一个i2c适配器需要i2c_algorithm

中提供的通信函数来控制适配器上产生特定的访问周期。i2c_adapter中包含其使用的i2c_algorithm指针。

i2c_algorithm中的关键函数master_xfer用于产生访问i2c设备所用到的start、stop、ask信号。以i2c_msg(即i2c

消息)为单位发送和接收通信数据。


你可能感兴趣的:(arm学习)