
QMK 键盘固件实战4pplet waffling80 TKL 的版本分支、配列矩阵与 DFU 刷写指南【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware导读waffling80 是 4pplet 设计的一款 87 键TKLPCB目标是与 a87 外壳/定位板兼容同时通过不同的开关类型与配列选项覆盖 ANSI、ISO、Tsangan/WKL 以及带 F13 的多种变体。本文以 keyboards/4pplet/waffling80/readme.md 为核心结合 QMK 仓库内该键盘的info.json、矩阵图、三套 PCB 版本rev_a / rev_b / rev_b_ansi配置与默认键位源码完整讲解它的版本差异、矩阵设计、构建刷写命令、DFU 引导进入方式以及 Caps/Scroll Lock 的 RGB 指示灯实现。读完本文你将掌握如何针对该 PCB 的不同版本编译固件、如何用物理按键组合进入刷写模式以及如何基于源码理解并二次定制其键位与指示灯逻辑。键盘概览一张 PCB三种版本十六种社区配列waffling80 在仓库根 readme 中被描述为A TKL PCB attempting a87 compatibility with different switch and layout-options.即一块以 a87 兼容性为目标、支持不同开关与配列选项的 TKL PCB而三个版本子目录的 readme 则进一步补充为“attempting a87 and a88 compatibility”。它由 4pplet 与各版本自己的keyboard.json中。该键盘在 QMK 仓库内被组织为三个编译目标对应三种 PCB 版本版本路径主控 MCU引导模式USB PID版本号Rev Akeyboards/4pplet/waffling80/rev_aATMega32U2atmel-dfu0x00060.0.1Rev Bkeyboards/4pplet/waffling80/rev_bSTM32F072stm32-dfu0x000F0.0.2Rev B ANSIkeyboards/4pplet/waffling80/rev_b_ansiSTM32F072stm32-dfu0x00170.0.1以上细节分别来自 rev_a/keyboard.json、rev_b/keyboard.json 与 rev_b_ansi/keyboard.json。三者共用同一个厂商 IDVID 0x4444顶层 info.json 中维护者同样为4pplet。从版本命名与配置可以推断Rev A 是 AVR 时代的版本ATMega32U2 QMK LUFA 引导而 Rev B / Rev B ANSI 转向了 32 位 STM32 平台Rev B 与 Rev B ANSI 的矩阵引脚定义完全一致cols: B2, B1, B0, A7, A6, A3, B9, B8rows: B13, B12, A5, A4, A2, A1, F0, C15, C13, C14, F1, A0仅在keyboard_name与 PID 上区分说明 Rev B ANSI 是 Rev B 的 ANSI 专用HShotswap衍生版本。构建固件三条 make 命令与编译流程在配置好 QMK 构建环境之后waffling80 的三种版本分别通过以下命令编译默认键位make 4pplet/waffling80/rev_a:default make 4pplet/waffling80/rev_b:default make 4pplet/waffling80/rev_b_ansi:default其中rev_a、rev_b、rev_b_ansi是 PCB 版本目标default是键位目标对应 keymaps/default/keymap.c。编译产物为对应平台的.hex/.bin固件之后使用配套 DFU 工具刷入即可。关于环境搭建与 make 用法的完整说明可参考仓库内的 docs/newbs.md、docs/newbs_building_firmware.md 与 docs/getting_started_make_guide.md。如果你是第一次接触 QMK从 docs/newbs_getting_started.md 开始会更容易上手。值得一提的是Rev B 的 rules.mk 中有一条特殊配置# Wildcard to allow APM32 MCU DFU_SUFFIX_ARGS -p FFFF -v FFFF该参数将 DFU 后缀校验的 PID/VID 设为通配符目的是兼容 APM32 这类 STM32 兼容 MCU——当固件 DFU 后缀与标准 STM32 不完全一致时通配可以避免刷写工具拒绝写入。这是硬件兼容性设计在构建脚本层面留下的直接证据。进入 DFU 引导模式两种途径waffling80 全系使用 DFU 引导程序刷写固件readme 给出了两种进入方式方式一物理操作适用于任意状态Rev A轻按 PCB 背面的物理复位按键或短接背面标注为RESET的复位焊盘键盘即进入 DFU 模式此时可以刷写固件。Rev B / Rev B ANSI按住背面的复位焊盘数秒键盘进入 DFU 模式。方式二Bootmagic 按键组合适用于已预刷固件的情况Rev A拔掉键盘同时按住Spacebar和B插入 USB 线等待一秒后松开按键键盘进入 DFU。Rev B / Rev B ANSI拔掉键盘按住Esc键插入 USB 线等待一秒后松开键盘进入 DFU。两个版本的按键组合不同这与各自的固件配置直接相关Rev A 的 keyboard.json 中启用了qmk_lufa_bootloader并声明esc_input: C4、esc_output: C6同时bootmagic特性开启Rev B 系列同样开启了bootmagic。这一差异说明方式二依赖 QMK 的 Bootmagic 特性在启动阶段扫描指定矩阵位置来触发引导因此只有在固件已经可运行已预刷时才可用。提示更详细的刷写与引导模式背景可参考 docs/flashing.md。配列支持全键位与 16 个社区配列waffling80 的顶层 info.json 声明了 16 个community_layouts覆盖 ANSI / ISO × 常规 / F13 × 标准 / Split Backspace RShift / Tsangan 的组合tkl_ansi、tkl_ansi_split_bs_rshift、tkl_ansi_tsangan、tkl_ansi_tsangan_split_bs_rshifttkl_f13_ansi、tkl_f13_ansi_split_bs_rshift、tkl_f13_ansi_tsangan、tkl_f13_ansi_tsangan_split_bs_rshifttkl_iso、tkl_iso_split_bs_rshift、tkl_iso_tsangan、tkl_iso_tsangan_split_bs_rshifttkl_f13_iso、tkl_f13_iso_split_bs_rshift、tkl_f13_iso_tsangan、tkl_f13_iso_tsangan_split_bs_rshift此外info.json中还定义了专用的LAYOUT_all以及一系列键盘级 layout如LAYOUT_tkl_ansi、LAYOUT_tkl_f13_ansi_split_space_split_bs_rshift等。LAYOUT_all是覆盖全部矩阵键位的“完整配列”不仅包含常规 TKL 按键还额外放置了 F13、多个 Fn 键以及三段式空格Space 2.25u Space 1.25u Space 2.75u等位置用于适配不同开关类型包括 Alps 双动作开关和分裂空格套件。这种“一层LAYOUT_all兜底 多个命名 layout 面向社区”的组织方式正是 QMK 多配列键盘的典型做法社区配列让不同用户的键位 JSON 可以跨键盘复用而LAYOUT_all保证键盘本身的每一个矩阵节点都能被键位引用到。矩阵设计8 列 × 12 行与 COL2ROW仓库内 matrix_diagram.md 给出了 Rev A / Rev B 共用的矩阵接线图直观展示了各键位对应的矩阵坐标行 × 列例如F13 行使用了矩阵00 / 10 / 01 / 11 / 02 / 12 / 03 / 13 / 04 / 14 / 05 / 15 / 06 / 16 / 07 / 17 / 37共 17 个节点2u Backspace 落在67ISO Enter 区域涉及76 / 66底行分别绘制了标准配列A0 B1 A1 A3 A4 B4 A5 B5、Tsangan/WKLA0 B1 A1 A3 B4 A5 B5与 Tsangan/WKL 分裂空格A0 B1 A1 B2 A3 B3 B4 A5 B5三种接线差异。各版本的引脚分配在keyboard.json的matrix_pins中Rev Acols: C6, C7, B7, B6, B5, B2, D0, C2rows: C4, C5, B4, B3, B1, B0, D6, D5, D3, D4, D1, D28 列 × 12 行。Rev B / Rev B ANSIcols: B2, B1, B0, A7, A6, A3, B9, B8rows: B13, B12, A5, A4, A2, A1, F0, C15, C13, C14, F1, A0同样是 8 列 × 12 行。两者均声明diode_direction: COL2ROW即二极管从列指向行这是矩阵扫描方向的硬件约定决定了matrix_pins中行列的驱动方式。RGB 方面三个版本都在rgblight下声明led_count: 2、saturation_steps: 8、brightness_steps: 8WS2812 数据引脚 Rev A 为D7Rev B / Rev B ANSI 为A8。注意 Rev B 的 config.h 额外定义了WS2812_EXTERNAL_PULLUP用于处理该版本 WS2812 数据线的外部上拉需求——这属于硬件细节层面的兼容性修正。默认键位解析LAYOUT_all 与双层键位默认键位文件 keymaps/default/keymap.c 定义了 0 / 1 两个层全部使用LAYOUT_all第 0 层主层标准 TKL 键位布局。字母区为常规 QWERTY右侧编辑区为Insert / Home / Page Up、Delete / End / Page Down方向键区完整底行为Ctrl / GUI / Alt / 三段空格 / Fn / Alt / GUI / Ctrl。主层中嵌入了两个MO(1)临时层触发键右侧 Shift 旁与空格区并按注释所示在LAYOUT_all尾部额外放置了两个MO(1)键专门对应Alps 双动作开关的附加节点。第 1 层功能层绝大部分键为KC_TRNS透传仅第一个位置Esc设置为QK_BOOT即按下Fn Esc可直接让键盘复位进入 DFU——这为已编译用户提供了一种软件方式的刷写入口与 readme 中的硬件/ Bootmagic 方案互补。从代码结构看双动作 Alps 开关为这块 PCB 增加了可编程的额外矩阵节点而默认键位把其中两个节点映射为MO(1)让用户在不增加实体按键的情况下多出两个功能层触发点。指示灯实现Caps / Scroll Lock 的 RGB 状态反馈Rev A 与 Rev B 的板级源码 rev_a/rev_a.c 与 rev_b/rev_b.c 实现了相同的led_update_kb逻辑将 Caps Lock 与 Scroll Lock 状态映射到两枚 WS2812 指示灯RGB 索引 0 为 Scroll Lock索引 1 为 Caps Lock#ifndef CAPS_LOCK_ENABLE # define CAPS_LOCK_ENABLE 1 #endif #ifndef SCROLL_LOCK_ENABLE # define SCROLL_LOCK_ENABLE 1 #endif bool led_update_kb(led_t led_state) { bool res led_update_user(led_state); if (SCROLL_LOCK_ENABLE res) { if (led_state.scroll_lock) { #ifdef SCROLL_LOCK_COLOR rgblight_sethsv_at(SCROLL_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); } } if (CAPS_LOCK_ENABLE res) { if (led_state.caps_lock) { #ifdef CAPS_LOCK_COLOR rgblight_sethsv_at(CAPS_LOCK_COLOR, 1); #else rgblight_sethsv_at(rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val(), 1); #endif } else { rgblight_sethsv_at(HSV_OFF, 1); } } return res; }这段代码的几个关键点默认启用CAPS_LOCK_ENABLE与SCROLL_LOCK_ENABLE未定义时默认置 1保证开箱即有指示灯功能可静态配色源码中注释给出了#define CAPS_LOCK_COLOR HSV_GREEN/#define SCROLL_LOCK_COLOR HSV_GREEN的可选写法。定义后指示灯固定为指定颜色不定义时则沿用当前 RGB 的 HSV 值颜色可通过 VIA 等工具动态调整源码注释对此有明确说明标准回调链led_update_kb先调用led_update_user获取返回值res只有上层没有“吞掉”更新时才执行指示灯逻辑最后把res返回给更上层——这是 QMK 标准_kb/_user回调约定的典型用法用户层代码可以在此基础上继续扩展状态驱动led_state.caps_lock/led_state.scroll_lock来自 QMK 维护的 LED 状态结构体随主机侧指示灯状态实时更新指示灯点亮/熄灭自动跟随。进一步阅读键盘主说明keyboards/4pplet/waffling80/readme.md版本说明rev_a/readme.md、rev_b/readme.md、rev_b_ansi/readme.md硬件与配列定义info.json、rev_a/keyboard.json、rev_b/keyboard.json、rev_b_ansi/keyboard.json矩阵接线图matrix_diagram.md默认键位keymaps/default/keymap.c指示灯实现rev_a/rev_a.c、rev_b/rev_b.c相关通用文档docs/newbs.md、docs/getting_started_make_guide.md、docs/flashing.md【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考