Linux I2C 总线浅析
㈠ Overview
Linux 的 I2C 体系结构分为 3 个组成部分:
·I2C核心:
I2C核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(即“algorithm”)
上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。这部分是
与平台无关的。
·I2C总线驱动:
I2C总线驱动是对I2C硬件体系结构中适配器端的实现。I2C总线驱动主要包含了I2C适配器
数据结构i2c_adapter、I2C适配器的algorithm数据结构i2c_algorithm和控制I2C适配
器产生通信信号的函数。经由I2C总线驱动的代码,我们可以控制I2C适配器以主控方式产
生开始位、停止位、读写周期,以及以从设备方式被读写、产生ACK等。不同的CPU平台
对应着不同的I2C总线驱动。
总线驱动的职责,是为系统中每个I2C总线增加相应的读写方法。但是总线驱动本身并不
会进行任何的通讯,它只是存在在那里,等待设备驱动调用其函数。
这部分在MTK 6516中是由MTK已经帮我们实现了的,不需要我们更改。
· I2C设备驱动:
I2C设备驱动是对I2C硬件体系结构中设备端的实现。设备一般挂接在受CPU控制的I2C适
配器上,通过I2C适配器与CPU交换数据。I2C设备驱动主要包含了数据结构i2c_driver和
i2c_client,我们需要根据具体设备实现其中的成员函数。在Linux内核源代码中的
drivers目录下的i2c_dev.c文件,实现了I2C适配器设备文件的功能,应用程序通过“i2c-
%d”文件名并使用文件操作接口open()、write()、read()、ioctl()和close()等来访问这
个设备。应用层可以借用这些接口访问挂接在适配器上的I2C设备的存储空间或寄存器并
控制I2C设备的工作方式。
设备驱动则是与挂在I2C总线上的具体的设备通讯的驱动。通过I2C总线驱动提供的函数,
设备驱动可以忽略不同总线控制器的差异,不考虑其实现细节地与硬件设备通讯。
这部分在MTK 6516中是由具体的设备实现的。(比如camera)