안녕하세요?

GPIO Interrupt 확인하고 해당 서비스 진행하기 위해 
/sys/class/gpio/gpioN/value 값을 사용하는 코드를 작성하고 있는데
문제가 발생하여 도움을 받고자 합니다.

우선 GPIO Port를 falling edge interrupt 로 사용하기 위해서 init.rc에 다음을 추가하였습니다.

write /sys/class/gpio/export "N"
write /sys/class/gpio/gpioN/active_low "1"
write /sys/class/gpio/gpioN/direction "in"
write /sys/class/gpio/gpioN/edge "falling"

그리고 interrupt 발생여부는 다음과 같은 코드에서 수행됩니다.

jint Java_kr_iges_wallpad_gpiotest_MainActivity_GPIORead(JNIEnv *env, jobject obj, jchar port)
{
    int fd, ret;
    struct pollfd fdset[1];
    char buf[32];
 
    if ((fd = gpio_fd_open(port)) == -1 ){
        LOGE("Read Port open error");
        return -1;
    }
 
    gpio_poll_fd.fd = fd;
    gpio_poll_fd.events = POLLPRI;
    gpio_poll_fd.revents = 0;
 
    while (1) {
        ret = poll(&gpio_poll_fd, 1, 3000);
        if (ret > 0) {
            if ((gpio_poll_fd.revents & POLLPRI) == POLLPRI){
                LOGD("GPIO interrupt!");
 
                ret = 0;
                break;
            } else {
                LOGW("No GPIO interrupt detected, weird.");
            }
        } else if (ret == 0) {
            LOGE("poll call timed out, should not be possible!");
        } else {
            LOGE("poll call failed - %s.", strerror(errno));
            break;
        }
    }
 
    close(fd);
    return ret;
}
 
int gpio_fd_open(unsigned int gpio)
{
	int fd, len;
	char buf[MAX_BUF];
 
	len = snprintf(buf, sizeof(buf), GPIO_PATH "/gpio%d/value", gpio);
 
	fd = open(buf, O_RDONLY | O_NONBLOCK );
	if (fd < 0) {
		perror("gpio/fd_open");
	}
 
	return fd;
}


여기서 문제는 poll()의 return parameter이고 interrupt 발생 여부를 확인하기 위해 사용되는
gpio_poll_fd.revents값이 항상 POLLPRI라는 것입니다.

/sys/class/gpio/gpioN/value를 확인하면 해당 GPIO Port의 input값에 맞게 변하고 있는데
그리고 direction(in)/edge(falling)도 맞게 설정되어 있는데 이런 문제가 발생하는 군요...

왜 이런 문제가 발생하는지...
어떻게 해결할 수 있을까요?

감사합니다.