
QMK 固件中的 Zinc 40% 分体键盘构建、默认键位与模块化 RGB 定制完全指南【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmwareZinc 是 25KEYS 出品的 40% 行错位row-staggered分体键盘本文基于 QMK 仓库中 keyboards/25keys/zinc 目录下的官方文档与源码完整讲解它的硬件定义、固件构建方式、默认键位图的六层架构以及 Zinc 特有的ZINC命令行定制与 RGB 功耗管理机制。读完本文你将能够独立编译刷写 Zinc 固件、理解并修改其默认键位并利用其内置的 LED 定制选项灵活配置背光、底光和 RGB Matrix。Zinc 是什么Zinc 是一款 40% 布局约 44 键的行错位分体键盘左右两半分离、按键按行错落排列配合 Pro Micro 主控构成典型的 QMK 分体方案。官方 readme 中给出如下关键信息Keyboard MaintainermonksoffunkTwittermonksoffunkJPHardware SupportedZinc PCBHardware Availability由维护者个人发布可通过其 Twitter 账号联系获取从源码结构看Zinc 在仓库中分为两个硬件版本目录均基于 Pro Micro 开发板development_board: promicro版本目录说明rev.1keyboards/25keys/zinc/rev1早期版本矩阵引脚与 rev.A 不同rev.Akeyboards/25keys/zinc/reva现行版本每个版本目录下都包含keyboard.json数据驱动的硬件定义、config.h编译期配置与post_config.h后置 RGB/功耗配置而默认键位图则统一存放在 keymaps/default并额外附带了日文readme_jp.md与英文readme_en.md的键位说明。快速上手构建与刷写官方 readme 给出的标准构建命令在搭建好 QMK 构建环境之后执行make 25keys/zinc/rev1:default该命令会使用默认键位图编译 rev.1 版本的固件。需要刷写到键盘时追加:flash目标即可make 25keys/zinc/rev1:default:flash对于 rev.A 版本将命令中的rev1替换为reva即可例如make 25keys/zinc/reva:default由于 Zinc 是分体键盘编译产物需要分别刷写左右两半。关于构建环境的搭建可参考仓库内的 newbs 新手指南 与 Make 指令参考。注意keyboard.json中声明了url为外部仓库地址QMK 官方文档站docs.qmk.fm上的构建指引内容与仓库内docs/目录下的文档一致可直接在仓库内查阅。硬件定义keyboard.json 解析Zinc 采用 QMK 数据驱动配置data-driven configuration硬件细节全部记录在keyboard.json中。以 rev.A 为例keyboards/25keys/zinc/reva/keyboard.json{ keyboard_name: Zinc rev.A, manufacturer: 25KEYS, development_board: promicro, matrix_pins: { cols: [F4, F5, F6, F7, B1, B3], rows: [D4, C6, D7, E6] }, diode_direction: COL2ROW, split: { enabled: true, serial: { pin: D2 } }, tapping: { term: 100 }, ws2812: { pin: D3 } }值得注意的硬件设计点矩阵规模4 行 × 12 列。从布局映射可以看出左右两半各占 6 列矩阵第 0–5 列属于左手、第 6–11 列属于右手因此物理上每半是 4×6 的矩阵。二极管方向COL2ROW即列驱动、行读取的标准接法。分体通信split.enabled true左右手通过串行serial协议通信信号线接在D2引脚。RGB 数据线ws2812的pin为D3同时声明了rgb_matrix驱动为ws2812、rgblight的色相步进hue_steps为 10。点击时限tapping.term为 100ms影响 Mod-Tap / Layer-Tap 等组合键的判定窗口。布局LAYOUT_ortho_4x12坐标映射中左右两半之间空出 x6、7、8 三列正是分体间隙的体现。rev.1 与 rev.A 的主要差异在矩阵引脚分配rev.1 的列为[F4, D4, C6, D7, E6, B4]、行为[F6, F7, B1, B3]见 keyboards/25keys/zinc/rev1/keyboard.json其余配置基本一致。默认键位图深度解析Zinc 的默认键位图位于 keyboards/25keys/zinc/keymaps/default/keymap.c是一份内容相当完整的参考实现涵盖多布局切换、层叠层、RGB 联动和日文输入法切换。六层架构键位图通过枚举定义了六个层enum layer_number { _QWERTY 0, _COLEMAK, _DVORAK, _LOWER, _RAISE, _ADJUST };QWERTY / COLEMAK / DVORAK三种基础打字布局其中 QWERTY 为默认层层 0。LOWER / RAISE拇指位的临时功能层符号/数字层。ADJUST由 LOWER 与 RAISE 同时按下触发tri-layer 三态层承载系统控制与硬件设置功能。前三层的底排布局一致例如 QWERTY 层LAYOUT_ortho_4x12展开后左右各 6 键[_QWERTY] LAYOUT_ortho_4x12( KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , KC_ESC, ADJUST, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ),底排把LOWER、RAISE放在两个空格键内侧方向键收敛到右手最右侧一列符合 40% 键盘的紧凑习惯。PDF 宏与持久默认层切换在 ADJUST 层中可以看到QWERTY、COLEMAK、DVORAK三个自定义键它们对应键位图顶部的宏定义#define QWERTY PDF(_QWERTY) #define COLEMAK PDF(_COLEMAK) #define DVORAK PDF(_DVORAK)PDF是 QMK 提供的「持久默认层」键码宏定义于 quantum/quantum_keycodes.h#define PDF(layer) (QK_PERSISTENT_DEF_LAYER | ((layer) 0x1F))其底层处理逻辑位于 quantum/process_keycode/process_default_layer.c当该键码在按键释放时调用set_single_persistent_default_layer(layer)将指定层写入 EEPROM 作为默认层。这意味着按下 ADJUST 层中的COLEMAK键后键盘重启仍会停留在 Colemak 布局切换是持久生效的——这正是PDFPersistent Default layer与普通临时层切换的本质区别。三态层tri-layer与 ADJUST 联动LOWER与RAISE同时按下时进入_ADJUST层其逻辑由自定义函数update_tri_layer_RGB()维护void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { if (IS_LAYER_ON(layer1) IS_LAYER_ON(layer2)) { layer_on(layer3); } else { layer_off(layer3); } }在process_record_user()中LOWER/RAISE 的按下与释放都会调用该函数保证 ADJUST 层的开合与两个基础层严格同步。ADJUST 层内容十分丰富[_ADJUST] LAYOUT_ortho_4x12( _______, QK_BOOT, RGBRST, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, KC_INS, _______, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, AG_NORM, AG_SWAP, KC_MINS, KC_EQL, KC_PSCR, KC_SCRL, KC_PAUS, UG_PREV, UG_NEXT, UG_HUED, UG_SATD, UG_VALD, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, EISU, EISU, EISU, KANA, KANA, KANA, KC_HOME, KC_PGDN, KC_END )其中包括QK_BOOT进入刷写模式、底光开关/色相/饱和度/亮度调节UG_TOGG、UG_HUEU等、macOS/Windows 修饰键切换AG_NORM/AG_SWAP、三套基础布局切换、日文输入法键EISU/KANA以及媒体与翻页键。LOWER/RAISE 与反应式 RGB 的联动键位图作者做了一个有趣的设计LOWER 与 RAISE 按下时会把底光切到反应式 RGB 模式reactive mode松开后恢复之前的模式。相关逻辑摘录如下case LOWER: if (record-event.pressed) { if (TOG_STATUS) { // 已有反应式按键按下不重复改模式 } else { TOG_STATUS !TOG_STATUS; #ifdef RGBLIGHT_ENABLE rgblight_mode_noeeprom(16); #endif } layer_on(_LOWER); update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); } else { #ifdef RGBLIGHT_ENABLE rgblight_mode_noeeprom(RGB_current_config.mode); // 恢复按下前的模式 #endif TOG_STATUS false; layer_off(_LOWER); update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); } return false;实现要点TOG_STATUS是一个布尔变量用于记录「是否有反应式按键正处于按下状态」避免 LOWER 与 RAISE 同时按下时重复改写 RGB 模式RAISE 分支使用模式 15LOWER 使用模式 16。所有模式切换均使用rgblight_mode_noeeprom()即不写入 EEPROM配合RGB_current_config变量在松开按键时恢复原模式。QK_UNDERGLOW_MODE_PREVIOUS / NEXT分支同样被覆写切模式前先把RGB_current_config.mode恢复为当前实际模式再调用rgblight_step()/rgblight_step_reverse()并同步记录新模式确保「恢复」时拿到的是正确值。matrix_init_user()中调用rgblight_init()并保存初始配置保证复位后状态一致。RGB 相关的编译期开关位于 keymaps/default/config.h当LED_ANIMATIONS定义时会启用呼吸、彩虹、蛇形、骑士、圣诞、静态渐变等RGBLIGHT_EFFECT_*动画效果。日文输入法切换EISU / KANAZinc 默认键位面向日文输入场景提供了EISU英数与KANA假名两个自定义键码case EISU: if (record-event.pressed) { if (keymap_config.swap_lalt_lgui false) { register_code(KC_LNG2); // Windows 布局下使用日文输入法键码 } else { SEND_STRING(SS_LALT()); // macOS 布局下模拟 Cmd 切换输入法 } } else { unregister_code(KC_LNG2); } return false;该逻辑依据keymap_config.swap_lalt_lgui即 ADJUST 层中AG_SWAP/AG_NORM切换的标志自动适配两种平台Windows 侧直接发送KC_LNG1/KC_LNG2系统键码macOS 侧则模拟Cmd组合键。这保证了同一份键位图在跨平台使用时的输入法切换能力。RGBRST一键恢复底光出厂配置RGBRST键码按下时执行eeconfig_update_rgblight_default(); rgblight_enable(); RGB_current_config rgblight_config;即把 EEPROM 中的 RGB 配置恢复为编译期默认值并重新使能用于灯效混乱时的一键复位。Zinc 专属定制rules.mk 与 ZINC 命令行选项Zinc 最实用也最具特色的部分是 keymaps/default/rules.mk 中实现的 LED 模块化构建系统。默认rules.mk中定义了一组可裁剪的开关LED_BACK_ENABLE no # LED backlight (Enable SK6812mini backlight) LED_UNDERGLOW_ENABLE no # LED underglow (Enable WS2812 RGB underlight) LED_BOTH_ENABLE no # LED backlight and underglow LED_RGB_CONT no # LED continuous backlight or/and underglow between left Zinc and right Zinc RGB_MATRIX no # RGB LED Matrix RGB_MATRIX_SPLIT_RIGHT no # RGB Matrix for RIGHT Hand LED_ANIMATIONS yes # LED animations IOS_DEVICE_ENABLE no # connect to IOS device (iPad,iPhone)这些开关通过make ZINC选项列表的方式在命令行传入选项用逗号分隔选项作用示例back启用 SK6812mini 轴灯背光make ZINCback 25keys/zinc/rev1:defaultunder启用 WS2812 底光make ZINCunder 25keys/zinc/rev1:defaultboth同时启用背光与底光make ZINCboth 25keys/zinc/rev1:defaultcont左右两半 LED 连续编号RGBLED_CONTmake ZINCunder,cont ...matrix切换到 RGB LED Matrixmake ZINCmatrix ...right仅右手启用 RGB Matrixmake ZINCmatrix,right ...na关闭 LED 动画LED_ANIMATIONSnomake ZINCback,na 25keys/zinc/rev1:defaultios适配 iOS 设备iPad/iPhone限制功耗make ZINCunder,ios 25keys/zinc/rev1:defaultrules.mk通过findstring解析ZINC变量并对开关赋值随后将其映射为 QMK 官方特性与编译宏ifeq ($(strip $(LED_BACK_ENABLE)), yes) RGBLIGHT_ENABLE yes ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) OPT_DEFS -DRGBLED_BOTH else OPT_DEFS -DRGBLED_BACK endif else ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) RGBLIGHT_ENABLE yes endif ifeq ($(strip $(RGB_MATRIX)), yes) RGBLIGHT_ENABLE no RGB_MATRIX_ENABLE yes endif编译时还会通过ZINC_CUSTOMISE_MSG打印当前生效的 LED 配置摘要方便确认构建参数。需要注意背光与底光共用RGBLIGHT_ENABLE二者不能与音频AUDIO同时开启注释明确提示「Do not enable these with audio at the same time」。使用matrix时会把RGBLIGHT_ENABLE置为no避免与 RGB Matrix 冲突。官方 readme 的构建命令未带ZINC参数此时按rules.mk中的默认值构建即仅保留LED_ANIMATIONS yes无背光/底光。post_config.hLED 数量、亮度上限与 USB 功耗管理rev1/post_config.h 与 reva/post_config.h 内容一致根据前述开关自动推导硬件相关常量1. LED 数量与左右分配根据背光/底光/连续模式组合定义RGBLIGHT_LED_COUNT与RGBLED_SPLIT组合LED 总数左右分配仅底光默认6每半 3底光 cont12{ 6, 6 }仅背光24每半 12背光 cont48{ 24, 24 }背光 底光30每半 15背光 底光 cont60{ 30, 30 }同时无条件定义RGBLIGHT_SPLIT让两半各自管理自己的 LED 段。2. 亮度上限自适应RGBLIGHT_LIMIT_VAL根据 LED 数量阶梯式下调——LED 越多单颗上限越低以控制总电流RGBLIGHT_VAL_STEP亮度步进在非 iOS 下为 17iOS 下为 4。3. iOS 功耗约束启用IOS_DEVICE_ENABLE时亮度上限被大幅压低如 90/45/35且USB_MAX_POWER_CONSUMPTION设为 100否则为 400。文件注释明确说明这是为了「fix iPhone and iPad power adapter issue」——iOS 设备要求功率低于 100mA 才可靠供电这也是ZINCios选项存在的根本原因。结语Zinc 是 40% 分体键盘中工程化相当完整的参考实现keyboard.json完成了数据驱动硬件描述默认键位图展示了 PDF 持久默认层、tri-layer 三态层、反应式 RGB 联动与日文输入法切换的组合技巧而rules.mkpost_config.h更是提供了一套通过ZINC命令行参数即可灵活裁剪背光/底光/RGB Matrix 的模块化构建体系。对希望深入理解 QMK 分体键盘构建流程或参考优秀默认键位设计的开发者来说keyboards/25keys/zinc 目录是一份不可多得的完整范例。进一步了解 QMK 分体键盘通用机制可继续阅读仓库内的 config_options.md 与 feature_layers.md。【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考