Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4028699
  • 博文数量: 366
  • 博客积分: 9916
  • 博客等级: 中将
  • 技术积分: 7195
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-29 23:27
个人简介

简单!

文章分类

全部博文(366)

文章存档

2013年(51)

2012年(269)

2011年(46)

分类: 嵌入式

2013-05-01 19:05:56

一、简介 


         I2C总线仅仅使用SCL、SDA两根信号线就实现了设备之间的数据交互,极大地简化对硬件资源和PCB板布线空间的占用。因此,I2C总线被非常广泛地应用在EEPROM、实时钟、小型LCD等设备与CPU的接口中。使用i2c子系统而不使用普通字符设备有以下好处:

1)使用Linux I2C子系统,不需要过于详细了解I2C操作。

2)编写驱动可移植性强。

3)可以使用内核资源,当面对复杂I2C器件,工作量相对少得多。

        I2C工作原理:I2C总线标准是两根传输线,SDA是数据线,Scl是时钟线。当SCL为高,SDA由高变低时,发送启动信息,发送9个脉冲,1-7 是地址,8是读写控制位,9是ACK应答位,所以挂在I2C上的被控设备都能接受所发送的信息,并把接收到的7位地址与自己的地址进行比较,如果相同就会反馈应答。当SCL为低,SDA由低变高,则发送停止信号。

二、架构


Linux的I2C构架分为三个部分:

1)I2C core框架

        提供了核心数据结构的定义和相关接口函数,用来实现I2C适配器驱动和设备驱动的注册、注销管理,以及I2C通信方法上层的、与具体适配器无关的代码,为系统中每个I2C总线增加相应的读写方法。具体实现在/drivers/i2c目录下的i2c-core.c和i2c-dev.c。

 2) I2C总线驱动

        定义描述具体I2C总线适配器的i2c_adapter数据结构、实现在具体I2C适配器上的I2C总线通信方法,并由i2c_algorithm数据结构进行描述。 经过I2C总线驱动的的代码,可以为我们控制I2C产生开始位、停止位、读写周期以及从设备的读写、产生ACK等。总线驱动具体实现在/drivers/i2c目录下busses文件夹中,例如Linux I2C GPIO总线驱动为i2c_gpio.c。总线算法在/drivers/i2c目录下algos文件夹中,例如Linux I2C GPIO总线驱动算法实现为i2c_algo_bit.c。

 3) I2C 设备驱动

         是对具体I2C硬件驱动的实现。I2C 设备驱动通过I2C适配器与CPU通信。其中主要包含i2c_driver和 i2c_client数据结构,i2c_driver结构对应一套具体的驱动方法,例如:probe、remove、suspend等,需要自己申明。 i2c_client数据结构由内核根据具体的设备注册信息自动生成,设备驱动根据硬件具体情况填充。设备驱动具体实现放在/drivers/i2c目录下chips文件夹中。

三、驱动的编写


       如何编写自己的i2c相关的驱动,参考方案:

     (1)提供 I2C 适配器的硬件驱动,探测、初始化 I2C 适配器(如申请 I2C 的 I/O 地址和中断号)、驱动 CPU 控制的 I2C 适配器从硬件上产生各种信号以及处理 I2C 中断等。

     (2)提供 I2C 适配器的 algorithm ,用具体适配器的 xxx_xfer() 函数填充 i2c_algorithm 的 master_xfer 指针,并把 i2c_algorithm 指针赋值给 i2c_adapter 的 algo 指针。

     (3)实现 I2C 设备驱动与 i2c_driver 接口,用具体设备 yyy 的 yyy_attach_adapter() 函数指针、 yyy_detach_client() 函数指针和 yyy_command() 函数指针的赋值给 i2c_driver 的 attach_adapter 、 detach_adapter 和 detach_client 指针。

     (4)实现 I2C 设备驱动的文件操作接口,即实现具体设备 yyy 的 yyy_read() 、 yyy_write() 和 yyy_ioctl() 函数等。

      上述工作中 1、2 属于I2C总线驱动,3、4 属于I2C设备驱动,做完这些工作,系统会增加两个内核模块。


阅读(6022) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~