Last active
August 29, 2015 14:14
-
-
Save redlotus/7a40eadb8f68240eab46 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <errno.h> | |
#include <unistd.h> | |
#include <fcntl.h> | |
/**************************************************************** | |
* Constants | |
****************************************************************/ | |
#define SYSFS_GPIO_DIR "/sys/class/gpio" | |
#define POLL_TIMEOUT (3 * 1000) /* 3 seconds */ | |
#define MAX_BUF 64 | |
/**************************************************************** | |
* gpio_export | |
****************************************************************/ | |
int gpio_export(unsigned int gpio) | |
{ | |
int fd, len; | |
char buf[MAX_BUF]; | |
fd = open(SYSFS_GPIO_DIR "/export", O_WRONLY); | |
if (fd < 0) | |
{ | |
perror("gpio/export"); | |
return fd; | |
} | |
len = snprintf(buf, sizeof(buf), "%d", gpio); | |
write(fd, buf, len); | |
close(fd); | |
return 0; | |
} | |
/**************************************************************** | |
* gpio_unexport | |
****************************************************************/ | |
int gpio_unexport(unsigned int gpio) | |
{ | |
int fd, len; | |
char buf[MAX_BUF]; | |
fd = open(SYSFS_GPIO_DIR "/unexport", O_WRONLY); | |
if (fd < 0) | |
{ | |
perror("gpio/export"); | |
return fd; | |
} | |
len = snprintf(buf, sizeof(buf), "%d", gpio); | |
write(fd, buf, len); | |
close(fd); | |
return 0; | |
} | |
/**************************************************************** | |
* gpio_set_dir | |
****************************************************************/ | |
int gpio_set_dir(unsigned int gpio, unsigned int out_flag) | |
{ | |
int fd, len; | |
char buf[MAX_BUF]; | |
len = snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/direction", gpio); | |
fd = open(buf, O_WRONLY); | |
if (fd < 0) | |
{ | |
perror("gpio/direction"); | |
return fd; | |
} | |
if (out_flag) | |
write(fd, "out", 4); | |
else | |
write(fd, "in", 3); | |
close(fd); | |
return 0; | |
} | |
/**************************************************************** | |
* gpio_set_value | |
****************************************************************/ | |
int gpio_set_value(unsigned int gpio, unsigned int value) | |
{ | |
int fd, len; | |
char buf[MAX_BUF]; | |
len = snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio); | |
fd = open(buf, O_WRONLY); | |
if (fd < 0) | |
{ | |
perror("gpio/set-value"); | |
return fd; | |
} | |
if (value) | |
write(fd, "1", 2); | |
else | |
write(fd, "0", 2); | |
close(fd); | |
return 0; | |
} | |
/**************************************************************** | |
* gpio_get_value | |
****************************************************************/ | |
int gpio_get_value(unsigned int gpio, unsigned int *value) | |
{ | |
int fd, len; | |
char buf[MAX_BUF]; | |
char ch; | |
len = snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio); | |
fd = open(buf, O_RDONLY); | |
if (fd < 0) | |
{ | |
perror("gpio/get-value"); | |
return fd; | |
} | |
read(fd, &ch, 1); | |
if (ch != '0') | |
{ | |
*value = 1; | |
} | |
else | |
{ | |
*value = 0; | |
} | |
close(fd); | |
return 0; | |
} | |
/**************************************************************** | |
* gpio_set_edge | |
****************************************************************/ | |
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) | |
{ | |
perror("gpio/set-edge"); | |
return fd; | |
} | |
write(fd, edge, strlen(edge) + 1); | |
close(fd); | |
return 0; | |
} | |
/**************************************************************** | |
* gpio_fd_open | |
****************************************************************/ | |
int gpio_fd_open(unsigned int gpio) | |
{ | |
int fd, len; | |
char buf[MAX_BUF]; | |
len = snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio); | |
fd = open(buf, O_RDONLY | O_NONBLOCK ); | |
if (fd < 0) | |
{ | |
perror("gpio/fd_open"); | |
} | |
return fd; | |
} | |
/**************************************************************** | |
* gpio_fd_close | |
****************************************************************/ | |
int gpio_fd_close(int fd) | |
{ | |
return close(fd); | |
} | |
/**************************************************************** | |
* Main | |
****************************************************************/ | |
int main(int argc, char **argv) | |
{ | |
int gpio_fd; | |
unsigned int gpio = 36; | |
gpio_export(gpio); | |
gpio_set_dir(gpio, 1); | |
gpio_fd = gpio_fd_open(gpio); | |
gpio_set_value(gpio, 1); | |
unsigned int *value; | |
gpio_get_value(gpio, value); | |
printf("value of gpio %d is %d", gpio, *value); | |
gpio_fd_close(gpio_fd); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment