QMK 实战指南:4pplet waffling60 Rev D 60% 键盘固件的编译、刷写与底层解析
【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware
本指南以 QMK 固件仓库中 waffling60 Rev D 官方文档 为核心,围绕这块支持 MX 轴体、同时提供热插拔(hot swap)与焊接(solder)两种 PCB 版本的 60% 键盘,系统讲解其固件目标结构、编译命令、DFU 进入方法,并结合仓库源码解析其矩阵配置、RGB 背光与 Caps Lock 指示灯的底层实现。读完本文,你将掌握从零编译 waffling60 Rev D 固件、进入 DFU 刷写固件,以及读懂并二次定制该键盘 QMK 源码的完整能力。
1. waffling60 Rev D:一块怎样的 60% 键盘
根据 waffling60 顶层说明,waffling60 是 4pplet 设计的一款 60% 配列 PCB,面向 MX 轴体,同一型号提供热插拔与焊接两种版本,并具备相当不错的配列兼容性(decent layout support)。Rev D 是该系列中的一个硬件修订版本,配套的 Rev D 文档 明确给出了该版本在 QMK 中的完整支持信息:
- 键盘维护者(Maintainer):4pplet
- 硬件支持:waffling60(含 Rev A / B / C / D / E 以及 Rev D ANSI / ISO 等多个子版本)
- 默认固件目标:
4pplet/waffling60/rev_d
在仓库目录结构中,keyboards/4pplet/waffling60 下按硬件修订版分目录组织,每个修订版都包含自己的keyboard.json(数据驱动配置)、readme.md、keymaps/default/keymap.c默认键位,以及部分版本特有的config.h、rules.mk、.c实现文件。这种"一版一目录"的组织方式是 QMK 多版本键盘的典型结构。
1.1 硬件身份标识
打开 Rev D 的 keyboard.json 可以看到其 USB 描述信息:
"usb": { "vid": "0x4444", "pid": "0x000E", "device_version": "0.0.4" }- VID(厂商 ID):
0x4444,属于 4pplet 的统一厂商标识; - PID(产品 ID):
0x000E,用于在系统与刷写工具中区分 Rev D 与其他修订版; - 设备版本:
0.0.4。
与之对比,Rev D ANSI 使用 PID0x000D、Rev D ISO 使用 PID0x000C,三者共用 VID0x4444,这正是同一系列不同版本共存的常见做法——编译前务必确认目标目录,避免刷错固件。
1.2 主控与引导程序
Rev D 的主控配置同样位于keyboard.json:
"processor": "STM32F072", "bootloader": "stm32-dfu"即主控为 STM32F072(ARM Cortex-M0 内核),引导程序为 STM32 的 DFU 模式,这也决定了本文后面介绍的 DFU 刷写流程。值得注意的是,Rev D 的 rules.mk 中有这样一行:
# Wildcard to allow APM32 MCU DFU_SUFFIX_ARGS = -p FFFF -v FFFF其注释说明这是为了兼容 APM32 主控(国产 STM32 兼容芯片)——通过将 DFU 后缀校验中的 PID/VID 设为通配符FFFF,允许同一固件刷写进 APM32 芯片。如果你的 Rev D PCB 使用的是 APM32 主控,这一配置可以避免刷写时因设备标识不匹配而失败;但同时也意味着刷写工具对设备的身份校验放宽,操作时应更谨慎地确认目标设备。
2. 编译固件:make 命令与构建环境
2.1 标准编译命令
按照 Rev D 文档 的说明,搭建好 QMK 构建环境之后,编译该键盘默认键位固件的命令为:
make 4pplet/waffling60/rev_d:default命令的解析规则遵循 QMK 通用的make <keyboard>:<keymap>格式:
4pplet/waffling60/rev_d:键盘目标路径,对应仓库中的 keyboards/4pplet/waffling60/rev_d 目录;default:键位方案名,对应同一目录下 keymaps/default/keymap.c。
编译完成后会生成可直接用于 DFU 刷写的固件文件(通常为.bin/.hex/.dfu形式)。QMK 官方还提供了构建环境搭建文档与 make 使用指南,首次接触 QMK 的读者可先阅读仓库中的 getting_started_build_tools(实际文档路径为 docs/getting_started_build_tools.md)与 getting_started_make_guide,以及 newbs 新手指南。
2.2 同一系列的其他目标
顶层 waffling60 readme 列出了整个系列的可编译目标,方便按手中 PCB 版本选择:
make 4pplet/waffling60/rev_a:default make 4pplet/waffling60/rev_b:default make 4pplet/waffling60/rev_c:default make 4pplet/waffling60/rev_d:default make 4pplet/waffling60/rev_e:default make 4pplet/waffling60/rev_d_ansi:default make 4pplet/waffling60/rev_d_iso:default其中 Rev E 文档 特别说明 Revision E 在 Rev D 基础上增加了底灯(underglow)并支持 6u 空格,因此如果手中是 Rev E PCB,应使用rev_e目标;rev_d_ansi与rev_d_iso则分别对应 ANSI 与 ISO 配列的独立固件目标(详见第 4 节)。
3. 进入 DFU 模式:两种刷写入口
Rev D 文档给出了两种进入 DFU 引导模式的方式,二者适用场景不同。
3.1 方式一:物理复位按钮 / 复位排针
Tap the physical reset button or short the reset-header (labled RESET) on the back of the PCB for keyboard to enter DFU. When in DFU, it's ready to flash the firmware.
即:轻按 PCB 上的物理复位按钮,或用镊子短接 PCB 背面标注为 RESET 的复位排针,键盘即进入 DFU 模式,此时系统会将其识别为 DFU 设备,可直接刷写固件。这是最通用、最可靠的方式,无论固件是否正常都能使用。
3.2 方式二:Bootmagic 组合键(固件已预刷时)
Unplug your keyboard, hold down the Spacebar and B at the same time, plug in your keyboard and wait a second before releasing the keys. The keyboard will enter DFU and is ready to flash the firmware.
即:拔下 USB 线 → 同时按住空格键(Spacebar)与 B 键 → 插入 USB 线 → 等待约一秒后松开按键,键盘同样会进入 DFU 模式。该方式依赖固件中启用的 Bootmagic 功能(Rev D 的 keyboard.json 中"bootmagic": true),因此只适用于固件已被正常预刷的场景;若固件损坏或为空,此入口无法生效。
提示:不同修订版的 DFU 入口按键并不相同。例如 Rev E 文档 使用的是Esc 键(Bootmagic Lite 默认入口),Rev D ISO 文档 则要求长按 MCU 同侧的按键超过 1 秒(短按只会复位而不会进入 DFU)。刷写前请务必查阅对应修订版的 readme。
4. 配列支持:ANSI / ISO / 多种底部布局
Rev D 文档中 "decent layout support" 的表述,在仓库源码中有非常具体的体现。对比三个目标目录的keyboard.json可以看到配列设计的差异:
4.1 Rev D(通用热插拔/焊接版)
Rev D 的 keyboard.json 定义了单个LAYOUT宏,对应默认键位 keymaps/default/keymap.c 中的 5 行键盘矩阵:
- 第一行 15 键(含右上角 Backspace 与 2u 定位);
- 第二行 14 键(1.5u Tab 与 1.5u Backspace 收尾);
- 第三行 14 键(1.75u Caps Lock,右端 1.25u Enter);
- 第四行 14 键(1.25u 左 Shift、ISO 反斜杠位、1.75u 右 Shift 与 FN 层切换键);
- 底行 10 键,采用2.25u 左 Ctrl + 1.25u 键 + 三个 2.25u/2.75u 空格 + 1.25u×3 + 1.25u 右列的分区布局。
4.2 Rev D ANSI
Rev D ANSI 的 keyboard.json 提供纯 ANSI 配列(无 ISO 反斜杠位),右 Shift 为 2.25u,右下角为 1.5u 键位布局,底行为1.5u Ctrl + 1u + 1.5u Alt + 3u 空格 + 1u + 3u 空格 + 1.5u 键位的组合。
4.3 Rev D ISO
Rev D ISO 的 keyboard.json 最为丰富:除了通过layout_aliases将LAYOUT指向LAYOUT_all外,还定义了多个命名的 60% 社区标准配列,包括:
LAYOUT_all:ISO 全键位(含 2u Backspace、2 行高的 ISO Enter);LAYOUT_60_iso_tsangan_split_rshift与LAYOUT_60_iso_tsangan_split_bs_rshift:ISO + Tsangan 底行 + 分裂右 Shift / 分裂 Backspace;LAYOUT_60_iso_wkl_split_rshift与LAYOUT_60_iso_wkl_split_bs_rshift:ISO + WKL 底行(无 Winkey 的 1.5u 键位)+ 分裂变体。
与之配套的 Rev D ISO 矩阵图 用 ASCII 图形直观展示了各键位的矩阵坐标(如2D即矩阵第 2 行第 D 列,对应 ISO Enter 的 2 行高键),并额外绘制了 Tsangan/WKL/HHKB 与 10u 空格三种底行变体,可帮助理解LAYOUT_*宏与物理矩阵的映射关系。
5. 矩阵与硬件特性源码解析
5.1 矩阵引脚与二极管方向
Rev D 采用 5 行 × 14 列的矩阵扫描,引脚定义在 keyboard.json:
"matrix_pins": { "cols": ["B2", "A4", "A3", "A2", "F1", "F0", "C15", "C14", "C13", "B9", "B8", "B7", "A15", "B3"], "rows": ["B14", "A9", "B6", "B5", "B4"] }, "diode_direction": "COL2ROW"- 列引脚为 14 个 GPIO(B2、A4、A3、A2、F1、F0、C15、C14、C13、B9、B8、B7、A15、B3);
- 行引脚为 5 个 GPIO(B14、A9、B6、B5、B4);
diode_direction为COL2ROW,表示二极管阴极方向为"列到行"——这是 QMK 矩阵扫描的方向约定,决定了扫描时行列的驱动与读取角色,改动该值可能导致按键识别异常。
5.2 RGB 与 WS2812 配置
Rev D 在keyboard.json中启用了rgblight功能并声明了 WS2812 灯带引脚:
"features": { "bootmagic": true, "mousekey": true, "extrakey": true, "nkro": true, "rgblight": true }, "rgblight": { "saturation_steps": 8, "brightness_steps": 8, "led_count": 1 }, "ws2812": { "pin": "A8" }led_count: 1表示 Rev D 板上只有1 颗 WS2812 灯珠(Rev E 才加入真正的底灯条);- 饱和度与亮度调节步进各为 8 档,对应
RGB_SAT/RGB_VAI等 RGB 控制键的步进粒度; - 灯带数据引脚为
A8。
此外,Rev D 的 config.h 中还定义了一行关键的硬件宏:
#define WS2812_EXTERNAL_PULLUP这表示 Rev D 的 WS2812 数据线使用了外部上拉电阻,因此需要显式告知 QMK 的 WS2812 驱动,避免驱动在内部上拉/无上拉假设下出现兼容问题。
5.3 Caps Lock 指示灯:用 RGB 灯珠实现
Rev D 并未配置独立的 Caps Lock LED 引脚,而是复用那颗 WS2812 灯珠来指示大写锁定状态,实现代码在 rev_d.c:
bool led_update_kb(led_t led_state) { bool res = led_update_user(led_state); if (CAPS_LOCK_ENABLE && res) { if (led_state.caps_lock) { #ifdef CAPS_LOCK_COLOR rgblight_sethsv_at(CAPS_LOCK_COLOR, 0); #else rgblight_sethsv_at(rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val(), 0); #endif } else { rgblight_sethsv_at(HSV_OFF, 0); } } return res; }其工作逻辑为:
- 先调用
led_update_user()并保存返回值,保证用户层的 LED 钩子仍可执行(返回res向上传递); - Caps Lock 开启时,将第 0 号灯珠设置成指定颜色:若定义了
CAPS_LOCK_COLOR宏则使用该颜色,否则保持当前 RGB 的色相/饱和度/亮度; - Caps Lock 关闭时,将该灯珠设置为
HSV_OFF熄灭; - 通过
#ifndef CAPS_LOCK_ENABLE提供默认值true,允许在构建时通过-DCAPS_LOCK_ENABLE=false关闭这一行为。
这意味着你可以在自己的 keymap 目录中添加config.h,通过定义CAPS_LOCK_COLOR来定制 Caps Lock 指示灯颜色,例如:
#define CAPS_LOCK_COLOR HSV_GREEN5.4 默认键位:双层层级设计
默认键位 keymap.c 定义了两个层:
- 层 0(主层):标准 ANSI 60% 布局,
KC_ESC起头、底行三空格(2.25u / 2.75u / 2.25u 对应KC_SPC)、右下角KC_RALT、KC_RGUI、KC_APP,最右为MO(1)临时切换层; - 层 1(功能层):Esc 位映射为
QK_BOOT(重启进 DFU,即软件入口),F1–F12 依次排开,WASD 方向键映射在第二、三行,其余均为KC_TRNS(透传)。
QK_BOOT的存在说明:即使不拆壳按复位键,也可以在默认固件下通过FN 层 + Esc组合进入 DFU,方便日常刷写。
6. 常见操作小结
| 操作 | 方法 | 前提条件 |
|---|---|---|
| 编译默认固件 | make 4pplet/waffling60/rev_d:default | 已配置 QMK 构建环境 |
| 进入 DFU(物理) | 轻按复位按钮 / 短接 RESET 排针 | 无需固件 |
| 进入 DFU(组合键) | 拔线后按住 Spacebar+B 再插线 | 固件已预刷且 Bootmagic 开启 |
| 软件进入 DFU | 默认键位 FN 层按 Esc(QK_BOOT) | 默认固件已刷入 |
| 刷写固件 | DFU 模式下使用 QMK 刷写命令 | 键盘处于 DFU 状态 |
7. 总结
waffling60 Rev D 是一个典型的"数据驱动 + 源码增强"结合的 QMK 键盘:硬件身份、矩阵、RGB、特性开关全部收敛在 keyboard.json 中,编译目标与刷写入口由 readme.md 明确定义,而 Caps Lock 指示灯这类定制逻辑则落在 rev_d.c 的钩子实现里。理解这条"文档 → 配置 → 源码"的链路,你就能轻松完成从编译、刷写到按需定制(如更换指示灯颜色、调整默认键位)的完整闭环;若手中是 Rev D ANSI / ISO 或其他修订版,参照对应目录的文档与配置文件操作即可。
【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考