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,...
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....
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.