Linux下应用层使用echo 命令读取和修改GPIO的状态(/sys/class/gpio)

本文介绍了在Linux系统下如何使用echo命令读取和修改GPIO的状态。内容包括GPIO的用户接口、查看引脚占用情况、请求和释放GPIO,以及详细阐述了读取和写入GPIO的操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux 使用echo 命令读取和修改GPIO的状态


一、用户接口

所有GPIO接口都基于/sys/class/gpio/

二、看看引脚被占用情况

cat /sys/kernel/debug/gpio

示例:

在这里插入图片描述

如图所示可以查看哪些引脚已经被使用以及配置模式和当前电平状态

三、引脚请求和释放

首先必须请求GPIO。所以如果我们想请求gpio6,我们会这样做:

root:/> echo 6 > /sys/class/gpio/export

如果此过程成功,您将得到一个 /sys/class/gpio/gpio6/ 目录。

然后,当我们完成它,我们会释放它通过做:

root:/> echo 6 > /sys/class/gpio/unexport
最后可以通过 cat /sys/kernel/debug/gpio 命令查看是否释放成功

四、gpio读/写

在特定的GPIO目录

#!/bin/sh echo 4 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio4/direction echo 0 > /sys/class/gpio/gpio4/value echo 9 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio9/direction echo 1 > /sys/class/gpio/gpio9/value echo 12 > /sys/class/gpio/export echo 1n > /sys/class/gpio/gpio9/direction echo 2 > /sys/class/gpio/gpio12/value echo 4 > /sys/class/gpio/unexport echo 9 > /sys/class/gpio/unexport echo 12> /sys/class/gpio/unexport ~ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #include <dirent.h> #include <string.h> #include <sys/stat.h> #include <sys/types.h> #define GPIO_NUM 12 // 使用GPIO引脚号 #define SHORT_PRESS_TIME 1 // 短按时间阈值(秒) #define LONG_PRESS_TIME 3 // 长按时间阈值(秒) #define CONFIG_PATH "/home/zn/xyconfig.ini" // 配置文件路径 int init_daemon(void) { int pid; int i; if (pid = fork()) { exit(0); } //是父进程,结束父进程 else if (pid < 0) { exit( -1 ); } //fork 失败,退出 setsid(); //第一子进程成为新的会话组长进程组长 //并与控制终端分离 if (pid = fork()) { exit(0); } //是第一子进程,结束第一子进程 else if (pid < 0) { exit(1); } //fork 失败,退出 //第二子进程不再是会话组长 for(i=0; i< getdtablesize(); ++i) //关闭打开的文件描述符 close(i); chdir("/tmp"); //改变工作目录到 /tmp umask(0); //重设文件创建掩模 return; } void gpio_init() { // 导出GPIO FILE *fp = fopen("/sys/class/gpio/export", "w"); if(fp) { fprintf(fp, "%d", GPIO_NUM); fclose(fp); } // 设置输入方向 char path[50]; sprintf(path, "/sys/class/gpio/gpio%d/direction", GPIO_NUM); fp = fopen(path, "w"); if(fp) { fprintf(fp, "in"); fclose(fp); } } void gpio_cleanup() { // 取消导出GPIO FILE *fp = fopen("/sys/class/gpio/unexport", "w"); if(fp) { fprintf(fp, "%d", GPIO_NUM); fclose(fp); } } int read_gpio_value() { char path[50]; sprintf(path, "/sys/class/gpio/gpio%d/value", GPIO_NUM); FILE *fp = fopen(path, "r"); if(!fp) return -1; char buf[2]; fread(buf, 1, sizeof(buf), fp);
03-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章鱼哥嵌入式开发

坚持不易,你们的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值