도와주세요!!
글 수 15,339
2017.01.05 09:20:29 (*.99.110.196)
18242
안녕하세요?
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)도 맞게 설정되어 있는데 이런 문제가 발생하는 군요...
왜 이런 문제가 발생하는지...
어떻게 해결할 수 있을까요?
감사합니다.
실제 /proc/interrupts 에 해당 인터럽트가 등록되어 생각하시는 만큼 인터럽트가 발생하고 있나요?
위코드상으로는 함수가 호출되면 3초동안 인터럽트를 기다리다 빠지게 되어 있는데...
POLLPRI 는 이벤트가 발생했다는 것을 알려줄뿐 무엇을 해야 하는지는 ioctl 을 이용해서 알아내거나
해당 드라이버에서 코드를 어떻게 작성하였는지 확인하셔야 할 것 같습니다.
그에 맞게 사용하셔야 하구요.
POLLPRI 이 발생했다는 것이 문제라고는 생각이 안되는데요...
정보가 좀 부족한 것 같습니다