LINUX的IIC从这开始(一)

LINUX的版本:linux-3.0.8linux

iic对你们确定不陌生,我就不介绍它的什么优势缺点的了,尤为是之前开发过单片机的同志们,动不动就用io口模拟一个iic接口,对什么起始啊,应答啊,结束啊都比较了解,但linux的iic驱动是有本身的模型的,固然你也能够继续用io口模拟一个iic接口,但这就违背了许多原则,因此咱们有必要好好的研究一下,固然了,我也是个新手,有许多出错的地方还请你们指出来,我们好相互学习嘛。我此次主要是经过如下几个方面讨论linux的iic驱动:数据结构

1.linux下的iic子系统的体系结构;函数

2.iic设备驱动的介绍(以友善的smart210上的EEPROM来验证);学习

3.iic总线驱动的介绍(简单分析一下,水平有限啊)。spa

好吧,我们开始吧,首先从一张体系结构图开始,以下:code


首先申明一下啊,这张图片是网上当的。从图上能够看出,从大方向能够分为:应用层、内核层以及硬件层。应用层是应用工程师关心的事情,硬件层是硬件工程师关心的。咱们主要看内核空间的部分,内核空间部分能够分为:iic设备驱动、iic核心以及iic总线驱动。固然了,这些许多书里和博文里都说了,我们也说得说说,一是这样能够一个一个介绍,另外,好歹我们也得装的专业点嘛,要否则之后怎么混,哈哈,开个玩笑。说到这里,你有没有想,就一个iic,须要这么麻烦吗,不就两根线嘛,我写个iic驱动,我之间配置寄存器就好了嘛,至于把这个体系弄明白吗?我当时也是这么想的,不事后来看了许多资料后,我就对开发linux的前辈们顶礼膜拜了,他们怎么那么聪明,好吧,我再给他们鞠个躬啊。下面经过一个简单的例子来讲明为何!blog

我以smart210上的s5pv210为例吧,s5pv210上有三个iic模块,也就是所说的适配器,如今假设有3个iic设备,就好比说有三块EEPROM吧(smart210上实际只有一片),要求是:s5pv210上的3个iic模块都可以控制3片EEPROM中的任意一片。那么你要写的驱动就以下了:
接口

Adapter1_eeprom1_driver(); Adapter1_eeprom2_driver(); Adapter1_eeprom3_driver(); Adapter2_eeprom1_driver(); Adapter2_eeprom2_driver(); Adapter2_eeprom3_driver(); Adapter3_eeprom1_driver(); Adapter3_eeprom2_driver(); Adapter3_eeprom3_driver();
一共是9个驱动程序,那若是有n个iic模块,m个设备呢,那你就得写n*m驱动了。原本写程序就是解决重复麻烦的事的,如今自己就这么麻烦,这就人如何是好?还记得上面说,iic驱动在内核空间分为:iic设备驱动、iic核心以及iic总线驱动吧。之因此这样分,就是把iic模块的驱动和iic设备驱动分开,而后iic核心把它们联系起来。这样当须要第1个iic模块控制第1片EEPROM时,就先选择第1个模块的驱动,而后选择第1片EEPROM就好了,当须要第2个iic模块控制第2片EEPROM时,adapter1_driver——EEPROM2_driver,同理:adapter1_driver——EEPROM3_driver,adapter2_driver——EEPROM1_driver等等,这样只须要写6个驱动就够了,当数量多时,优点就更加明显了,那么有n个iic模块,m个设备状况,你只用写n+m个驱动了。这就是分层思想带来的好处,并且这样写驱动重复的代码会不多,由于我们通常写的是设备驱动,而设备驱动是不须要设置soc上具体的寄存器的,因此所写的驱动也更加容易移植。

好吧,下面介绍,iic设备驱动、iic核心以及iic总线驱动吧(参考宋宝华的书)图片

1.iic核心开发

iic核心提供iic总线驱动和设备驱动的注册、注销方法,iic通讯方法(algorithm)上层的,与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。

2.iic总线驱动

iic总线驱动是对iic硬件体系结构中适配器端的实现,说白了,就是怎么操做iic模块工做。适配器可由CPU控制,甚至直接集成到cpu里面,s5pv210就集成了3个iic适配器。iic总线驱动主要包括了iic适配器数据结构i2c_adapter、i2c适配器的algorithm数据结构i2c_algorithm和iic适配器产生通讯信号的函数。

3.iic设备驱动

iic设备驱动是对iic硬件体系结构中设备端的实现,好比说实验板上的EEPROM设备等。设备通常挂接在cpu控制的iic适配器上,经过iic适配器与cpu交换数据。

iic设备驱动主要包括了数据结构i2c_driver和i2c_client,咱们须要根据具体设备实现其中的成员函数。

如今问题又来了,我们作驱动的人具体须要关心这三部分中的那一部分呢?

iic核心部分是linux内核自带的,不须要开发,固然应该简单地看一下,对理解整个体系是有帮助的,若是你能开发iic核心,那我得膜拜一下你了;iic总线驱动这部分,通常都是由硬件厂商提供的,好比说我们后边要讨论的s5pv210,三星公司就提供了iic总线驱动,这个文件就是了linux-3.0.8/drivers/i2c/buses/i2c-s3c2410.c,固然了仍是看一下的,要否则怎么能说懂iic驱动呢?对于作驱动的我们,最关心的就是iic设备驱动部分了,这才是我们的重点。你们写驱动都知道,每一个驱动中,数据结构是很重要的,那么下一片就介绍介绍几个重要的数据结构吧。