您的位置:首页 > 运维架构 > Linux

【C代码】通过linux文件系统操作GPIO

2016-06-05 05:07 375 查看
本文描述如果通过文件IO sysfs方式控制树莓派 GPIO端口。通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value等,direction控制GPIO方向,而value可控制GPIO输出或获得GPIO输入。

参考博文:树莓派学习笔记——使用文件IO操作GPIO SysFs方式

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

#define BUFFER_MAX 100
#define DIRECTION_MAX 100
#define IN 0
#define OUT 1
#define LOW 0
#define HIGH 1
#define POUT 21

static int gpio_export(int pin);
static int gpio_unexport(int pin);
static int gpio_direction(int pin, int dir);
static int gpio_write(int pin, int value);
static int gpio_read(int pin);
/*
int main(int argc, char const *argv[])
{
int i = 0;

gpio_export(POUT);
gpio_direction(POUT, OUT);

for (i = 0; i < 20; i++) {
gpio_write(POUT, i % 2);
usleep(500 * 1000);
}

gpio_unexport(POUT);
return 0;
}
*/
static int gpio_export(int pin)
{
char buffer[BUFFER_MAX];
int len;
int fd;

fd = open("/sys/class/gpio/export", O_WRONLY);
if (fd < 0) {
fprintf(stderr, "Failed to open export for writing!\n");
return(-1);
}

len = snprintf(buffer, BUFFER_MAX, "%d", pin);
if (write(fd, buffer, len) < 0) {
fprintf(stderr, "Fail to export gpio!");
return -1;
}

close(fd);
return 0;
}

static int gpio_unexport(int pin)
{
char buffer[BUFFER_MAX];
int len;
int fd;

fd = open("/sys/class/gpio/unexport", O_WRONLY);
if (fd < 0) {
fprintf(stderr, "Failed to open unexport for writing!\n");
return -1;
}

len = snprintf(buffer, BUFFER_MAX, "%d", pin);
if (write(fd, buffer, len) < 0) {
fprintf(stderr, "Fail to unexport gpio!");
return -1;
}

close(fd);
return 0;
}

static int gpio_direction(int pin, int dir)
{
static const char dir_str[] = "in\0out";
char path[DIRECTION_MAX];
int fd;

snprintf(path, DIRECTION_MAX, "/sys/class/gpio/gpio%d/direction", pin);
fd = open(path, O_WRONLY);
if (fd < 0) {
fprintf(stderr, "failed to open gpio direction for writing!\n");
return -1;
}

if (write(fd, &dir_str[dir == IN ? 0 : 3], dir == IN ? 2 : 3) < 0) {
fprintf(stderr, "failed to set direction!\n");
return -1;
}

close(fd);
return 0;
}

static int gpio_write(int pin, int value)
{
static const char values_str[] = "01";
char path[DIRECTION_MAX];
int fd;

snprintf(path, DIRECTION_MAX, "/sys/class/gpio/gpio%d/value", pin);
fd = open(path, O_WRONLY);
if (fd < 0) {
fprintf(stderr, "failed to open gpio value for writing!\n");
return -1;
}

if (write(fd, &values_str[value == LOW ? 0 : 1], 1) < 0) {
fprintf(stderr, "failed to write value!\n");
return -1;
}

close(fd);
return 0;
}

static int gpio_read(int pin)
{
char path[DIRECTION_MAX];
char value_str[3];
int fd;

snprintf(path, DIRECTION_MAX, "/sys/class/gpio/gpio%d/value", pin);
fd = open(path, O_RDONLY);
if (fd < 0) {
fprintf(stderr, "failed to open gpio value for reading!\n");
return -1;
}

if (read(fd, value_str, 3) < 0) {
fprintf(stderr, "failed to read value!\n");
return -1;
}

close(fd);
return (atoi(value_str));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息