rotary_dial_kmod는 로터리 전화 다이얼을 Linux의 evdev 입력 장치로 바꿔, 다이얼 입력을 숫자패드처럼 처리할 수 있게 함
- 동작 방식은 BUSY/PULSE 스위치를 SoC의 GPIO 핀에 연결하는 구조이며, 기계식 접점 특성상 바운싱 처리가 필요함
- 국가와 제조사에 따라 접점 이름, 펄스 길이, 숫자 인코딩이 달라질 수 있어 실제 배선과 라벨 확인이 중요함
- 사용자는 devicetree에
rotary-dial 노드와 pulse-gpios, busy-gpios를 설정한 뒤 트리 외부 커널 모듈로 빌드·로드함
- 실제 하드웨어가 없어도 개발 VM에서
gpio-sim 기반 BUSY/PULSE GPIO를 조작해 엔드투엔드 테스트를 실행할 수 있음
로터리 다이얼을 evdev 입력 장치로 변환
rotary_dial_kmod는 로터리 전화 다이얼을 evdev 입력 장치로 바꾸는 Linux 커널 드라이버임
- 다음과 같은 상황을 염두에 둠
- 숫자패드보다 느린 다이얼링을 선호하는 경우
- 오래된 로터리 전화를 디지털 환경에서 쓰고 싶은 경우
- 실제 하드웨어 없이 VM 기반 엔드투엔드 개발·테스트 환경이 있는 간단한 드라이버 예제가 필요한 경우
- 그 밖의 창의적 사용 사례
배선과 신호 동작
- 이 프로젝트는 로터리 다이얼을 BUSY와 PULSE 두 스위치로 구성된 장치로 다룸
- BUSY는 normally open
- PULSE는 normally closed
- 두 스위치는 pull-up 저항을 통해 임베디드 Linux SoC의 GPIO 핀에 연결됨
- 다이얼을 감으면 BUSY 스위치가 닫히고 busy 핀은 low로 구동됨
- 다이얼이 원위치로 돌아오는 동안 PULSE 스위치가 반복적으로 열리며 pulse 핀은 high로 구동됨
- 기계식 스위치라서 바운싱이 발생할 수 있음
국가·제조사별 차이
- 스위치 접점 표기는 국가와 제조사에 따라 다르거나 없을 수 있음
- 독일에서는 BUSY 스위치를 nsa로 부름
- 독일에서는 PULSE 스위치를 nsi로 부름
- 핀 배정이 불확실하면 다이얼을 천천히 움직이면서 멀티미터의 연속성 테스터로 스위치 반응을 확인함
- 펄스 신호의 듀티 사이클과 지속 시간도 국가와 제조사에 따라 달라짐
- 독일 예시에서는 펄스당 PULSE 스위치가 62ms 열리고 38ms 닫힘
- 대부분의 경우 1~9개 펄스는 숫자 1~9에 대응하고, 10개 펄스는 0에 대응함
- 일부 국가는 인코딩이 다르며, 스웨덴 예시에서는 1개 펄스가 0, 10개 펄스가 9에 대응함
- 확실하지 않으면 다이얼의 라벨을 확인해야 함
커널 모듈 사용 방법
- 드라이버는 표준 트리 외부 커널 모듈임
- 사용 절차는 Linux 커널 빌드 환경이 준비되어 있고 빌드 호스트와 타깃 호스트가 동일하다는 가정에서 시작함
- 실제 환경에서는 Yocto나 Buildroot가 제공하는 크로스 툴체인으로 빌드하는 경우가 많음
- devicetree에는
rotary-dial 노드를 추가함
pulse-gpios 속성은 pulse GPIO 핀에 바인딩함
busy-gpios 속성은 busy GPIO 핀에 바인딩함
linux,keycodes 속성으로 기본 키코드 맵을 선택적으로 변경할 수 있음
- 자세한 정보와 예시는 devicetree binding에 있음
KDIR 환경 변수는 커널 소스 트리를 가리켜야 함
- 빌드, 설치, 로드는 다음 명령으로 실행함
make
make install
modprobe rotary_dial
- 커널 모듈이 로드되면 로터리 다이얼 입력 장치가 나타나며, 키코드 매핑에 따라 기본적으로 숫자패드처럼 동작함
- 디버깅에는 evemu 패키지를 사용할 수 있음
evemu-describe로 입력 장치 속성을 확인함
evemu-record로 다이얼 이벤트를 모니터링함
개발 VM과 시뮬레이션
- 드라이버 개발과 엔드투엔드 테스트를 위한 VM이 제공됨
- VM의 Linux 커널에는 devicetree 패치가 적용되어 있음
- 이 devicetree는 gpio-sim을 통해 시뮬레이션된 busy와 pulse GPIO 라인을 제공함
- 사용자 공간에서 GPIO 라인을 조작해 다이얼 호출을 시뮬레이션할 수 있음
- VM 사용 절차는 다음과 같음
- Nix package manager를 설치함
- flakes를 활성화함
make vm으로 VM을 빌드함
- 커널을 커스텀 설정과 devicetree 패치로 다시 빌드해야 하므로 시간이 걸릴 수 있음
make run-vm으로 VM을 실행함
- 시작 후 개발 셸에 자동 로그인됨
- VM에서는
KDIR이 VM의 커널 빌드 산출물을 가리키므로 make만으로 드라이버를 빌드할 수 있음
clang-format과 clang-tidy 일부 타깃에는 빌드 산출물만으로 충분하지 않으며, KDIR이 별도로 다운로드한 커널 소스를 가리켜야 함
- 빌드 후
insmod와 rmmod 타깃으로 드라이버를 로드·언로드할 수 있음
rotary_dialer와 테스트
rotary_dialer는 GPIO 라인을 조작해 숫자 다이얼링을 시뮬레이션함
- 빌드는 다음 명령으로 실행함
make rotary_dialer
- 세 번의 펄스를 다이얼하는 예시는 다음과 같음
test/rotary_dialer 3
- 셸로 돌아오면 숫자
2가 보여야 하며, 이는 시뮬레이션 devicetree가 스웨덴식 인코딩을 설정했기 때문임
- 테스트 스위트는 개발 VM에서 실행할 수 있음
make test
- 테스트는 커널 모듈을 로드하고 여러 케이스를 실행함
- 입력 장치 기능을 검증함
- 주어진 펄스 수를 다이얼한 뒤 기대한 키코드가 방출되는지 확인함
- 잘못된 입력이 정상적으로 처리되는지 확인함
메인라인 포함 여부
- 프로젝트 설명은 로터리 다이얼을 입력 장치로 쓰는 미래를 긍정적으로 보지만, Linus Torvalds는 동의하지 않을 수 있다는 농담으로 마무리됨