
QMK 固件 2021 年 2 月 27 日破坏性变更解析info.json 数据驱动配置迁移与 ChibiOS 升级实践【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware本文以 QMK 官方变更日志 docs/ChangeLog/20210227.md 为核心系统梳理该版本引入的破坏性变更键盘目录重组、info.json 数据驱动配置的大规模扩展与qmk generate-info-json迁移工具、ChibiOS 20.3.2 升级与默认配置迁移以及同批次的修复、增强与清理项。读完本文你将掌握从config.h/rules.mk向info.json迁移的完整操作流程、优先级判定规则并理解 QMK 数据驱动配置背后的源码实现与验证机制。概览这是一次面向配置体系重构的破坏性更新2021 年 2 月 27 日的这次版本更新是 QMK 从C 语言宏定义 Make 变量走向数据驱动配置的关键节点。它包含三类主要内容需要用户手动操作的变更若干键盘源码目录被移动或删除旧路径构建将直接失败核心变更ChibiOS 子模块升级至 20.3.2 并提供各 MCU 默认配置Python 最低版本提升至 3.7info.json能力大幅扩展覆盖绝大多数键盘参数大量配套修复与清理涉及编译、USB 事件、分体键盘Split Common、RGBLight、鼠标键等模块。对于键盘维护者而言最重要的实操任务是使用新提供的qmk generate-info-json命令把键盘的config.h/rules.mk信息迁移到info.json并移除重复定义。需要用户操作的变更键盘目录移动与删除目录迁移清单以下键盘的源码路径在本次更新中被移动若你的个人 keymap 引用旧路径需要同步调整旧键盘名新键盘名bear_65jacky_studio/bear_65s7_elephant/rev1jacky_studio/s7_elephant/rev1s7_elephant/rev2jacky_studio/s7_elephant/rev2aplx6aplyard/aplx6/rev1southpaw75fr4/southpaw75移动后的目录结构在当前仓库中可以直接验证例如 keyboards/jacky_studio/bear_65 下包含rev1/、rev2/与readme.md其中rev1/keyboard.json、rev2/keyboard.json已采用数据驱动的配置方式同理keyboards/aplyard/aplx6 与 keyboards/fr4 均为重组后的归属目录。随迁移新增的键盘作为同一批目录重构的一部分两个新键盘被加入仓库Aplyard Aplx6 rev2随 aplx6 rev1 一起被移入父目录aplyard/aplx6即同时维护 rev1 与 rev2 两个版本FR4Boards Unix60与southpaw75一起归入fr4目录。被删除的键盘handwired/bluepill/bluepill70被移除。如果你的构建命令或 keymap 依赖该键盘需要改用其他支持 BluePill 的键盘或自行在 userspace 中维护。变更操作建议修改个人 keymap 中所有指向旧键盘名的qmk compile、qmk flash命令与 Makefile 目标检查rules.mk中的继承关系与相对路径引用如果依赖被删除的handwired/bluepill/bluepill70需要评估迁移到bluepill通用配置或其他目标。核心变更一ChibiOS 20.3.2 升级与默认配置迁移QMK 的 ChibiOS 与 ChibiOS-Contrib 子模块被更新至20.3.2。与之配套QMK 为所有常见 ARM 微控制器运行于 ChibiOS 之上提供了默认配置文件。这一变化带来的直接好处键盘目录中不再需要各自维护一份完整的halconf.h、chconf.h、mcuconf.h及 board 定义只需声明与默认值不同的部分即可。对应地PR 体积显著缩小配置迁移Config Migrations工作也在本版本集中开展。从源码结构看本仓库 platforms 目录中按平台组织了大量chibios相关配置.mk、.ld链接脚本与头文件正是平台级默认配置 键盘级覆盖这一分层思想的落地。本次迁移涉及的 MCU 配置还新增了STM32G431 与 STM32G474的板级定义并针对 Proton-C 提供了与 Pro Micro 引脚习惯一致的默认配置。配套的系统级优化默认配置中几乎禁用了所有 ChibiOS 子系统仓库范围统一执行键盘按需在自身配置中开启避免无用子系统占用资源早期初始化early init逻辑完成转换遗留的如何执行配置迁移注释也被修正。核心变更二构建基础设施与 Python 版本要求从本版本起构建 QMK 必须使用 Python且最低版本从原先的 3.6 提升到3.7。这直接影响 QMK CLI 的所有命令qmk compile、qmk flash、qmk info等因为它们在构建流程中承担info.json解析、schema 校验、代码生成等工作。同时develop分支的代码格式化被纳入 CI 任务保证合入代码的格式一致性。核心变更三info.json 数据驱动配置的大规模扩展这是本次更新中影响最深远的架构变化。绝大多数键盘参数现在都可以在info.json中表达而不再需要写入config.h/rules.mk。意义在于键盘维护更容易单一 JSON 文件即可描述键盘为工具链铺路非技术用户可以在不写代码的情况下通过工具添加和维护 QMK 键盘。迁移工具qmk generate-info-json为降低迁移成本官方提供了新命令qmk generate-info-json -kb keyboard该命令会为指定键盘生成一份完整的info.json。生成后即可删除config.h与rules.mk中的重复信息。其命令行实现位于 lib/python/qmk/cli/generate/info_json.py支持以下参数-kb, --keyboard指定键盘必填支持键盘路径补全-km, --keymap同时展示某个 JSON keymap 的层信息-o, --output将结果写入指定文件存在则覆盖-ow, --overwrite直接覆盖键盘目录下已有的info.json会覆盖--output指定的位置。生成逻辑的核心流程见 lib/python/qmk/info.py 的info_json()函数从keyboard.h中解析布局_search_keyboard_h通过merge_info_jsons()合并键盘目录下所有info.json/keyboard.jsonfind_info_json会同时查找info.json与keyboard.json两种文件名并向上合并父目录的配置调用_extract_rules_mk()与_extract_config_h()解析rules.mk与config.h计算矩阵尺寸等派生值最后按 schema 校验。官方迁移示例Lets Split以lets_split为例完整操作如下userhostname:~/qmk_firmware/keyboards/lets_split:0$ qmk generate-info-json new-info.json userhostname:~/qmk_firmware/keyboards/lets_split:0$ mv new-info.json info.json userhostname:~/qmk_firmware/keyboards/lets_split:0$ qmk info执行qmk info后CLI 会逐一报告config.h/rules.mk与info.json中的重复定义警告信息中的 overwriting 即表示旧文件值优先于 info.json⚠ lets_split/rev2: DEBOUNCE in config.h is overwriting debounce in info.json ⚠ lets_split/rev2: DEVICE_VER in config.h is overwriting usb.device_ver in info.json ⚠ lets_split/rev2: DIODE_DIRECTION in config.h is overwriting diode_direction in info.json ⚠ lets_split/rev2: MANUFACTURER in config.h is overwriting manufacturer in info.json ⚠ lets_split/rev2: RGB_DI_PIN in config.h is overwriting rgblight.pin in info.json ⚠ lets_split/rev2: RGBLED_NUM in config.h is overwriting rgblight.led_count in info.json ⚠ lets_split/rev2: PRODUCT_ID in config.h is overwriting usb.pid in info.json ⚠ lets_split/rev2: VENDOR_ID in config.h is overwriting usb.vid in info.json ⚠ lets_split/rev2: Matrix pins are specified in both info.json and config.h, the config.h values win. ⚠ lets_split/rev2: LAYOUTS in rules.mk is overwriting community_layouts in info.json ⚠ lets_split/rev2: Feature bootmagic is specified in both info.json and rules.mk, the rules.mk value wins. ⚠ lets_split/rev2: Feature mousekey is specified in both info.json and rules.mk, the rules.mk value wins. ⚠ lets_split/rev2: Feature extrakey is specified in both info.json and rules.mk, the rules.mk value wins. ⚠ lets_split/rev2: Feature console is specified in both info.json and rules.mk, the rules.mk value wins. ⚠ lets_split/rev2: Feature command is specified in both info.json and rules.mk, the rules.mk value wins. ⚠ lets_split/rev2: Feature nkro is specified in both info.json and rules.mk, the rules.mk value wins. ⚠ lets_split/rev2: Feature backlight is specified in both info.json and rules.mk, the rules.mk value wins. ⚠ lets_split/rev2: Feature midi is specified in both info.json and rules.mk, the rules.mk value wins. ⚠ lets_split/rev2: Feature audio is specified in both info.json and rules.mk, the rules.mk value wins. ⚠ lets_split/rev2: Feature unicode is specified in both info.json and rules.mk, the rules.mk value wins. ⚠ lets_split/rev2: Feature bluetooth is specified in both info.json and rules.mk, the rules.mk value wins. ⚠ lets_split/rev2: Feature rgblight is specified in both info.json and rules.mk, the rules.mk value wins. ⚠ lets_split/rev2: Feature sleep_led is specified in both info.json and rules.mk, the rules.mk value wins.随后输出的键盘概览信息Keyboard Name: Lets Split Manufacturer: Wootpatoot Website: Maintainer: QMK Community Keyboard Folder: lets_split/rev2 Layouts: LAYOUT, LAYOUT_ortho_4x12 Size: 13 x 4 Processor: atmega32u4 Bootloader: caterina迁移后的真实形态数据驱动配置样例迁移完成后的lets_split/rev2在仓库中已完全数据驱动化其 keyboards/lets_split/rev2/keyboard.json 展示了info.json覆盖的主要命名空间{ keyboard_name: Lets Split v2, manufacturer: Wootpatoot, usb: { vid: 0x6F77, pid: 0x0002, device_version: 0.0.2 }, matrix_pins: { cols: [F6, F7, B1, B3, B2, B6], rows: [D7, E6, B4, B5] }, diode_direction: COL2ROW, split: { enabled: true, serial: { pin: D0 } }, rgblight: { led_count: 12 }, ws2812: { pin: D3 }, features: { bootmagic: false, mousekey: true, extrakey: true, command: true }, layouts: { LAYOUT_ortho_4x12: { layout: [ {matrix: [0, 0], x: 0, y: 0} ] } } }可见原本散落在config.h中的 USB VID/PID、矩阵引脚、二极管方向、分体串口引脚、RGB 灯数以及rules.mk中的功能开关全部收敛到一个 JSON 文件中。父目录 keyboards/lets_split/info.json 则只保留共享的maintainer、development_boardpromicro与community_layouts形成父目录公共配置 子目录版本差异配置的层级覆盖结构。优先级与覆盖规则从qmk info输出的警告可以总结出明确的覆盖优先级config.h中的宏定义优先于info.json对应字段如 DEBOUNCE、DEVICE_VER、DIODE_DIRECTION、MANUFACTURER 等rules.mk中的功能开关优先于info.json的features如 bootmagic、mousekey、extrakey、rgblight 等矩阵引脚若两处同时声明以config.h为准rules.mk的LAYOUTS优先于info.json的community_layouts。即config.h/rules.mk是更权威的来源info.json仅在旧文件未定义时生效。这正是迁移期保持兼容的机制——即使两边重复定义构建也不会失败只是会产生警告。Schema 验证机制info.json的正确性由 JSON Schema 保证。仓库的 data/schemas/keyboard.jsonschema 定义了键盘数据的完整结构包括usb、matrix_pins、diode_direction、split、rgblight、features、layouts等命名空间并对processor、development_board、bootloader等字段使用枚举约束。generate_info_json的实现中见 lib/python/qmk/cli/generate/info_json.py还通过修剪式校验器pruning validator剔除 schema 未声明的 API-only 属性保证输出文件的纯净性。本次基础设施更新还包含一系列配套 PR键盘矩阵可从info.json配置、JSON 数据统一用 schema 校验并借此消除自定义代码、支持在info.json中指定BOARD、info.json规则先于 userspace 规则处理、建立info.json与config.h/rules.mk的映射系统、使 LAYOUT 解析更健壮等。详细变更清单按类别修复FixesGCC 10 兼容修复 Drop Alt 固件在 GCC 10 下的编译问题构建修复修复develop分支编译失败、修复损坏的键盘与 keymap涉及多个 PR、修复构建依赖顺序——确保生成文件在编译任何目标文件之前生成头文件修复在uart.h中引入stdbool.h以修复编译器错误ChibiOS USB 事件解耦将 USB 事件从 USB 中断处理程序中解耦修复了同时使用背光Backlight与外置 EEPROM 时 MCU 死锁的问题唤醒稳定性处理从睡眠中唤醒的不稳定问题按键事件修复修复在瞬时激活层上按下媒体键可能导致 key up 事件丢失的问题RGB 初始化修复 Massdrop 键盘的 RGB 初始化 bug编码修复修复 Windows 下文件编码错误以及 layouts 未能正确合并进info.json的问题。新增与增强Additions and Enhancements分体键盘Split Common新增 Sync Timer 特性用于同步计时在传输协议中增加修饰键状态主侧矩阵可传输到从侧transport.c被移入QUANTUM_LIB_SRC串口配置允许配置串口 USART 超时鼠标键为鼠标键实现可选的动力学移动算法kinetic mouse movement键码改进 US International 与 Extended 布局的语言特定键码新增tap_code_delay(code, delay)APIQWIICQWIIC_ENABLE改为 yes/no 选择新增QWIIC_DRIVERS以按需引入具体驱动AVR 引导允许 AVR 键盘覆盖bootloader_jump函数RGBLightTwinkle 效果改用呼吸曲线更平滑允许配置默认设置活动追踪跟踪最近一次矩阵活动与编码器活动音频从 ZSA 反向移植 ChibiOS 音频改动系统挂起时停止播放声音鼠标报告鼠标报告支持 8 个按键userspace允许在 userspace 实现post_config.h新 MCU/平台新增 AT90USB162 支持、STM32G4xx 模拟 USBPD 支持新键盘sendyyeah/pix。清理与优化Clean-ups and Optimizations重写 RGBLight 的 APA102 支持更新 TMK Core 中的 ADB 协议实现移除用户文件中未使用的action_get_macro()调用、移除QMK_KEYBOARD_CONFIG_H、移除MIDI_ENABLE_STRICT、移除已弃用的qmk json-keymap命令与 FAUXCLICKY 特性移除 legacy print 向后兼容层重构print.h的平台逻辑UART 驱动重构mousekey 迁移至 quantum 目录Audio 系统全面重构蓝牙输出选择中移除 USB and BT 选项重构tmk_core/common/action.c以减小代码体积移除键盘级已定义、用户 keymap 又重复定义的规则与设置。升级与迁移实操建议结合上述变更从旧版本升级到本版本的建议操作顺序升级 QMK CLI 与 Python 环境确保 Python ≥ 3.7重新安装 QMK 依赖处理键盘路径变更按上文目录迁移清单更新所有构建目标执行 info.json 迁移对每个自维护键盘运行qmk generate-info-json -kb keyboard用qmk info检查重复定义警告再手动删除config.h/rules.mk中的重复项直至警告清零验证构建确认config.h中残留的#include与宏与新的info.json不冲突关注 ChibiOS 默认配置如果你的键盘运行于 ARM MCU检查是否需要删除自定义的halconf.h/chconf.h/mcuconf.h中的默认值仅保留差异项回归测试重点验证分体键盘的传输与同步、RGB 初始化、休眠唤醒、媒体键等本次修复涉及的功能点。总结2021 年 2 月 27 日的这次更新标志着 QMK 配置体系进入数据驱动时代info.json从辅助文件升级为键盘配置的主载体配合qmk generate-info-json迁移工具与 JSON Schema 校验大大降低了键盘维护门槛ChibiOS 20.3.2 与默认配置文件的引入则简化了 ARM 键盘的板级配置。对于键盘维护者与深度玩家而言理解info.json的命名空间、覆盖优先级与迁移流程是顺畅升级到后续所有 QMK 版本的前提。【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考