linux内核gpio模拟i2c实例.doc

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条GPIO线的i2c设备可以直接使用Linux内核通用的i2c设备注册,传输和注销等方法。步骤:首先确认在注册i2c-gpio模块前,所要用到的2条GPIO口是没有被系统其它地方所调用的。在每个系统平台启动时,都会打开一系列的设备,他们通常实现在arch/目录下相应的平台子目录中的例如setup.c,devices.c文件中,在这里我们进行i2c总线的注册以及设备的挂载。i2c-gpio定义的结构在include/linux/i2c-gpio.h中:/***structi2c_gpio_plat_data-Plat-dependentdatafori2c-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*isn tactivelydrivenhighwhensettingtheoutputvaluehigh.*gpio_get_value()mustreturntheactualpinstateevenifthe*pinisconfiguredasanoutput.*@scl_is_open_drain:SCLissetupasopendrain.Samerequirements*asforsda_is_open_drainapply.*@scl_is_output_only:SCLoutputdriverscannotbeturnedoff.*/structi2c_gpio_plat_data{unsignedintsda_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_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*/初始化这个结构体后再将其装入plat_device结构体,方便注册:staticstructplat_devicei2c_device={.name=“device-name“,.id=your-id,.dev={.plat_data=注册i2c-gpio设备将i2c设备挂入我们注册的总线:plat_device_register(staticstructi2c_board_infoi2c_device[]={{I2C_BOARD_INFO(“name“,i2c_device_addr),}};i2c_register_board_info(your-id,i2c_device,ARRAY_SIZE(i2c_device));此时我们就可以在i2c设备的驱动程序中通过遍历所在i2c总线,得到其所在的地址i2c_device_addr。在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,.driver={.name=“lis35de“,},};staticint__initst_lis35de_init(void){printk(KERN_INFO“st_lis35de_init\n“);returni2c_add_driver(}在init时用i2c_add_driver(&st_lis35de_driver),此时将会对所在i2c总线进行遍历并得到该设备的适配器等信息,主要目的即是使驱动得到自己的i2c_client,在这个i2c_client中,已经有了该i2c设备的地址等信息,我们在驱动中定义一个新的i2c_client全局变量,把得到的这个i2c_client传给这个全局变量,从而可以继续后面的i2c操作。此时我们就可以使用通用的i2c读写操作了。总结:直接用GPIO口模拟I2C时序和利用内核模块i2c-gpio虚拟i2c总线的区别:1.用GPIO口模拟I2C时序不需要在系统启动时注册I2C总线,只需要在I2C设备驱动中单独实现。用i2c-gpio模块虚拟i2c总线需要在系统启动时注册新的I2C总线,并将i2c设备挂载到新的i2c总线,涉及的范围较广。2.用GPIO口模拟I2C时序,代码操作较繁琐,且不方便挂载多个i2c设备。用i2c-gpio模块可以完全模拟i2c总线,可以挂载多个设备。3.在i2c读写操作时,用GPIO口模拟I2C时序需要每次根据读/写操作发送器件地址/*读操作:*/staticinti2c_RxData(char*rxData,intlength){str

linux源码gpio模拟i2c,linux内核gpio模拟i2c实例.doc相关推荐

  1. Linux源码目录结构和Linux文件系统目录结构

    学习Linux也有一段时间了,具体来整理一下Linux源码的目录结构和文件系统的目录结构,以便加深记忆. 一.Linux源码的目录结构 首先上一张截图,如下所示: 再看各个文件的介绍,借用一下其他资源 ...

  2. linux 源码 调试,开发一个Linux调试器(六):源码级逐步执行

    我们计算编写这些函数异常简单的版本,但真正的调试器有 thread plan 的概念,它封装了所有的单步信息.例如,调试器可能有一些复杂的逻辑去决定断点的地位,然后有一些回调函数用于断定单步操作是否完 ...

  3. Linux源码研究-用户管理员手册-内核命令行参数

    下面的列表是__setup(), core_param()和module_param()宏实现的内核参数,内核从命令-开始解析参数,如果参数不被识别,也不包含".",参数会被用来启 ...

  4. linux 源码安装node 9,linux如何安装node?

    linux如何安装node?下面本篇文章就来给大家介绍一下linux下安装node的方法,希望对大家有所帮助. Node官网已经把linux下载版本更改为已编译好的版本了,我们可以直接下载解压后使用即 ...

  5. linux源码安装iftop,【Linux 命令】iftop安装与简单使用

    iftop是linux下的一个流量监控工具,用于查看实时网络流量,反向解析IP,显示端口信息 官网:http://www.ex-parrot.com/~pdw/iftop/ 1.安装必须软件包 yum ...

  6. linux 源码安装浏览器,vps+linux+安装浏览器

    弹性云服务器 ECS 弹性云服务器(Elastic Cloud Server)是一种可随时自助获取.可弹性伸缩的云服务器,帮助用户打造可靠.安全.灵活.高效的应用环境,确保服务持久稳定运行,提升运维效 ...

  7. linux内核线程socket,从Linux源码看Socket(TCP)的accept

    从Linux源码看Socket(TCP)的accept 前言 笔者一直以为若是能知道从应用到框架再到操做系统的每一处代码,是一件Exciting的事情. 今天笔者就从Linux源码的角度看下Serve ...

  8. ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核

    ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核 原以为会是很简单的事,结果还是颇废一番周折.很多情况是没有遇到过得.所以这里记录一下. 问题记录的 ...

  9. 编译linux源码报错,记录一次Linux内核源码编译实验

    记录一次Linux内核源码编译实验 文章目录 记录一次Linux内核源码编译实验 0. 实验环境 1. 选择.下载内核源码 2. 安装必要的依赖软件以及性能要求 3. 解压.配置和编译内核源码 3.1 ...

  10. vscode读linux源码,vscode搭建linux内核开发环境

    vscode在linux下搭建内核驱动开发环境 一.前言 Souce insight是一个阅读.开发linux内核驱动模块的好工具,但是Source insight是收费的软件,而且没有原生linux ...

最新文章

  1. 调整JVM堆内存解决OutOfMemoryError
  2. luvit 被忽视的lua 高性能框架(仿nodejs)
  3. myeclips/eclipse配置总结(根据网络整理)
  4. python 用turtle库画围棋棋盘和正、余弦函数图形
  5. 操作技巧——查看端口是否被占用
  6. ionic4监听返回事件 AppMinimize navController
  7. 毕业一年后我转行NLP 这几点宝贵经验分享给大家
  8. PHP——下载图片到本地代码
  9. 【WH】MVC数据分页扩展类
  10. javascript优缺点
  11. python脚本实现QQ自动发送消息
  12. 基于stc15f2k60s2芯片单片机编程(计算器,不完美)
  13. JAVAFX的webview中的webkit支持WindowsXP系统
  14. 各种音视频编解码学习详解(7)--微软Windows Media系列
  15. 新浪邮箱注册,email注册申请
  16. 苹果服务器系统状态查询网址
  17. 三、box 盒子模型
  18. Markdown怎么加入emoji
  19. 永安行专利侵权胜诉,IPO并未搁置
  20. 单位冲激函数与单位阶跃函数

热门文章

  1. MapReduce 示例:减少 Hadoop MapReduce 中的侧连接
  2. 大咖布道丨证券行业规模化敏捷和核心能力演进
  3. 3行!仅3行代码就能抓取B站数据
  4. 一文快速掌握IPv6基础知识及使用指南
  5. 【华为云技术分享】选择困难症必看!云服务器操作系统选择技巧+经验
  6. 【华为云技术分享】Linux内核模块依赖图绘制(2)
  7. 失去循环标签的Python,我这样实现跳出外层循环
  8. 带着canvas去流浪系列之一:绘制柱状图
  9. java mongodb 多文档_如何通过Java在MongoDB中一次性插入多个文档
  10. Kotlin学习笔记22 协程part2 join CoroutineScope 协程vs线程