libgpiod 엣지 이벤트, gpiomon으로 어떻게 잡나

gpiomon 엣지 감시는 libgpiod 명령줄 도구 gpiomon이 GPIO 라인의 엣지 이벤트를 기다렸다가 stdout으로 출력하는 경로입니다. 이 글은 이미 libgpiod 개요를 안다는 전제에서 엣지 옵션·chip/offset 실수·폴링과의 차이만 다룹니다.

근거는 libgpiod v2 계열 공식 gpiomon 매뉴얼과 gpio tools 예제입니다. 보드 핀맵 실측이나 가격·후기는 포함하지 않습니다.

gpiomon 옵션은?

한 줄 답: --edges로 rising / falling / both(기본 both)를 고르고, 필요하면 --num-events, --debounce-period, --active-low, --quiet를 붙입니다.

공식 설명: gpiomon은 라인의 이벤트를 기다린 뒤 표준 출력으로 인쇄합니다. 라인은 이름으로 지정하거나, --chip을 준 경우 offset으로 지정합니다.

자주 쓰는 옵션입니다.

옵션의미
-e, --edgesfalling / rising / both (기본 both)
-n, --num-eventsN개 처리 후 종료
-p, --debounce-period디바운스 기간(기본 단위 ms, 10us 등 단위 가능)
-l, --active-lowactive-low로 취급해 rising/falling 해석을 뒤집음
-q, --quiet출력 없이 대기(스크립트용)
-c, --chip칩으로 범위 제한(offset 사용 시 필요)
-b, --biaspull-up / pull-down / disabled
-F, --format출력 포맷(%E, %o, %c 등)
--idle-timeout이벤트 없이 지정 기간이면 종료

공식 예제:

gpiomon --num-events=3 --edges=rising GPIO22
gpiomon --num-events=1 --quiet GPIO22
gpiomon --format="%e %c %o %l %S" --edges=falling -c gpiochip0 22

채터가 많은 버튼·스위치는 --debounce-period를 먼저 검토합니다. active-low 배선인데 rising만 보면 논리가 뒤집히므로 -l과 엣지 선택을 같이 맞춥니다.

chip/offset 실수는 어떻게 피하나?

한 줄 답: 이름으로 지정하거나, offset를 쓸 때는 반드시 -c/--chip으로 칩을 고정하고 gpiodetect·gpioinfo로 확인합니다.

매뉴얼 요지: 라인은 이름으로 지정하고, chip 옵션이 있을 때만 offset으로 지정합니다. 칩은 번호·이름·경로로 동일하게 가리킬 수 있습니다(0, gpiochip0, /dev/gpiochip0).

실수를 줄이는 순서입니다.

  1. gpiodetect로 시스템에 있는 chip label·라인 수를 목록화합니다.
  2. gpioinfo -c gpiochipN(또는 해당 chip)으로 라인 이름·offset·이미 사용 중인지 확인합니다.
  3. 가능하면 라인 이름으로 gpiomon을 호출합니다. 숫자만 넘기면 offset로 해석될 수 있으므로, 이름이 숫자처럼 보이면 --by-name을 검토합니다.
  4. offset를 쓸 때는 -c gpiochip0 22처럼 chip과 offset을 한 쌍으로 적습니다.
  5. 이름이 여러 chip에 중복되면 --strict로 모호함을 즉시 실패시킵니다.

보드 실크스크린의 “GPIO22”와 chip 내부 offset 22가 항상 같다는 보장은 없습니다. SoC·디바이스 트리·mux에 따라 chip이 갈라지므로, 문서·실측 없이 전역 번호 습관을 character device 경로에 가져오지 않습니다.

폴링과 차이는?

한 줄 답: gpiomon은 커널이 보고하는 엣지 이벤트를 대기하고, 폴링은 gpioget 등으로 값을 주기적으로 읽어 변화를 추정합니다.

libgpiod 도구 문서에서 gpiomon의 역할은 엣지 이벤트를 기다림입니다. --quiet --num-events=1이면 이벤트가 올 때까지 블록하고 출력 없이 종료할 수 있어, 셸 스크립트의 이벤트 대기에 맞습니다.

폴링과의 대비입니다.

엣지 대기 (gpiomon)폴링 (gpioget 루프 등)
트리거커널 라인 이벤트주기적 샘플
CPU대기 중 대부분 슬립주기에 비례해 깨어남
짧은 펄스디바운스·엣지 설정에 따라 포착샘플 사이에 놓칠 수 있음
구현한 프로세스·옵션으로 충분루프·슬립·비교 로직 필요

폴링이 완전히 불필요한 것은 아닙니다. 레벨을 주기적으로 기록하거나, 엣지 미지원·권한 제한 환경에서는 gpioget 반복이 현실적인 경우도 있습니다. 다만 “rising/falling을 놓치지 않고 기다리기”가 목표면 공식 도구 경로는 gpiomon입니다.

마무리

엣지 감시 최소 절차는 ① gpioinfo로 이름/chip 확인 → ② --edges와 필요 시 --debounce-period → ③ offset이면 --chip 고정입니다. 라이브러리 API로 같은 이벤트를 받을 때는 이 CLI와 동일한 character device v2 모델을 따르면 됩니다.

출처