linux内核GPIO模拟I2C实例_第1页
linux内核GPIO模拟I2C实例_第2页
linux内核GPIO模拟I2C实例_第3页
linux内核GPIO模拟I2C实例_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、linux 内核 GPIO 模拟 I2C 实例2010-10-11 作者:cvip302814 来源:cvip302814 的 blog前言:在许多情况下,我们并没有足够的 I2C 总线,本文主在介绍如何利用 Linux 内核中的 i2c-gpio 模块,利用 2 条 GPIO 线模拟 i2c 总线,并挂载设备。思路:先通过对 i2c-gpio 所定义的结才体初始化(包括初始化 i2c 的 2 条线,频率,timeout 等)并将 i2c-gpio 模块编译进内核,实现用 GPIO_X,GPIO_Y2 条 GPIO线注册新的 i2c 总线。此时这个模块对 i2c 设备是透明的,及挂在这 2 条

2、 GPIO线的 i2c 设备可以直接使用 Linux 内核通用的 i2c 设备注册,传输和注销等方法。步骤:首先确认在注册 i2c-gpio 模块前,所要用到的 2 条 GPIO 口是没有被系统其它地方所调用的。在每个系统平台启动时,都会打开一系列的设备,他们通常实现在 arch/目录下相应的平台子目录中的例如 setupsdevices.c 文件中,在这里我们进行 i2c 总线的注册以及设备的挂载。i2c-gpio 定义的结构在include/linux/i2c-gpio.h 中:/* structi2c_gpio_platform_data-Platform-dependentdatafo

3、ri2c-gpio* sda_pin:GPIOpinIDtouseforSDA* scl_pin:GPIOpinIDtouseforSCL* udelay:signaltoggledelay.SCLfrequencyis(500/udelay)kHz* timeout:clockstretchingtimeoutinjiffies.Iftheslavekeeps* SCLlowforlongerthanthis,thetransferwilltimeout.* sda_is_open_drain:SDAisconfiguredasopendrain,i.e.thepin* isntactive

4、lydrivenhighwhensettingtheoutputvaluehigh.* gpio_get_value()mustreturntheactualpinstateevenifthe* pinisconfiguredasanoutput.* scl_is_open_drain:SCLissetupasopendrain.Samerequirements* asforsda_is_open_drainapply.* scl_is_output_only:SCLoutputdriverscannotbeturnedoff.*/structi2c_gpio_platform_datauns

5、ignedintsda_pin;unsignedintscl_pin;intudelay;inttimeout;unsignedintsda_is_open_drain:1;unsignedintscl_is_open_drain:1;unsignedintscl_is_output_only:1;);其中 sda_pin 和 scl_pin 分别是 i2c 总线的数据线和时钟线, 在 i2c-gpio 中会通过 gpio_request 函数对这 2 个口进行申请,udelay 和 timeout 如果不设初值,i2c-gpio 中会自动将其设为默认值。if(pdata-udelay)bit

6、_data-udelay=pdata-udelay;elseif(pdata-scl_is_output_only)bit_data-udelay=50;/*10kHz*/elsebit_data-udelay=5;/*100kHz*/if(pdata-timeout)bit_data-timeout=pdata-timeout;elsebit_data-timeout=HZ/10;/*100ms*/初始化这个结构体后再将其装入 platform_device 结构体,方便注册:staticstructplatform_devicei2c_device=.name=device-name,.i

7、d=your-id,.dev=.platform_data=&i2c_data,/i2c_gpio_platform_data),);注册 i2c-gpio 设备将 i2c 设备挂入我们注册的总线:platformdeviceregister(&i2cdevice);staticstructi2c_board_infoi2c_device=一一一I2C_BOARD_INFO(name,i2c_device_addr),);i2cregisterboardinfo(your-id,i2cdevice,ARRAYSIZE(i2cdevice);此时我们就可以在 i2c 设备的驱动程

8、序中通过遍历所在 i2c 总线,得到其所在的地址 i2c_device_addn在 i2c 驱动中,需要注册一个 i2c_driver 的结构体,例如:staticconststructi2c_device_idlis35de_id=lis35de,0,);staticstructi2c_driverst_lis35de_driver=.probe=st_lis35de_probe,.remove=st_lis35de_remove,.suspend=st_lis35de_suspend,.resume=st_lis35de_resume,.id_table=lis35de_id,.drive

9、r=.name=lis35de,;staticint_initst_lis35de_init(void)一-printk(KERN_INFOst_lis35de_initn);returni2c_add_driver(&st_lis35de_driver);在 init 时用 i2c_add_driver(&st_lis35de_driver),此时将会对所在 i2c 总线进行遍历并得到康备而适配器等 7 言息, .目的即是使驱动得到自己的 i2c_client,在这个 i2c_client 中, 已经有了该 i2c 设备的地址等信息, 我们在驱动中定义一个新的i2c_clie

10、nt 全局变量,把得到的这个 i2c_client 传给这个全局变量,从而可以继续正面的 i2c 操作。此时我们就可以使用通用的 i2c 读写操作了。总结:直接用 GPIO 口模拟 I2C 时序和利用内核模块 i2c-gpio 虚拟 i2c 总线的区别:1 .用 GPIO 口模拟 I2C 时序不需要在系统启动时注册 I2C 总线,只需要在 I2C设备驱动中单独实现。用 i2c-gpio 模块虚拟 i2c 总线需要在系统启动时注册新的I2C 总线,并将 i2c 设备挂载到新的 i2c 总线,涉及的范围较广。2.用 GPIO 口模拟 I2C 时序,代码操作较繁琐,且不方便挂载多个 i2c设备。用

11、i2c-gpi。模块可以完全模拟 i2c 总线,可以挂载多个设备。3 .在 i2c 读写操作时, 用 GPIO 口模拟 I2C 时序需要每次根据读/写操作发送器件地址1+1/0,然后再发送寄存器地址。用 i2c-gpio 模块相当于直接在 i2c 总线上操作,在系统启动挂载 i2c 设备时已经告诉了 i2c 总线它的地址,在该设备自己的驱动中,只需要通过 i2c_add_driver 操作即可以得到其地址等诸多信息,读写操作只需要发送寄存器地址即力。附:i2c 一般的读写操作#include/*读操作:*/staticinti2c_RxData(char*rxData,intlength).structi2c_msgmsgs口=/*冠1 个字节的 i2c 设备寄存器地址告诉总线*/.addr=client-addr,.flags=0,/操作.len=1,.buf=rxData,/*从总线读取 length 个字节的数据,存入 rxData*/.addr=client-addr,.flags=I2C_M_RD,/I2C_M_RD 在 i2c.h 中被定义为 1,读操作.len=length,.buf=rxDat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论