본문으로 건너뛰기
피드

옛날 USB 노브 Griffin PowerMate를 최신 macOS에서 다시 살리는 드라이버

open-source 약 5분

Griffin PowerMate라는 오래된 USB 노브를 최신 macOS에서 다시 쓸 수 있게 해주는 작은 Swift 드라이버가 공개됐어. USB HID 리포트를 읽어 회전, 클릭, 롱프레스, LED 제어를 앱 이벤트나 스크롤, 키 입력으로 매핑하는 구조야.

  • 1

    PowerMate의 벤더 아이디는 0x077d, 제품 아이디는 0x0410이다

  • 2

    드라이버는 6바이트 USB HID 리포트에서 버튼 상태와 회전 델타를 읽는다

  • 3

    PowerMateAgent는 회전을 스크롤이나 방향키로, 클릭을 마우스 클릭이나 Return 키로 매핑한다

  • 4

    메뉴 감지는 macOS Accessibility API를 사용하며 Input Monitoring 권한이 필요하다

  • Griffin PowerMate라는 옛날 USB 노브를 최신 macOS에서 다시 쓰게 해주는 드라이버가 나왔음

    • PowerMate는 돌리고 누를 수 있는 작은 물리 노브고, 바닥에는 밝기 조절 가능한 파란 LED가 있음
    • 원래는 영상, 오디오 작업에서 스크롤 가능한 데스크톱 컨트롤러처럼 쓰라고 나온 장치임
  • 드라이버가 하는 일은 단순하지만 꽤 깔끔함

    • PowerMate의 USB 식별자는 VID 0x077d, PID 0x0410
    • USB HID로 장치를 열고 6바이트 리포트를 읽어서 버튼과 회전 이벤트를 뽑아냄
    • Byte 0은 버튼 상태, Byte 1은 회전 델타로 쓰이며 회전 속도는 리포트 사이 시간 차이로 계산함
  • macOS에서는 장치가 버스에 보여도 기본 동작은 없음

    • 그래서 이 라이브러리가 장치를 선점하고 앱으로 이벤트를 전달함
    • 데모는 swift build, swift run PowerMateDemo로 실행하고, 노브를 돌리거나 누르면 이벤트를 출력함
  • PowerMateAgent를 쓰면 일반 앱에서도 바로 쓸 수 있는 입력 장치가 됨

    • 회전은 기본적으로 세로 스크롤로 매핑됨
    • 메뉴나 서브메뉴가 포커스된 상태에서는 회전이 위아래 방향키로 바뀜
    • 짧게 누르면 왼쪽 클릭, 길게 누르면 오른쪽 클릭으로 동작함

💡

> 메뉴와 서브메뉴에서 자연스럽게 쓰려면 macOS 설정에서 Accessibility 권한을 줘야 함. 이벤트를 다른 앱에 보내는 구조라 Input Monitoring 권한도 필요함.

  • LED도 피드백 채널로 쓸 수 있음

    • 노브를 돌리는 동안 LED가 맥동하고, 대기 상태에서는 어둡게 내려감
    • 버튼을 누르는 동안은 완전히 켜지는 식으로 상태를 표현함
    • setLEDBrightness로 0부터 255까지 정적 밝기를 줄 수 있고, 내장 펄스 모드도 제어 가능함
  • 라이브러리로 붙여서 자기 앱에 넣는 것도 가능함

    • Swift Package 의존성으로 PowerMateDriver를 추가하고 onRotate, onButtonDown, onButtonUp 콜백을 연결하면 됨
    • 회전은 스크롤, 볼륨, 미디어 키, 자체 앱 명령 등 원하는 동작으로 매핑 가능함
  • 제약도 명확함

    • 드라이버가 kIOHIDOptionsTypeSeizeDevice로 장치를 독점해서 한 번에 한 프로세스만 PowerMate를 사용할 수 있음
    • 다른 오래된 PowerMate 앱이 장치를 잡고 있으면 LED 제어나 입력 수신이 실패할 수 있음
    • 요구 환경은 macOS 13 이상, Swift 5.9 이상임

기술 맥락

  • 여기서 재미있는 선택은 오래된 하드웨어를 새 프로토콜로 포장한 게 아니라, 기존 USB HID 리포트를 그대로 읽어서 현대 macOS 입력 이벤트로 변환했다는 점이에요. 장치 펌웨어를 건드릴 수 없으니 운영체제 쪽에서 해석 계층을 만든 거죠.

  • macOS 권한 모델 때문에 단순 드라이버만으로는 끝나지 않아요. 다른 앱에 스크롤이나 클릭 이벤트를 보내려면 Input Monitoring이나 Accessibility 권한이 필요하고, 메뉴 상태를 알기 위해서도 접근성 API를 거쳐야 하거든요.

  • 장치를 독점으로 여는 것도 의도적인 선택이에요. 여러 프로세스가 같은 노브 입력을 동시에 읽으면 클릭이나 회전이 중복 처리될 수 있어서, 하나의 에이전트가 장치를 잡고 시스템 이벤트로 뿌리는 구조가 더 예측 가능해요.

엄청난 신기술은 아니지만, 오래된 하드웨어를 현대 OS 권한 모델과 HID API에 맞춰 되살리는 사례라 꽤 실용적임. macOS 자동화 도구나 물리 입력 장치 만드는 개발자한테는 참고할 디테일이 많음.

댓글

댓글

댓글을 불러오는 중...

open-source

뱀부랩, 오픈소스 슬라이서 개발자에게 법적 압박 걸었다가 역풍 맞음

3D 프린터 제조사 뱀부랩이 OrcaSlicer-BambuLab 개발자에게 중단 요구서를 보내면서 오픈소스와 수리권 커뮤니티의 반발을 샀다. GamersNexus와 Louis Rossmann은 개발자의 허락을 받아 소프트웨어를 다시 호스팅하고, 소송이 걸리면 각각 1만 달러씩 법률 지원을 하겠다고 나섰다.

open-source

OrcaSlicer 포크, Bambu Lab 프린터의 인터넷 연결 기능 되살림

FULU Foundation의 OrcaSlicer-bambulab 포크가 Bambu Lab 프린터에서 LAN 전용 제한 없이 BambuNetwork 기반 인터넷 연결을 다시 지원한다고 밝힘. Windows에서는 WSL 2 설정이 필요하고, Linux에서는 일반 설치만으로 충분하다고 안내함.

open-source

코넬대가 공개한 정확히 2,000줄짜리 교육용 운영체제

코넬대 기반 프로젝트인 egos-2000은 학생이 교육용 운영체제 전체 코드를 직접 읽을 수 있게 만드는 걸 목표로 한다. C, 헤더, 어셈블리, make 파일을 합쳐 정확히 2,000줄이며, QEMU와 RISC-V 보드에서 동작하고 9개 코스 프로젝트가 붙어 있다. 운영체제 수업에서 ‘작지만 전체 구조가 보이는 코드베이스’가 필요했던 사람에게 꽤 반가운 자료다.

open-source

이맥스가 Git 대신 Bazaar를 붙잡았던 6년짜리 오픈소스 드라마

이맥스는 2008년 CVS에서 벗어나면서 Git 대신 GNU 프로젝트인 Bazaar를 선택했고, 이 결정은 성능 벤치마크와 개발자 반발을 압도한 정치적 판단에 가까웠다. Bazaar는 느리고 유지보수도 흔들렸지만, GNU 패키지는 GNU 도구를 써야 한다는 원칙 때문에 전환은 2014년까지 미뤄졌다. 결국 ELPA 브랜치 문제와 Bazaar 개발 중단, 변환 스크립트 준비 끝에 이맥스는 Git으로 옮겨갔다.

open-source

현대차·기아, 오픈소스 특허 방어망 넓혀 소프트웨어 중심 차량 전환 준비

현대차·기아가 오픈소스 소프트웨어 특허 분쟁을 줄이기 위해 글로벌 특허 네트워크 OIN 2.0에 가입했다. 소프트웨어 중심 차량, 클라우드, 커넥티드 서비스처럼 오픈소스 의존도가 큰 영역에서 법적 리스크를 미리 관리하려는 움직임이다.