转载地址:http://blog.csdn.net/xie0812/article/details/22942375
LINUX的版本:linux-3.0.8
iic对大家肯定不陌生,我就不介绍它的什么优点缺点的了,尤其是以前开发过单片机的同志们,动不动就用io口模拟一个iic接口,对什么起始啊,应答啊,结束啊都比较了解,但linux的iic驱动是有自己的模型的,当然你也可以继续用io口模拟一个iic接口,但这就违背了许多原则,所以我们有必要好好的研究一下,当然了,我也是个新手,有许多出错的地方还请大家指出来,咱们好相互学习嘛。我这次主要是通过以下几个方面讨论linux的iic驱动:
1.linux下的iic子系统的体系结构;
2.iic设备驱动的介绍(以友善的smart210上的EEPROM来验证);
3.iic总线驱动的介绍(简单分析一下,水平有限啊)。
好吧,咱们开始吧,首先从一张体系结构图开始,如下:
首先申明一下啊,这张图片是网上当的。从图上可以看出,从大方向可以分为:应用层、内核层以及硬件层。应用层是应用工程师关心的事情,硬件层是硬件工程师关心的。我们主要看内核空间的部分,内核空间部分可以分为:iic设备驱动、iic核心以及iic总线驱动。当然了,这些许多书里和博文里都说了,咱们也说得说说,一是这样可以一个一个介绍,另外,好歹咱们也得装的专业点嘛,要不然以后怎么混,哈哈,开个玩笑。说到这里,你有没有想,就一个iic,需要这么麻烦吗,不就两根线嘛,我写个iic驱动,我之间配置寄存器就行了嘛,至于把这个体系弄明白吗?我当时也是这么想的,不过后来看了许多资料后,我就对开发linux的前辈们顶礼膜拜了,他们怎么那么聪明,好吧,我再给他们鞠个躬啊。下面通过一个简单的例子来说明为什么!
我以smart210上的s5pv210为例吧,s5pv210上有三个iic模块,也就是所说的适配器,现在假设有3个iic设备,就比如说有三块EEPROM吧(smart210上实际只有一片),要求是:s5pv210上的3个iic模块都能够控制3片EEPROM中的任意一片。那么你要写的驱动就如下了:
- <span style="font-size:14px;">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();</span>
好吧,下面介绍,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设备驱动部分了,这才是咱们的重点。大家写驱动都知道,每个驱动中,数据结构是很重要的,那么下一片就介绍介绍几个重要的数据结构吧。