QMK 实战指南:4pplet waffling60 Rev D 60% 键盘固件的编译、刷写与底层解析
2026/9/15 14:50:32 网站建设 项目流程

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.mdkeymaps/default/keymap.c默认键位,以及部分版本特有的config.hrules.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_ansirev_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_aliasesLAYOUT指向LAYOUT_all外,还定义了多个命名的 60% 社区标准配列,包括:

  • LAYOUT_all:ISO 全键位(含 2u Backspace、2 行高的 ISO Enter);
  • LAYOUT_60_iso_tsangan_split_rshiftLAYOUT_60_iso_tsangan_split_bs_rshift:ISO + Tsangan 底行 + 分裂右 Shift / 分裂 Backspace;
  • LAYOUT_60_iso_wkl_split_rshiftLAYOUT_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_directionCOL2ROW,表示二极管阴极方向为"列到行"——这是 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; }

其工作逻辑为:

  1. 先调用led_update_user()并保存返回值,保证用户层的 LED 钩子仍可执行(返回res向上传递);
  2. Caps Lock 开启时,将第 0 号灯珠设置成指定颜色:若定义了CAPS_LOCK_COLOR宏则使用该颜色,否则保持当前 RGB 的色相/饱和度/亮度;
  3. Caps Lock 关闭时,将该灯珠设置为HSV_OFF熄灭;
  4. 通过#ifndef CAPS_LOCK_ENABLE提供默认值true,允许在构建时通过-DCAPS_LOCK_ENABLE=false关闭这一行为。

这意味着你可以在自己的 keymap 目录中添加config.h,通过定义CAPS_LOCK_COLOR来定制 Caps Lock 指示灯颜色,例如:

#define CAPS_LOCK_COLOR HSV_GREEN

5.4 默认键位:双层层级设计

默认键位 keymap.c 定义了两个层:

  • 层 0(主层):标准 ANSI 60% 布局,KC_ESC起头、底行三空格(2.25u / 2.75u / 2.25u 对应KC_SPC)、右下角KC_RALTKC_RGUIKC_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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询