1. 前言
I2C协议是嵌入式系统中广泛使用的一类通信协议,主要用于CPU和各种外设之间的低速数据通信。Linux kernel使用I2C framework抽象、管理相应的资源,并以各种形式,向各类使用者提供API。另外,作为总线(bus)的一种,I2C framework的实现体现了linux设备模型的精髓,值得研究与学习。
按照分析各类framework的老规矩,蜗蜗会从4个角度分4篇文章介绍I2C framework:
1)Linux I2C framework的整体介绍,包括基础知识、软件框架、API汇整等。就是本文。
2)从Provider的角度,介绍怎么借助I2C framework管理I2C相关的SOC资源。换句话说,就是怎么编写一个I2C driver (I2C Control driver)。
3)从Consumer的角度,介绍I2C framework为使用者提供了哪些功能、哪些API,以及怎样利用I2C framework编写程序。
4)从内部实现的角度,分析I2C framework的实现逻辑。(I2C_core)
2. I2C的总线拓扑
I2C是总线的一种,其硬件拓扑如下图所示:
linux kernel I2C framework使用如下的软件拓扑抽象I2C硬件(我们可以一起领会一下其中的“设备模型”思想):
1)在I2C Framework中涉及到2条虚拟总线:①platform bus;②i2c bus;
①platform bus(/sys/bus/platform):在I2C Framework中,I2C控制器直接从属于platform bus,我们在linux kernel中常说的I2C driver,都是指I2C controller driver,都是以platform driver的形式存在,对应的控制器是platform device。
②i2c bus(/sys/bus/i2c):与此同时,kernel抽象出I2C bus,用于挂载和I2C controller通过I2C总线连接的各个I2C slave device。
2)2个主要数据结构:① i2c_adapter;② i2c_client;
① i2c_adapter:抽象I2C Controller有关的功能(主要是数据的收发),I2C adapter也挂载在I2C bus上。
② i2c_client:抽象I2C Device(I2C slave device),也挂载于I2C bus上,这样就可以方便的进行Master(I2C adapter)和Slave之间的匹配操作,并通过I2C core提供的统一接口,访问I2C salve device,进行数据的收发。
注:什么是platform bus?
在计算机中有这样一类设备,它们通过各自的设备控制器,直接和CPU连接,CPU可以通过常规的寻址操作访问它们(或者说访问它们的控制器)。这种连接方式,并不属于传统意义上的总线连接。但设备模型应该具备普适性,因此Linux就虚构了一条Platform Bus,供这些设备挂靠。
3. 软件框架
基于第2章所述的总线拓扑,Linux kernel抽象出如下的软件框架:
1)I2C framework的最终目标,是提供一种“访问I2C slave devices”的方法。由于这些slave devices由I2C controller控制,因而主要由I2C controller驱动实现这一目标。
2)经过I2C framework的抽象,consumer可以不用关心I2C总线的技术细节,只需要通过简单的API,就可以与slave devices进行数据交互。正常情况下,consumer是位于内核态的其它driver(如HDMI driver、touch screen driver等等)。与此同时,I2C framework也通过字符设备向用户空间提供类似的接口,用户空间程序可以通过该接口访问slave devices。<>
本文非原创,绝大部分内容整理至:蜗窝科技,www.wowotech.net。