QMK 固件实战:ai03 JP60 JIS 兼容键盘的构建、烧录与矩阵配置解析
【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware
本文基于 QMK 固件仓库中的 JP60 键盘文档 keyboards/ai03/jp60/readme.md 展开,围绕这块 GH60 兼容、JIS 类布局的热插拔键盘 PCB,讲清楚三件事:如何用make命令编译与烧录 JP60 固件、如何通过 Bootmagic/复位键/QK_BOOT 三种方式进入 ATmega32u4 的 DFU 引导加载器,以及 keyboard.json 中定义的 5×14 矩阵、USB 描述符与 JIS 键位映射是如何组织并生效的。读完后你可以独立完成该键盘的固件构建,并理解其防抖策略(asym_eager_defer_pk)的底层实现。
JP60 键盘简介
JP60 是由 ai03 Design Studio 设计的一款GH60 兼容的 JIS 类热插拔键盘 PCB(见 readme 中的 "GH60-compatible JIS-like hotswap keyboard PCB")。它继承 GH60 的 60% 外形轮廓,但键位按 JIS(日式)布局排布——1U 的\/键、1.25U 的 Tab 键、1.75U 的 Caps Lock、1.25U 的 Enter 等,是典型的 JIS 60% 形态。
从 keyboard.json 可以确认该板的核心身份信息:
| 项目 | 值 | 说明 |
|---|---|---|
| 主控 | atmega32u4 | ATmega32u4,自带 USB |
| 引导加载器 | atmel-dfu | 标准 DFU,可用dfu-util/ QMK 自动烧录 |
| USB VID | 0xA103 | ai03 的厂商 ID |
| USB PID | 0x0024 | JP60 在 ai03 系列中的产品 ID |
| 设备版本 | 0.0.1 | USB bcdDevice 字段 |
| LTO | true | 开启链接时优化,进一步压缩体积 |
features节点默认启用了bootmagic、extrakey、mousekey、nkro(无键冲突)四项功能;qmk.locking同时开启enabled与resync,意味着该板默认具备 Caps Lock 锁定指示与锁定状态重同步能力。这些能力决定了 keymap 中可以使用QK_BOOT、鼠标键、T(系列锁定键码等,无需在rules.mk中额外声明。
编译与烧录
按照原文档给出的操作,在配置好 QMK 构建环境之后(构建环境搭建与 make 用法可参见仓库内 docs/getting_started_make_guide.md 与 docs/getting_started_docker.md),编译 JP60 默认键位的命令为:
make ai03/jp60:default烧录命令为:
make ai03/jp60:default:flash其中ai03/jp60是键盘名,default对应 keyboards/ai03/jp60/keymaps/default/keymap.c 这个默认键位;由于该键盘只有一个 keymap,构建系统会自动选择它。若要在烧录后自动复位并进入固件,可追加-e参数;若构建环境尚未就绪,QMK 提供 Docker 与裸机两套环境搭建路径(对应仓库中的docs/getting_started_docker.md等文档)。
进入 Bootloader 的三种方式
原文档的 "Bootloader" 一节列出了三种进入 DFU 引导加载器的方法,这也是所有atmel-dfu键盘的共同约定:
- Bootmagic 复位:按住矩阵中 (0,0) 位置(通常是左上角第一个键,JP60 上即
KC_ESC)不放,然后插入 USB 线。固件检测到该键在启动时处于按下状态即自动跳转 DFU。这依赖keyboard.json中的"bootmagic": true。 - 物理复位键:短按 PCB 背面的 RESET 按钮——部分板子是裸露的焊盘,需要用镊子短接。
- 布局中的键码:按下映射为
QK_BOOT的键。JP60 的默认键位中,FN 层第一行第一个键(_FN层的左上角)正是QK_BOOT。
进入 DFU 后,主机会识别出标准的 atmel-dfu 设备,随后即可用make ai03/jp60:default:flash完成烧录。
矩阵配置:5 行 × 14 列,COL2ROW
keyboard.json 中的matrix_pins定义了完整的扫描矩阵,共5 行 × 14 列,二极管方向为COL2ROW:
"matrix_pins": { "cols": ["D2", "D1", "D3", "D5", "D4", "D6", "C6", "F0", "F1", "F4", "F5", "F6", "F7", "C7"], "rows": ["B6", "B5", "B4", "D7", "E6"] }几个值得注意的细节:
- 列引脚并非按 D2–D7 的顺序排列(如
D3后是D5、D4),这是 PCB 布线时为缩短走线做的重排,对上层软件完全透明——QMK 只按数组下标把matrix: [row, col]映射到物理按键。 COL2ROW表示二极管阳极接列、阴极接行,扫描时逐行拉低、读列电平。- 5×14 的矩阵容量为 70 键,实际使用 60 键位,其中
matrix: [2, 12]被复用为第 0 行第 14 列的一个额外 1U 键位(位于数字行最右),而[2, 12]在第二行则是 Backspace 键的一部分——从layouts.LAYOUT的坐标数据可以看到这个键被描述为"x": 14, "y": 0。
diode_direction与矩阵引脚是 QMK "data-driven" 键盘配置的一部分,格式说明见 docs/reference_info_json.md(该键盘的 JSON 是 info.json 的演进形态,字段语义一致)。
布局与 JIS 键位
layouts.LAYOUT用 x/y/w/h 坐标精确描述了 JIS 60% 形态,与 keymap.c 中的LAYOUT(...)宏一一对应。典型特征键位包括:
| 键位 | 矩阵坐标 | 尺寸 |
|---|---|---|
| Esc | [0,0] | 1U |
| Tab | [1,0] | 1.5U |
| Backspace | [2,0] | 1.25U × 2U |
| Caps Lock | [2,1] | 1.75U |
| LShift | [3,0] | 2.25U |
| RShift | [3,13] | 1.75U |
| Space | [4,7] | 6U |
| Enter | [2,0] 复用 | 1.25U(第二行末位) |
默认键位使用了 JIS 专用键码(来自 QMK 的keymap_japanese.h扩展集),例如JP_1–JP_0、JP_YEN(¥)、JP_CIRC(.)、JP_MINS(-)、JP_MHEN(-全角)、JP_HENK(`半角/全角)、JP_KANA、JP_ZKHK(无换行)、JP_EISU(英数)。这与 ANSI 布局的KC_1…KC_MINS等是两套独立的 HID 键码,保证在日语 IME 环境下产生正确的 JIS 输出:
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT( /* Base */ KC_ESC, JP_1, JP_2, JP_3, JP_4, JP_5, JP_6, JP_7, JP_8, JP_9, JP_0, JP_MINS, JP_CIRC, JP_YEN, KC_DEL, KC_TAB, JP_Q, JP_W, JP_E, JP_R, JP_T, JP_Y, JP_U, JP_I, JP_O, JP_P, JP_AT, JP_LBRC, MO(1), JP_A, JP_S, JP_D, JP_F, JP_G, JP_H, JP_J, JP_K, JP_L, JP_SCLN, JP_COLN, JP_RBRC, KC_ENT, KC_LSFT, JP_Z, JP_X, JP_C, JP_V, JP_B, JP_N, JP_M, JP_COMM, JP_DOT, JP_SLSH, JP_BSLS, KC_RSFT, KC_LCTL, KC_LGUI, KC_LALT, JP_MHEN, KC_SPC, JP_HENK, JP_KANA, JP_ZKHK, JP_EISU ), ... };第二层_FN由左下角MO(1)切入:F1–F12 横排在首行(F1 即QK_BOOT),并给出了一套 JIS 键盘典型的导航布局——PGUP/UP在上层、HOME/PGDN/END在中间层、方向键与左右箭头在 FN 层中部,LEFT/DOWN/RIGHT与ENT列对齐。这种"F 键 + 四向导航"的双行排布是 60% JIS 布局的常见解法。
防抖策略:asym_eager_defer_pk 的源码级解读
JP60 的 keymap 目录下附带了 rules.mk,只有一行配置,但信息量很大:
DEBOUNCE_TYPE = asym_eager_defer_pk # Specify per-key debounce for improved responsiveness它把该键盘的防抖算法从默认的sym_defer_g切换为asym_eager_defer_pk。QMK 支持的全部防抖算法及其语义在 docs/feature_debounce_type.md 中有完整表格,其中asym_eager_defer_pk的定义是:
按键按下(key-down)时状态立即上报(eager),随后忽略该键
DEBOUNCE毫秒内的后续变化;按键抬起(key-up)时为每键启动计时器,等该键DEBOUNCE毫秒内无变化后再上报(defer)。
对应实现位于 quantum/debounce/asym_eager_defer_pk.c。从源码结构看,其核心逻辑为:
- 每键维护一个
debounce_counter_t(1 位 pressed 标志 + 7 位计时值,DEBOUNCE上限被钳制在 127ms); transfer_matrix_values()中,按下事件直接cooked[row] ^= col_mask立即生效,这就是"eager"——打字响应零延迟;- 抬起事件则不立即修改 cooked 矩阵,而是等
update_debounce_counters_and_transfer_if_expired()在DEBOUNCE毫秒后确认电平稳定才推送,这就是"defer"——用于吸收开关弹跳带来的误抬起; - 若未定义
DEBOUNCE宏,代码内默认取 5ms,也可在config.h中#define DEBOUNCE 10调整。
选择该算法的动机正如 rules.mk 注释所说 "for improved responsiveness":按下零延迟对打字手感最重要,而抬起的防抖延迟通常被手指离开键面的物理时间掩盖,因此用"按下即时、抬起延时"的非对称折中换取更快的响应。该算法还有对应的单元测试(见 quantum/debounce/tests/testlist.mk 中的debounce_asym_eager_defer_pk条目),保证行为与文档一致。
小结
JP60 在 QMK 仓库中的全部核心资产即四个文件:readme(构建/烧录/Bootloader 说明)、keyboard.json(USB 描述符、5×14 矩阵引脚、JIS 布局坐标、功能开关)、keymaps/default/keymap.c(JIS 键码 + FN 层导航布局)、keymaps/default/rules.mk(防抖算法选型)。构建流程固定为make ai03/jp60:default编译、make ai03/jp60:default:flash烧录,烧录前需通过 Bootmagic(按住 Esc 插线)、PCB 背面复位键或 FN 层的QK_BOOT三者之一进入 atmel-dfu。若你在此基础上定制 keymap,需要注意 JIS 键码来自keymap_japanese.h,且矩阵坐标与 JIS 大键位的对应关系以keyboard.json的layouts.LAYOUT为准。
【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考