como detectar uma alteração de pinos de um GPIO na placa Linux

Estou usando o kernel 3.12 em uma placa linux baseada em ARM (CPU imx233). Meu objetivo é detectar a alteração de pinos de um GPIO (1 a 0).

Eu posso ler o valor do pino constantemente chamando a função abaixo (em um tempo (1) loop)

int GPIO_read_value(int pin){
    int gpio_value = 0;
    char path[35] = {'\0'};
    FILE *fp;
    sprintf(path, "/sys/class/gpio/gpio%d/value", pin);
    if ((fp = fopen(path,"rb+")) == NULL){ //echo in > direction
         //error
    }

    fscanf(fp, "%d", &gpio_value);
    fclose(fp);
    return gpio_value;
}

Mas isso causa muita carga na CPU. Eu não usousleep ounanosleep, porque a troca de pinos ocorre por um período muito curto, o que me faria perder o evento.

Até onde eu descubro, não é possível usarpoll(). Existe algumpoll() como função que eu posso usar para detectar uma alteração de pinos de um GPIO?

EDIT: Apenas no caso, se estou fazendo algo errado, aqui está o meupoll() uso que não detecta a alteração de pinos

struct pollfd pollfds;
    int fd;
    int nread, result;
    pollfds.fd = open("/sys/class/gpio/gpio51/value", O_RDWR);
    int timeout = 20000;           /* Timeout in msec. */
    char buffer[128];

    if( pollfds.fd < 0 ){
        printf(" failed to open gpio \n");
        exit (1);
    }

    pollfds.events = POLLIN;
    printf("fd opens..\n");
    while (1)
    {
            result = poll (&pollfds, 0, timeout);
            switch (result)
            {
                  case 0:
                    printf ("timeout\n");
                    break;
                  case -1:
                    printf ("poll error \n");
                    exit (1);

                   default:
                printf("something is happening..\n");
                    if (pollfds.revents & POLLIN)
                    {
                        nread = read (pollfds.fd, buffer, 8);
                        if (nread == 0) {
                            printf ("result:%d\n", nread);
                            exit (0);
                         } else {
                            buffer[nread] = 0;
                            printf ("read %d from gpio: %s", nread, buffer);
                         }
                     }
              }
     }
     close(fd);

EDIT2: o código emhttps://developer.ridgerun.com/wiki/index.php/Gpio-int-test.c funciona bem compoll() Eu precisava definir a borda ascendente / descendente para a interrupção e um pouco de correção na definição. Isso resolve meu problema, no entanto, pode ser bom para mim e para outras pessoas ouvir / conhecer os métodos alternativos.

questionAnswers(1)

yourAnswerToTheQuestion