分享

LINUX的IIC从这开始(一)

 enchen008 2014-04-16

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中的任意一片。那么你要写的驱动就如下了:

  1. <span style="font-size:14px;">Adapter1_eeprom1_driver();  
  2. Adapter1_eeprom2_driver();  
  3. Adapter1_eeprom3_driver();  
  4. Adapter2_eeprom1_driver();  
  5. Adapter2_eeprom2_driver();  
  6. Adapter2_eeprom3_driver();  
  7. Adapter3_eeprom1_driver();  
  8. Adapter3_eeprom2_driver();  
  9. Adapter3_eeprom3_driver();</span>  
一共是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设备驱动部分了,这才是咱们的重点。大家写驱动都知道,每个驱动中,数据结构是很重要的,那么下一片就介绍介绍几个重要的数据结构吧。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多