레거시 다이얼 전화기를 리눅스 입력장치로 만드는 커널 드라이버
(gitlab.com)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는 동의하지 않을 수 있다는 농담으로 마무리됨
댓글과 토론
Hacker News 의견들
-
70년대 말에 HP41C 계산기로 회전식 전화 다이얼러를 만들었음
NC 리드 릴레이를 압전 부저에 연결하고, NC 접점을 전화선에 직렬로 넣었음
다이얼 펄스에 필요한 짧은 비프음을 만들려고 문서화되지 않은 opcode를 쓰는 synthetic programming을 사용했고, 이름을 영숫자로 입력하면 번호를 찾아 걸 수 있었음
약 10년 전 회사에서 Keith Jarrett이라는 사람을 만났는데, HP-41C Synthetic Programming Manual을 쓴 그 Keith Jarrett인지 묻기도 전에 “아니요, 음악가 아닙니다. 다들 그걸 물어요”라고 하더라
그래서 질문을 끝까지 했더니, 35년 전에 읽었던 그 책의 저자라서 본인도 무척 기뻐하고 놀랐음
https://picclick.com/HP-41-Synthetic-Programming-Made-Easy-b...
https://www.hpmuseum.org/prog/synth41.htm- 친구와 나도 이걸 만들었고, 어떤 전화기에서도 동작하는 단축 다이얼러로 썼음
synthetic programming 안내서 종이책도 아직 가지고 있음
그 기법을 빼더라도 이 계산기는 1980년대 초 기준으로 매우 강력한 프로그래밍 가능 도구였음
같은 친구와 RF 전송의 S-파라미터 모델링 대학원 수업 계산을 전부 처리하는 프로그램도 짰고, 교수에게 자랑했더니 “보상”으로 모든 시험에서 계산기 프로그램 사용이 금지됐음
나중에야 전기공학과의 RF 쪽과 디지털 전자 쪽 사이에 영역 다툼이 있었다는 걸 알게 됨
HP-41CX 계산기가 전기공학 학위 과정에서 가장 중요한 교훈 하나를 알려줬는데, 인간의 의사결정에서는 기술이 최우선순위가 아닌 경우가 많다는 것임 - 그런 걸 계산기 자체에서 프로그래밍했는지 궁금함
hp49g로 비슷한 걸 해봤고 제약된 환경에서 프로그램을 짠 게 자랑스러웠는데, 41c의 한 줄 표시창으로 했다면 정말 대단한 성취였을 듯함
- 친구와 나도 이걸 만들었고, 어떤 전화기에서도 동작하는 단축 다이얼러로 썼음
-
회전식 전화기를 좋아하는 사람을 위한 살짝 홍보를 하자면, 내 전화기를 완전 동작하는 블루투스 헤드셋으로 개조했고 회전 다이얼로 전화번호를 거는 것도 포함했음
HN 글은 잘 안 됐지만 Hackaday에는 소개됐음
https://hackaday.com/2024/10/31/bakelite-to-the-future-a-195...
https://blog.waleson.com/2024/10/bakelite-to-future-1950s-ro...
블루투스 회전식 숫자패드에 대체 모드를 만드는 건 어렵지 않을 것 같음
이제 시간만 찾으면 됨- 멋짐. 요즘은 ESP32를 쓰는 게 훨씬 경제적인 선택이지만, 그래도 Linux 커널 드라이버를 꼭 써보고 싶었음
-
iPhone이 아직 소문뿐이던 시절, 당시 iPod처럼 터치 휠을 넣으면 회전식 다이얼을 되살릴 좋은 기회라고 제안했음
그 자리에 있던 모두에게 단호히 거절당했지만, 덕분에 이제 Linux 박스만 준비하면 그 고전적인 회전식 감성을 쓸 수 있게 됨- 사실 혼자가 아니었음: https://www.patentlyapple.com/2010/12/apple-wins-patent-for-...
Steve Jobs도 이 특허의 발명자 중 한 명으로 올라가 있었음
나와 다른 Apple 동료도 거의 같은 시기에 거의 동일한 특허를 냈고, 한동안 Apple은 터치 휠에서 회전식 다이얼을 시뮬레이션하는 특허를 두 개 보유했음
내 특허는 결국 소멸됐고 Steve의 특허는 갱신됨
SF 저녁 자리에서 술을 좀 많이 마신 상태로 동료에게 이 아이디어를 제안했는데, 물리감이 아주 좋아 실제처럼 느껴지던 오래된 핀볼 게임을 떠올리고 있었음
핵심은 사용자가 적절한 제스처로 어떤 숫자든 빠르게 돌릴 수 있게 다이얼 물리감을 구현하는 것이라고 봤음
이 아이디어를 냈을 때 나는 iPhone 정보를 공유받은 상태가 아니었지만, 동료가 특허 위원회에 보냈고 승인됐음
Steve의 특허와 유사한 점을 봤을 때 위원회가 웃었을 것 같지만, 큰 차이도 있어서 중복은 아니었음
다만 초기 마케팅의 일부로 iPhone 관련 특허 수를 늘리고 싶었던 것 같음. Steve도 iPhone 발표 때 이미 “200개가 넘는 특허”가 있다고 말했음 - iPod에 셀룰러 네트워킹만 붙여서 한 모델이라도 냈다면 정말 웃긴 타임라인이 됐을 듯함
입력은 이걸 쓰면 됨: https://www.youtube.com/watch?v=9BnLbv6QYcA - 터치스크린에서 회전식 다이얼로 전화를 걸게 해주는 앱이 분명 있을 것 같음
- 사실 혼자가 아니었음: https://www.patentlyapple.com/2010/12/apple-wins-patent-for-...
-
이제 누군가 그 회전식 전화기를 제대로 활용해서 Dark Souls를 깨면 될 때가 됐음
- Dreamcast의 낚싯대 컨트롤러로 Soul Calibur를 할 수 있었다는 게 떠오름
-
DTMF 버전이 필요함
호주에 회선 전원만으로 동작하는 아주 작은 박스를 만드는 사람이 있는데, 회전식 펄스를 Touch Tone으로 변환해줌
몇 년 전 POTS 배선이 없는 건물로 이사하기 전까지 그 덕분에 회전식 전화기를 계속 쓸 수 있었음. 아쉬움- FXS/ATA에 연결해서 VoIP 전화기로 만들면 되지 않을까?
나도 1920년대 촛대형 전화기를 포함해 여러 대를 그렇게 아직 동작하게 쓰고 있음
- FXS/ATA에 연결해서 VoIP 전화기로 만들면 되지 않을까?
-
아주 좋음. 이런 최소 드라이버 구현을 좋아함
드라이버에 실제 코드가 얼마나 적게 필요한지 보여주지만, 동시에 기본 드라이버 하나를 동작시키려면 알아야 할 플래그와 커널 메서드가 얼마나 많은지도 보여줌
“처음에는 Rust for Linux 프로젝트의 상태를 살펴보려고 드라이버를 Rust로 다시 구현하려 했지만, 필요한 바인딩이 아직 없다는 걸 곧 깨달았고 그 부분은 기다려야 했다”는 대목이 흥미롭고 꽤 실망스럽지만 예상 밖은 아님
접근 방식과 겪은 장애물을 문서화하면 흥미로운 블로그 글이 될 것 같음- 아쉽게도 지금은 일부 하위 시스템 API에만 Rust 바인딩이 있어서, 의미 있게 글로 쓸 만큼 멀리 가지 못했음
내년쯤 지원이 성숙해져 Rust 재구현이 가능해지면 기꺼이 경험을 써볼 생각임
- 아쉽게도 지금은 일부 하위 시스템 API에만 Rust 바인딩이 있어서, 의미 있게 글로 쓸 만큼 멀리 가지 못했음
-
약 30년 전의 회전식 전화기 관련 일이 떠오름
직접 회전식 전화기를 쓴 건 아니지만, 여전히 그런 전화기와 호환되는 전화망이 관련돼 있었음
반복해서 쓰기보다 여기 링크로 남김:
https://news.ycombinator.com/item?id=40391220
호기심을 자극하자면, 큰 노크 소리와 “San Jose Police! Open up!”이 나오는 이야기임- 그 이야기가 낯익어서 112가 911로 리다이렉트된다고 댓글을 달려 했음
112가 더 다이얼하기 쉬웠기 때문인데, 알고 보니 1년 전에 그 글을 처음 봤을 때 이미 같은 댓글을 달았더라 - 내가 알기로 모든 PSTN은 펄스 다이얼과 호환됐거나 아직 호환됨
- 그 이야기가 낯익어서 112가 911로 리다이렉트된다고 댓글을 달려 했음
-
Seattle의 Connections Museum에서 Sarah가 Linux 박스의 Asterisk 소프트 PBX가 오래된 전화 교환기의 pre-DTMF 트렁크와 revertive pulse signaling으로 통신하게 하는 드라이버를 쓴 일이 떠오름
https://www.youtube.com/watch?v=35N5vKKGDy8 -
재미있는 역사적 반전으로, 뉴질랜드 회전식 전화기는 숫자와 펄스 수의 대응이 반대였음
여기서는 펄스 수가 10 - 숫자였음- 거기에는 깊은 기술적 이유도 있었음
내가 그 이유를 아는 살아 있는 극소수 중 한 명일 것 같아서, 지식이 사라지지 않도록 공유함
비교적 초기의 기계식 전화 교환기 중에 rotary exchange가 있었음 [0]
전화기에서 온 펄스가 교환기 안의 클러치를 연결해 회전 구동부를 움직이고, 그게 스위칭 장치를 움직였음
rotary exchange의 문제 중 하나는 클러치 패드가 닳아 연결이 불안정해진다는 것이었음
Aotearoa/NZ에는 rotary exchange를 설치하기로 했을 때 이미 기존 번호 계획이 있었음
어떤 똑똑한 사람이 마모 문제를 알고 있었고, 기존 번호 계획을 기준으로 다이얼의 1 위치가 9펄스를 내게 하면 전체 패드 마모가 훨씬 줄어 유지보수가 덜 필요하다고 계산했음
거기서 시작된 방식임
또 하나 재미있는 사실은 Norway도 회전식 전화기에 같은 구성을 선택한 것으로 알고 있음
같은 이유였는지는 확실하지 않음
[0] https://en.wikipedia.org/wiki/Rotary_system
- 거기에는 깊은 기술적 이유도 있었음
-
마침 책상 위에 회전식 전화기를 분해해 놓고 클록 스프링을 다시 감는 중인데 이 글이 올라왔음
묘한 우연임- 진짜 질문인데, 그 전화기가 책상 위에서 분해된 채로 얼마나 오래 있었음?
나와 비슷하다면 대략 2년쯤 됐을 듯함
- 진짜 질문인데, 그 전화기가 책상 위에서 분해된 채로 얼마나 오래 있었음?