来源:百问网

作者:韦东山

本文字数: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

可以点击“了解更多”与韦东山老师交流

wringPi 初始化GPIO 为上拉_GPIO子系统重要概念相关推荐

  1. wringPi 初始化GPIO 为上拉_GPIO接口

    //阅读完大约10min //本文中的正文,改编自以下链接评论,由于非常全面明晰,所以我将之采纳. STM32的I/O口的8种工作模式-OpenEdv-开源电子网​www.openedv.com 前言 ...

  2. wringPi 初始化GPIO 为上拉_你彻底弄清GPIO内部结构和各种模式了吗?

    据说能将处理器的GPIO(General Purpose Input and Output)内部结构和各种模式彻底弄清楚的人并不多?那现在就让多一点 GPIO的功能,简单说就是可以根据自己的需要去配置 ...

  3. wringPi 初始化GPIO 为上拉_敏矽微电子Cortex-M0学习笔记04-GPIO详解及应用实例

    前面我们已经对敏矽微电子的基于cortex m0内核的ME32F030R8T6的基本功能做了介绍,然后详细讲解了开发环境MDK的安装,pack包的安装,工程的建立及程序的仿真,紧接着讲解了ME32F0 ...

  4. wringPi 初始化GPIO 为上拉_玩转GPIO之PWM点亮呼吸灯(非树莓派)

    在这篇文章,我介绍了基于逸宸电子开发的总线适配器来点亮LED灯的基本方法! myastrotong:玩转GPIO之点灯(非树莓派)​zhuanlan.zhihu.com 这款总线适配器的介绍见这里: ...

  5. 鸿蒙开发板hi3861 hispark code 2.0 canary金丝雀版本,gpio如何上拉电阻呢?

    鸿蒙开发板hi3861 hispark code 2.0 canary金丝雀版本,gpio如何上拉电阻呢? code 2.0 LTS支持,canary没有这个功能呢 IoSetPull(WIFI_IO ...

  6. android 查看gpio状态_GPIO子系统重要概念

    来源:百问网 作者:韦东山 本文字数:3161,阅读时长:5分钟 1.1 引入 要操作GPIO引脚,先把所用引脚配置为GPIO功能,这通过Pinctrl子系统来实现. 然后就可以根据设置引脚方向(输入 ...

  7. gpio上拉失效问题

    遇到一个问题是与gpio的上拉失效有关. 先看一下我的问题描述和解决过程 关于反复重启1000整机设备,出现PXM板卡启动失败的现象问题描述: 通过当时记录的串口信息,最开始的异常出现在sdk加载上, ...

  8. MUI框架的上拉加载的深入探索和实战运用

    文章目录 上拉加载 初始化 端部上拉载荷 重置上拉加载 禁用上拉刷新 启用上拉刷新 选项卡更改图标 mui变量和plus变量分别是什么 网络请求必须用mui.ajax,调试必须用真机或模拟器 上拉加载 ...

  9. 微信小程序页面事件 - 下拉刷新与上拉触底

    一.下拉刷新 1.概念:下拉刷新是移动端的专有名词,指的是通过手指在屏幕上的下拉滑动操作,从而重新加载页面数据的行为. 2. 启用下拉刷新 启用下拉刷新有两种方式: ①全局开启下拉刷新 在 app.j ...

最新文章

  1. Jmeter之解决烦人的中文乱码问题
  2. 统计学习方法|支持向量机(SVM)原理剖析及实现
  3. 计算机应用与网络讲义,计算机基础讲义
  4. appframework3.0(JQmobi)入门教程
  5. python 接口测试 如何写配置文件_python接口自动化测试 - configparser配置文件解析器详细使用...
  6. redis笔记5 stream消息队列
  7. ajax图片上传,基于firefox
  8. 2020行政区划重新划分_邯郸市的20年,2000年-2020年区划对比,你觉得成绩如何?...
  9. 常用经典SQL语句大全完整版--详解+实例
  10. 8box这件事欠考虑
  11. 每天一道面试题--- js 中 this 指针的用法
  12. 【poj-1066】判断线段相交
  13. 帕慕克给我上的一堂编程学习课
  14. SSM 尚筹网 Vue3 + Vite + Java
  15. 硬盘插上后计算机无法识别,移动硬盘插入Mac后,在Windows无法识别
  16. SSM根据上传文件获取视频文件时长
  17. Qt如何设置控件字体有下划线
  18. 影视行业舆情监测方案
  19. 2020-08-25高级计算机系统结构-第一章-概述
  20. 淘客基地转发:关于淘宝联盟2月佣金结算时间调整通知!

热门文章

  1. 十六进制转化为ASCII码引起的的进制的故事
  2. STM32 ST link V2 固件 ST-LinkV2.J16.S4.hex
  3. 狼山会方法库:三角感觉营销系统方法论,所有营销模型的母体
  4. 新浪微博 ID与MID互转 (62进制)
  5. Windows XP万能钥匙
  6. C# 微信公众号导出历史文章
  7. linux logo程序,生成linux启动logo脚本
  8. 机器人战争显示服务器连接,飞机机器人战争城市救援
  9. 经典算法——扑克牌的顺子
  10. 【解决方案】EasyCVR打造明厨亮灶监管平台,保护舌尖上的安全