fomu-factory-test/jig/bin/gpiopoll.c

104 lines
2.1 KiB
C
Raw Normal View History

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/time.h>
#include <poll.h>
#include "rpi.h"
#define GPIO 26
static int write_file(const char *filename, const char *string) {
int fd = open(filename, O_WRONLY);
if (fd == -1)
return fd;
write(fd, string, strlen(string));
close(fd);
return 0;
}
static int export_gpio(int gpio) {
char filename[512];
char string[128];
snprintf(filename, sizeof(filename)-1, "/sys/class/gpio/export");
snprintf(string, sizeof(string)-1, "%d", gpio);
if (write_file(filename, string))
return -1;
snprintf(filename, sizeof(filename)-1, "/sys/class/gpio/gpio%d/direction", gpio);
snprintf(string, sizeof(string)-1, "in");
if (write_file(filename, string))
return -1;
snprintf(filename, sizeof(filename)-1, "/sys/class/gpio/gpio%d/edge", gpio);
snprintf(string, sizeof(string)-1, "falling");
if (write_file(filename, string))
return -1;
return 0;
}
int main(int argc, char *argv[])
{
char str[256];
struct pollfd pfd;
int fd, gpio;
char buf[8];
if (argc > 1)
gpio = atoi(argv[1]);
else
gpio = GPIO;
if (gpioInitialise()) {
fprintf(stderr, "Unable to initialize GPIO! Are you running as root?\n");
return 0;
}
gpioSetPullUpDown(gpio, PI_PUD_UP);
if (export_gpio(gpio)) {
perror("Unable to export GPIO");
return 1;
}
snprintf(str, sizeof(str)-1, "/sys/class/gpio/gpio%d/value", gpio);
if ((fd = open(str, O_RDONLY)) < 0)
{
fprintf(stderr, "Failed, gpio %d not exported.\n", gpio);
exit(1);
}
pfd.fd = fd;
pfd.events = POLLPRI;
lseek(fd, 0, SEEK_SET); /* consume any prior interrupt */
read(fd, buf, sizeof buf);
while (1) {
poll(&pfd, 1, -1); /* wait for interrupt */
lseek(fd, 0, SEEK_SET); /* consume interrupt */
read(fd, buf, sizeof buf);
//fprintf(stderr, "Delay...");
usleep(1000);
/* Read value after brief debounce */
lseek(fd, 0, SEEK_SET);
//fprintf(stderr, "Re-read...");
read(fd, buf, sizeof buf);
if (buf[0] != '0')
continue;
printf("START\n");
fflush(stdout);
usleep(1000);
}
exit(0);
}