linux I2C 总线和外设驱动

学习(整理)嵌入式Linux开发教程

I2C 总线是板级内部总线。由于 I2C 总线简单、便捷,在嵌入式系统中应用比较广泛。
 

  • I2C 子系统的设计思路

I2C 子系统要处理的问题主要有两个:

(1) 控制总线的 I2C 控制器,驱动 I2C 控制器,以实现 I2C 总线上的通信

(2) 总线上的从机器件,使 I2C 总线上的从机器件能很好地工作起来。

  • 1.驱动每个 I2C 控制器

I2C 控制器是实现 I2C 总线通信的硬件操作接口。软件系统是通过 I2C 控制器实现在 I2C总线上收/发数据。每一个 I2C 控制器连接一路 I2C 总线, I2C 控制器与 I2C 总线的连接如图6.1所示。嵌入式处理器内部通常集成有多路 I2C 控制器,以连接多路 I2C 总线。
 

linux I2C 总线和外设驱动

I2C 子系统需要为每个 I2C 控制器在/dev/目录下实现设备文件。通过这些设备文件,应用程序就可以在指定的 I2C 总线上实现收/发数据。 I2C 子系统在/dev/目录下生成的设备文件名通常为: i2c-0、 i2c-1、 i2c-2„„i2c-n。这些设备文件和 I2C 控制器的关系如图 6.2 所示。
 

linux I2C 总线和外设驱动

虽然 I2C 子系统在/dev/目录下生成的设备文件有多个,但这些设备文件的操作接口是一样的,I2C 子系统使用一个用户层接口驱动实现这些统一的接口。

I2C 子系统需要为每个 I2C 控制器实现一个 I2C 适配器。 I2C 适配器能驱动 I2C 控制器,实现主机数据在 I2C 总线的收/发。 I2C 适配器不关心要向总线发送的数据是从哪里来,也不关心从总线接收的数据如何处理。

每当 I2C 子系统添加了一个 I2C 适配器,都会被已有的用户层接口驱动探测到。同样用户层接口驱动加载时,也会探测 I2C 子系统中已有的 I2C 适配器。用户层接口驱动每探测到一个 I2C 适配器,都会为之生成设备文件。用户层接口驱动和 I2C 适配器的关系如图 6.3 所示。

linux I2C 总线和外设驱动

 

2. 驱动每个 I2C 从机器件

I2C 总线上可以接多个从机器件。而这些从机器件很多是需要实现内核态的驱动程序。以图 6.4 为例, I2C 总线上PCF8563 是 RTC 芯片,需要实现 RTC 驱动; CAT9555 是 I2C 转GPIO 芯片,需要实现 GPIO 驱动; OV3640 是摄像头模块,通过 I2C 接口配置内部寄存器,需要实现摄像头驱动„„ 这些驱动程序和从机器件进行通信时,通信数据必然是通过 I2C控制器。

linux I2C 总线和外设驱动

 

I2C 子系统为总线上的每个从机都实现一个 I2C 设备。I2C 设备都包含了控制从机器件的 I2C 适配器,以及从机地址、从机器件名字的信息。从机器件驱动只要获得从机器件的 I2C 设备,并借助 I2C 子系统提供的操作函数,就可以轻松地建立和从机器件的通信,如图 6.5 所示。

linux I2C 总线和外设驱动

 

驱动和设备匹配, I2C 子系统要求从机器件驱动实现一个 I2C 驱动。每个 I2C 驱动都包含了它能驱动的 I2C 设备的信息当一个 I2C 驱动添加到 I2C 子系统时,就会扫描子系统中所有的 I2C 设备,探测否有 I2C 设备能被自己驱动。同样当一个 I2C 设备添加到 I2C 子系统时,就会扫描子系统中所有的 I2C 驱动,探测否有可以驱动自己的 I2C 驱动。这种 I2C 设备和 I2C驱动的互相探测的机制,使从机器件驱动比较容易获得对应的 I2C 设备,从而建立和从机器件的通信,如图 6.6 所示。
 

linux I2C 总线和外设驱动

  • I2C 子系统在/sys 文件系统的信息

I2C 子系统在/sys 文件系统的信息在/sys/bus/i2c/目录下。在/sys/bus/i2c/目录下有 devices和 drivers 目录,如下所示:

linux I2C 总线和外设驱动

devices目录下包含了I2C子系统里所有的I2C控制器和I2C设备的属性文件;

linux I2C 总线和外设驱动

上述的i2c-0目录 / i2c-1目录 / i2c-2目录 / i2c-3目录分别表示I2C0和I2C1和I2C2和I2C3总线上I2C控制器的属性文件目录;
其它目录都是 I2C 设备的属性文件目录。

以 1-0008 目录名为例,“1”表示从机器件在 I2C1 总线;“0008”表示从机地址为 0x08。
进入 1-0008 目录,可以看到各文件如下所示:

linux I2C 总线和外设驱动

I2C 设备的属性文件目录下的 name 属性文件是 I2C 设备的名称。若 I2C 设备的属性文件目录下有 driver 文件,表示该 I2C 设备已经被 I2C 驱动所匹配到。

 

drivers目录下包含了 I2C 子系统里所有的 I2C 驱动的属性文件。 

linux I2C 总线和外设驱动

该目录下是各 I2C 驱动的属性文件的目录。以wm8960 目录为例,该目录下
属性文件如下所示:

linux I2C 总线和外设驱动

可以该看到该目录下有 I2C 设备的属性文件目录的链接,这表示该驱动已经匹配到 I2C设备。

通过这些属性文件的信息,可以查看 I2C 设备是否添加; I2C 设备信息是否正确; I2C 设备是否匹配到驱动; I2C 驱动是否正确注册; I2C 驱动是否匹配到 I2C 设备。这在驱动的开发调试阶段十分有用。