注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

LINUX驱动之IIC子系统之二I2C的体系介绍  

2012-11-08 22:40:53|  分类: LINUX内核驱动 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

LINUX驱动之IIC子系统之二I2C的体系介绍

郑重声明:图片和部分资料来自网络,如有冒犯,敬请原谅。

在今天的BLOG开始之前,先看一幅图:

 

LINUX驱动之IIC子系统之二I2C的体系介绍 - 还东国 - 还东国的博客

 

通过这幅图可以清楚的看到整个I2C的架构,大致分成了三个层次:用户空间(也就是应用程序),内核(也就是驱动部分)和硬件(也就是实际物理设备,这里以2440为例,即为其中的i2c控制器和at24c08)。

每个I2C设备对应着一个Adapter(跟硬件一致,一个适配器可以连接多个I2C设备),每一个adapter提供了一个描述的结构(struct i2c_adapter),也定义了adapter支持的操作(struct i2c_adapter).再通过i2c core层将i2c设备与i2c adapter关联起来.

 

要想操作I2C,就必须明白它的协议和硬件接口,分析下来有两个方面:

一、 I2C控制器的驱动,它主要操作控制器来产生I2C的时序信号,来发送数据和接收数据。

二、硬件设备的驱动,这部分驱动用来使控制器正确操作芯片,来读取和存放数据。

在Linux系统中,对前者的实现叫做I2C总线驱动,对后者的实现叫做I2C设备驱动。

一般来说,如果CPU中集成了I2C控制器并且Linux内核支持这个CPU,那么总线驱动方面就不用我们操心了,内核已经做好了。但如果CPU中没有I2C控制器,而是外接的话,那么就要我们自己实现总线驱动了。对于设备驱动来说,一般常用的驱动也都包含在内核中了,如果我们用了一个内核中没有的芯片,那么就要自己来写了。

由上面的示意图还可以看出,Linux的I2C体系结构分为3个组成部分:

一、I2C核心:

   I2C核心注册I2C总线类型、适配器类等并提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(algorithm)上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。所有的I2C驱动代码位于drivers/i2c目录下:

I2c-core.c     实现I2C核心的功能

I2c-dev.c      实现I2C适配器设备文件的功能,每一个I2C适配器都被分配一个设备

Chips         特定的I2C设备驱动

Busses        I2C总线的驱动

Algos         实现了一些I2C总线适配器的algorithm

主要接口函数:

1、增加/删除I2C适配器

 

int i2c_add_adapter(struct i2c_adapter *adapter)  

int i2c_del_adapter(struct i2c_adapter *adap)  

2、增加/删除I2C从设备驱动

 

int i2c_register_driver(struct module *owner, structi2c_driver *driver)  

static inline int i2c_add_driver(struct i2c_driver *driver)  

void i2c_del_driver(struct i2c_driver *driver)  

i2c_add_driver是对i2c_register_driver简单的封装

 

3、i2c传输,发送和接收

 

int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg*msgs, int num)  

int i2c_master_send(const struct i2c_client *client, constchar *buf, int count)  

int i2c_master_recv(const struct i2c_client *client, char*buf, int count)  

i2c_master_send和i2c_master_recv是i2c_transfer的封装

 

二、I2C总线驱动(I2Cadapter/Algo driver):

I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可由CPU控制,甚至集成在CPU内部(大多数微控制器都这么做)。适配器就是我们经常所说的控制器,一条I2C总线对应一个adapter。经由I2C总线驱动的代码,我们可以控制I2C适配器以主控方式产生开始位,停止位,读写周期,以及以从设备方式被读写,产生ACK等。I2C总线驱动由i2c_adapter和i2c_algorithm来描述。一个I2C适配器需要I2C_algorithm中提供的通信函数来控制适配器上产生特定的访问周期。I2c_algorithm中的关键函数master_xfer()用于产生I2C访问周期需要的信号,以i2c_msg为单位。

三、 I2C设备驱动:

I2C设备驱动是对I2C硬件体系结构中设备端的实现。设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。I2C设备驱动主要包含了数据结构i2c_driver和i2c_client,我们需要根据具体设备实现其中的成员函数。

I2c_driver与i2c_client是一对多的关系,一个i2c_driver上可以支持多个同等类型的i2c_client。

I2c_adapter与i2c_client的关系与I2C硬件体系中适配器和从设备的关系一致,i2c_client依附在i2c_adapter上。

 

在Linux内核源代码中的drivers目录下的i2c_dev.c文件,实现了I2C适配器设备文件的功能,应用程序通过“i2c-%d”文件名并使用文件操作接口open()、write()、read()、ioctl()和close()等来访问这个设备。应用层可以借用这些接口访问挂接在适配器上的I2C设备的存储空间或寄存器并控制I2C设备的工作方式。

设备驱动则是与挂在I2C总线上的具体的设备通讯的驱动。通过I2C总线驱动提供的函数,设备驱动可以忽略不同总线控制器的差异,不考虑其实现细节地与硬件设备通讯。

好了,今天就讲到这里,慢慢的一点点来,就会深入到内核中去。

若有恒,何须五更起,半夜眠。

  评论这张
 
阅读(1195)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017