2012-09-22 2 views
8

gpio 인터럽트로 작업하고 있습니다. "/ sys/class/gpio/gpio38/value"에 파일이 있습니다. 속성 값이 일 때마다 알림을 원합니다. 그렇다면 이것을 어떻게 사용자 영역에서 얻을 수 있을까요? 이미 정보를 수집 했으므로 select(), poll() 또는 epoll()을 사용할 수 있습니다. 그래서이 응용 프로그램에 맞는 무엇입니까? 또는/proc/irq 또는 다른 것을 사용할 수 있는지 제안 해주십시오. 감사합니다 :) 내가 도움이 될 수 있습니다 뭔가 here을 발견select(), poll() 또는 epoll()? sysfs 속성

답변

2

:

GPIO 신호/SYS/클래스/GPIO/gpio42/(GPIO 번호 42) 같은 경로가 다음과 같은 읽기가/쓰기 속성 :

"value"... 0 (낮음) 또는 1 (높음)으로 읽습니다. GPIO 이 출력으로 구성된 경우이 값을 쓸 수 있습니다. 0이 아닌 값은 모두 high로 처리됩니다. 핀이 인터럽트 인터럽트 발생으로 구성이 인터럽트를 발생 시키도록 구성되어있는 경우 ("가장자리"의 설명 참조) 할 수있는 경우

하면 폴링 할 수있다 (2) 파일 및 폴 (2)는 인터럽트가 트리거 될 때마다 리턴합니다. poll (2)를 사용하는 경우 POLLPRI 및 POLLERR 이벤트를 설정하십시오. select (2)를 사용하는 경우 exceptfds에 파일 설명자를 설정하십시오. poll (2)가 sysfs 파일의 시작 부분에 lseek (2)를 반환하고 새 값을 읽거나 파일을 닫은 후 을 다시 열어 값을 읽습니다.

"gpio42"에 대한 것이지만 귀하의 사례에 적용될 수 있습니다. 그렇지 않으면 내 대답에 의견을 말하십시오.

+0

덕분에, 내가 에지 파일 또는 값 파일의 모든 GPIO를 인터럽트-할 수 있습니다하지 않는 것이 –

1

그들 중 하나를 사용할 수 있습니다. 여기서 중요한 점은 GPIO 라인의 값에 대한 sysfs 파일을 열어서 (예 : /sys/class/gpio/gpio42/value) 차단하려고 할 때입니다.

라인 상태의 변경 사항은 쓰기가 아닌 예외 조건으로 신호 처리됩니다 (직관적 일 수 있음)

선택의 경우

: 토니 - 더 - 사자 @

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

주를 올릴 수있는 의미 GPIO합니다. 당신은 인터럽트를 지원하지 않습니다 (그리고 이것은 사용중인 정확한 CPU/SoC에 달려 있습니다), 당신은 그것을 전체적으로 읽을 필요가 있습니다. 와이. – duskwuff

+0

GPIO 라인이 I2C 주변 장치 또는 오디오 코덱으로 구현되는 경우 특히 그렇습니다. 그러나이 경우'select()'''pselect()',''poll()''또는''epoll()'을 호출 할 수 없습니다. ['poll()'과 그 형제들, 실제로는 전혀 투표하지 마십시오.] – marko

+0

안녕하세요 @Marko 답장을 보내 주셔서 감사합니다. 위에서 언급 한 select에 대한 샘플 코드를 제공해 주시겠습니까? 실제로 내가하는 일은 echo 1> file_name을 할 때 알림이 출력되어야합니다. 매우 도움이 될 것입니다. –

관련 문제