40 static pthread_t isr_handler_thread;
41 static int isr_handler_flag;
65 gpio_edge (
int pin,
char *edge)
70 sprintf(filename,
"/sys/class/gpio/gpio%d/edge", pin);
71 file = fopen(filename,
"w");
74 debug(
"[%s] Can't open file (edge): %s\n", __func__, filename);
78 fwrite(edge,
sizeof (
char), strlen (edge) + 1, file);
98 sprintf(filename,
"/sys/class/gpio/gpio%d/value", pin);
99 file = open(filename, O_RDWR | O_NONBLOCK);
102 debug(
"[%s] Can't open file (value): %s\n", __func__, filename);
127 char filename[35], pinStr[2];
131 file = fopen(
"/sys/class/gpio/export",
"w");
134 debug(
"[%s] Can't open file (export)\n", __func__);
138 sprintf(pinStr,
"%d", pin);
140 fwrite(pinStr,
sizeof (
char), strlen (pinStr), file);
144 sprintf(filename,
"/sys/class/gpio/gpio%d/direction", pin);
145 file = fopen(filename,
"w");
148 debug(
"[%s] Can't open file (direction)\n", __func__);
155 fwrite(
"out",
sizeof (
char), 3, file);
159 fwrite(
"in",
sizeof (
char), 2, file);
163 debug(
"[%s] Can't set pin direction.\n", __func__);
181 isr_handler (
void *isr)
183 struct pollfd fdset[2];
184 int nfds = 2, gpio_fd, rc;
189 if ( isr_handler_flag )
191 debug(
"isr_handler running\n");
195 gpio_fd = gpio_valfd((
int) i.pin);
200 memset((
void *) fdset, 0,
sizeof (fdset));
202 fdset[0].fd = STDIN_FILENO;
203 fdset[0].events = POLLIN;
205 fdset[1].fd = gpio_fd;
206 fdset[1].events = POLLPRI;
208 rc = poll(fdset, nfds, 1000);
212 debug(
"\npoll() failed!\n");
218 debug(
"poll() timeout.\n");
219 if ( isr_handler_flag == 0 )
221 debug(
"exiting isr_handler (timeout)");
226 if ( fdset[1].revents & POLLPRI )
229 if ( -1 == read(fdset[1].fd, buf, 64) )
231 debug(
"read failed for interrupt");
238 if ( fdset[0].revents & POLLIN )
240 if ( -1 == read(fdset[0].fd, buf, 1) )
242 debug(
"read failed for stdin read");
246 debug(
"\npoll() stdin read 0x%2.2X\n", buf[0]);
254 debug(
"exiting isr_handler (flag)");
282 gpio_edge(pin, mode);
286 isr_handler_flag = 1;
287 pthread_create(&isr_handler_thread, NULL, isr_handler, (
void *) i);
306 isr_handler_flag = 0;
326 file = gpio_valfd (pin);
330 if ( write(file,
"0", (
sizeof(
char) * 1)) == -1 )
332 debug(
"[%s] Can't write to GPIO pin", __func__);
338 if ( write(file,
"1", (
sizeof(
char) * 1)) == -1 )
340 debug(
"[%s] Can't write to GPIO pin", __func__);
346 debug(
"[%s] Wrong value for the GPIO pin", __func__);
371 file = gpio_valfd (pin);
373 if (read (file, &valStr, 1) == 1)
376 debug (
"[%s] valStr: %s, val: %d\n", __func__, valStr, val);
380 debug (
"[%s] Can't read pin value", __func__);
402 file = fopen(
"/sys/class/gpio/unexport",
"w");
405 debug(
"[%s] Can't open file (unexport)\n", __func__);
409 sprintf(pinStr,
"%d", pin);
410 fwrite(pinStr,
sizeof (
char), strlen (pinStr), file);
int gpio_init(unsigned int pin, unsigned int dir)
Initialize the GPIO interface for the pin numbered pin on the Raspberry Pi P1 header in the direction...
int gpio_release(unsigned int pin)
The inverse of gpio_init. Frees the pin numbered pin on the Raspberry Pi P1 header, so it can be used for other purposes.
int gpio_write(unsigned int pin, unsigned int val)
Set the pin numbered pin on the Raspberry Pi P1 header to the value specified by val. dir should be either "0" or "1". The defined constants LOW or OFF may be used instead of 0 and HIGH or ON instead of 1/.
int gpio_read(unsigned int pin)
Read the value on the pin numbered pin on the Raspberry Pi P1 header.
int gpio_set_int(unsigned int pin, void(*isr)(int), char *mode)
Set isr as the interrupt service routine (ISR) for pin numbered pin on the Raspberry Pi P1 header...
int gpio_clear_int(unsigned int pin)
Clears any interrupt service routine (ISR) set on the pin numbered pin on the Raspberry Pi P1 header...
Header for general library functionality.