android 查看gpio状态_GPIO子系统重要概念
来源:百问网
作者:韦东山
本文字数:3161,阅读时长:5分钟
1.1 引入
- 要操作GPIO引脚,先把所用引脚配置为GPIO功能,这通过Pinctrl子系统来实现。
- 然后就可以根据设置引脚方向(输入还是输出)、读值──获得电平状态,写值──输出高低电平。
- 以前我们通过寄存器来操作GPIO引脚,即使LED驱动程序,对于不同的板子它的代码也完全不同。
- 当BSP工程师实现了GPIO子系统后,我们就可以:
a. 在设备树里指定GPIO引脚
b. 在驱动代码中:
使用GPIO子系统的标准函数获得GPIO、设置GPIO方向、读取/设置GPIO值。
这样的驱动代码,将是单板无关的。
1.2 在设备树中指定引脚
在几乎所有ARM芯片中,GPIO都分为几组,每组中有若干个引脚。所以在使用GPIO子系统之前,就要先确定:它是哪组的?组里的哪一个?
在设备树中,“GPIO组”就是一个GPIO Controller,这通常都由芯片厂家设置好。我们要做的是找到它名字,比如“gpio1”,然后指定要用它里面的哪个引脚,比如。
有代码更直观,下图是一些芯片的GPIO控制器节点,它们一般都是厂家定义好,在xxx.dtsi文件中:
我们暂时只需要关心里面的这2个属性:
gpio-controller;#gpio-cells = <2>;
“gpio-controller”表示这个节点是一个GPIO Controller,它下面有很多引脚。
“#gpio-cells = <2>”表示这个控制器下每一个引脚要用2个32位的数(cell)来描述。
为什么要用2个数?其实使用多个cell来描述一个引脚,这是GPIO Controller自己决定的。比如可以用其中一个cell来表示那是哪一个引脚,用另一个cell来表示它是高电平有效还是低电平有效,甚至还可以用更多的cell来示其他特性。
普遍的用法是,用第1个cell来表示哪一个引脚,用第2个cell来表示有效电平:
GPIO_ACTIVE_HIGH : 高电平有效GPIO_ACTIVE_LOW : 低电平有效
定义GPIO Controller是芯片厂家的事,我们怎么引用某个引脚呢?在自己的设备节点中使用属性"[-]gpios",示例如下:
上图中,可以使用gpios属性,也可以使用name-gpios属性。
1.3 在驱动代码中调用GPIO子系统
在设备树中指定了GPIO引脚,在驱动代码中如何使用?
也就是GPIO子系统的接口函数是什么?
GPIO子系统有两套接口:基于描述符的(descriptor-based)、老的(legacy)。前者的函数都有前缀“gpiod_”,它使用gpio_desc结构体来表示一个引脚;后者的函数都有前缀“gpio_”,它使用一个整数来表示一个引脚。
要操作一个引脚,首先要get引脚,然后设置方向,读值、写值。
驱动程序中要包含头文件,#include // descriptor-based或#include // legacy
下表列出常用的函数:
有前缀“devm_”的含义是“设备资源管理”(Managed Device Resource),这是一种自动释放资源的机制。它的思想是“资源是属于设备的,设备不存在时资源就可以自动释放”。
比如在Linux开发过程中,先申请了GPIO,再申请内存;如果内存申请失败,那么在返回之前就需要先释放GPIO资源。
如果使用devm的相关函数,在内存申请失败时可以直接返回:设备的销毁函数会自动地释放已经申请了的GPIO资源。
建议使用“devm_”版本的相关函数。
举例,假设备在设备树中有如下节点:
foo_device {compatible = "acme,foo";...led-gpios = , /* red */ , /* green */ ; /* blue */power-gpios = ;};
那么可以使用下面的函数获得引脚:
struct gpio_desc *red, *green, *blue, *power;red = gpiod_get_index(dev, "led", 0, GPIOD_OUT_HIGH);green = gpiod_get_index(dev, "led", 1, GPIOD_OUT_HIGH);blue = gpiod_get_index(dev, "led", 2, GPIOD_OUT_HIGH);power = gpiod_get(dev, "power", GPIOD_OUT_HIGH);
要注意的是,gpiod_set_value设置的值是“逻辑值”,不一定等于物理值。
什么意思?
旧的“gpio_”函数没办法根据设备树信息获得引脚,它需要先知道引脚号。
引脚号怎么确定?
在GPIO子系统中,每注册一个GPIO Controller时会确定它的“base number”,那么这个控制器里的第n号引脚的号码就是:base number + n。
但是如果硬件有变化、设备树有变化,这个base number并不能保证是固定的,应该查看sysfs来确定base number。
1.4 sysfs中的访问方法
在sysfs中访问GPIO,实际上用的就是引脚号,老的方法。
a. 先确定某个GPIO Controller的基准引脚号(base number),再计算出某个引脚的号码。方法如下:
② 然后进入某个gpiochip目录,查看文件label的内容
③ 根据label的内容对比设备树
label内容来自设备树,比如它的寄存器基地址。用来跟设备树(dtsi文件)比较,就可以知道这对应哪一个GPIO Controller。
下图是在100asK_imx6ull上运行的结果,通过对比设备树可知gpiochip96对应gpio4:
所以gpio4这组引脚的基准引脚号就是96,这也可以“cat base”来再次确认。① 先在开发板的/sys/class/gpio目录下,找到各个gpiochipXXX目录:
② 然后进入某个gpiochip目录,查看文件label的内容
③ 根据label的内容对比设备树
label内容来自设备树,比如它的寄存器基地址。用来跟设备树(dtsi文件)比较,就可以知道这对应哪一个GPIO Controller。
下图是在100asK_imx6ull上运行的结果,通过对比设备树可知gpiochip96对应gpio4:
所以gpio4这组引脚的基准引脚号就是96,这也可以“cat base”来再次确认。
b. 基于sysfs操作引脚:
以100ask_imx6ull为例,它有一个按键,原理图如下:
那么GPIO4_14的号码是96+14=110,可以如下操作读取按键值:
echo 110 > /sys/class/gpio/exportecho in > /sys/class/gpio/gpio110/directioncat /sys/class/gpio/gpio110/valueecho 110 > /sys/class/gpio/unexport
注意:如果驱动程序已经使用了该引脚,那么将会export失败,会提示下面的错误:
对于输出引脚,假设引脚号为N,可以用下面的方法设置它的值为1:
echo N > /sys/class/gpio/exportecho out > /sys/class/gpio/gpioN/directionecho 1 > /sys/class/gpio/gpioN/valueecho N > /sys/class/gpio/unexport
可以点击“了解更多”与韦东山老师交流
android 查看gpio状态_GPIO子系统重要概念相关推荐
- android 查看gpio状态_iTOP-iMX6开发板-GPIO读写配置文档_V1.0《2》
本文档主要介绍 iMX6 板子 gpio 引脚读写配置.有关平台文件的设备注册的资料可以参 考"iTOP-iMX6-平台文件注册设备"文档.注册的设备名称是"gpio_c ...
- android 查看gpio状态_android gpio 调试
android gpio 调试 gpio_chip gpio 端口控制芯片 gpio 端口:系统全局的gpio号 gpio口dts配置qcom,msm-ear-hac-pa = ;这里的msm_gpi ...
- Linux应用层操作GPIO,查看GPIO状态
1.操作GPIO system("echo 421 >/sys/class/gpio/export"); system("echo out >/sys/cla ...
- wringPi 初始化GPIO 为上拉_GPIO子系统重要概念
来源:百问网 作者:韦东山 本文字数:3161,阅读时长:5分钟 1.1 引入 要操作GPIO引脚,先把所用引脚配置为GPIO功能,这通过Pinctrl子系统来实现. 然后就可以根据设置引脚方向(输入 ...
- 查看gpio状态_基于Arduino开发,借助blinker平台,让NodeMCU实现8路继电器APP端状态监视和控制...
基于Arduino开发,借助blinker物联网平台,让NodeMCU实现8路继电器APP端状态监视和控制 先上开发板功能图: 本文利用了NodeMCU上的D0-D3,D5-D9,总共 8个 GPIO ...
- 香橙派orangepi查看 GPIO当前状态方法: 安装wiringOP
树莓派orangepi查看GPIO当前状态 方法:安装GPIO库接口wiringpid,而香橙派orangepi跟树莓派的方法不一样,是用wiringOP, 而wiringOP是从wiringpi改造 ...
- Android 4.4(KitKat)表格管理子系统 - 骨架
原文地址:http://blog.csdn.net/jinzhuojun/article/details/37737439 窗体管理系统是Android中的主要子系统之中的一个.它涉及到App中组件的 ...
- 【Android开发教程】一、基础概念
Android操作系统 Android是一个基于Linux.使用java作为程序接口的操作系统.他提供了一些工具,比如编译器.调试器.还有他自己的仿真器(DVM - Dalvik Virtual Ma ...
- “.NET研究”【Android开发教程】一、基础概念
Android操作系统 Android是一个基于Linux.使用java作为程序接口的操作系统.他提供了一些工具,比如编译器.调试器.还有他自己的仿真器(DVM - Dalvik Virtual Ma ...
最新文章
- application.xml定时
- CANOpen数据存档文件
- CVPR 2021 论文/代码分类汇总!持续更新中!
- CSS默认可继承样式
- ecshop添加404页面
- 下载faceScrub人脸数据库 (多线程版本)
- 记录一次es写入操作
- NLP算法-情绪分析-snowNLP算法库
- 数据分析师出品丨采购周报模板
- 香港流行乐黄金二十年——经典歌手(音乐人)全面回顾 二
- Codeforces 128 A Statues【预处理+Bfs】
- 专利第三方评估_什么是第三方风险评估,您该如何做?
- maven将第三方依赖包添加到pom文件
- C语言课间程序设计实践报告
- ARM嵌入式体系架构(理论篇)
- djcpth计算机实验报告,计算机组成原理实验
- Excel插件获取单元格批注以及设置批注
- SPI、I2C、UART、I2S、GPIO、SDIO、CAN,你能分清楚吗?
- CANoe-RS485/RS232
- Webpack与其他打包工具的区别