linux内核的I2C子系统详解1——I2C总线概览、驱动框架概览

以下内容源于朱有鹏《物联网大讲堂》课程的学习,如有侵权,请告知删除。


1、I2C总线汇总概览

(1)三根通信线:SCL、SDA、GND;

(2)同步、串行、电平、低速(几百k)、近距离;

(3)总线式结构:支持多个设备挂接在同一条总线上

(4)主从式结构:通信双方必须一个为主(master)一个为从(slave),主设备掌握每次通信的主动权,从设备按照主设备的节奏被动响应。

  • 每个从设备在总线中有唯一的地址(slave address),主设备通过从地址找到自己要通信的从设备(本质是广播)。

(5)I2C主要用途就是主SoC和外围设备之间的通信,最大优势是支持在总线上扩展多个外围设备。

  • 常见的各种物联网传感器芯片(如gsensor、温度、湿度、光强度、酸碱度、烟雾浓度、压力等)均使用I2C接口和主SoC进行连接。

(6)电容触摸屏芯片的多个引脚构成2个接口。http://blog.csdn.net/oqqhutu12345678/article/details/65445338

  • 一个接口是I2C的,负责和主SoC连接(本身作为从设备)。主SoC通过该接口初始化及控制电容触摸屏芯片,而芯片通过该接口向SoC汇报触摸事件的信息(触摸坐标等),我们使用电容触摸屏时重点关注的是这个接口;
  • 另一个接口是电容触摸板的管理接口,电容触摸屏芯片通过该接口来控制触摸板硬件。该接口是电容触摸屏公司关心的,他们的触摸屏芯片内部固件编程要处理这部分,我们使用电容触摸屏的人并不关心这里。

2、linux内核的I2C驱动框架总览

(1)I2C驱动框架的主要目标

  • 让驱动开发者可以在内核中方便的添加自己的I2C设备的驱动程序,从而可以更容易的在linux下驱动自己的I2C接口硬件。

(2)源码中I2C相关的驱动均位于:drivers/i2c目录下。

(3)linux系统提供2种I2C驱动实现方法。

  • 第一种叫i2c-dev,对应drivers/i2c/i2c-dev.c。
  • 这种方法只是封装了主机(I2C master,一般是SoC中内置的I2C控制器)的I2C基本操作,并且向应用层提供相应的操作接口,应用层代码需要自己去实现对slave的控制和操作,所以这种I2C驱动相当于只是提供给应用层可以访问slave硬件设备的接口,本身并未对硬件做任何操作,应用需要实现对硬件的操作,因此写应用的人必须对硬件非常了解,其实相当于传统的驱动中干的活儿丢给应用去做了,所以这种I2C驱动又叫做“应用层驱动”。
  • 这种方式并不主流,它的优势是把差异化都放在应用中,这样在设备比较难缠(尤其是slave是非标准I2C时)时不用修改驱动,而只需要修改应用就可以实现对各种设备的驱动。这种驱动在驱动层很简单(就是i2c-dev.c),我们就不分析了。
  • 第二种I2C驱动是所有的代码都放在驱动层实现,直接向应用层提供最终结果。应用层甚至不需要知道这里面有I2C存在,譬如电容式触摸屏驱动,直接向应用层提供/dev/input/event1的操作接口,应用层编程的人根本不知道event1中涉及到了I2C。这种是我们后续分析的重点。



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