高通平台中gpio简单操作和调试

做底层驱动免不了gpio打交道,所以对其操作和调试进行了一下简单的梳理

一、gpio的调试方法

        在Linux下,通过sysfs,获取gpio状态,也可以操作gpio。

1、获取gpio状态

        cd /sys/kernel/debug/

        cat gpio

2、操作gpio(以gpio99为例)

        cd /sys/class/gpio/

        echo 99 > export

        cd gpio99

        echo in/out > direction    //设置gpio输入或输出

        cat direction                    //获取gpio输入输出状态

        echo 'value' > value        //设置gpio寄存器值

        cat value                        //获取gpio寄存器的值


二、在kernel代码中操作gpio

        在代码中有两种方式操作gpio,一种是一次申请单个gpio,成功后操纵该gpio,另一种是使用pinctrl,通过设备树设置,一次操作多个gpio。

1、方法一

        设备树设备节点中添加gpio    //可选

        device_node {

                ...

                gpio_name = <&tlmm 99 0>;    //gpio_99

                ...

        }

        驱动代码:

  1.        int gpio_99 = of_get_named_gpio_flags(dev->of_node, "gpio_name", 0, NULL);    //从设备数节点, 可选
  2.        gpio_request(gpio_99, "gpio_name");        //通过gpio号申请gpio
  3.        gpio_direction_output(gpio_99, 1);            //设置gpio_99输出,初始值为1
  4.        gpio_set_value(gpio_99, 0);                    //设置gpio_99值为0
  5.        gpio_free(gpio_99);                                //gpio_99不再使用后应当释放

        注:

        gpio的申请和设置都可能会出现失败的情况,应该做好异常处理


2、方法二

        设备树代码:

        平台pinctrl节点下添加如下子节点:

        相关文档和设备树配置详解见kernel/Document/pinctrl.txt和Documentation/devicetree/bindings/pinctrl/下多个文件

        gpio_group {

                gpio_active: gpio_active {

                       mux {

                                pins = "gpio99", "gpio98";    //复用引脚99和98

                                functions = "gpio";            //引脚功能配置为普通gpio

                        };

                        config {

                                pins = "gpio99", "gpio98";

                                drive-strength = <8>;    //最大电流限制为8mA

                                bias-pull-up;                //配置上拉

                                output-high;                //输出高电平

                         };

                };

                gpio_sleep: gpio_sleep {

                       mux {

                                pins = "gpio99", "gpio98";    //复用引脚99和98

                                functions = "gpio";            //引脚功能配置为普通gpio

                        };

                        config {

                                pins = "gpio99", "gpio98";

                                drive-strength = <2>;    //最大电流限制为2mA

                                bias-no-pull;                //不上拉也不下拉

                                output-low;                //输出低电平

                         }; 

        };


        设备节点中引用pinctrl:

        device_node {

                    ...

                    pinctrl-names = "gpio_active", "gpio_sleep";    //分别对用pinctrl-0和pinctrl-1

                    pinctrl-0 = <&gpio_active>;                               //引用

                    pinctrl-1 = <&gpio_sleep>;                                //引用

                    ...

        };


        内核驱动代码:


  1.        struct pinctrl *pinctrl = devm_pinctrl_get(device);    //获取device对应节点下的pinctrl
  2.        struct pinctrl_state = pinctrl_lookup_state(pinctrl, "gpio_active");    //通过pinctrl名获取pinctrl对应状态
  3.        pinctrl_select_state(pinctrl, pinctrl_state);        //设置pinctrl的状态为'gpio_active
  4.        devm_pinctrl_put(pinctrl);          //使用完了释放资源

        也可以同时使用方法一和方法二,方法一操作简单,但是只能拉高或拉低,而方法二可全面配置GPIO。在一个设备驱动中同时使用方法一和方法二可保证资源不被其他模块操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win10系统下使用anaconda在虚拟环境下安装CUDA及CUDNN

前排预警&#xff1a;不要挂梯子!!!!!使用清华源就行不然报错&#xff01;&#xff01;&#xff01;&#xff01; 解决check_hostname requires server_hostname_orange_の_呜的博客-CSDN博客错误描述在GitHub下载代码文件后使用pip install -r requirement.txt下载依赖包时出…

jlink问题

现在淘宝上买到的JLINK都是盗版的&#xff0c;用着用着的时候就会遇到各种异常问题&#xff0c; 这里有一个方法来修改SN&#xff0c;修改SN后就会变得正常了&#xff0c;亲测有效 两种固件: V*_ID-自定义.* 是出厂设置,烧入后用jlink.exe连接上S/N会显示-1. 此时可以根据自己的…

将XML格式转化为YOLO需要的txt格式(代码)

1、XML的格式 <annotation><folder>cr</folder><filename>crazing_2.jpg</filename><source><database>NEU-DET</database></source><size><width>200</width><height>200</height><…

js 点击button切换颜色_ThingJS 和three.js开发示例对比,让开发早点下班回家!3D 可视化...

ThingJS 3D框架简化了开发工作&#xff0c;面向对象和模块化的特点使得网页代码更加易于管理和维护&#xff0c;并且提供近200个官方示例&#xff0c;直接获取API能力&#xff0c;不需要基于3D概念进行开发&#xff0c;适合3D商业项目快速生成&#xff01;距离您的业务仅一层之…

变量命名

列举一下我自己的一些写法 local_int_loop_count global_int_data_count local_bool_plug_insert_flag global_bool_ble_connect_flag函数命名 get_tick_number set_tick_number为了代码清晰易懂&#xff0c;通常变量名采用一些著名的命名规则&#xff0c;主要有Camel标记法&am…

VSCode使用技巧——Ctrl+鼠标滚轮键使字体进行缩放

点击VSCode左下角的齿轮&#xff0c;进入设置 进入Extensions——》JSON——》Edit in settings.json 在json当中添加如下&#xff1a; "editor.mouseWheelZoom": true,

python 交互式可视化库_Python 交互式可视化库

Python 交互式可视化库 所属分类&#xff1a;中间件编程 开发工具&#xff1a;Python 文件大小&#xff1a;12843KB 下载次数&#xff1a;1 上传日期&#xff1a;2018-12-06 18:40:56 上 传 者&#xff1a;孤独的老张 说明&#xff1a; 一个 Python 交互式可视化库&#xff0c;…

OpenCV各版本差异与演化,从1.x到4.0

最近因项目需要&#xff0c;得把OpenCV捡起来&#xff0c;登录OpenCV官网&#xff0c;竟然发现release了4.0.0-beata版本&#xff0c;所以借此机会&#xff0c;查阅资料&#xff0c;了解下OpenCV各版本的差异及其演化过程&#xff0c;形成了以下几点认识&#xff1a; 新版本的…

python题库刷题训练软件_Python基础练习100题 ( 11~ 20)

刷题继续 上一期和大家分享了前10道题&#xff0c;今天继续来刷11~20 Question 11: Write a program which accepts a sequence of comma separated 4 digit binary numbers as its input and then check whether they are divisible by 5 or not. The numbers that are divisi…

如何学习计算机图形学

http://blog.csdn.net/szchtx/article/details/6916675转载于:https://www.cnblogs.com/ArcherHuang/p/6574560.html

shell for循环

weiqifaubuntu:~/qcom$ for i in $(seq 1 1 10) > do > echo "hello World" > done hello World hello World hello World hello World hello World hello World hello World hello World hello World hello World weiqifaubuntu:~/qcom$ 输入for i in $(s…

西门子s7-200解密软件下载_西门子S7-200/300/400通讯方式汇总,超级全面

1西门子 200 plc 使用 MPI 协议与组态王进行通讯时需要哪些设置?1)在运行组态王的机器上需要安装西门子公司提供的 STEP7 Microwin 3.2 的编程软件&#xff0c;我们的驱动需要调用编程软件提供的 MPI 接口库函数;2)需要将 MPI 通讯卡 CP5611 卡安装在计算机的插槽中&#xff0…

如何监控NVIDIA GPU 的运行状态和使用情况

设备跟踪和管理正成为机器学习工程的中心焦点。这个任务的核心是在模型训练过程中跟踪和报告gpu的使用效率。 有效的GPU监控可以帮助我们配置一些非常重要的超参数&#xff0c;例如批大小&#xff0c;还可以有效的识别训练中的瓶颈&#xff0c;比如CPU活动(通常是预处理图像)占…

进程和线程的本质和区别

进程是什么&#xff1f; 程序并不能单独运行&#xff0c;只有将程序装载到内存中&#xff0c;系统为它分配资源才能运行&#xff0c;而这种执行的程序就称之为进程。程序和进程的区别就在于&#xff1a;程序是指令的集合&#xff0c;它是进程运行的静态描述文本&#xff1b;进程…

HBase学习笔记——概念及原理

1.什么是HBase HBase – Hadoop Database&#xff0c;是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase利用Hadoop HDFS作为其文件存储系统&#xff0c;利用Hadoop MapReduce来处理HBas…

.bat是什么语言_简单说说当我们打开网页时,浏览器到底做了什么?

前言&#xff1a;为什么我们需要掌握浏览器的原理作为一名前端研发&#xff0c;平日里打交道最多的&#xff0c;就是各式各样的客户端。不论你是针对pc端还是移动端&#xff0c;甚至是专门在微信端做前端研发&#xff0c;都需要跟一样东西接触——浏览器。不知道你有没有留意过…

花书《深度学习》代码实现:02 概率部分:概率密度函数+期望+常见概率分布代码实现

1 概率 1.1 概率与随机变量 频率学派概率 (Frequentist Probability)&#xff1a;认为概率和事件发⽣的频率相关。贝叶斯学派概率 (Bayesian Probability)&#xff1a;认为概率是对某件事发⽣的确定程度&#xff0c;可以理解成是确信的程度。随机变量 (Random Variable)&…

内存泄露Lowmemorykiller分析

01 前言 最近疫苗事情非常火热,这件事情让我对刘强东有点刮目相看,我们需要更多的人关注曝光此类问题 02 正文 Android Kernel 会定时执行一次检查,杀死一些进程,释放掉内存。Low memory killer 是定时进行检查。Low memory killer 主要是通过进程的oom_adj 来判定进程的…

腾讯官网生成qq在线客服代码

http://jingyan.baidu.com/article/e2284b2b42ce8ce2e6118ddd.html转载于:https://www.cnblogs.com/diyunpeng/p/6576696.html

TabError: inconsistent use of tabs and spaces in indentation

本文使用PyCharm的格式化代码功能解决TabError: inconsistent use of tabs and spaces in indentation。 1、提出问题&#xff1a; 当把代码从别处复制进来PyCharm&#xff0c;然后运行报错&#xff1a;TabError: inconsistent use of tabs and spaces in indentation 2、 分…