news 2026/9/16 17:57:12

QMK 固件实战:ai03 JP60 JIS 兼容键盘的构建、烧录与矩阵配置解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
QMK 固件实战:ai03 JP60 JIS 兼容键盘的构建、烧录与矩阵配置解析

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 可以确认该板的核心身份信息:

项目说明
主控atmega32u4ATmega32u4,自带 USB
引导加载器atmel-dfu标准 DFU,可用dfu-util/ QMK 自动烧录
USB VID0xA103ai03 的厂商 ID
USB PID0x0024JP60 在 ai03 系列中的产品 ID
设备版本0.0.1USB bcdDevice 字段
LTOtrue开启链接时优化,进一步压缩体积

features节点默认启用了bootmagicextrakeymousekeynkro(无键冲突)四项功能;qmk.locking同时开启enabledresync,意味着该板默认具备 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键盘的共同约定:

  1. Bootmagic 复位:按住矩阵中 (0,0) 位置(通常是左上角第一个键,JP60 上即KC_ESC)不放,然后插入 USB 线。固件检测到该键在启动时处于按下状态即自动跳转 DFU。这依赖keyboard.json中的"bootmagic": true
  2. 物理复位键:短按 PCB 背面的 RESET 按钮——部分板子是裸露的焊盘,需要用镊子短接。
  3. 布局中的键码:按下映射为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后是D5D4),这是 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_1JP_0JP_YEN(¥)、JP_CIRC(.)、JP_MINS(-)、JP_MHEN(-全角)、JP_HENK(`半角/全角)、JP_KANAJP_ZKHK(无换行)、JP_EISU(英数)。这与 ANSI 布局的KC_1KC_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/RIGHTENT列对齐。这种"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.jsonlayouts.LAYOUT为准。

【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 17:55:27

WSL2深度实践指南:从安装配置到AI/云原生生产落地

1. 为什么现在必须认真对待 WSL2:它早已不是“Linux子系统”那么简单 Windows 上装个 WSL2,表面看只是敲几行命令、点几个确认框的事——但如果你真这么想,大概率会在三天后凌晨两点对着黑屏终端抓狂: wsl --list --verbose 显…

作者头像 李华
网站建设 2026/9/16 17:55:03

AI论文写作工具测评:学术规范与学科适配实战指南

1. 项目概述:AI论文写作工具的崛起与痛点解决去年帮学弟改论文时,发现他用了某款AI写作工具生成的文献综述,不仅结构完整,连引用的文献都精准匹配研究方向。这让我意识到,AI论文工具已经从早期的"文字拼接机"…

作者头像 李华
网站建设 2026/9/16 17:54:17

MEMS差压传感器与精密电阻组合:低成本搭建微差压监控与信号调理链路

搞工业现场和楼宇自控的朋友,对“压差”这两个字应该都不陌生。风机过滤器堵没堵、洁净室正压够不够、实验室通风柜有没有保持负压,说到底都在看一个数据——高低压侧的压力差。今天我聊一套我最近在用的组合:LMIS025B这颗MEMS差压传感器&…

作者头像 李华
网站建设 2026/9/16 17:54:13

DDR3迁DDR4实录:从选型到布线的五个致命坑

几个月前,我们团队做了一次平台升级,把老产品里用了好几年的DDR3方案整体迁到DDR4。立项时我在会上说了一句“换内存颗粒而已,撑死改改原理图”,后来这句话成了我一个月的笑柄。整个项目走下来,问题根本不在于DDR3和DD…

作者头像 李华
网站建设 2026/9/16 17:51:59

Vue2状态管理:Vuex核心原理与实战应用

1. Vuex在Vue2中的核心价值与应用场景在Vue2项目开发中,随着应用复杂度提升,组件间的状态管理往往会变得混乱。想象一个电商网站:购物车数据需要在导航栏、商品列表、结算页面等多个组件间同步,如果仅用props和事件总线传递&#…

作者头像 李华