2012-09-22 17 views
8

Estoy trabajando con interrupciones gpio. Tengo un archivo en "/ sys/class/gpio/gpio38/value". Deseo una notificación siempre que haya un cambio en el atributo valor. Entonces, ¿cómo puedo lograr esto en el espacio de usuario? Como ya he recopilado información, puedo usar select(), poll() o epoll(). Entonces, ¿cuál es el correcto para esta aplicación? O por favor sugiérame si puedo usar/proc/irq o algo. Gracias :)select(), poll() o epoll()? para el atributo sysfs

Respuesta

2

he encontrado algo here que pueda ser de ayuda:

señales GPIO tienen como caminos/sys/class/GPIO/gpio42/(por GPIO # 42) y tienen la siguiente lectura/escribe atributos:

"valor" ... se lee como 0 (bajo) o 1 (alto). Si el GPIO está configurado como salida, este valor puede escribirse; cualquier valor distinto de cero se trata como alto.

Si el pasador se puede configurar como generadora de interrupción de interrupción y si se ha configurado para generar interrupciones (ver la descripción de "borde"), puede sondear (2) en ese archivo y poll (2) volverá cada vez que se active la interrupción. Si usa encuesta (2), configure los eventos POLLPRI y POLLERR. Si usa use select (2), configure el descriptor de archivo en exceptfds. Después de la encuesta (2) devuelve, ya sea lseek (2) al comienzo del archivo sysfs y lee el nuevo valor o cierra el archivo y lo vuelve a abrir para leer el valor.

Aunque dice que es para "gpio42", supongo que esto puede aplicarse a su caso. Si no es así, haga un comentario en mi respuesta.

+0

gracias @ tony-del-león, significa que tengo para sondear archivo de borde o archivo de valores –

1

Puede usar cualquiera de ellos. El punto aquí es que se abre el archivo sysfs para el valor de la línea de GPIO (por ejemplo /sys/class/gpio/gpio42/value y luego bloquear en él.

Los cambios en el estado de la línea se señalizan como una condición de excepción en lugar de una escritura (como podría ser intuitivo).

En el caso de select:

fd_set exceptfds; 
int res;  

FD_ZERO(&exceptfds); 
FD_SET(gpioFileDesc, &exceptfds); 

res = select(gpioFileDesc+1, 
      NULL,    // readfds - not needed 
      NULL,    // writefds - not needed 
      &exceptfds, 
      NULL);    // timeout (never) 

if (res > 0 && FD_ISSET(gpioFileDesc, &exceptfds)) 
{ 
    // GPIO line changed 
} 
+1

tenga en cuenta que no todos los GPIO se interrumpen con capacidad Si el GPIO?. está trabajando con no admite interrupciones (y esto dependerá de la CPU/SoC exacta que esté usando), necesitará leerlo periódicamente y – duskwuff

+0

No hay dudas de que esto es cierto, especialmente cuando la línea GPIO se implementa con un periférico I2C o códec de audio. Sin embargo, en ese caso, nunca estarías llamando 'select()' 'pselect()', 'poll()' o 'epoll()' en ellos. ['poll()' y sus hermanos, de hecho no sondean nada] – marko

+0

Hola @Marko Muchísimas gracias por la respuesta. ¿Puedes darme un código de muestra para seleccionar que has mencionado anteriormente? de hecho, lo que estoy haciendo es cuando hago eco de 1> nombre_de_archivo, entonces la notificación debería imprimirse. Será de gran ayuda. –

Cuestiones relacionadas