[태그:] HID 리포트

  • Keycode는 어떻게 인식될까? QMK 키 입력 처리 구조 완벽 이해

    Keycode는 어떻게 인식될까? QMK 키 입력 처리 구조 완벽 이해

    LINK&TEM GUIDE

    Keycode는 어떻게 인식될까?

    물리 키 위치가 QMK 키코드와 USB HID 입력으로 바뀌는 과정

    📌 핵심 요약
    • 키보드는 키캡에 적힌 문자보다 먼저 스위치가 연결된 행과 열 위치를 감지합니다.
    • QMK는 감지된 매트릭스 좌표를 현재 활성화된 레이어의 Keycode로 변환합니다.
    • KC_A 같은 기본 Keycode는 일반적으로 USB HID Usage ID와 연결됩니다.
    • 레이어 전환, Mod-Tap, 매크로처럼 복합 기능을 가진 Keycode는 QMK 내부에서 추가 처리를 거칩니다.
    • 최종적으로 만들어진 HID 리포트를 운영체제가 해석해 문자 입력이나 단축키 동작을 실행합니다.

    키보드에서 A 키를 누르면 컴퓨터 화면에 곧바로 알파벳 A가 나타나는 것처럼 보입니다. 하지만 키보드 내부에서는 스위치가 눌린 순간부터 운영체제가 문자를 표시하기까지 여러 단계의 변환이 일어납니다. 그 중심에 있는 값이 바로 Keycode입니다.

    Keycode는 단순히 특정 문자를 의미하는 이름이 아닙니다. 펌웨어가 감지한 물리적인 키 위치에 어떤 기능을 부여할지 결정하는 숫자 값에 가깝습니다. 같은 스위치라도 기본 레이어에서는 A가 될 수 있고, Fn 레이어에서는 볼륨 조절이나 방향키가 될 수 있습니다. 따라서 키보드가 인식하는 것은 처음부터 문자가 아니라 매트릭스 좌표와 그 좌표에 배정된 기능 값입니다.

    특히 QMK Firmware에서는 기본 문자 키뿐 아니라 레이어 전환, Ctrl 조합, Tap-Hold, 매크로, 마우스 이동, 미디어 제어까지 다양한 동작을 Keycode 형태로 관리합니다. 이번 글에서는 스위치가 눌린 뒤 Keycode가 선택되고, QMK 내부 처리 과정을 거쳐 USB HID 리포트로 전달되는 흐름을 순서대로 살펴보겠습니다.


    1. Keycode는 키캡에 적힌 문자가 아니다

    Keycode를 이해할 때 가장 먼저 구분해야 하는 것은 물리 키, Keycode, 실제 입력 문자가 서로 다른 개념이라는 점입니다. 키캡에 A가 인쇄되어 있어도 키보드 회로와 펌웨어가 그 글자를 직접 읽는 것은 아닙니다.

    스위치를 누르면 전기적으로 특정 행과 열이 연결됩니다. MCU는 키보드 매트릭스를 반복해서 스캔하면서 이전 상태와 현재 상태가 달라진 지점을 찾습니다. 예를 들어 2번 행과 4번 열의 스위치가 새롭게 연결되었다면 펌웨어는 먼저 “2행 4열 키가 눌렸다”라는 사실을 알아냅니다.

    그다음 QMK는 현재 활성화된 레이어의 키맵에서 해당 좌표를 조회합니다. 2행 4열에 KC_A가 저장되어 있다면 그제야 이 물리 입력은 KC_A라는 Keycode로 변환됩니다. 같은 좌표에 KC_LEFT가 배치되어 있다면 방향키 왼쪽으로 처리되고, MO(1)가 배치되어 있다면 레이어를 일시적으로 활성화하는 키가 됩니다.

    구분 의미 예시
    물리 키 PCB에서 스위치가 연결된 실제 위치 2행 4열
    Keycode 펌웨어가 해당 위치에 배정한 기능 값 KC_A
    HID Usage 호스트로 전달되는 표준 입력 식별 값 Keyboard a and A
    출력 문자 운영체제의 언어 배열이 최종적으로 만든 결과 a, A 또는 다른 문자
    💡 TIP

    특정 키가 예상과 다른 문자를 입력한다고 해서 항상 스위치나 PCB 문제인 것은 아닙니다. 키맵의 Keycode 배정과 운영체제의 키보드 언어 배열을 먼저 확인하는 것이 좋습니다.
    Link&Tem Insight

    QMK의 언어별 Keycode 별칭은 운영체제의 언어 설정을 직접 변경하지 않습니다. 예를 들어 특정 국가 배열을 위한 별칭을 사용해도 실제 출력 문자는 호스트 운영체제에 선택된 키보드 레이아웃에 따라 결정됩니다. Keycode는 문자 자체보다 키보드 위치와 기능을 전달하는 식별자에 가깝습니다.

    2. 키를 누르면 먼저 매트릭스 좌표가 발견된다

    대부분의 기계식 키보드는 각 스위치를 MCU 핀에 하나씩 직접 연결하지 않고 행과 열로 구성된 매트릭스를 사용합니다. 예를 들어 5개의 행과 15개의 열을 조합하면 비교적 적은 수의 MCU 핀으로 많은 스위치를 검사할 수 있습니다.

    MCU는 한쪽 라인을 순서대로 활성화하고 반대쪽 라인의 전기 상태를 읽는 방식으로 전체 키를 스캔합니다. 특정 행을 활성화했을 때 특정 열에서 신호 변화가 감지되면 그 교차점에 있는 스위치가 눌린 것으로 판단합니다. 이때 얻는 정보는 아직 KC_A나 KC_ENTER가 아니라 행 번호와 열 번호입니다.

    스위치는 접점이 맞닿는 순간 짧은 시간 동안 신호가 여러 번 흔들릴 수 있습니다. 펌웨어는 디바운스 처리를 통해 이 흔들림을 하나의 정상적인 입력으로 정리합니다. 안정된 상태 변화가 확인되면 QMK는 해당 좌표의 키 이벤트를 생성하며, 눌림과 떼어짐을 각각 구분합니다.

    스위치 입력이 Keycode로 바뀌기 전 단계
    1. MCU가 매트릭스의 행과 열을 반복해서 스캔합니다.
    2. 이전 스캔과 현재 스캔의 상태를 비교합니다.
    3. 디바운스 처리를 거쳐 실제 눌림인지 판단합니다.
    4. 변화가 발생한 행과 열 좌표를 확인합니다.
    5. 눌림 또는 떼어짐 상태가 포함된 키 이벤트를 생성합니다.
    6. 활성 레이어의 키맵에서 해당 좌표의 Keycode를 조회합니다.

    이 구조 덕분에 물리 키의 위치와 기능을 분리할 수 있습니다. PCB의 스위치 위치는 그대로 두고 펌웨어의 키맵만 변경해도 완전히 다른 배열을 만들 수 있는 이유입니다. QWERTY 배열을 Colemak이나 Dvorak으로 바꾸거나, Caps Lock 위치에 Ctrl을 배치하는 것도 같은 원리입니다.

    3. QMK는 활성 레이어에서 Keycode를 찾는다

    매트릭스 좌표가 확인되면 QMK는 keymaps 배열에서 해당 위치의 값을 조회합니다. QMK 키맵은 일반적으로 레이어, 행, 열로 구성된 다차원 구조를 사용하며 각 위치에는 16비트 형태의 액션 코드가 저장됩니다.

    기본 레이어가 활성화된 상태에서 A 위치를 누르면 Layer 0의 해당 좌표를 확인합니다. 그러나 Fn 키로 Layer 1이 활성화되어 있다면 같은 물리 위치에서도 Layer 1의 값을 먼저 확인합니다. Layer 1에 KC_F1이 배치되어 있다면 A가 아니라 F1 기능으로 처리됩니다.

    상위 레이어의 해당 위치가 KC_TRNS로 설정되어 있으면 QMK는 그 키를 투명한 위치로 판단합니다. 즉 현재 레이어에서 기능을 확정하지 않고 아래쪽 레이어로 내려가 실제 Keycode를 찾습니다. 반대로 KC_NO가 배치되어 있으면 해당 위치는 아무 동작도 하지 않습니다.

    키맵 값 처리 방식 결과
    KC_A 기본 키 입력으로 처리 A 위치의 HID 입력 전송
    KC_TRNS 아래 레이어의 같은 좌표 조회 하위 레이어 기능 사용
    KC_NO 입력을 실행하지 않음 아무 동작 없음
    MO(1) 누르는 동안 지정 레이어 활성화 Layer 1 사용
    LT(1, KC_SPC) 탭과 홀드 시간을 구분 Space 또는 Layer 1
    Link&Tem Insight

    레이어는 각각 독립된 키보드가 겹쳐 있는 구조에 가깝습니다. QMK는 활성화된 레이어 가운데 우선순위가 높은 레이어부터 좌표를 확인하고, 투명 키를 만나면 아래 레이어로 내려갑니다. 따라서 레이어가 활성화되었다고 해서 모든 키가 반드시 바뀌는 것은 아닙니다.

    4. KC_A는 내부적으로 숫자 값으로 처리된다

    QMK의 키맵 파일을 보면 KC_A, KC_ENTER, KC_LCTRL 같은 이름이 사용됩니다. 사람이 보기에는 문자와 기능 이름이지만 컴파일 과정이 끝난 펌웨어에서는 숫자 값으로 처리됩니다. 이 이름들은 개발자가 키맵을 읽고 수정하기 쉽게 만든 기호입니다.

    QMK 공식 문서에 따르면 Quantum Keycode는 일정한 숫자 범위 안에서 관리됩니다. 기본 키에 해당하는 표준 Keycode는 낮은 범위를 사용하고, 레이어 전환이나 Mod-Tap처럼 추가 정보가 필요한 기능은 다른 비트 영역을 활용합니다. 겉으로는 함수처럼 보이는 Keycode도 전처리와 컴파일 과정을 거치면 펌웨어가 해석할 수 있는 값으로 변환됩니다.

    예를 들어 KC_A는 일반적인 키보드 입력을 나타내는 기본 Keycode입니다. 반면 LCTL(KC_C)는 Ctrl과 C를 함께 보내는 조합을 표현하며, LT(1, KC_SPC)는 짧게 누르면 Space를 보내고 길게 누르면 Layer 1을 활성화하도록 구성됩니다. 이 값들은 모두 같은 방식으로 처리되지 않고 Keycode의 종류에 따라 서로 다른 QMK 처리 루틴으로 전달됩니다.

    ⚠ 주의할 점

    QMK Keycode 이름과 USB HID Usage ID를 완전히 같은 개념으로 보면 안 됩니다. 기본 Keycode는 HID 값과 직접 연결되는 경우가 많지만, 레이어 전환이나 매크로 같은 QMK 전용 Keycode는 호스트로 그대로 전송되지 않고 펌웨어 내부 동작으로 먼저 해석됩니다.

    5. 기본 Keycode와 QMK 전용 Keycode의 차이

    모든 Keycode가 컴퓨터로 곧바로 전송되는 것은 아닙니다. KC_A나 KC_ENTER 같은 기본 Keycode는 최종적으로 USB HID 키보드 리포트에 반영될 수 있지만, MO(1), TG(2), QK_BOOT 같은 QMK 전용 Keycode는 키보드 내부 상태를 변경하기 위해 사용됩니다.

    MO(1)을 누르면 운영체제에 “MO(1) 키가 눌렸다”라는 값이 전달되는 것이 아닙니다. QMK가 해당 Keycode를 먼저 가로채 Layer 1을 활성화하고, 이후 다른 키가 눌렸을 때 Layer 1의 키맵을 조회하도록 내부 상태를 변경합니다. 키를 떼면 해당 레이어를 다시 비활성화합니다.

    Mod-Tap과 Layer-Tap처럼 하나의 키에 두 가지 기능이 들어 있는 Keycode는 눌린 시간, 다른 키의 입력 여부, 탭 횟수 같은 추가 조건도 확인합니다. 따라서 같은 키를 눌러도 짧게 누른 경우와 길게 누른 경우의 결과가 달라질 수 있습니다.

    종류 대표 예시 주요 처리 위치
    기본 키 KC_A, KC_1, KC_ENTER HID 키보드 리포트에 반영
    수정 키 KC_LCTL, KC_LSFT HID Modifier 비트에 반영
    레이어 키 MO(1), TG(1), TO(2) QMK 내부 레이어 상태 변경
    탭·홀드 키 MT(), LT() 입력 시간과 조건 판정 후 기능 결정
    사용자 정의 키 SAFE_RANGE 이후 값 사용자 코드에서 직접 동작 정의
    Keycode 인식 흐름 한눈에 보기
    1. 스위치가 눌리면서 매트릭스의 전기 상태가 변합니다.
    2. MCU가 행과 열 좌표의 변화를 발견합니다.
    3. 디바운스 후 눌림 또는 떼어짐 이벤트가 확정됩니다.
    4. 활성 레이어의 키맵에서 16비트 Keycode를 찾습니다.
    5. QMK가 Keycode 종류와 추가 조건을 분석합니다.
    6. 내부 기능이면 레이어나 펌웨어 상태를 변경합니다.
    7. 일반 입력이면 HID 리포트에 키 상태를 반영합니다.
    8. 운영체제가 HID 입력을 현재 언어 배열에 맞게 해석합니다.
    Part 1 정리

    Keycode 인식은 키캡의 문자를 읽는 과정이 아니라 매트릭스 좌표를 찾고, 활성 레이어의 키맵에서 기능 값을 조회하는 과정입니다. 기본 Keycode는 HID 입력으로 이어질 수 있지만 레이어, Tap-Hold, 매크로 같은 QMK 전용 Keycode는 펌웨어 내부에서 먼저 해석됩니다. 다음 내용에서는 process_record 처리 과정, HID 리포트 생성, 운영체제가 최종 문자를 결정하는 원리와 Keycode 오류를 확인하는 방법을 이어서 살펴보겠습니다.

    6. QMK는 Keycode를 어떤 순서로 처리할까?

    활성 레이어에서 Keycode를 찾았다고 해서 곧바로 PC에 전송되는 것은 아닙니다. QMK는 조회된 Keycode를 여러 처리 단계에 통과시킨 뒤, 최종적으로 어떤 입력을 전송할지 결정합니다.

    이 과정이 필요한 이유는 QMK의 Keycode가 단순한 문자 입력만 표현하지 않기 때문입니다. 일반 키보드의 A 키처럼 바로 전송할 수 있는 입력도 있지만, 레이어 전환, 탭과 홀드 구분, 매크로, 모드 전환처럼 펌웨어 내부에서 먼저 해석해야 하는 기능도 있습니다.

    Keycode 처리 흐름
    1. 키보드 매트릭스에서 눌린 위치를 확인합니다.
    2. 현재 활성화된 레이어를 확인합니다.
    3. 키맵에서 해당 위치의 Keycode를 조회합니다.
    4. QMK 내부 기능이 먼저 Keycode를 검사합니다.
    5. 사용자 정의 처리 함수가 입력을 확인합니다.
    6. 전송 가능한 HID 입력으로 변환합니다.
    7. USB 또는 무선 연결을 통해 PC로 전달합니다.

    예를 들어 키맵에서 조회된 값이 KC_A라면 비교적 단순합니다. QMK는 A 키가 눌렸다는 정보를 HID 리포트에 추가할 수 있습니다. 하지만 조회된 값이 MO(1)이라면 PC에 MO(1)이라는 키를 보내는 것이 아닙니다.

    MO(1)은 QMK 내부에서만 의미가 있는 레이어 기능입니다. 이 Keycode가 눌리는 동안 QMK는 1번 레이어를 활성화하고, 키를 놓으면 다시 비활성화합니다. 즉 일부 Keycode는 운영체제로 전송되는 입력이고, 일부는 펌웨어의 상태를 바꾸는 명령입니다.

    💡 핵심 구분

    모든 Keycode가 PC로 그대로 전송되는 것은 아닙니다. 기본 키는 HID 입력으로 변환되지만, 레이어·매크로·탭홀드 같은 기능 키는 QMK 내부에서 먼저 처리됩니다.

    7. process_record_user는 어떤 역할을 할까?

    QMK에서 사용자 정의 Keycode를 만들거나 특정 키의 동작을 변경할 때 자주 사용하는 함수가 process_record_user입니다. 이 함수는 Keycode가 최종 처리되기 전에 사용자가 입력을 직접 확인하고 필요한 동작을 추가할 수 있게 해줍니다.

    함수에는 현재 인식된 Keycode와 키가 눌렸는지 또는 놓였는지를 나타내는 기록이 전달됩니다. 사용자는 이 값을 기준으로 특정 Keycode가 눌렸을 때 문자열을 입력하거나, 다른 키 조합을 실행하거나, 펌웨어 상태를 변경할 수 있습니다.

    process_record_user에서 할 수 있는 일
    • 사용자 정의 Keycode 동작 실행
    • 특정 키를 다른 키 조합으로 변환
    • 문자열이나 단축키 전송
    • 키가 눌릴 때와 놓일 때의 동작 분리
    • 조건에 따라 기본 Keycode 처리 차단

    이 함수의 반환값도 중요합니다. 일반적으로 true를 반환하면 QMK가 해당 Keycode의 기본 처리를 계속 진행합니다. 반대로 false를 반환하면 이후 기본 처리를 중단할 수 있습니다.

    예를 들어 사용자 정의 Keycode가 눌렸을 때 이미 원하는 매크로를 실행했다면 false를 반환해 동일한 입력이 추가로 처리되지 않도록 만들 수 있습니다. 반면 단순히 입력 상태만 확인하고 원래 Keycode도 정상적으로 동작하게 하려면 true를 반환합니다.

    process_record_user는 Keycode를 새로 만드는 기능이라기보다, 이미 인식된 Keycode가 어떤 동작을 해야 하는지 사용자가 개입할 수 있는 지점이라고 이해하면 쉽습니다.

    8. Keycode는 HID 리포트로 어떻게 변환될까?

    QMK 내부 처리가 끝난 기본 Keycode는 USB HID 규격에 맞는 입력 정보로 변환됩니다. 이때 키보드는 문자 자체를 보내는 것이 아니라, 현재 어떤 키들이 눌려 있는지를 담은 HID 리포트를 전송합니다.

    예를 들어 사용자가 A 키를 누르면 키보드는 PC에 영문 소문자 a라는 글자를 직접 전송하지 않습니다. 대신 키보드 사용 페이지에서 A 위치에 해당하는 HID Usage 정보를 리포트에 기록합니다.

    이후 운영체제가 현재 키보드 배열, Shift 키 상태, Caps Lock 상태, 입력 언어를 확인해 실제 화면에 어떤 문자를 표시할지 결정합니다.

    단계 처리 주체 주요 역할
    물리 키 감지 키보드 MCU 행과 열 좌표 확인
    Keycode 조회 QMK Firmware 레이어와 키맵 해석
    HID 리포트 생성 QMK Firmware 눌린 키 상태를 규격에 맞게 구성
    문자 해석 운영체제 언어와 배열에 맞는 문자 출력
    중요한 점

    Keycode와 화면에 표시되는 문자는 같은 개념이 아닙니다. 같은 KC_A 입력이라도 키보드 배열과 입력 언어에 따라 운영체제가 다르게 해석할 수 있습니다.

    9. Shift·Ctrl·Alt는 일반 키와 무엇이 다를까?

    Shift, Ctrl, Alt, GUI 키는 일반 문자 키와 함께 조합되는 수식 키입니다. HID 키보드 리포트에서는 이러한 키의 상태가 일반 키와 구분되어 관리되는 경우가 많습니다.

    예를 들어 Ctrl+C를 입력하면 QMK는 Ctrl이 눌린 상태와 C가 눌린 상태를 함께 리포트에 반영합니다. 운영체제는 이 조합을 문자 입력이 아니라 복사 명령으로 해석합니다.

    QMK에서는 LCTL(KC_C)처럼 하나의 표현 안에 수식 키와 기본 Keycode를 조합할 수도 있습니다. 이렇게 작성된 Keycode는 눌리는 순간 Ctrl과 C가 함께 활성화되고, 키를 놓으면 함께 해제되는 방식으로 처리됩니다.

    대표적인 수식 키 표현
    • KC_LSFT — 왼쪽 Shift
    • KC_LCTL — 왼쪽 Ctrl
    • KC_LALT — 왼쪽 Alt
    • KC_LGUI — Windows 키 또는 Command 키
    • LCTL(KC_C) — Ctrl+C 조합

    이 구조 덕분에 키 하나로 여러 키의 조합을 실행할 수 있습니다. 다만 운영체제마다 단축키 체계가 다르므로, Windows와 macOS에서 같은 Keycode 조합이 서로 다른 기능으로 동작할 수 있습니다.

    10. 탭홀드 Keycode는 어떻게 구분할까?

    QMK의 강력한 기능 중 하나는 키를 짧게 눌렀을 때와 길게 누르고 있을 때 서로 다른 동작을 실행하는 탭홀드 기능입니다.

    예를 들어 LT(1, KC_SPC)는 짧게 누르면 Space로 동작하고, 누른 채 유지하면 1번 레이어를 활성화합니다. 하나의 물리 키가 두 가지 역할을 가지는 것입니다.

    이 경우 QMK는 키가 눌린 순간 바로 Space를 전송하기 어렵습니다. 사용자가 짧게 누를지, 계속 누르고 있을지 아직 알 수 없기 때문입니다. 따라서 설정된 탭 판정 시간과 이후 입력을 확인해 탭인지 홀드인지 결정합니다.

    💡 탭홀드 처리의 특징

    일반 Keycode는 눌린 즉시 처리할 수 있지만, 탭홀드 Keycode는 입력 시간과 다른 키의 입력 여부까지 확인해야 최종 동작을 결정할 수 있습니다.

    이 때문에 탭홀드 설정에서는 타이핑 습관이 중요합니다. 판정 시간이 너무 짧으면 의도하지 않은 홀드가 발생할 수 있고, 너무 길면 레이어 전환이나 수식 키 동작이 늦게 느껴질 수 있습니다.

    11. Keycode를 눌렀는데 다른 문자가 나오는 이유

    QMK 키맵에서 KC_A를 지정했는데 예상과 다른 문자가 입력된다면, 펌웨어가 Keycode를 잘못 인식했다고 단정하기는 어렵습니다. 키보드는 정상적인 HID 위치 정보를 보냈지만 운영체제의 키보드 배열이 다르게 설정되어 있을 수 있기 때문입니다.

    특히 ANSI와 ISO 배열, 영문과 한글 입력기, 미국식과 유럽식 키보드 레이아웃 사이에는 같은 물리 위치를 다르게 해석하는 경우가 있습니다.

    예상과 다른 입력이 나올 때 확인할 항목
    • 현재 활성화된 QMK 레이어가 맞는지 확인
    • VIA 또는 키맵에서 지정한 Keycode 확인
    • Windows 또는 macOS의 키보드 배열 확인
    • 입력 언어와 한영 전환 상태 확인
    • Shift, Ctrl, Alt 같은 수식 키가 남아 있지 않은지 확인
    • 탭홀드 판정이 의도대로 작동하는지 확인

    Keycode는 키보드 펌웨어와 운영체제 사이의 약속입니다. 따라서 문제를 확인할 때는 물리 스위치, QMK 키맵, HID 전송, 운영체제 배열을 각각 나누어 살펴보는 것이 좋습니다.

    12. Keycode 동작을 확인하는 방법

    사용자 정의 키맵을 수정한 뒤에는 실제로 어떤 Keycode가 인식되는지 확인하는 과정이 필요합니다. 화면에 입력되는 문자만 보면 펌웨어에서 어떤 단계가 잘못되었는지 구분하기 어렵기 때문입니다.

    기본적인 확인 방법은 키보드 테스트 도구를 사용해 눌린 키를 확인하는 것입니다. 더 깊게 확인하려면 QMK의 콘솔과 디버깅 기능을 이용해 매트릭스 좌표, Keycode, 키 이벤트가 어떻게 처리되는지 살펴볼 수 있습니다.

    문제 위치를 구분하는 기준
    • 키 입력 자체가 감지되지 않으면 매트릭스 또는 하드웨어 확인
    • 다른 Keycode가 조회되면 레이어와 키맵 확인
    • Keycode는 맞지만 기능이 다르면 사용자 정의 함수 확인
    • HID 입력은 맞지만 문자가 다르면 운영체제 배열 확인

    QMK 콘솔을 사용하려면 펌웨어에서 콘솔 기능을 활성화해야 하며, 키보드와 MCU에 따라 지원 방식이 다를 수 있습니다. 일반 사용자는 먼저 VIA 키 테스터와 운영체제의 키보드 뷰어를 확인하고, 펌웨어를 직접 개발할 때 콘솔 디버깅을 사용하는 것이 효율적입니다.

    13. Keycode를 이해할 때 자주 하는 실수

    Keycode는 이름만 보면 단순해 보이지만, 실제로는 펌웨어 기능과 HID 규격, 운영체제 해석이 연결된 개념입니다. 아래와 같은 부분에서 혼동이 자주 발생합니다.

    자주 하는 오해
    • Keycode를 화면에 표시되는 문자와 동일하게 생각하는 것
    • 모든 QMK Keycode가 PC로 직접 전송된다고 생각하는 것
    • 물리 키 위치와 Keycode가 항상 고정되어 있다고 생각하는 것
    • 레이어가 바뀌어도 같은 키가 같은 기능을 한다고 생각하는 것
    • 펌웨어 문제와 운영체제 키보드 배열 문제를 구분하지 않는 것

    가장 중요한 기준은 물리 위치 → 활성 레이어 → Keycode → QMK 내부 처리 → HID 리포트 → 운영체제 해석의 순서입니다. 입력 문제가 생겼을 때 이 순서를 따라가면 어느 단계에서 예상과 달라졌는지 찾기 쉬워집니다.

    🔍 Insight

    QMK의 Keycode는 단순한 키 이름이 아니라 펌웨어가 실행할 동작을 표현하는 명령 값입니다. 일부는 HID 입력이 되고, 일부는 레이어나 매크로처럼 키보드 내부 상태를 바꿉니다.

    14. 자주 묻는 질문

    Q. KC_A는 문자 a를 직접 전송하나요?

    아닙니다. 키보드는 A 키 위치에 해당하는 HID 입력 정보를 보내고, 운영체제가 현재 언어와 키보드 배열을 기준으로 최종 문자를 결정합니다.

    Q. 같은 물리 키에 여러 Keycode를 지정할 수 있나요?

    가능합니다. 레이어마다 서로 다른 Keycode를 배치할 수 있으며, 탭홀드 기능을 사용하면 짧게 누를 때와 길게 누를 때의 동작도 나눌 수 있습니다.

    Q. MO(1)도 PC로 전송되는 Keycode인가요?

    MO(1)은 QMK 내부에서 레이어를 활성화하는 기능입니다. 일반 문자 키처럼 운영체제로 그대로 전송되는 값은 아닙니다.

    Q. 사용자 정의 Keycode는 어떻게 만들 수 있나요?

    일반적으로 사용자 정의 Keycode 값을 선언한 뒤 process_record_user 함수에서 해당 값이 눌렸을 때 실행할 동작을 작성합니다.

    Q. Keycode 번호를 직접 외워야 하나요?

    대부분의 경우 숫자를 외울 필요는 없습니다. KC_A, KC_ENT, MO(1)처럼 QMK가 제공하는 이름을 사용하면 컴파일 과정에서 실제 값으로 변환됩니다.

    Q. Keycode가 정상인데 문자가 다르게 입력될 수 있나요?

    가능합니다. 운영체제에 설정된 키보드 언어와 배열이 다르면 동일한 HID 입력도 다른 문자로 해석될 수 있습니다.

    📚 함께 보면 좋은 글

    Keycode가 인식되는 전체 흐름을 이해했다면 펌웨어, 저장 공간, MCU 구조까지 함께 살펴보세요. 각각의 개념이 연결되면 키보드가 입력을 처리하는 과정이 더 명확해집니다.

    🔗 공식 자료

    📖 출처

    • QMK Firmware 공식 문서 — Keycodes
    • QMK Firmware 공식 문서 — Keymap Overview
    • QMK Firmware 공식 문서 — Quantum Keycodes
    • QMK Firmware 공식 문서 — Custom Quantum Functions
    • QMK Firmware 공식 문서 — Tap-Hold Configuration
    • USB Implementers Forum HID Usage Tables
    Link&Tem 한 줄 정리

    Keycode는 키캡에 적힌 문자가 아니라, 매트릭스 위치와 활성 레이어를 바탕으로 QMK가 찾아낸 동작 값입니다. 이 값은 펌웨어 내부 기능으로 처리되거나 HID 리포트로 변환된 뒤 운영체제에서 최종 입력으로 해석됩니다.

  • QMK Firmware 구조 완벽 이해: 키 입력부터 레이어·EEPROM·MCU까지

    QMK Firmware 구조 완벽 이해: 키 입력부터 레이어·EEPROM·MCU까지

    LINK&TEM GUIDE

    QMK Firmware 구조

    키 입력 처리부터 keymap.c·info.json·config.h가 합쳐지는 과정까지

    📌 핵심 요약
    • QMK Firmware는 키보드 MCU에서 실행되며 스위치 상태를 읽고 USB 또는 무선 입력 보고서를 만드는 펌웨어입니다.
    • QMK 소스는 공통 코어, MCU·보드 지원 코드, 키보드별 하드웨어 정의, 사용자 키맵이 계층적으로 결합되는 구조입니다.
    • info.json은 배열과 하드웨어 정보를, config.h는 컴파일 설정을, rules.mk는 사용할 기능과 소스 구성을 정의합니다.
    • keymap.c에는 각 레이어의 키 배치와 사용자 지정 입력 동작이 저장됩니다.
    • 컴파일된 펌웨어에는 필요한 기능만 포함되며, 완성된 바이너리를 MCU에 플래시해야 실제 키보드 동작이 바뀝니다.

    커스텀 키보드 설명에서 자주 등장하는 QMK Firmware는 단순히 키 위치를 바꾸는 프로그램이 아닙니다. 키보드 전원이 켜진 순간부터 스위치 상태를 확인하고, 눌린 키를 해석하며, 레이어와 매크로를 처리하고, 최종 입력을 컴퓨터에 전달하는 전체 동작을 담당합니다.

    VIA에서 키 하나를 바꾸면 화면에서는 단순한 키맵 변경처럼 보이지만, 그 아래에서는 QMK가 정의한 키코드 구조와 레이어 처리 방식, 메모리 저장 방식, USB HID 보고서 생성 과정이 함께 작동합니다. 직접 QMK 소스를 수정할 때는 여기에 키보드 매트릭스 핀, 다이오드 방향, MCU 종류, 부트로더, RGB 기능과 같은 하드웨어 설정까지 다뤄야 합니다.

    QMK Firmware 구조가 어렵게 느껴지는 가장 큰 이유는 파일이 많기 때문입니다. 하지만 모든 파일을 한꺼번에 이해할 필요는 없습니다. QMK를 크게 보면 공통 펌웨어 엔진, 키보드 하드웨어 정의, 사용자 키맵이라는 세 계층으로 나눌 수 있습니다. 이 계층이 컴파일 단계에서 하나로 합쳐져 MCU가 실행할 펌웨어가 됩니다.


    1. QMK Firmware는 키보드 안에서 무엇을 할까?

    키보드 스위치는 문자 정보를 직접 만들어내지 않습니다. 사용자가 A 키를 누르더라도 스위치가 MCU에 전달하는 것은 특정 행과 열이 전기적으로 연결되었다는 상태 변화에 가깝습니다. 어느 위치가 어떤 문자에 해당하는지는 펌웨어가 판단합니다.

    QMK는 먼저 키보드 매트릭스를 반복적으로 스캔합니다. 이전 스캔 결과와 현재 결과를 비교해 새로 눌린 키와 해제된 키를 찾고, 접점의 순간적인 흔들림을 걸러내기 위해 디바운스 처리를 적용합니다. 그다음 현재 레이어와 키맵을 기준으로 해당 위치의 키코드를 결정합니다.

    키코드가 단순한 영문자라면 비교적 바로 처리할 수 있지만, QMK에서는 하나의 키에 훨씬 복잡한 동작을 지정할 수 있습니다. 짧게 누르면 Escape, 길게 누르면 Control로 작동하게 만들거나, 키를 누르는 동안만 다른 레이어를 활성화하거나, 여러 키를 순서대로 실행하는 매크로를 연결할 수도 있습니다.

    모든 처리가 끝나면 QMK는 현재 눌린 키 정보를 USB HID 형식의 보고서로 구성합니다. 컴퓨터는 이 보고서를 받아 운영체제의 키보드 입력으로 처리합니다. 따라서 QMK는 물리적인 스위치 변화와 운영체제가 이해하는 키 입력 사이를 연결하는 핵심 소프트웨어라고 볼 수 있습니다.

    QMK의 기본 입력 처리 흐름
    1. MCU가 키보드 매트릭스의 행과 열을 스캔합니다.
    2. 이전 상태와 비교해 눌림 또는 해제 이벤트를 찾습니다.
    3. 디바운스 로직으로 접점의 불안정한 신호를 정리합니다.
    4. 활성 레이어와 키맵을 기준으로 키코드를 결정합니다.
    5. 탭·홀드, 레이어, 콤보, 매크로 같은 기능을 처리합니다.
    6. USB HID 보고서를 생성해 컴퓨터로 전송합니다.

    이 과정은 키를 한 번 누를 때만 실행되는 것이 아닙니다. MCU의 메인 루프가 계속 반복되면서 매트릭스를 스캔하고 각종 작업을 처리합니다. 조명 애니메이션, 인코더 회전, OLED 표시, 분할 키보드 통신 같은 기능도 이 반복 구조 안에서 함께 관리됩니다.

    💡 Link&Tem Insight

    QMK에서 키 입력 속도를 이해할 때는 매트릭스 스캔과 USB Polling을 구분해야 합니다. 매트릭스 스캔은 MCU가 스위치 상태를 확인하는 내부 과정이고, USB Polling은 컴퓨터가 USB 장치의 보고서를 확인하는 통신 주기입니다. 내부 스캔이 빨라도 디바운스 설정과 USB 전송 주기에 따라 최종 입력 지연은 달라질 수 있습니다.

    2. QMK 소스는 어떤 계층으로 나뉠까?

    QMK Firmware 저장소를 열어보면 수많은 폴더와 C 파일이 표시됩니다. 처음에는 키보드 하나를 작동시키는 데 왜 이렇게 많은 코드가 필요한지 의문이 들 수 있습니다. 이는 QMK가 특정 키보드 한 대만을 위한 펌웨어가 아니라 다양한 MCU와 수많은 키보드 설계를 공통 구조로 지원하기 때문입니다.

    QMK 공식 저장소의 공통 영역에는 키 입력 처리, 레이어, 키코드, USB 통신, 조명, 오디오, 포인팅 장치 등 여러 키보드에서 재사용하는 기능이 들어 있습니다. 사용자는 이 공통 코드를 매번 새로 작성하지 않고, 자신의 키보드에 필요한 하드웨어 정보와 키맵만 추가해 펌웨어를 만들 수 있습니다.

    구조 주요 역할
    QMK 공통 코어 키코드, 레이어, USB HID, 매크로, 디바운스 등 공통 기능 처리
    플랫폼·드라이버 AVR·ARM·RP2040 계열 MCU와 GPIO, 타이머, 통신 장치 제어
    키보드 폴더 매트릭스 핀, 배열, 부트로더, PCB별 기능과 하드웨어 정의
    리비전 폴더 같은 제품에서 PCB 버전이나 MCU가 달라질 때 차이 분리
    키맵 폴더 사용자별 레이어, 키 배치, 기능 설정과 사용자 코드 저장

    예를 들어 하나의 키보드 제품에 여러 PCB 리비전이 존재한다면 상위 키보드 폴더에는 공통 설정을 두고, 하위 리비전 폴더에는 MCU나 핀 배치처럼 달라진 부분만 저장할 수 있습니다. QMK는 상위 폴더와 하위 폴더의 설정을 계층적으로 읽어 최종 구성을 만듭니다.

    이 구조 덕분에 같은 키보드의 여러 버전이 공통 코드를 공유할 수 있습니다. 반대로 폴더 계층을 제대로 이해하지 못하고 하위 리비전의 설정만 수정하면 상위 폴더에서 내려온 값과 충돌하거나, 의도한 키보드가 아닌 다른 빌드 대상에 설정을 적용하는 실수가 생길 수 있습니다.

    TIP|수정하기 전에 정확한 빌드 대상을 확인하세요

    키보드 이름이 같더라도 rev1, rev2, ansi, iso, solder, hotswap처럼 PCB 또는 배열별 하위 폴더가 나뉠 수 있습니다. 펌웨어를 수정하기 전에는 현재 PCB에 해당하는 정확한 키보드 경로와 MCU 종류를 먼저 확인하는 것이 안전합니다.

    3. 키보드 폴더 안의 주요 파일

    QMK 키보드 폴더를 이해하려면 모든 C 파일보다 먼저 info.json, config.h, rules.mk, keymap.c의 역할을 구분해야 합니다. 이 네 파일은 비슷해 보이지만 담당하는 정보가 다릅니다.

    최근 QMK는 키보드의 정적인 정보를 가능한 한 info.json으로 관리하는 데이터 기반 구성을 사용합니다. QMK 공식 문서에 따르면 info.json의 정보는 config.h와 rules.mk의 설정과 결합되어 컴파일 시 필요한 최종 구성을 만듭니다. 또한 QMK API와 Configurator가 키보드 배열을 표시할 때도 이 정보가 사용됩니다. :contentReference[oaicite:0]{index=0}

    info.json|키보드의 구조화된 설명서

    info.json에는 키보드 이름, 제조사, USB 식별 정보, MCU와 부트로더, 매트릭스 크기, 다이오드 방향, 지원 기능, 물리적 레이아웃 같은 내용을 JSON 형식으로 작성할 수 있습니다. 특히 키보드의 키 위치와 배열 정보는 QMK Configurator가 화면에 키보드를 그릴 때 중요한 기준이 됩니다.

    여기서 주의할 점은 물리적인 키 위치와 전기적인 매트릭스 위치가 같지 않을 수 있다는 것입니다. 키보드 위에서 왼쪽부터 순서대로 배치된 키라도 PCB 배선에서는 서로 다른 행과 열에 연결될 수 있습니다. info.json의 레이아웃 정의는 화면상의 위치와 매트릭스 좌표를 연결하는 역할을 합니다.

    config.h|컴파일 전 적용되는 설정값

    config.h는 C 전처리기 매크로를 이용해 펌웨어 동작을 설정하는 헤더 파일입니다. 기능별 시간값, 버퍼 크기, 입력 방식, 조명 관련 옵션처럼 컴파일 과정에서 코드가 참고해야 할 값을 정의할 수 있습니다.

    QMK는 폴더 계층마다 config.h를 둘 수 있으며, 상위 키보드 설정과 하위 리비전 설정, 키맵별 설정이 최종 빌드에 반영됩니다. 특정 값을 하위 단계에서 다시 지정해야 할 때는 이미 정의된 매크로를 #undef로 해제한 뒤 새 값으로 정의해야 하는 경우도 있습니다. :contentReference[oaicite:1]{index=1}

    rules.mk|포함할 기능과 빌드 규칙

    rules.mk는 어떤 QMK 기능을 펌웨어에 포함할지 결정하는 빌드 설정 파일입니다. 예를 들어 RGB Matrix, OLED, 인코더, 오디오, 마우스 키, 콤보 기능을 활성화하면 관련 소스가 빌드 대상에 들어갑니다.

    모든 기능을 무조건 활성화하지 않는 이유는 MCU의 플래시 메모리와 RAM이 제한되어 있기 때문입니다. 사용하지 않는 기능을 제외하면 펌웨어 크기를 줄일 수 있고, 작은 용량의 AVR MCU에서도 필요한 기능을 선택적으로 사용할 수 있습니다.

    다만 최근 QMK 구조에서는 여러 정적 설정이 info.json으로 이동했으며, 내용이 없는 rules.mk는 필수가 아닙니다. 따라서 오래된 QMK 강좌와 최신 키보드 폴더를 비교하면 파일 구성이 다르게 보일 수 있습니다. :contentReference[oaicite:2]{index=2}

    keymap.c|레이어와 사용자 입력 동작

    keymap.c는 사용자가 가장 자주 수정하는 파일입니다. 기본 레이어와 Fn 레이어에 어떤 키코드를 배치할지 정의하며, 키를 눌렀을 때 실행할 사용자 지정 코드도 작성할 수 있습니다.

    단순한 키맵은 키코드 배열만으로 완성되지만, 복잡한 키맵에서는 process_record_user(), matrix_scan_user(), layer_state_set_user() 같은 사용자 후크를 활용할 수 있습니다. 이를 통해 특정 키 입력을 가로채거나, 레이어 상태에 따라 LED를 바꾸거나, 주기적으로 실행할 동작을 추가할 수 있습니다.

    파일 주요 정보 주로 수정하는 상황
    info.json 배열, MCU, 매트릭스, 기능 등 구조화된 정보 새 키보드·PCB 정의
    config.h 전처리 매크로와 세부 동작값 시간값·기능 옵션 조정
    rules.mk 활성 기능과 빌드 대상 QMK 기능 추가·제거
    keymap.c 레이어별 키코드와 사용자 코드 키 배치·매크로·동작 변경
    💡 Link&Tem Insight

    info.json과 keymap.c는 모두 키 배열과 관련 있지만 목적이 다릅니다. info.json은 키보드가 어떤 물리 배열과 매트릭스 구조를 지원하는지 설명하고, keymap.c는 그 배열의 각 위치에 어떤 키코드를 넣을지 결정합니다. 즉 info.json이 키보드의 설계도라면 keymap.c는 사용자가 선택한 실제 배치에 가깝습니다.

    4. LAYOUT 매크로는 왜 필요할까?

    keymap.c를 보면 키코드가 단순한 2차원 매트릭스 배열이 아니라 LAYOUT, LAYOUT_ansi, LAYOUT_60_ansi 같은 이름 안에 작성된 경우가 많습니다. 이 LAYOUT 매크로는 사용자가 보는 물리적 키 배열을 PCB의 행과 열 좌표로 변환합니다.

    PCB 매트릭스는 배선 효율을 기준으로 구성되기 때문에 실제 키보드 모양과 다를 수 있습니다. 사용자가 keymap.c에 매트릭스 좌표를 직접 입력해야 한다면 키 하나를 변경할 때마다 회로도를 확인해야 합니다. LAYOUT 매크로를 사용하면 키보드 위에 보이는 순서대로 키코드를 작성하고, 내부에서 올바른 매트릭스 좌표로 재배열할 수 있습니다.

    LAYOUT 매크로가 연결하는 두 구조
    • 물리 배열: 사용자가 실제 키보드에서 보는 키 위치
    • 전기 매트릭스: PCB에서 각 스위치가 연결된 행과 열 위치
    • 키코드 배열: 각 물리 위치에 사용자가 지정한 입력 기능

    하나의 PCB가 ANSI Enter와 ISO Enter, 분할 Backspace, 분할 Spacebar 같은 여러 배열을 지원한다면 LAYOUT 매크로도 여러 개 존재할 수 있습니다. 이때 자신의 실제 조립 배열과 다른 매크로를 선택하면 키 개수가 맞지 않거나 일부 위치가 의도와 다르게 연결될 수 있습니다.

    QMK Configurator에서 배열을 고를 때 여러 레이아웃 이름이 나타나는 것도 같은 이유입니다. Configurator가 단순히 키보드 제품명만 확인하는 것이 아니라, 해당 PCB가 제공하는 LAYOUT 정의를 읽어 선택 가능한 배열을 보여주는 것입니다.

    TIP|키맵을 복사할 때 LAYOUT 이름도 확인하세요

    다른 사용자의 keymap.c를 복사했는데 컴파일 오류가 발생한다면 키코드보다 LAYOUT 매크로 이름과 키 개수를 먼저 확인하는 것이 좋습니다. 같은 60% 키보드라도 PCB가 지원하는 배열과 매크로 이름은 다를 수 있습니다.

    5. keymap.c에서 레이어는 어떻게 표현될까?

    QMK의 레이어는 서로 다른 키맵 배열을 여러 장 겹쳐 놓은 구조입니다. 일반적으로 Layer 0에는 기본 입력을 두고, Layer 1에는 숫자열이나 방향키, 미디어 키, RGB 제어 같은 보조 기능을 배치합니다.

    keymap.c에서는 각 레이어가 별도의 LAYOUT 배열로 정의됩니다. 레이어 번호는 단순히 화면 전환 순서가 아니라, 현재 활성화된 여러 레이어 가운데 어떤 키코드를 우선해서 읽을지 결정하는 기준이 됩니다.

    상위 레이어의 특정 위치가 KC_TRNS로 설정되어 있으면 QMK는 바로 아래 활성 레이어의 같은 위치를 확인합니다. 반대로 KC_NO는 해당 위치에서 아무 입력도 발생시키지 않습니다. 두 키코드는 화면에서 비슷하게 보일 수 있지만 레이어가 겹쳐질 때 결과가 완전히 다릅니다.

    키코드 동작 사용 예시
    KC_TRNS 아래 활성 레이어의 키코드를 통과시켜 사용 Fn 레이어에서 기본 키를 그대로 유지
    KC_NO 해당 위치의 입력을 차단 사용하지 않을 스위치 위치 비활성화
    MO(n) 누르는 동안 지정 레이어 활성화 일반적인 Fn 키
    TG(n) 누를 때마다 지정 레이어 켜기·끄기 고정 숫자·게임 레이어
    LT(n, kc) 짧게 누르면 키코드, 길게 누르면 레이어 Space와 Fn 기능 결합

    레이어 상태는 MCU가 실행 중인 동안 RAM에서 관리됩니다. 다만 기본 레이어처럼 전원을 껐다 켜도 유지해야 하는 설정은 EEPROM 또는 MCU의 비휘발성 저장 영역에 기록할 수 있습니다. 따라서 모든 레이어가 EEPROM에 통째로 저장되는 것은 아니며, 컴파일된 키맵과 실행 중인 레이어 상태, 비휘발성 기본 레이어 설정을 구분해야 합니다.

    6. QMK는 설정 파일을 어떻게 하나의 펌웨어로 만들까?

    QMK 소스 폴더에 있는 파일은 MCU가 그대로 실행할 수 있는 형태가 아닙니다. C 소스와 JSON 설정, 빌드 규칙을 컴파일해 MCU 종류에 맞는 기계어 바이너리로 변환해야 합니다.

    사용자가 키보드와 키맵을 지정해 컴파일을 시작하면 QMK 빌드 시스템은 해당 키보드 경로를 확인합니다. 이후 상위 키보드 폴더, 하위 리비전 폴더, 선택한 키맵 폴더에서 설정을 수집하고, info.json과 config.h, rules.mk의 내용을 결합합니다.

    그다음 선택한 MCU 플랫폼에 필요한 드라이버와 QMK 공통 코어, 활성화된 기능의 소스 코드, 키보드별 코드, keymap.c의 사용자 코드를 함께 컴파일합니다. 사용하지 않는 기능은 빌드 대상에서 제외되거나 최종 링크 과정에서 제거될 수 있습니다.

    QMK 펌웨어 빌드 흐름
    1. 컴파일할 키보드 경로와 키맵을 선택합니다.
    2. 키보드·리비전·키맵 폴더의 설정을 계층적으로 수집합니다.
    3. info.json, config.h, rules.mk를 바탕으로 최종 구성을 생성합니다.
    4. QMK 코어와 MCU 드라이버, 선택 기능, 사용자 코드를 컴파일합니다.
    5. 각 오브젝트 파일을 하나의 실행 가능한 펌웨어로 연결합니다.
    6. 부트로더와 MCU에 맞는 HEX, BIN 또는 UF2 파일을 생성합니다.

    출력 파일 형식은 MCU와 부트로더에 따라 다릅니다. AVR 기반 키보드에서는 HEX 파일을 자주 사용하고, ARM 계열에서는 BIN 파일이 사용될 수 있습니다. RP2040처럼 UF2 부트로더 방식을 사용하는 MCU에서는 UF2 파일을 저장 장치에 복사하는 방식으로 플래시할 수 있습니다.

    중요한 점은 QMK 소스 수정과 실제 키보드 변경이 서로 다른 단계라는 것입니다. keymap.c를 수정했더라도 다시 컴파일하지 않으면 새 펌웨어 파일이 만들어지지 않습니다. 컴파일된 파일을 만들었더라도 MCU에 플래시하지 않으면 현재 키보드는 기존 펌웨어를 계속 실행합니다.

    자주 발생하는 구조 이해 오류
    • 다른 PCB 리비전의 키맵을 컴파일하고 현재 키보드에 적용하려는 경우
    • MCU 또는 부트로더 설정이 실제 하드웨어와 다른 경우
    • rules.mk에서 기능만 활성화하고 필요한 핀이나 드라이버 설정을 누락한 경우
    • info.json의 물리 배열 좌표와 매트릭스 좌표를 같은 개념으로 이해한 경우
    • keymap.c 수정 후 기존에 생성된 펌웨어 파일을 다시 플래시한 경우
    • 펌웨어 크기가 MCU의 플래시 용량을 초과했는데 기능을 계속 추가한 경우
    💡 Link&Tem Insight

    QMK Configurator도 결과적으로 QMK 빌드 시스템을 이용합니다. 사용자가 웹 화면에서 배열을 구성하면 Configurator가 키맵 데이터를 만들고 서버에서 펌웨어를 컴파일합니다. 직접 소스를 수정하는 방식과 출발점은 다르지만, 최종적으로는 키보드 하드웨어 정의와 QMK 코어, 선택한 키맵이 결합된 펌웨어가 생성된다는 점은 같습니다.
    Part 1 정리

    QMK Firmware는 공통 코어와 MCU 드라이버, 키보드별 하드웨어 정의, 사용자 키맵을 계층적으로 결합하는 구조입니다. info.json은 키보드 구조를 설명하고, config.h는 세부 설정값을 정의하며, rules.mk는 포함할 기능을 선택하고, keymap.c는 실제 레이어와 키 동작을 구성합니다. 다음 부분에서는 MCU가 펌웨어를 실행하는 방식, 부팅부터 매트릭스 스캔까지의 내부 흐름, EEPROM과 플래시 메모리의 차이, VIA와 QMK 소스 방식의 구조 차이를 이어서 살펴보겠습니다.

    7

    전원이 켜진 뒤 QMK Firmware는 어떻게 동작할까?

    컴파일된 QMK Firmware가 키보드의 마이크로컨트롤러에 기록되면, 소스 코드의 파일 구조는 하나의 실행 가능한 펌웨어 이미지로 바뀝니다. 사용자가 키보드에 전원을 연결했을 때 마이크로컨트롤러는 플래시 메모리에 저장된 프로그램을 읽고 초기화 과정을 시작합니다.

    STEP 1
    전원 인가
    USB 또는 배터리에서 전원을 공급받습니다.
    “`
    STEP 2
    MCU 초기화
    클록, GPIO, 타이머와 통신 장치를 준비합니다.
    STEP 3
    QMK 초기화
    키맵, 레이어, 기능과 저장값을 불러옵니다.
    STEP 4
    반복 실행
    매트릭스를 스캔하고 키 입력을 처리합니다.
    “`

    초기화가 끝나면 QMK는 한 번 실행되고 종료되는 일반 프로그램처럼 동작하지 않습니다. 키보드가 켜져 있는 동안 매우 짧은 작업을 계속 반복하는 구조로 움직입니다. 이 반복 구간에서 스위치 상태 확인, 디바운스 처리, 키코드 변환, 레이어 판정, 매크로 실행, RGB 갱신, USB 보고서 전송 등이 순서대로 처리됩니다.

    핵심 포인트

    QMK의 중심은 특정 파일 하나가 아니라, 하드웨어 초기화와 키 입력 처리를 계속 연결하는 실행 흐름입니다. 키맵에 작성한 기능은 이 반복 흐름 안에서 조건에 맞을 때 호출됩니다.

    8

    매트릭스 스캔과 키코드 처리는 어떻게 연결될까?

    기계식 키보드의 스위치는 대부분 행과 열로 구성된 매트릭스 회로에 연결됩니다. QMK는 각 행과 열의 전기적 상태를 빠르게 확인해 어떤 스위치가 눌렸는지 판정합니다. 이때 확인된 위치는 곧바로 문자로 전송되는 것이 아니라 여러 처리 단계를 통과합니다.

    처리 단계 QMK가 하는 일 예시
    매트릭스 읽기 행과 열의 상태를 확인합니다. 2행 3열 스위치 눌림
    디바운스 접점 진동으로 발생한 불안정한 신호를 정리합니다. 한 번 누른 키가 여러 번 인식되는 현상 방지
    레이어 판정 현재 활성화된 레이어에서 해당 위치의 키코드를 찾습니다. 기본 레이어에서는 A, 기능 레이어에서는 F1
    이벤트 처리 일반 키, 모드탭, 매크로, 탭댄스 등의 동작을 실행합니다. 짧게 누르면 Esc, 길게 누르면 Ctrl
    HID 보고서 전송 처리 결과를 USB 또는 무선 HID 보고서로 호스트에 전달합니다. 운영체제가 키 입력을 수신

    따라서 키보드에서 물리적인 스위치 하나를 눌렀다고 해서 PC에 특정 문자가 고정적으로 전달되는 것은 아닙니다. 동일한 스위치 위치라도 현재 레이어, 조합 상태, 사용자 코드와 기능 설정에 따라 전혀 다른 결과가 만들어질 수 있습니다. 이것이 QMK 기반 키보드가 일반적인 고정형 펌웨어보다 유연한 이유입니다.

    9

    Flash와 EEPROM은 어떤 역할을 나눠 가질까?

    QMK Firmware를 이해할 때 자주 혼동되는 부분이 플래시 메모리와 EEPROM입니다. 두 저장 영역 모두 전원을 꺼도 정보가 유지될 수 있지만, 저장되는 데이터의 성격과 갱신 방식이 다릅니다.

    FLASH MEMORY

    펌웨어 프로그램 저장

    컴파일된 QMK 코드, 키맵, 활성화된 기능과 하드웨어 제어 로직이 포함됩니다. 소스 코드를 수정한 뒤 펌웨어를 다시 플래싱하면 이 영역의 프로그램이 교체됩니다.

    “`
    EEPROM

    사용자 설정값 저장

    기본 레이어, RGB 설정, 오디오 설정, VIA에서 변경한 키맵처럼 실행 중 바뀔 수 있는 값을 저장하는 데 사용됩니다. MCU에 따라 별도 EEPROM 대신 플래시 일부를 가상 EEPROM처럼 사용할 수도 있습니다.

    “`
    구분 Flash EEPROM 또는 가상 EEPROM
    주요 내용 실행할 펌웨어 코드 변경 가능한 설정값
    갱신 시점 펌웨어 플래싱 시 설정 변경 또는 저장 명령 실행 시
    대표 예시 keymap.c, 기능 코드, USB 처리 코드 VIA 키맵, 기본 레이어, RGB 밝기
    초기화 영향 다른 펌웨어를 플래싱하면 프로그램 변경 EEPROM 초기화 명령으로 설정값 삭제 가능
    주의할 점

    새 펌웨어를 플래싱했는데도 VIA 키맵이나 RGB 설정이 이전 상태로 남아 있다면, 플래시의 펌웨어와 EEPROM의 설정값이 별도로 유지되고 있기 때문일 수 있습니다. 구조가 크게 바뀐 펌웨어를 설치한 뒤 문제가 생기면 EEPROM 초기화가 필요한 경우도 있습니다.

    10

    VIA와 QMK Firmware는 어떤 관계일까?

    VIA는 QMK와 완전히 별개의 펌웨어가 아닙니다. 일반적으로 VIA 지원 키보드는 QMK Firmware 안에 VIA 통신 기능이 포함된 형태로 빌드됩니다. VIA 웹 앱이나 데스크톱 앱은 키보드와 통신해 현재 키맵과 설정을 읽고 변경합니다.

    VIA 앱
    사용자 인터페이스에서 키 배치를 변경
    “`
    VIA 통신 기능
    QMK 내부에서 설정 읽기와 쓰기 요청을 처리
    EEPROM
    변경된 키맵과 설정을 비휘발성 영역에 저장
    “`

    VIA에서 키를 변경할 때마다 QMK 소스 코드의 keymap.c가 수정되는 것은 아닙니다. 펌웨어 안에 준비된 동적 키맵 저장 영역의 값이 바뀌고, QMK는 스캔 과정에서 해당 값을 참조합니다. 반면 소스 코드로 직접 빌드한 키맵은 컴파일 시 펌웨어 프로그램에 포함됩니다.

    구분 QMK 소스 키맵 VIA 동적 키맵
    변경 방법 소스 수정 후 다시 컴파일하고 플래싱 VIA 화면에서 즉시 변경
    저장 위치 펌웨어 플래시 이미지 EEPROM 또는 대응되는 저장 영역
    자유도 사용자 코드와 고급 기능까지 구현 가능 펌웨어가 미리 허용한 범위에서 변경
    적합한 사용자 고급 커스텀 기능과 직접 개발이 필요한 사용자 코드 없이 빠르게 키 배치를 변경하려는 사용자
    11

    STM32와 RP2040에서는 무엇이 달라질까?

    QMK의 상위 구조는 MCU가 달라져도 비슷하게 유지됩니다. 사용자는 동일한 방식으로 키보드 폴더, 키맵, 레이어와 기능을 구성할 수 있습니다. 하지만 하드웨어에 가까운 하위 계층에서는 MCU 종류에 따라 빌드 시스템, 드라이버, 부트로더, 플래싱 방식과 주변 장치 설정이 달라질 수 있습니다.

    비교 항목 STM32 계열 RP2040 계열
    프로세서 구조 제품군에 따라 다양한 ARM Cortex-M 코어 사용 듀얼 코어 ARM Cortex-M0+ 기반
    저장 구조 MCU 내부 플래시를 사용하는 모델이 많음 외부 QSPI 플래시를 사용하는 구성이 일반적
    펌웨어 파일 부트로더에 따라 BIN, HEX, DFU 방식 등이 사용됨 UF2 파일을 드라이브에 복사하는 방식이 널리 사용됨
    저수준 지원 QMK의 하드웨어 추상화 계층과 지원 프레임워크 사용 RP2040용 드라이버와 하드웨어 설정 사용
    키맵 작성법 대부분 동일한 QMK 키코드와 레이어 문법 사용 대부분 동일한 QMK 키코드와 레이어 문법 사용

    즉, 사용자가 보는 QMK의 상위 인터페이스는 최대한 공통으로 유지되고, MCU별 차이는 하드웨어 추상화 계층 아래에서 처리됩니다. 이 구조 덕분에 같은 QMK 기능을 서로 다른 MCU 기반 키보드에도 비교적 일관된 방식으로 적용할 수 있습니다.

    중요한 해석

    STM32와 RP2040의 차이는 단순히 처리 속도만의 문제가 아닙니다. 플래시 구조, 부트로더, USB 구현, 사용 가능한 핀과 주변 장치가 다르므로 키보드 PCB 설계와 펌웨어 설정도 함께 달라집니다.

    12

    QMK Firmware 구조를 한눈에 정리하면

    소스 구조
    QMK 공통 코드, MCU 지원 코드, 키보드 정의와 사용자 키맵으로 나뉩니다.
    “`
    빌드 과정
    설정 파일과 C 소스가 전처리, 컴파일, 링크 과정을 거쳐 펌웨어가 됩니다.
    실행 구조
    초기화 후 매트릭스 스캔과 입력 처리를 빠르게 반복합니다.
    저장 구조
    펌웨어 코드는 플래시에, 변경 가능한 설정은 EEPROM 계열 영역에 저장됩니다.
    VIA 연동
    QMK의 동적 키맵 기능을 이용해 컴파일 없이 키 배치를 변경합니다.
    MCU 차이
    상위 키맵 구조는 비슷하지만 저수준 드라이버와 플래싱 방식은 달라집니다.
    “`
    FINAL INSIGHT

    QMK는 키맵 파일 하나가 아니라 계층화된 펌웨어 플랫폼입니다

    QMK Firmware는 키 위치를 문자로 바꾸는 단순한 변환표가 아닙니다. 키보드 하드웨어 정의, MCU 제어, 매트릭스 스캔, 키 이벤트 처리, USB HID 통신, 저장 장치 관리와 사용자 기능을 하나의 구조 안에서 연결합니다. 사용자는 상위 키맵과 기능 설정을 중심으로 작업하지만, 그 아래에서는 수많은 공통 모듈과 하드웨어 계층이 함께 동작합니다.

    자주 묻는 질문

    Q1. QMK를 사용하려면 반드시 C 언어를 알아야 하나요?

    기본적인 키맵 변경은 기존 예제를 수정하거나 QMK Configurator를 이용해도 가능합니다. 다만 사용자 키코드, 매크로, 상태 조건과 고급 기능을 직접 구현하려면 C 문법과 QMK의 이벤트 구조를 이해하는 것이 도움이 됩니다.

    “`

    Q2. keymap.c만 수정하면 모든 기능을 구현할 수 있나요?

    많은 사용자 기능은 keymap.c에서 구현할 수 있지만, 하드웨어 핀 설정이나 기능 활성화에는 config.h, rules.mk, info.json 등의 수정이 필요할 수 있습니다. 키보드 자체의 구조를 바꾸는 작업은 keyboard.c나 하드웨어 정의 파일까지 확인해야 합니다.

    Q3. VIA에서 바꾼 키맵은 펌웨어를 다시 설치하면 사라지나요?

    펌웨어 플래싱 방식과 EEPROM 처리 여부에 따라 달라집니다. 동적 키맵 정보가 저장된 EEPROM 영역이 유지되면 이전 설정이 남을 수 있고, EEPROM을 초기화하면 기본 키맵으로 돌아갈 수 있습니다.

    Q4. QMK의 폴더가 복잡한 이유는 무엇인가요?

    수많은 키보드와 MCU를 하나의 프로젝트에서 지원하기 때문입니다. 공통 기능은 재사용하고, 키보드별 차이와 사용자 키맵은 별도 계층으로 분리해 중복을 줄이는 구조입니다.

    Q5. MCU가 바뀌면 keymap.c도 전부 다시 작성해야 하나요?

    동일한 레이아웃 매크로와 QMK 기능이 지원된다면 키맵의 상당 부분을 재사용할 수 있습니다. 다만 핀 구성, 부트로더, 저장 방식과 MCU 전용 기능은 새 하드웨어에 맞게 조정해야 합니다.

    “`

    함께 보면 좋은 글

    공식 자료

    Sources

    • QMK Firmware Documentation, QMK Project
    • QMK Firmware Source Repository, GitHub
    • QMK Keyboard Metadata and info.json Reference
    • QMK Configuration Options Reference
    LINK&TEM 한 줄 정리

    QMK Firmware는 키보드 설정 파일, 공통 기능, MCU 제어 코드와 사용자 키맵을 계층적으로 결합해 하나의 실행 가능한 펌웨어로 만드는 구조입니다.

    7

    전원이 켜진 뒤 QMK Firmware는 어떻게 동작할까?

    컴파일된 QMK Firmware가 키보드의 마이크로컨트롤러에 기록되면, 소스 코드의 파일 구조는 하나의 실행 가능한 펌웨어 이미지로 바뀝니다. 사용자가 키보드에 전원을 연결했을 때 마이크로컨트롤러는 플래시 메모리에 저장된 프로그램을 읽고 초기화 과정을 시작합니다.

    STEP 1
    전원 인가
    USB 또는 배터리에서 전원을 공급받습니다.
    “`
    STEP 2
    MCU 초기화
    클록, GPIO, 타이머와 통신 장치를 준비합니다.
    STEP 3
    QMK 초기화
    키맵, 레이어, 기능과 저장값을 불러옵니다.
    STEP 4
    반복 실행
    매트릭스를 스캔하고 키 입력을 처리합니다.
    “`

    초기화가 끝나면 QMK는 한 번 실행되고 종료되는 일반 프로그램처럼 동작하지 않습니다. 키보드가 켜져 있는 동안 매우 짧은 작업을 계속 반복하는 구조로 움직입니다. 이 반복 구간에서 스위치 상태 확인, 디바운스 처리, 키코드 변환, 레이어 판정, 매크로 실행, RGB 갱신, USB 보고서 전송 등이 순서대로 처리됩니다.

    핵심 포인트

    QMK의 중심은 특정 파일 하나가 아니라, 하드웨어 초기화와 키 입력 처리를 계속 연결하는 실행 흐름입니다. 키맵에 작성한 기능은 이 반복 흐름 안에서 조건에 맞을 때 호출됩니다.

    8

    매트릭스 스캔과 키코드 처리는 어떻게 연결될까?

    기계식 키보드의 스위치는 대부분 행과 열로 구성된 매트릭스 회로에 연결됩니다. QMK는 각 행과 열의 전기적 상태를 빠르게 확인해 어떤 스위치가 눌렸는지 판정합니다. 이때 확인된 위치는 곧바로 문자로 전송되는 것이 아니라 여러 처리 단계를 통과합니다.

    처리 단계 QMK가 하는 일 예시
    매트릭스 읽기 행과 열의 상태를 확인합니다. 2행 3열 스위치 눌림
    디바운스 접점 진동으로 발생한 불안정한 신호를 정리합니다. 한 번 누른 키가 여러 번 인식되는 현상 방지
    레이어 판정 현재 활성화된 레이어에서 해당 위치의 키코드를 찾습니다. 기본 레이어에서는 A, 기능 레이어에서는 F1
    이벤트 처리 일반 키, 모드탭, 매크로, 탭댄스 등의 동작을 실행합니다. 짧게 누르면 Esc, 길게 누르면 Ctrl
    HID 보고서 전송 처리 결과를 USB 또는 무선 HID 보고서로 호스트에 전달합니다. 운영체제가 키 입력을 수신

    따라서 키보드에서 물리적인 스위치 하나를 눌렀다고 해서 PC에 특정 문자가 고정적으로 전달되는 것은 아닙니다. 동일한 스위치 위치라도 현재 레이어, 조합 상태, 사용자 코드와 기능 설정에 따라 전혀 다른 결과가 만들어질 수 있습니다. 이것이 QMK 기반 키보드가 일반적인 고정형 펌웨어보다 유연한 이유입니다.

    9

    Flash와 EEPROM은 어떤 역할을 나눠 가질까?

    QMK Firmware를 이해할 때 자주 혼동되는 부분이 플래시 메모리와 EEPROM입니다. 두 저장 영역 모두 전원을 꺼도 정보가 유지될 수 있지만, 저장되는 데이터의 성격과 갱신 방식이 다릅니다.

    FLASH MEMORY

    펌웨어 프로그램 저장

    컴파일된 QMK 코드, 키맵, 활성화된 기능과 하드웨어 제어 로직이 포함됩니다. 소스 코드를 수정한 뒤 펌웨어를 다시 플래싱하면 이 영역의 프로그램이 교체됩니다.

    “`
    EEPROM

    사용자 설정값 저장

    기본 레이어, RGB 설정, 오디오 설정, VIA에서 변경한 키맵처럼 실행 중 바뀔 수 있는 값을 저장하는 데 사용됩니다. MCU에 따라 별도 EEPROM 대신 플래시 일부를 가상 EEPROM처럼 사용할 수도 있습니다.

    “`
    구분 Flash EEPROM 또는 가상 EEPROM
    주요 내용 실행할 펌웨어 코드 변경 가능한 설정값
    갱신 시점 펌웨어 플래싱 시 설정 변경 또는 저장 명령 실행 시
    대표 예시 keymap.c, 기능 코드, USB 처리 코드 VIA 키맵, 기본 레이어, RGB 밝기
    초기화 영향 다른 펌웨어를 플래싱하면 프로그램 변경 EEPROM 초기화 명령으로 설정값 삭제 가능
    주의할 점

    새 펌웨어를 플래싱했는데도 VIA 키맵이나 RGB 설정이 이전 상태로 남아 있다면, 플래시의 펌웨어와 EEPROM의 설정값이 별도로 유지되고 있기 때문일 수 있습니다. 구조가 크게 바뀐 펌웨어를 설치한 뒤 문제가 생기면 EEPROM 초기화가 필요한 경우도 있습니다.

    10

    VIA와 QMK Firmware는 어떤 관계일까?

    VIA는 QMK와 완전히 별개의 펌웨어가 아닙니다. 일반적으로 VIA 지원 키보드는 QMK Firmware 안에 VIA 통신 기능이 포함된 형태로 빌드됩니다. VIA 웹 앱이나 데스크톱 앱은 키보드와 통신해 현재 키맵과 설정을 읽고 변경합니다.

    VIA 앱
    사용자 인터페이스에서 키 배치를 변경
    “`
    VIA 통신 기능
    QMK 내부에서 설정 읽기와 쓰기 요청을 처리
    EEPROM
    변경된 키맵과 설정을 비휘발성 영역에 저장
    “`

    VIA에서 키를 변경할 때마다 QMK 소스 코드의 keymap.c가 수정되는 것은 아닙니다. 펌웨어 안에 준비된 동적 키맵 저장 영역의 값이 바뀌고, QMK는 스캔 과정에서 해당 값을 참조합니다. 반면 소스 코드로 직접 빌드한 키맵은 컴파일 시 펌웨어 프로그램에 포함됩니다.

    구분 QMK 소스 키맵 VIA 동적 키맵
    변경 방법 소스 수정 후 다시 컴파일하고 플래싱 VIA 화면에서 즉시 변경
    저장 위치 펌웨어 플래시 이미지 EEPROM 또는 대응되는 저장 영역
    자유도 사용자 코드와 고급 기능까지 구현 가능 펌웨어가 미리 허용한 범위에서 변경
    적합한 사용자 고급 커스텀 기능과 직접 개발이 필요한 사용자 코드 없이 빠르게 키 배치를 변경하려는 사용자
    11

    STM32와 RP2040에서는 무엇이 달라질까?

    QMK의 상위 구조는 MCU가 달라져도 비슷하게 유지됩니다. 사용자는 동일한 방식으로 키보드 폴더, 키맵, 레이어와 기능을 구성할 수 있습니다. 하지만 하드웨어에 가까운 하위 계층에서는 MCU 종류에 따라 빌드 시스템, 드라이버, 부트로더, 플래싱 방식과 주변 장치 설정이 달라질 수 있습니다.

    비교 항목 STM32 계열 RP2040 계열
    프로세서 구조 제품군에 따라 다양한 ARM Cortex-M 코어 사용 듀얼 코어 ARM Cortex-M0+ 기반
    저장 구조 MCU 내부 플래시를 사용하는 모델이 많음 외부 QSPI 플래시를 사용하는 구성이 일반적
    펌웨어 파일 부트로더에 따라 BIN, HEX, DFU 방식 등이 사용됨 UF2 파일을 드라이브에 복사하는 방식이 널리 사용됨
    저수준 지원 QMK의 하드웨어 추상화 계층과 지원 프레임워크 사용 RP2040용 드라이버와 하드웨어 설정 사용
    키맵 작성법 대부분 동일한 QMK 키코드와 레이어 문법 사용 대부분 동일한 QMK 키코드와 레이어 문법 사용

    즉, 사용자가 보는 QMK의 상위 인터페이스는 최대한 공통으로 유지되고, MCU별 차이는 하드웨어 추상화 계층 아래에서 처리됩니다. 이 구조 덕분에 같은 QMK 기능을 서로 다른 MCU 기반 키보드에도 비교적 일관된 방식으로 적용할 수 있습니다.

    중요한 해석

    STM32와 RP2040의 차이는 단순히 처리 속도만의 문제가 아닙니다. 플래시 구조, 부트로더, USB 구현, 사용 가능한 핀과 주변 장치가 다르므로 키보드 PCB 설계와 펌웨어 설정도 함께 달라집니다.

    12

    QMK Firmware 구조를 한눈에 정리하면

    소스 구조
    QMK 공통 코드, MCU 지원 코드, 키보드 정의와 사용자 키맵으로 나뉩니다.
    “`
    빌드 과정
    설정 파일과 C 소스가 전처리, 컴파일, 링크 과정을 거쳐 펌웨어가 됩니다.
    실행 구조
    초기화 후 매트릭스 스캔과 입력 처리를 빠르게 반복합니다.
    저장 구조
    펌웨어 코드는 플래시에, 변경 가능한 설정은 EEPROM 계열 영역에 저장됩니다.
    VIA 연동
    QMK의 동적 키맵 기능을 이용해 컴파일 없이 키 배치를 변경합니다.
    MCU 차이
    상위 키맵 구조는 비슷하지만 저수준 드라이버와 플래싱 방식은 달라집니다.
    “`
    FINAL INSIGHT

    QMK는 키맵 파일 하나가 아니라 계층화된 펌웨어 플랫폼입니다

    QMK Firmware는 키 위치를 문자로 바꾸는 단순한 변환표가 아닙니다. 키보드 하드웨어 정의, MCU 제어, 매트릭스 스캔, 키 이벤트 처리, USB HID 통신, 저장 장치 관리와 사용자 기능을 하나의 구조 안에서 연결합니다. 사용자는 상위 키맵과 기능 설정을 중심으로 작업하지만, 그 아래에서는 수많은 공통 모듈과 하드웨어 계층이 함께 동작합니다.

    자주 묻는 질문

    Q1. QMK를 사용하려면 반드시 C 언어를 알아야 하나요?

    기본적인 키맵 변경은 기존 예제를 수정하거나 QMK Configurator를 이용해도 가능합니다. 다만 사용자 키코드, 매크로, 상태 조건과 고급 기능을 직접 구현하려면 C 문법과 QMK의 이벤트 구조를 이해하는 것이 도움이 됩니다.

    “`

    Q2. keymap.c만 수정하면 모든 기능을 구현할 수 있나요?

    많은 사용자 기능은 keymap.c에서 구현할 수 있지만, 하드웨어 핀 설정이나 기능 활성화에는 config.h, rules.mk, info.json 등의 수정이 필요할 수 있습니다. 키보드 자체의 구조를 바꾸는 작업은 keyboard.c나 하드웨어 정의 파일까지 확인해야 합니다.

    Q3. VIA에서 바꾼 키맵은 펌웨어를 다시 설치하면 사라지나요?

    펌웨어 플래싱 방식과 EEPROM 처리 여부에 따라 달라집니다. 동적 키맵 정보가 저장된 EEPROM 영역이 유지되면 이전 설정이 남을 수 있고, EEPROM을 초기화하면 기본 키맵으로 돌아갈 수 있습니다.

    Q4. QMK의 폴더가 복잡한 이유는 무엇인가요?

    수많은 키보드와 MCU를 하나의 프로젝트에서 지원하기 때문입니다. 공통 기능은 재사용하고, 키보드별 차이와 사용자 키맵은 별도 계층으로 분리해 중복을 줄이는 구조입니다.

    Q5. MCU가 바뀌면 keymap.c도 전부 다시 작성해야 하나요?

    동일한 레이아웃 매크로와 QMK 기능이 지원된다면 키맵의 상당 부분을 재사용할 수 있습니다. 다만 핀 구성, 부트로더, 저장 방식과 MCU 전용 기능은 새 하드웨어에 맞게 조정해야 합니다.

    “`

    함께 보면 좋은 글

    공식 자료

    Sources

    • QMK Firmware Documentation, QMK Project
    • QMK Firmware Source Repository, GitHub
    • QMK Keyboard Metadata and info.json Reference
    • QMK Configuration Options Reference
    LINK&TEM 한 줄 정리

    QMK Firmware는 키보드 설정 파일, 공통 기능, MCU 제어 코드와 사용자 키맵을 계층적으로 결합해 하나의 실행 가능한 펌웨어로 만드는 구조입니다.