Linux系统的GPIO设置(以UpBoard为例)

2023-05-16

GPIO往往是通过sys文件系统进行操作的,当我们需要验证一个GPIO口置1还是置0的话,可以通过操作sys文件来完成。
  UpBoard官方所提供的linux系统已经安装了支持UP-Board的RPi.GPIO和相应的支持。在ubilinux上这些都是可以支持使用的。但是一定要弄清楚引脚图,如果使用官网提供的系统可以按照官网的手册给出的引脚定义,但是如果是按照自己安装的Ubuntu 系统就要按照一般的Linux进行引脚与GPIO的对应的关系,具体如图(这个已经要弄清楚是GPIO对应的那个引脚):
  这里看到,这里定义的GPIO号是4那么对应到排针上的位置就是第7个引脚,但是在自己安装的系统中是第4个引脚。在这里插入图片描述

一、概述

通过 sysfs 方式控制 GPIO,先访问 /sys/class/gpio 目录,向 export 文件写入 GPIO 编号,使得该 GPIO 的操作接口从内核空间暴露到用户空间,GPIO 的操作接口包括 direction 和 value 等,direction 控制 GPIO 方向,而 value 可控制 GPIO 输出或获得 GPIO 输入。文件 IO 方式操作 GPIO,使用到了4个函数 open、close、read、write。
  
  首先,看看系统中有没有“/sys/class/gpio”这个文件夹。如果没有请在编译内核的时候加入:Device Drivers -> GPIO Support -> /sys/class/gpio/… (sysfs interface)。

二、/sys/class/gpio 的使用说明

如果是在已经适配好的 Linux 内核上,那么相信已经有了完成的 gpiochip,可以在用户空间 /sys/class/gpio 目录下看到如下文件:
export gpiochip0/ gpiochip32/ gpiochip64/ gpiochip96/ unexport
说明:

1、gpio_operation 通过 /sys/ 文件接口操作 IO 端口 GPIO 到文件系统的映射。
2、控制 GPIO 的目录位于 /sys/class/gpio。
3、/sys/class/gpio/export 文件用于通知系统需要导出控制的 GPIO 引脚编号。
4、/sys/class/gpio/unexport 用于通知系统取消导出。
5、/sys/class/gpio/gpiochipX 目录保存系统中 GPIO 寄存器的信息,包括每个寄存器控制引脚的起始编号 base,寄存器名称,引脚总数。

三、导出一个引脚的操作步骤

具体GPIO 需要参考数据手册,个别的有计算的公式。
1、首先计算此引脚编号。
引脚编号 = 控制引脚的寄存器基数 + 控制引脚寄存器位数
举个栗子(具体 GPIO 需要参考数据手册),如果使想用 GPIO1_20,那么引脚编号就可能等于 1 x 32 + 20 = 54。
2、向 /sys/class/gpio/export 写入此编号,比如12号引脚,在 shell 中可以通过以下命令实现:

	echo 12 > /sys/class/gpio/export

如果出现权限不够用的情况下要改变权限(Permission denied),下面操作中很多步提示这个问题
在这里插入图片描述

sudo chmod 777 /sys/class/gpio/export

命令成功后生成 /sys/class/gpio/gpio12 目录,如果没有出现相应的目录,说明此引脚不可导出。
s	sS
如果提示下面的错误,说明可能对应的端口不对。
在这里插入图片描述
3、direction 文件,定义输入输入方向,可以通过下面命令定义为输出。

echo out > /sys/class/gpio/gpio12/direction

direction 接受的参数可以是:in、out、high、low。其中参数 high / low 在设置方向为输出的同时,将 value 设置为相应的 1 / 0。
4、value 文件是端口的数值,为1或0,通过下面命令将 gpio12 设置为高电平。

echo 1 > /sys/class/gpio/gpio12/value

下面进行一下总结程序:

1、导出
echo 44 > /sys/class/gpio/export

2、设置方向
echo out > /sys/class/gpio/gpio44/direction

3、查看方向
cat /sys/class/gpio/gpio44/direction

4、设置输出
echo 1 > /sys/class/gpio/gpio44/value

5、查看输出值
cat /sys/class/gpio/gpio44/value

6、取消导出

echo 44 > /sys/class/gpio/unexport

五、文件读写例程

1、在用户空间使用

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
 
//芯片复位引脚: P1_16
#define SYSFS_GPIO_EXPORT           "/sys/class/gpio/export" 
#define SYSFS_GPIO_RST_PIN_VAL      "48"  
#define SYSFS_GPIO_RST_DIR          "/sys/class/gpio/gpio48/direction"
#define SYSFS_GPIO_RST_DIR_VAL      "OUT" 
#define SYSFS_GPIO_RST_VAL          "/sys/class/gpio/gpio48/value"
#define SYSFS_GPIO_RST_VAL_H        "1"
#define SYSFS_GPIO_RST_VAL_L        "0"
 
int main()
{
    int fd;
 
         //打开端口/sys/class/gpio# echo 48 > export
         fd = open(SYSFS_GPIO_EXPORT, O_WRONLY);
         if(fd == -1)
         {
                   printf("ERR: Radio hard reset pin open error.\n");
                   return EXIT_FAILURE;
         }
         write(fd, SYSFS_GPIO_RST_PIN_VAL ,sizeof(SYSFS_GPIO_RST_PIN_VAL));
         close(fd);
 
         //设置端口方向/sys/class/gpio/gpio48# echo out > direction
         fd = open(SYSFS_GPIO_RST_DIR, O_WRONLY);
         if(fd == -1)
         {
                   printf("ERR: Radio hard reset pin direction open error.\n");
                   return EXIT_FAILURE;
         }
         write(fd, SYSFS_GPIO_RST_DIR_VAL, sizeof(SYSFS_GPIO_RST_DIR_VAL));
         close(fd);
 
         //输出复位信号: 拉高>100ns
         fd = open(SYSFS_GPIO_RST_VAL, O_RDWR);
         if(fd == -1)
         {
                   printf("ERR: Radio hard reset pin value open error.\n");
                   return EXIT_FAILURE;
         }      
         while(1)
         {
                   write(fd, SYSFS_GPIO_RST_VAL_H, sizeof(SYSFS_GPIO_RST_VAL_H));
                   usleep(1000000);
                   write(fd, SYSFS_GPIO_RST_VAL_L, sizeof(SYSFS_GPIO_RST_VAL_L));
                   usleep(1000000);
         }
         close(fd);
 
         printf("INFO: Radio hard reset pin value open error.\n");
         return 0;
 
} 

除了上述例程的操作方法外,我们还可以有更简单地做法,就是编写 Shell 脚本。例如:

#!/bin/bash 
echo 48 > /sys/class/gpio/gpio48/export
echo out > /sys/class/gpio/gpio48/direction
echo 1 > /sys/class/gpio/gpio48/value
usleep 1000
echo 0 > /sys/class/gpio/gpio48/value

2.在内核空间使用

#include <linux/gpio.h>
 
// 这里是配置成输出,默认高电平,名称为“gpio1_20”(就是给你的IO口取个名字)
gpio_request_one(54, GPIOF_INIT_HIGH, "gpio1_20")
// 这个就是配置成输入。
gpio_request_one(54, GPIOF_IN, "gpio1_20")
// 使用完后别忘了free
gpio_free(54);

感谢下面博主的帮助:
Upboard的GPIO设置
Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
Linux Kernel 控制 GPIO LED 闪烁 (Blink)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux系统的GPIO设置(以UpBoard为例) 的相关文章

  • 从 gitlab docker runner 启动声纳扫描仪

    我有一个 CI 工作流程 集成了 linting 作业和代码质量作业 我的 Linting 工作是一个 docker runner 从应用程序代码启动我的 eslint 脚本 然后我的代码质量工作应该启动声纳扫描仪泊坞窗实例 检查我的代码并
  • Linux:通过网络进行屏幕桌面视频捕获和 VNC 帧速率

    抱歉 文字墙很长 TL DR VNC 连接的帧速率是多少 以帧 秒为单位 或者更确切地说 由谁决定 客户端还是服务器 对于桌面屏幕捕获的任何其他建议 但 正确的时间编码 具有不抖动的帧速率 具有稳定的周期 并有可能将其作为未压缩 或无损 图
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些
  • 如何使用sprof?

    请举例说明 从邮件中找到here http sources redhat com ml libc alpha 2003 07 msg00029 html and here http sourceware org ml binutils 20
  • 是否有我可以运行的操作系统命令来确定是否在基于 Xen 的虚拟机内运行

    我可以在基于 Xen 的虚拟机中运行一个操作系统命令来告诉我它是一个虚拟机而不是物理机 我听说内核对此有一些自我意识智能 例如就像 ps 输出中的额外列之类的 我知道 vmstat 提供了 st 列 但我在运行 Linux 内核 2 6 1
  • Linux下的C#,Process.Start()异常“没有这样的文件或目录”

    我在使用 Process 类调用程序来启动程序时遇到问题 可执行文件的层次结构位于 bin 目录下 而当前工作目录需要位于 lib 目录下 project bin a out this is what I need to call lib
  • Mono 和 WebRequest 速度 - 测试

    在 mono 4 6 2 linux 中 我注意到 wget 下载文件的速度与webclient DownloadString 所以我做了一个小测试来调查 为什么 wget 明显比 C 快 根据我自己的实验 使用 wget 下载 手动读取文
  • 从 Linux 命令行发送 SNMP 陷阱消息

    Folks 我需要从 Linux 命令行使用此命令 snmptrap 将自定义消息发送到陷阱侦听器 我需要根据用户设置在 v1 和 v2c 中发送相同的消息 这是我发现的 For v1 snmptrap v 1 c Tas hostname
  • Alsa 带有来自调制解调器的 PCM 接口

    我有一个基于 imx28 CPU 的定制板 CPU 的串行端口连接到调制解调器的 PCM 输出 我必须为调制解调器的 PCM 接口开发一个驱动程序 使其成为 ALSA SoC 的一部分 您能指出内核树 中与我的设置重新组合的一些驱动程序吗
  • 对 sf:: 的未定义引用

    我想用 C 制作 GUI 应用程序 发现 SFML 是一个不错的选择 幸运的是 我使用的是 Linux 所以 SFML 2 4 已经安装在我的系统上 所以我开始搜索一些教程并找到了一个制作简单窗口的教程 但是当我运行代码时 出现错误 提示未
  • Linux TCP服务器:在接受连接之前读取客户端的IP地址

    Related C Winsock API如何在接受连接之前获取连接客户端IP https stackoverflow com questions 716209 c winsock api how to get connecting cli
  • 如何使用 bash 脚本关闭所有终端,在每个终端中有效地按 Ctrl+Shift+Q

    我经常打开许多终端 其中一些正在运行重要的进程 例如服务器 而另一些则没有运行任何东西并且可以关闭 如果您按 重要 则会弹出确认提示Cntrl Shift Q在其中 如下所示 我想要一个 bash 脚本 它可以关闭所有终端 但将 重要 终端
  • 在 Ubuntu 上纯粹通过 bash 脚本安装 mysql 5.7

    我想要一个无需任何手动输入即可安装 MySQL 5 7 实例的 bash 脚本 我正在关注数字海洋教程 https www digitalocean com community tutorials how to install mysql
  • gnome-terminal 新选项卡,使用别名作为要执行的命令

    我已经创建了一个别名 bashrc文件如下 alias myproject cd Desktop myproject 当我重新启动终端时保存文件后 输入myproject带我到项目目录 但是当我尝试使用别名作为新的命令参数时gnome te
  • 在中断时获取 current->pid

    我正在Linux调度程序上写一些东西 我需要知道在我的中断到来之前哪个进程正在运行 当前的结构可用吗 如果我在中断处理程序中执行 current gt pid 我是否可以获得我中断的进程的 pid 你可以 current gt pid存在并
  • 是否有可能在linux中找到包含特定文本的文件?

    考虑这种情况 我在文件夹 Example 下有很多文件 如果我需要找到一个包含特定短语 如 Class Example 的文件 我该如何使用 Linux shell 来做到这一点 linux中有类似 定位 的函数可以做到这一点吗 Thank
  • linux下如何获取昨天和前天?

    我想在变量中获取 sysdate 1 和 sysdate 2 并回显它 我正在使用下面的查询 它将今天的日期作为输出 bin bash tm date Y d m echo tm 如何获取昨天和前天的日期 这是另一种方法 对于昨天来说 da
  • Bash 脚本 - 迭代 find 的输出

    我有一个 bash 脚本 其中需要迭代 find 命令输出的每一行 但似乎我正在迭代 find 命令中的每个单词 以空格分隔 到目前为止我的脚本看起来像这样 folders find maxdepth 1 type d for i in f
  • 进程名称长度的最大允许限制是多少?

    进程名称允许的最大长度是多少 我正在读取进程名称 proc pid stat文件 我想知道我需要的最大缓冲区 我很确定有一个可配置的限制 但就是找不到它在哪里 根据man 2 prctl http man7 org linux man pa

随机推荐

  • Qt 判断文件或文件夹是否存在及创建文件夹

    1 判断文件夹是不是存在 参数说明 xff1a QString fullPath 文件夹全路径 方法1 bool isDirExist QString fullPath QDir dir fullPath if dir exists ret
  • Qt阻塞延时与非阻塞延时(四种方法之个人笔记)

    功能描述 毫秒级非阻塞延时函数 参数 延时毫秒数 其他说明 已试验 可用 但CPU占用率较高 void VdpuMngUI msecSleep int msec QTime dieTime 61 QTime currentTime addM
  • 获取本机所有网卡的网卡名、网卡描述、网卡MAC地址、网卡IP、网卡类型等信息及网线是否插入状态

    使用windows sdk提供的API函数GetAdaptersInfo 可以获得本机所有网卡的网卡名 网卡描述 网卡MAC地址 网卡IP 网卡类型等信息 xff0c 并用IP ADAPTER INFO结构体存储 xff0c 使用GetIf
  • C++ GUI Programming with Qt4 Second Edition 之 附录C.1 Qt Jambi入门

    Qt Jambi入门 本节 xff0c 我们将开发一个简单的Java应用程序并显示如图C 1所示的窗口 除窗口标题之外 xff0c Jambi Find对话框与第二章中创建的Find对话框的外观和功能均相同 通过使用相同的例子 xff0c
  • WinRAR 5.5 简体中文版去广告弹窗方法

    WinRAR 5 5 简体中文版去广告弹窗方法 1 下载WinRAR 5 5WinRAR官网 xff08 http www rarlab com xff09 2 下载 Resource Hacker 3 用压缩软件打开WinRAR安装包 x
  • C++子类的构造函数后面加:冒号的作用

    在C 43 43 类的构造函数中经常会看到如下格式的写法 xff1a MyWindow MyWindow QWidget parent Qt WindowFlags flag QMainWindow parent flag 上述语句中单冒号
  • “真相”重要吗?

    这是一篇个人思索的鸡汤 xff0c 并不想表达什么观点 xff0c 只是因为有了要写的冲动才写的 言归正传 xff0c 我认为 真相很重要 周末回老家看了一岁半儿子 xff0c 从国庆送回老家已经一个半月了 周日下午我临走时 xff0c 他
  • TDD(测试驱动开发)

    今天看到的新的有意思的名词 xff0c 在此将其记录下来 一 TDD是什么 xff1f Test Drive Development xff0c 是敏捷开发中的一项核心实践和技术 也是一种设计方法论 xff0c 其基本思想就是 xff1a
  • c++ 常见的一些问题总结

    目录 目录 1 深拷贝 xff08 string xff09 深拷贝的实现 xff08 xff09 2 迭代器失效 xff08 vector insert xff0c earse xff09 3 头文件展开问题 4 vector 的深浅拷贝
  • airflow 文档学习(二) - 概念

    1 核心功能 1 1 DAGs 有向无环图 反映所涉及的task的依赖关系 注 xff1a 搜索dag的时候 xff0c airflow只会关注同事包含 34 DAG 34 和 34 airflow 34 字样的py文件 1 2 scope
  • 2014创新工场校园招聘笔试题(9.16北京)

    选择题 1 若进栈序列为a b c d xff0c 进栈过程中可以出栈 xff0c 那么 xff08 xff09 不可能是一个出栈序列 A cbad B bdca C adbc D cdba 2 完全二叉树中编号为i的结点存在右孩子 xff
  • 2014美团校园招聘笔试(10.8北京)

    按照试卷要求不能透露题目具体内容 xff0c 因此本文只写考点 一共六道大题 xff0c 如下 xff1a Q1 基础题 xff0c 给出中序后序 xff0c 求前序 Q2 概率题 xff0c 求期望 Q3 概率题 xff0c 求可能性 Q
  • 2014去哪儿网校园招聘笔试(10.13北京)

    三道大题 43 两题TestCase 编程题 Q1 xff1a 实现一个字符串反转 xff0c 规则如下 xff1a 输入一个字符串str xff0c 一个分隔符delim xff0c 要求实现对分隔符之间的字符串做反转操作 xff0c 但
  • 图像处理算法工程师职位面试题汇总

    最近面试了几个图像的职位 xff0c 汇总一下面试题 图像基础知识 xff1a 1 常用的图像空间 2 简述你熟悉的聚类算法并说明其优缺点 3 请描述以下任一概念 xff1a SIFT SURF LDA PCA 4 请说出使用过的分类器和实
  • 软件开发职位面试题汇总

    10 19 去哪儿面试 1 struct和class的成员函数调用1000次后有什么执行效率方面的差异 xff1f 2 给两个int型数组A和B xff0c 长度都为n xff0c 编程实现A B 61 a1 b1 43 a2 b2 43
  • iOS8 新特性

    苹果公司在WWDC 2014上发布了许多新特性 xff0c 让我们一起来看看都有哪些内容 Contents App Extensions Touch ID Authentication Photos Games Health Kit Fra
  • 获取当前view所在页面的viewController

    一般来说 xff0c 我们可以知道一个viewController所在的view self view xff0c 或者它的子视图 self subViews 然而 xff0c 怎样知道一个view所在页面的viewController呢 x
  • [iOS] Get all UIView subviews with all property values

    转自StackOverFlow span class com style margin 0px padding 0px border 0px color rgb 128 128 128 background transparent span
  • Upgrading the delete confirmation button

    本文转载自andy heydon个人博客 ANDY HEYDON ARCHIVES ABOUT Upgrading the delete confirmation button by Andy iOS has a nice pattern
  • Linux系统的GPIO设置(以UpBoard为例)

    GPIO往往是通过sys文件系统进行操作的 xff0c 当我们需要验证一个GPIO口置1还是置0的话 xff0c 可以通过操作sys文件来完成 UpBoard官方所提供的linux系统已经安装了支持UP Board的RPi GPIO和相应的