// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2022 Wesion Technology Co., Ltd.
*
* Author: Yan <yan-wyb@foxmail.com>
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <poll.h>
#define SYSFS_GPIO_DIR "/sys/class/gpio"
#define MAX_BUF 255
int gpio_export(unsigned int gpio){
int fd, len;
char buf[MAX_BUF];
fd = open(SYSFS_GPIO_DIR "/export", O_WRONLY);
if (fd < 0) {
fprintf(stderr, "Can't export GPIO %d pin: %s\n", gpio, strerror(errno));
return fd;
}
len = snprintf(buf, sizeof(buf), "%d", gpio);
write(fd, buf, len);
close(fd);
return 0;
}
int gpio_unexport(unsigned int gpio){
int fd, len;
char buf[MAX_BUF];
fd = open(SYSFS_GPIO_DIR "/unexport", O_WRONLY);
if (fd < 0) {
fprintf(stderr, "Can't unexport GPIO %d pin: %s\n", gpio, strerror(errno));
return fd;
}
len = snprintf(buf, sizeof(buf), "%d", gpio);
write(fd, buf, len);
close(fd);
return 0;
}
int gpio_set_edge(unsigned int gpio, char *edge){
int fd, len;
char buf[MAX_BUF];
len = snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/edge", gpio);
fd = open(buf, O_WRONLY);
if (fd < 0) {
fprintf(stderr, "Can't set GPIO %d pin edge: %s\n", gpio, strerror(errno));
return fd;
}
write(fd, edge, strlen(edge)+1);
close(fd);
return 0;
}
int gpio_set_pull(unsigned int gpio, char *pull){
int fd, len;
char buf[MAX_BUF];
len = snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/pull", gpio);
fd = open(buf, O_WRONLY);
if (fd < 0) {
fprintf(stderr, "Can't set GPIO %d pin pull: %s\n", gpio, strerror(errno));
return fd;
}
write(fd, pull, strlen(pull)+1);
close(fd);
return 0;
}
int main(int argc, char *argv[])
{
struct pollfd fdset[2];
int fd, ret, gpio;
char buf[MAX_BUF];
if (argc < 3 || argc > 4) {
fprintf(stdout, "usage : sudo sysfs_irq_test <gpio> <edge> [pull]\n");
fflush(stdout);
return -1;
}
gpio = atoi(argv[1]);
if (gpio_export(gpio)) {
fprintf(stdout, "error : export %d\n", gpio);
fflush(stdout);
return -1;
}
if (gpio_set_edge(gpio, argv[2])) {
fprintf(stdout, "error : edge %s\n", argv[2]);
fflush(stdout);
return -1;
}
if (argv[3] && gpio_set_pull(gpio, argv[3])) {
fprintf(stdout, "error : pull %s\n", argv[3]);
fflush(stdout);
return -1;
}
snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio);
fd = open(buf, O_RDWR);
if (fd < 0)
goto out;
while (1) {
memset(fdset, 0, sizeof(fdset));
fdset[0].fd = STDIN_FILENO;
fdset[0].events = POLLIN;
fdset[1].fd = fd;
fdset[1].events = POLLPRI;
ret = poll(fdset, 2, 3*1000);
if (ret < 0) {
perror("poll");
break;
}
fprintf(stderr, ".");
if (fdset[1].revents & POLLPRI) {
char c;
(void)read (fd, &c, 1) ;
lseek (fd, 0, SEEK_SET) ;
fprintf(stderr, "\nGPIO %d interrupt occurred!\n", gpio);
}
if (fdset[0].revents & POLLIN)
break;
fflush(stdout);
}
close(fd);
out:
if (gpio_unexport(gpio)) {
fprintf(stdout, "error : unexport %d\n", gpio);
fflush(stdout);
}
return 0;
}
Linux/Android用户空间进程监听GPIO事件的示例代码
需积分: 5 166 浏览量
2023-04-04
20:12:02
上传
评论 1
收藏 1KB 7Z 举报
LovelyPenguin
- 粉丝: 16
- 资源: 38
最新资源
- #P0015. 全排列 超级简单
- pta题库答案c语言之排序4统计工龄.zip
- pta题库答案c语言之树结构7堆中的路径.zip
- pta题库答案c语言之树结构3TreeTraversalsAgain.zip
- pta题库答案c语言之树结构2ListLeaves.zip
- pta题库答案c语言之树结构1树的同构.zip
- 基于C++实现民航飞行与地图简易管理系统可执行程序+说明+详细注释.zip
- pta题库答案c语言之复杂度1最大子列和问题.zip
- 三维装箱问题(Three-Dimensional Bin Packing Problem,3D-BPP)是一个经典的组合优化问题
- 以下是一些关于Linux线程同步的基本概念和方法.txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈