키보드 펌웨어 커스텀: QMK / VIA 오픈소스 툴을 활용한 매핑 레이어 설계법


상용 기성 키보드의 한계는 하드웨어 스펙 시트의 제원에 머무르지 않고, 스위치 단락 신호가 USB 스캔코드로 변환되는 과정이 제조사의 폐쇄형 펌웨어(Proprietary Firmware)에 고정되어 있다는 점에서 기인합니다. 텐키리스(87키)나 60% 미니배열 등 물리적 키 개수가 축소된 폼팩터에서 방향키, 펑션(F)열, 네비게이션 블록을 호출하기 위해 사용자는 비효율적인 동시 입력을 강요받습니다. 전용 소프트웨어 매핑 툴이 존재하더라도 운영체제 백그라운드 프로세스에서 상주하며 메모리를 점유하고 인터럽트 지연을 유발하는 등, 하드웨어 레벨의 절대적 신호 무결성을 보장하지 못합니다.

이러한 소프트웨어 종속성과 매핑 병목을 근본적으로 해소한 오픈소스 임베디드 플랫폼이 바로 QMK(Quantum Mechanical Keyboard)VIA(Virtual Input Architecture)입니다. QMK는 C 언어 기반의 소스 레벨 컴파일을 통해 키 매트릭스 스캔 루프계층형 가상 레이어(Virtual Layer) 스택을 키보드 MCU의 플래시 메모리에 직접 주입합니다. 나아가 VIA는 기판의 EEPROM(비휘발성 메모리) 어드레스 공간을 동적으로 재할당하여, 컴파일 및 플래싱(Flashing) 과정 없이도 런타임 환경에서 즉각적인 키 리맵핑과 매크로를 하드웨어 자체에 영구 저장합니다. 본 칼럼에서는 QMK의 비트마스크 레이어 연산 기전과 VIA의 통신 프로토콜을 시스템 엔지니어링 관점에서 정밀 분석합니다.


01. QMK 펌웨어 내부 스택과 비트마스크 레이어 연산 아키텍처

QMK 펌웨어는 임베디드 마이크로컨트롤러 환경에서 최소한의 연산 클럭과 메모리 풋프린트로 다차원 스위치 매핑을 처리하는 고효율 이벤트 드리븐(Event-driven) OS 구조를 지닙니다.

  • 1) 32비트 정수형 레이어 상태 벡터(layer_state)와 비트마스크 연산: QMK 내부에서 활성화된 레이어 계층은 단일 32비트 부호 없는 정수(uint32_t `layer_state`)의 비트 플래그로 관리됩니다. 레이어 0부터 레이어 31까지 각 비트가 해당 계층의 활성(1) 및 비활성(0) 상태를 직접 가리킵니다. 레이어 전환 함수인 `layer_on(N)`이나 `MO(N)`이 호출되면 비트 OR 연산(`layer_state |= (1UL << N)`)이 1클럭 사이클 내에 수행되어, 행과 열의 물리적 좌표를 상위 가상 매트릭스로 즉각 오버레이 투영합니다.
  • 2) 최상위 활성 레이어 우선 탐색(Top-to-Bottom Fallthrough): 특정 키가 눌렸을 때 QMK 인터프리터는 활성화된 레이어 중 가장 높은 인덱스를 가진 최상단 레이어부터 검색을 개시합니다. 해당 좌표에 할당된 16비트 키코드(Keycode)를 읽어 들이며, 만약 그 위치에 투과 코드인 `KC_TRNS`(0x0001)가 정의되어 있다면 신호 처리를 중단하지 않고 직전 하위 활성 레이어로 탐색을 낙하(Fallthrough)시킵니다. 물리적 기본값(`KC_NO`)을 만날 때까지 스택을 순회하므로, 최소한의 키 할당만으로 직관적인 계층형 확장이 가능합니다.
  • 3) 탭-홀드 듀얼 펑션(Mod-Tap / Layer-Tap)의 시간 임계 기전: 단일 물리 스위치에 2가지 상이한 기능을 부여하는 핵심 메커니즘입니다. `TAPPING_TERM`(통상 200ms) 타이머를 기준으로 작동하며, 스위치가 눌렸다 해당 시간 이내에 해제되면 단발 탭 키코드(예: `Space`)를 방출하고, 누른 채로 타이머를 초과 유지하거나 다른 키와 조합되면 모디파이어(Ctrl) 또는 레이어 활성화(Layer 1) 키코드를 활성화합니다. 이를 통해 엄지손가락 홈 행의 물리적 조작 밀도를 200% 이상 증폭시킵니다.
  • 4) 탭댄스(Tap Dance) 상태 기계(State Machine)와 다중 타건 분기: 단일 스위치의 연타 횟수와 홀드 상태를 4가지 상태 머신(Single Tap, Single Hold, Double Tap, Double Hold)으로 분기하는 고급 함수 체계입니다. 전용 인터럽트 핸들러가 타이머 윈도우 내의 연속 클릭 이벤트를 큐(Queue)에 적재한 뒤, 사용자의 손가락이 키를 완전히 떼는 순간 확정된 엔드포인트 매크로 또는 키코드 함수 포인터를 다이렉트로 호출합니다.
  • 5) VIA 프로토콜의 Raw HID 패킷 전송과 런타임 EEPROM 동기화: QMK가 플래시 메모리에 고정된 펌웨어라면, VIA는 기판의 MCU와 호스트 PC 간에 양방향 Raw HID 인터페이스(벤더 정의 통신 채널)를 개설합니다. 32바이트 크기의 HID 패킷을 통해 특정 레이어, 행, 열의 바이트 오프셋 값을 실시간 송수신하며, 이를 기판 내 온칩 EEPROM 또는 에뮬레이션된 가상 플래시 섹터에 직접 기입(Write)하여 재부팅이나 재플래싱 없이도 즉각적인 영구 저장을 달성합니다.



💡 테크 에디터 핵심 분석 Point

VIA 환경에서 레이어 수를 무분별하게 확장할 때 가장 빈번하게 발생하는 하드웨어 결함은 'EEPROM 스택 오버플로우(Memory Overflow)'입니다. 구형 ATmega32U4(8비트 AVR) MCU는 내장 EEPROM 용량이 1,024바이트(1KB)에 불과합니다. 4개 이상의 레이어에 다중 키코드를 저장하고 복잡한 다이내믹 매크로 문자열을 할당할 경우, 할당된 EEPROM 경계를 초과하여 매트릭스 캘리브레이션 데이터나 부트로더 파티션을 침범하게 됩니다. 이로 인해 키보드가 무한 재부팅 루프에 빠지거나 벽돌(Bricked) 상태가 되므로, 4레이어 이상의 대규모 커스텀 시에는 64KB 이상의 에뮬레이티드 EEPROM을 지원하는 STM32(ARM 32비트) 또는 RP2040 컨트롤러를 필히 채택해야 합니다.


02. QMK 소스코드 플래싱 vs VIA / VIAL 동적 메모리 스펙 비교

세 가지 펌웨어 제어 방식은 메모리 상주 위치, 런타임 수정 편의성, 고급 기구학 제어 자유도에서 뚜렷한 공학적 파라미터 차이를 나타냅니다.

비교 파라미터 순수 QMK 소스 컴파일 VIA (Web/클라이언트) VIAL (온보드 완전 독립형)
데이터 저장 매체 MCU 플래시 ROM (정적 펌웨어) 온칩 / 에뮬레이티드 EEPROM 온칩 EEPROM + 플래시 사전 정의
런타임 매핑 수정 속도 수동 컴파일 및 툴 플래싱 (2~3분) 실시간 GUI 즉시 반영 (0.1초) 실시간 GUI 즉시 반영 (0.1초)
고급 기능(탭댄스/콤보) 지원 무제한 (C 코드 임의 제어 가능) 제한적 (기본 키코드/매크로 중심) GUI 완벽 지원 (탭댄스/콤보 온보드)
외부 정의 파일(JSON) 요구 불필요 (`info.json` 내부 통합) 신규 기판 시 수동 JSON 로드 필수 불필요 (기판 자체에서 스키마 전송)
입력 레이턴시 오버헤드 0.0 ms (최적화된 네이티브 코드) < 0.05 ms (EEPROM 캐싱 참조) < 0.05 ms (RAM 섀도우 버퍼링)

03. 단계별 키 입력 검출, 레이어 스택 평가, USB 리포트 패킷 변환

  1. 1단계: 하드웨어 매트릭스 스캔 및 키 이벤트(keyevent_t) 인큐잉

    MCU 내부의 `matrix_scan()` 루프가 1,000Hz 이상의 주파수로 행을 구동하고 열 핀의 논리 전위를 읽습니다. 특정 스위치의 단락이 검출되면, 디바운스 필터를 거쳐 정제된 핀 좌표 정보가 행과 열 인덱스, 그리고 누름/뗌 상태 플래그를 포함하는 구조체(`keyevent_t`)로 패키징되어 펌웨어 코어 이벤트 큐에 인큐(Enqueue)됩니다.

  2. 2단계: 레이어 스택 비트마스크 평가 및 16비트 키코드 변환

    이벤트는 `action_exec()` 엔진으로 전달됩니다. 현재 전역 변수 `layer_state`의 최상위 비트(Highest Active Bit)를 조회하여 최상단 레이어를 확인합니다. 2차원 배열 포인터를 통해 해당 레이어의 $(Row, Col)$ 메모리 주소에 저장된 16비트 키코드를 추출합니다. 추출된 코드가 `MO(1)` 같은 레이어 스위치일 경우 `layer_state`를 즉시 갱신하며, 일반 키코드일 경우 모디파이어 결합 여부를 비트 단위로 마스킹 연산합니다.

  3. 3단계: USB HID 키보드 리포트 패킷 조립 및 호스트 인터럽트 방출

    최종 매핑된 키코드는 표준 HID 사용법(Usage ID, 8비트)으로 치환되어 8바이트 부트 리포트 또는 16바이트 NKRO 비트맵 구조체에 기록됩니다. USB 디바이스 인터럽트 엔드포인트 IN 버퍼에 데이터가 적재되는 즉시, 호스트 PC의 SOF(Start of Frame) 타이밍에 맞춰 초당 1,000회(1ms 주기) 규격으로 패킷이 송출되어 OS 커널 인터럽트를 완료합니다.

High tech software matrix coding and cyber terminal engineering display



04. 데스크 셋업 하드웨어 최적화 가이드

📌 하드웨어 퍼포먼스 극대화 프로토콜
1. 탭-홀드 튜닝 시 `TAPPING_TERM` 정밀 캘리브레이션: Space-Fn 또는 Mod-Tap 사용 시 `config.h` 내부의 `#define TAPPING_TERM` 기본값(200ms)이 자신의 분당 타자 속도(WPM)와 불일치하면 오입력이 발생합니다. 고속 타건자(500타 이상)는 160~175ms로 하향 조율하고 `#define PERMISSIVE_HOLD`를 활성화하여 롤링 타이핑 시의 오작동을 차단해야 합니다.
2. VIA 웹 클라이언트 WebHID 권한 및 보안 충돌 예방: Chrome/Edge 기반 Web-VIA 접속 시 기기 인식이 거부되는 경우, 브라우저의 WebHID 플래그가 비활성화되었거나 공공 보안 소프트웨어가 가상 인터럽트 포트를 차단한 상태입니다. 보안 프로세스를 종료하고 브라우저 장치 페어링 팝업에서 복합 USB 장치를 승인해야 합니다.
3. EEPROM 클리어 펌웨어 초기화 프로토콜: 레이어 수정 후 키보드가 특정 키에서 멈추거나 먹통이 될 때는 기판 배면의 하드웨어 리셋 버튼을 누른 채 USB를 연결하여 DFU/UF2 모드로 진입한 뒤, QMK Toolbox에서 'Clear EEPROM'을 실행하여 손상된 메모리 파티션을 완전 포맷해야 합니다.
4. 빌드 최적화 플래그를 통한 펌웨어 사이즈 감축: 메모리가 협소한 구형 MCU 사용 시 `rules.mk`에서 `CONSOLE_ENABLE = no`, `COMMAND_ENABLE = no`, `RGBLIGHT_ENABLE = no` 등 불필요한 서브모듈을 비활성화하여 펌웨어 바이너리 용량을 플래시 한계(28KB) 이하로 다이어트해야 컴파일 에러를 방지할 수 있습니다.

05. 자주 묻는 엔지니어링 질문 (FAQ)

Q1. QMK 펌웨어에서 키 매핑을 수정한 후 다른 컴퓨터에 연결해도 매핑이 유지되나요?

완벽하게 유지됩니다. 일반 상용 소프트웨어(iCUE, Synapse 등)는 PC 운영체제에 백그라운드 프로그램이 실행 중일 때만 가상 신호를 가로채어 매핑을 변경합니다. 반면 QMK와 VIA는 키 매핑 데이터 자체가 키보드 메인보드 내부의 마이크로컨트롤러(MCU) 플래시 ROM 또는 온칩 EEPROM 메모리에 하드웨어 레벨로 직접 기록됩니다. 따라서 드라이버나 전용 프로그램이 전혀 설치되지 않은 맥, 리눅스, iPad, 심지어 콘솔 게임기에 연결해도 변경된 모든 레이어와 매크로가 100% 동일하게 작동합니다.

Q2. VIA 지원 기판인데 웹 사이트에서 키보드를 인식하지 못하는 기술적 원인은 무엇인가요?

원인은 크게 두 가지입니다. 첫째, 키보드 MCU에 순수 QMK만 플래싱되어 있고 VIA 통신 스택(`VIA_ENABLE = yes`)이 활성화된 펌웨어가 주입되지 않은 경우입니다. 둘째, 기판의 고유 USB VID/PID 및 매트릭스 레이아웃 구조가 담긴 JSON 정의 파일이 VIA 공식 깃허브 리포지토리에 아직 등록되지 않은 커스텀 기판일 경우입니다. 이 경우 VIA 설정 메뉴에서 'Design' 탭을 활성화한 후, 제조사가 제공하는 해당 기판 전용 `.json` 레이아웃 파일을 수동으로 로드해야 Raw HID 핸드셰이크가 성립됩니다.

Q3. 탭댄스(Tap Dance) 기능을 과도하게 설정하면 전체적인 키 입력 지연(Input Lag)이 발생하나요?

탭댄스가 할당된 '해당 특정 키'에 한해서만 필연적인 타이머 지연이 발생합니다. 시스템은 사용자가 1번 탭할지, 2번 연타할지, 누르고 있을지를 판단하기 위해 설정된 판정 타이머(`TAPPING_TERM`, 약 150~200ms) 동안 신호 송출을 보류하고 대기해야 하기 때문입니다. 그러나 탭댄스가 지정되지 않은 일반 문자열 키들은 이 타이머를 거치지 않고 네이티브 1ms 인터럽트로 즉시 처리되므로 키보드 전체의 레이턴시가 저하되지는 않습니다. 따라서 빠른 반응이 요구되는 게이밍 입력 키(WASD)에는 탭댄스 할당을 금지해야 합니다.


🔗 연계 추천 공학 칼럼 시리즈
  • 이전 편: 16편. 팜레스트(손목 받침대) 높이와 인체공학적 수근관 압력: 원목 vs 아크릴 vs 가죽 메모리폼
  • 다음 편: 18편. 게이밍 마우스 센서의 핵심: DPI, IPS, 가속도(G) 스펙의 실제 의미와 체감 차이

키보드 펌웨어 커스텀은 단순한 단축키 할당 유틸리티를 넘어, 마이크로컨트롤러의 메모리 레지스터와 하드웨어 인터럽트 파이프라인을 사용자 워크플로우에 최적화하는 정밀 임베디드 소프트웨어 엔지니어링입니다. QMK가 제공하는 32비트 비트마스크 기반의 초고속 가상 레이어 중첩과 탭-홀드 이중 기능 제어, 그리고 VIA의 Raw HID 기반 실시간 EEPROM 동기화는 물리적 키 배열의 물리적 한계를 완전히 극복하게 만듭니다. MCU의 메모리 용량과 타이핑 특성에 맞춘 정밀 파라미터 튜닝을 적용할 때, 비로소 하드웨어의 모든 물리적 잠재력을 100% 이끌어내는 프로페셔널 데스크 엔지니어링이 완성됩니다.

※ 본 테크 아키텍처 칼럼은 국제 전기·전자 표준 규격 및 공학적 측정 데이터를 기반으로 작성되었으며, 사용자의 시스템 환경, 펌웨어 리비전, 제조사 부품 배치에 따라 실제 결괏값에 오차가 있을 수 있습니다.

#QMK펌웨어 #VIA키매핑 #키보드매핑레이어 #EEPROM메모리 #키보드펌웨어커스텀

다음 이전