9.6_7.linux内核的I2C子系统详解1_2
5.9.6.1、I2C总线汇总概览
(1)三根通信线:SCL、SDA、GND
(2)同步、串行、电平、低速、近距离
(3)总线式结构,支持多个设备挂接在同一条总线上
(4)主从式结构,通信双方必须一个为主(master)一个为从(slave),主设备掌握每次通信的主动权,
从设备按照主设备的节奏被动响应。每个从设备在总线中有唯一的地址(slave address),
主设备通过从地址找到自己要通信的从设备(本质是广播)。
(5)I2C主要用途就是主SoC和外围设备之间的通信,最大优势是可以在总线上扩展多个外围设备的支持。
常见的各种物联网传感器芯片(如gsensor、温度、湿度、光强度、酸碱度、烟雾浓度、压力等)
均使用I2C接口和主SoC进行连接。
(6)电容触摸屏芯片的多个引脚构成2个接口。一个接口是I2C的,负责和主SoC连接(本身作为从设备),
主SoC通过该接口初始化及控制电容触摸屏芯片、芯片通过该接口向SoC汇报触摸事件的信息(触摸坐标等)
,我们使用电容触摸屏时重点关注的是这个接口;另一个接口是电容触摸板的管理接口,
电容触摸屏芯片通过该接口来控制触摸板硬件。该接口是电容触摸屏公司关心的,
他们的触摸屏芯片内部固件编程要处理这部分,我们使用电容触摸屏的人并不关心这里。
说明:主SoC通过该接口初始化及控制电容触摸屏芯片,触摸屏电容芯片不是一上电就可以用的,其本身还需要被我们的主SOC
初始化,其内有一系列寄存器,主芯片要给每个寄存器设置一个正确的值,然后电容触摸屏才能工作。
芯片通过该接口向SoC汇报触摸事件的信息(触摸坐标等),坐标/按下时间/压力等等。
电容屏使用者,本身并不制造电容触摸屏,我们只是使用其做产品,使用者一般关注的只是
I2C接口,I2C接口是我们的TP芯片和主芯片之间的通信接口,所以我们只关心这个,而且也只
关心到这一层,在往下层不关心。
再下层是另一个接口,即电容触摸板的管理接口,即我们的电容触摸屏IC
通过这个接口管理电容触摸板(电容触摸屏的硬件),该接口是电容触摸屏公司关心的。
固件,即集成到单片机/CPU里面的代码,本质是一个单片机程序,复杂度有限。
5.9.6.2、linux内核的I2C驱动框架总览
(1)I2C驱动框架的主要目标是:让驱动开发者可以在内核中方便的添加自己的I2C设备的驱动程序,
从而可以更容易的在linux下驱动自己的I2C接口硬件
(2)源码中I2C相关的驱动均位于:drivers/i2c目录下。linux系统提供2种I2C驱动实现方法:第一种叫i2c
-dev,对应drivers/i2c/i2c-dev.c,这种方法只是封装了主机(I2C master,
一般是SoC中内置的I2C控制器)的I2C基本操作,并且向应用层提供相应的操作接口,
应用层代码需要自己去实现对slave的控制和操作,
所以这种I2C驱动相当于只是提供给应用层可以访问slave硬件设备的接口,本身并未对硬件做任何操作,
应用需要实现对硬件的操作,因此写应用的人必须对硬件非常了解,
其实相当于传统的驱动中干的活儿丢给应用去做了,所以这种I2C驱动又叫做“应用层驱动”,
这种方式并不主流,它的优势是把差异化都放在应用中,这样在设备比较难缠(尤其是slave是非标准I2C时
)时不用动驱动,而只需要修改应用就可以实现对各种设备的驱动。这种驱动在驱动层很简单(就是i2c-dev
.c)我们就不分析了。
(3)第二种I2C驱动是所有的代码都放在驱动层实现,直接向应用层提供最终结果。
应用层甚至不需要知道这里面有I2C存在,譬如电容式触摸屏驱动,直接向应用层提供/dev/input/
event1的操作接口,应用层编程的人根本不知道event1中涉及到了I2C。这种是我们后续分析的重点。
说明:linux驱动都是内核实现一部分,然后再让驱动工程师实现一部分,总体加起来即它的驱动框架。
不同的I2C设备的差异,主要在设备本身的寄存器列表不一样,寄存器怎么初始化不一样。整个的操作模式是非常相似的。
来源:https://www.cnblogs.com/xiaohujian/p/12199337.html