linux源码gpio模拟i2c,linux内核gpio模拟i2c实例.doc
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相关推荐
- Linux源码目录结构和Linux文件系统目录结构
学习Linux也有一段时间了,具体来整理一下Linux源码的目录结构和文件系统的目录结构,以便加深记忆. 一.Linux源码的目录结构 首先上一张截图,如下所示: 再看各个文件的介绍,借用一下其他资源 ...
- linux 源码 调试,开发一个Linux调试器(六):源码级逐步执行
我们计算编写这些函数异常简单的版本,但真正的调试器有 thread plan 的概念,它封装了所有的单步信息.例如,调试器可能有一些复杂的逻辑去决定断点的地位,然后有一些回调函数用于断定单步操作是否完 ...
- Linux源码研究-用户管理员手册-内核命令行参数
下面的列表是__setup(), core_param()和module_param()宏实现的内核参数,内核从命令-开始解析参数,如果参数不被识别,也不包含".",参数会被用来启 ...
- linux 源码安装node 9,linux如何安装node?
linux如何安装node?下面本篇文章就来给大家介绍一下linux下安装node的方法,希望对大家有所帮助. Node官网已经把linux下载版本更改为已编译好的版本了,我们可以直接下载解压后使用即 ...
- linux源码安装iftop,【Linux 命令】iftop安装与简单使用
iftop是linux下的一个流量监控工具,用于查看实时网络流量,反向解析IP,显示端口信息 官网:http://www.ex-parrot.com/~pdw/iftop/ 1.安装必须软件包 yum ...
- linux 源码安装浏览器,vps+linux+安装浏览器
弹性云服务器 ECS 弹性云服务器(Elastic Cloud Server)是一种可随时自助获取.可弹性伸缩的云服务器,帮助用户打造可靠.安全.灵活.高效的应用环境,确保服务持久稳定运行,提升运维效 ...
- linux内核线程socket,从Linux源码看Socket(TCP)的accept
从Linux源码看Socket(TCP)的accept 前言 笔者一直以为若是能知道从应用到框架再到操做系统的每一处代码,是一件Exciting的事情. 今天笔者就从Linux源码的角度看下Serve ...
- ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核
ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核 原以为会是很简单的事,结果还是颇废一番周折.很多情况是没有遇到过得.所以这里记录一下. 问题记录的 ...
- 编译linux源码报错,记录一次Linux内核源码编译实验
记录一次Linux内核源码编译实验 文章目录 记录一次Linux内核源码编译实验 0. 实验环境 1. 选择.下载内核源码 2. 安装必要的依赖软件以及性能要求 3. 解压.配置和编译内核源码 3.1 ...
- vscode读linux源码,vscode搭建linux内核开发环境
vscode在linux下搭建内核驱动开发环境 一.前言 Souce insight是一个阅读.开发linux内核驱动模块的好工具,但是Source insight是收费的软件,而且没有原生linux ...
最新文章
- 调整JVM堆内存解决OutOfMemoryError
- luvit 被忽视的lua 高性能框架(仿nodejs)
- myeclips/eclipse配置总结(根据网络整理)
- python 用turtle库画围棋棋盘和正、余弦函数图形
- 操作技巧——查看端口是否被占用
- ionic4监听返回事件 AppMinimize navController
- 毕业一年后我转行NLP 这几点宝贵经验分享给大家
- PHP——下载图片到本地代码
- 【WH】MVC数据分页扩展类
- javascript优缺点
- python脚本实现QQ自动发送消息
- 基于stc15f2k60s2芯片单片机编程(计算器,不完美)
- JAVAFX的webview中的webkit支持WindowsXP系统
- 各种音视频编解码学习详解(7)--微软Windows Media系列
- 新浪邮箱注册,email注册申请
- 苹果服务器系统状态查询网址
- 三、box 盒子模型
- Markdown怎么加入emoji
- 永安行专利侵权胜诉,IPO并未搁置
- 单位冲激函数与单位阶跃函数
热门文章
- MapReduce 示例:减少 Hadoop MapReduce 中的侧连接
- 大咖布道丨证券行业规模化敏捷和核心能力演进
- 3行!仅3行代码就能抓取B站数据
- 一文快速掌握IPv6基础知识及使用指南
- 【华为云技术分享】选择困难症必看!云服务器操作系统选择技巧+经验
- 【华为云技术分享】Linux内核模块依赖图绘制(2)
- 失去循环标签的Python,我这样实现跳出外层循环
- 带着canvas去流浪系列之一:绘制柱状图
- java mongodb 多文档_如何通过Java在MongoDB中一次性插入多个文档
- Kotlin学习笔记22 协程part2 join CoroutineScope 协程vs线程