QMK 固件中的 AnomalyKB a65i 键盘支持指南:从刷机、进入 Bootloader 到配列定制
【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware
本指南聚焦 QMK Firmware 仓库中对 AnomalyKB a65i(一款由 Lfgberg 设计 PCB 的 65% 布局键盘)的官方支持。文中将以 keyboards/anomalykb/a65i/readme.md 为核心骨架,结合同目录下的 keyboard.json 与四套官方 keymap 源码,完整讲解该键盘的硬件配置、两种进入 Bootloader 的方式、官方编译命令,以及 ANSI / ISO / 分裂 Backspace 等配列的编译与自定义方法,帮助你完成从拿到 PCB 到刷入自定义固件的全流程。
键盘概况与硬件身份
a65i 是 AnomalyKB 推出的一款 65% 布局键盘 PCB,由 Lfgberg 设计并作为 QMK 仓库中该键盘的 Maintainer(维护者)。在仓库的键盘元数据中,它的官方身份信息定义在 keyboards/anomalykb/a65i/keyboard.json:
| 字段 | 值 | 说明 |
|---|---|---|
keyboard_name | A65I | QMK 编译系统中使用的键盘名 |
manufacturer | AnomalyKB | 制造商 / 品牌 |
maintainer | Lfgberg | 仓库维护者 |
usb.vid | 0x4C47 | USB Vendor ID |
usb.pid | 0x0004 | USB Product ID |
usb.device_version | 0.0.1 | 设备版本号 |
主控芯片为atmega32u4(ATmega32U4,AVR 架构),Bootloader 为atmel-dfu,这意味着它遵循 QMK 对经典 AVR 键盘的常见刷写流程。矩阵定义为 5 行 × 16 列(matrix_pins中 cols 列出 16 个引脚、rows 列出 5 个引脚),二极管方向为COL2ROW,详情见 keyboard.json。
进入 Bootloader 的两种方式
readme 中明确给出了 a65i 进入 Bootloader 模式(DFU 模式)的两种途径:
- 使用 MCU 附近的复位(Reset)按钮:按下 PCB 上主控芯片旁边的复位按钮,即可直接进入 Bootloader。
- Bootmagic 快捷方式:在插入 USB 的同时按住 ESC 键,通过 Bootmagic 触发进入 Bootloader。
第二种方式尤其重要——它意味着即使 PCB 上没有独立复位按钮,或键盘已装入外壳不便触达按钮时,你依然可以仅凭按键进入刷写模式。
从仓库实现看,该功能通过 keyboard.json 的features.bootmagic启用。QMK 当前的 Bootmagic 功能专注于「仅处理跳转进 Bootloader」,非常适合没有物理复位按钮的板子(官方说明见 docs/features/bootmagic.md)。触发方式是插入键盘时按住该键不松手即可,默认按键位置即多数键盘的 ESC 位。需要注意的是,文档同时给出警告:使用 Bootmagic总会重置 EEPROM,因此通过该方式进入刷写模式会丢失已保存的设置(如层状态、背光亮度等自定义配置),见 docs/features/bootmagic.md。
编译与刷写
在完成 QMK 构建环境搭建后,编译 a65i 默认固件的命令如下:
make anomalykb/a65i:default这条命令会编译defaultkeymap 并产出可直接刷入的固件。如果环境尚未搭建,可以参考仓库中的构建环境设置与 Make 使用指南(docs/newbs_building_firmware.md、docs/getting_started_make_guide.md);对完全的新手,建议从 docs/newbs.md 开始。
由于键盘使用atmel-dfuBootloader,刷写时通常会先将键盘置于 DFU 模式(上述两种方式任选其一),再用 QMK 工具链完成烧录;具体刷写方法可参考 docs/flashing.md。编译后生成的固件文件名遵循anomalykb_a65i_default的命名习惯。
官方配列与 keymap 文件结构
a65i 在仓库中提供了四种官方配列(layout),全部定义在 keyboard.json 的layout_aliases中,并映射到 QMK 标准的 65% 布局宏:
| 别名 | 对应布局宏 | 配列说明 |
|---|---|---|
LAYOUT_ansi | LAYOUT_65_ansi_blocker | ANSI 配列(含右上方 blocker 分隔) |
LAYOUT_ansi_splitbs | LAYOUT_65_ansi_blocker_split_bs | ANSI 配列 + 分裂 Backspace |
LAYOUT_iso | LAYOUT_65_iso_blocker | ISO 配列(含右上方 blocker 分隔) |
LAYOUT_iso_splitbs | LAYOUT_65_iso_blocker_split_bs | ISO 配列 + 分裂 Backspace |
此外还定义了一个LAYOUT_all完整矩阵布局(16 列全展开,见 keyboard.json),用于需要覆盖所有矩阵键位的场景。LAYOUT_all中可以看到诸如 2.25U 左 Shift、6.25U 空格、右侧 1.25U 高的竖向按键等尺寸定义,与下方默认 keymap 的 ASCII 布局图完全对应。
对应的官方 keymap 目录结构为:
keyboards/anomalykb/a65i/keymaps/ ├── default/ # ANSI 配列默认层 + Fn 层 ├── ansi_splitbs/ # ANSI + 分裂 Backspace ├── iso/ # ISO 配列 └── iso_splitbs/ # ISO + 分裂 Backspace各 keymap 的布局图可对照各目录下的keymap.c内 ASCII 注释查看。
默认 keymap 解析:ANSI 双层布局
defaultkeymap 位于 keyboards/anomalykb/a65i/keymaps/default/keymap.c,使用LAYOUT_65_ansi_blocker宏定义了两层(Layer 0 / Layer 1)布局。
Layer 0(默认层)是一个标准的 65% ANSI 布局:
,----------------------------------------------------------------. |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |Home| |----------------------------------------------------------------| |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |PgUp| |----------------------------------------------------------------| |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return |PgDn| |----------------------------------------------------------------| |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|Del | |----------------------------------------------------------------| |Ctrl|Win |Alt | Space |Alt| FN|Ctrl|Lef|Dow|Rig | `----------------------------------------------------------------'对应的 C 代码为(节选 default/keymap.c):
[0] = LAYOUT_65_ansi_blocker( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PSCR, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT),Layer 1(Fn 层)由右下角的MO(1)临时层触发,按住在 Layer 0 中标为FN的按键即可临时切换到本层(见 default/keymap.c):
[1] = LAYOUT_65_ansi_blocker( QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),要点解析:
QK_BOOT(即旧的RESET)键位放在 Layer 1 的左上角(ESC 位置):在默认层按FN + Esc即可触发 Bootloader 跳转——这实际上提供了第三种软进入刷写模式的方式,无需触碰物理按钮或重新插拔 USB。MO(1)是临时层切换键,按住时进入 Layer 1,松开自动回到默认层。KC_TRNS(Transparent)表示该键位「透明」,沿用更低层(这里是 Layer 0)的按键定义,因此 Layer 1 中未重新定义的按键行为与默认层一致。- 数字行在 Layer 1 中映射为
KC_F1~KC_F12,即FN + 1到FN + =可快捷触发功能键。
分裂 Backspace 与 ISO 配列变体
仓库还提供了三种配列变体,方便不同键帽套装与使用习惯的用户直接编译使用。
ANSI + 分裂 Backspace(ansi_splitbs)
位于 keyboards/anomalykb/a65i/keymaps/ansi_splitbs/keymap.c,使用LAYOUT_65_ansi_blocker_split_bs宏。与默认 ANSI 配列的核心区别在第一行:原本 2U 的 Backspace 被拆成「~(反引号)+ Backspace」两个键,同时右上角仍保留 Home 键(Layer 1 中对应KC_F1~KC_F12的布局不变,见其 keymap.c):
[0] = LAYOUT_65_ansi_blocker_split_bs( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PSCR, ...注意该层第一行的键位数量比默认配列多一个(多出KC_GRV),因此两端与默认层不同,键盘顶部实际键位总数更多,需要在LAYOUT_65_ansi_blocker_split_bs对应的布局定义中体现。
ISO 配列(iso)
位于 keyboards/anomalykb/a65i/keymaps/iso/keymap.c,使用LAYOUT_65_iso_blocker宏。与 ANSI 相比,它的差异集中在回车区附近:Enter 为倒 L 形 ISO 回车,并在其左侧补齐KC_NUHS(非美式#~键),同时KC_BSLS(反斜杠)移到左 Shift 右侧,见 iso/keymap.c:
[0] = LAYOUT_65_iso_blocker( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PSCR, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGUP, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGDN, KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT),ISO + 分裂 Backspace(iso_splitbs)
位于 keyboards/anomalykb/a65i/keymaps/iso_splitbs/keymap.c,使用LAYOUT_65_iso_blocker_split_bs宏,同时具备 ISO 回车区与分裂 Backspace(~+ Backspace)两个特征,见 iso_splitbs/keymap.c。
四套 keymap 的 Layer 1 结构一致:左上角均为QK_BOOT进入 Bootloader、数字行均为 F1~F12,其余键位全部KC_TRNS透明,保证 Fn 层行为在不同配列间保持一致。
硬件特征与功能配置
除配列外,keyboard.json 中还定义了该键盘启用的一组 QMK 功能:
"features": { "bootmagic": true, "console": true, "extrakey": true, "mousekey": true, "nkro": true }, "qmk": { "locking": { "enabled": true, "resync": true } }逐项说明:
| 配置项 | 含义 |
|---|---|
bootmagic | 启用 Bootmagic(插入 USB 时按住 ESC 进入 Bootloader) |
console | 启用调试控制台输出,便于通过终端观察调试信息 |
extrakey | 启用媒体键 / 系统控制键(音量、播放等) |
mousekey | 启用鼠标键功能(用键盘模拟鼠标指针与按键) |
nkro | 启用 N 键无冲突(NKRO)输入 |
locking | 启用锁定键(Caps Lock / Num Lock / Scroll Lock)状态同步(resync表示同步重同步行为) |
如何定制自己的 keymap
你可以基于官方 keymap 快速创建自己的配列,基本流程如下:
- 复制一份官方 keymap:将
keymaps/default/目录复制为keymaps/<yourname>/(例如keymaps/mine/),然后编辑其中的keymap.c。 - 修改键位映射:在
keymaps/<yourname>/keymap.c中按需修改 Layer 0 与 Layer 1 的键位。注意每个键位的数量与顺序必须严格匹配所选布局宏的参数个数(如LAYOUT_65_ansi_blocker有 67 个参数,LAYOUT_65_ansi_blocker_split_bs有 68 个),参数错位会导致编译错误或键位错乱。 - 加入更多层:可继续追加
[2]、[3]等更高层,配合MO(x)、LT(x, kc)、TG(x)等层切换键码实现更复杂的功能;更多可用的量子键码可参考 docs/quantum_keycodes.md 与 docs/keycodes.md。 - 编译验证:执行
make anomalykb/a65i:<yourname>进行编译,无错误后即可刷入键盘。 - 刷写固件:先进入 Bootloader(复位按钮、插电按住 ESC,或在默认层按
FN + Esc),再执行刷写操作,详见 docs/flashing.md。
若希望为 a65i 添加新布局宏(例如更特殊的配列),可参考LAYOUT_all的定义方式,在 keyboard.json 的layouts段中新增条目,该键盘已采用 QMK 的 contenteditable="false">【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考