当前位置: 首页 > news >正文

键盘固件刷写详解:Bootloader

键盘固件刷写详解:从入门到精通

引言

作为一名机械键盘爱好者,相信大家都曾经面临过刷写固件的问题。无论是想要自定义按键功能,还是升级键盘的固件,掌握刷写技巧都是非常必要的。本文将全面介绍不同类型的引导加载程序(Bootloader)以及如何正确刷写固件。

基础知识

什么是引导加载程序(Bootloader)?

引导加载程序是预装在微控制器中的一段特殊程序,它允许我们通过USB接口更新键盘的固件,而无需使用专业的硬件编程器。不同厂商和芯片使用的引导加载程序各不相同,所以刷写方法也有所区别。

QMK计算固件大小

对于基于AVR的键盘,QMK会根据rules.mk中设置的BOOTLOADER值自动计算.hex文件的大小是否适合刷写到设备,并输出总大小(以字节为单位)及最大限制。

使用CLI刷写键盘

最简单的方法是通过QMK命令行工具:

qmk flash -kb <keyboard> -km <keymap>

更多详情请参考QMK flash文档。

各类引导加载程序详解

1. Atmel DFU

默认情况下,所有USB AVR芯片(16/32U4RC除外)都预装了Atmel的DFU引导加载程序。许多键盘PCB上有自己的微控制器(如旧版OLKB板、Clueboards)都使用该引导加载程序。一些键盘可能使用LUFA的DFU引导加载程序或QMK的分支版本(如新版OLKB板),它们增加了一些特定硬件功能。

配置方法

确保在rules.mk中有以下设置(或使用lufa-dfuqmk-dfu替代):

# Bootloader selection
BOOTLOADER = atmel-dfu
兼容的刷写工具
  • QMK Toolbox(推荐的图形界面工具)
  • dfu-programmer / QMK中的dfu目标(推荐命令行方式)

命令行指令:

dfu-programmer <mcu> erase --force
dfu-programmer <mcu> flash --force <filename>
dfu-programmer <mcu> reset
刷写步骤
  1. 使用以下任一方法进入引导加载模式:
    • 按下键码QK_BOOT
    • 按下PCB上的RESET按钮(如果有)
    • 快速短接RSTGND
  2. 等待操作系统检测到设备
  3. 擦除闪存(使用Toolbox或CLI/make命令时会自动完成)
  4. 刷写.hex文件
  5. 将设备重置到应用模式(如上所述会自动完成)

2. QMK DFU

QMK维护了LUFA DFU引导加载程序的分支版本,它能执行简单的矩阵扫描以退出引导加载程序并返回应用程序,还能在操作过程中闪烁LED或通过扬声器发出提示音。

启用特殊功能

要启用这些功能,请将以下定义添加到config.h

#define QMK_ESC_OUTPUT F1  // COL2ROW模式下的COL引脚
#define QMK_ESC_INPUT  D5  // COL2ROW模式下的ROW引脚
// 可选功能:
//#define QMK_LED E6
//#define QMK_SPEAKER C6

注意:不建议使用与Bootmagic指定键相同的QMK_ESC键,因为按住它会导致MCU在进入和退出引导加载程序之间循环往复。

字符串自动生成

制造商和产品字符串会从config.h中自动提取,并在产品字符串后附加"Bootloader"。

生成引导加载程序

使用bootloader目标生成引导加载程序,例如:make planck/rev4:default:bootloader

要生成包含QMK和引导加载程序的完整生产文件,使用production目标,例如:make planck/rev4:default:production

make目标
  • :dfu:每5秒检查一次,直到DFU设备可用,然后刷写固件。
  • :dfu-split-left:dfu-split-right:与:dfu类似,但会在EEPROM中设置左右手配置,特别适合基于Elite-C的分体式键盘。

3. Caterina (Arduino)

Arduino板及其克隆版使用Caterina引导加载程序或其变体(使用Pro Micro或克隆版构建的任何键盘,以及Pololu A-Star),它们通过虚拟串口使用AVR109协议通信。

配置方法

确保在rules.mk中有以下设置:

# Bootloader selection
BOOTLOADER = caterina
兼容的刷写工具
  • QMK Toolbox(推荐的图形界面工具)
  • Avrdude
  • avrdude 与QMK中的程序员/目标avr109:avrdude(推荐命令行方式)

命令行指令:

avrdude -p <mcu> -c avr109 -P <serialport> -U flash:w:<filename>:i
刷写步骤
  1. 使用以下任一方法进入引导加载模式(进入后只有7秒时间刷写;某些变体可能需要在750毫秒内重置两次):
    • 按下键码QK_BOOT
    • 按下PCB上的RESET按钮(如果有)
    • 快速短接RSTGND
  2. 等待操作系统检测到设备
  3. 刷写.hex文件
  4. 等待设备自动重置
make目标
  • :avrdude:每5秒检查一次,直到Caterina设备可用(通过检测新的COM端口),然后刷写固件。
  • :avrdude-loop:类似:avrdude,但在刷写每个设备后,会尝试再次刷写,适合批量刷写,按Ctrl+C可退出循环。
  • :avrdude-split-left:avrdude-split-right:类似:avrdude,但会在EEPROM中设置左右手配置,特别适合基于Pro Micro的分体式键盘。

4. HalfKay

HalfKay是由PJRC开发的超轻量级引导加载程序,它表现为HID设备(无需额外驱动),预装在所有Teensy(特别是2.0)上。它目前是闭源的,一旦被覆盖(例如通过ISP刷写其他引导加载程序),就无法恢复。

5. USBasploader

USBasploader最初由Objective Development开发,它模拟USBasp ISP编程器,用于一些非USB AVR芯片,如运行V-USB的ATmega328P。

6. BootloadHID

BootloadHID是为AVR微控制器设计的USB引导加载程序。它像HID输入设备一样工作,与HalfKay非常相似,因此在Windows上无需安装任何驱动即可运行。

7. STM32/APM32 DFU

所有具有USB功能的STM32和APM32微控制器(少数例外,如STM32F103)都预装了无法修改或删除的工厂引导加载程序。

8. STM32duino

此引导加载程序几乎专门用于STM32F103板,因为它们没有预装USB DFU引导加载程序。源代码和预编译二进制文件可在GitHub上找到。

9. 树莓派RP2040 UF2

配置方法

确保在rules.mk中有以下设置:

# Bootloader selection
BOOTLOADER = rp2040
兼容的刷写工具

任何能够将文件从一个位置复制到另一个位置的应用程序,如macOS Finder或Windows资源管理器。

刷写步骤
  1. 使用以下任一方法进入引导加载模式:
    • 按下键码QK_BOOT
    • 插入USB数据线时按住PCB上的BOOTSEL按钮
    • 双击PCB上的RESET按钮¹
  2. 等待操作系统检测到设备
  3. 将.uf2文件复制到新出现的USB磁盘
  4. 等待键盘变为可用状态

或者使用CLI刷写:

  1. 使用上述任一方法进入引导加载模式
  2. 等待操作系统检测到设备
  3. 通过QMK CLI刷写,例如:qmk flash --keyboard handwired/onekey/rpi_pico --keymap default
  4. 等待键盘变为可用状态

¹注意:仅当控制器已使用定义了RP2040_BOOTLOADER_DOUBLE_TAP_RESET的QMK固件进行刷写时,此选项才有效。

高级技巧与注意事项

重置键盘的方法总结

  1. 软件重置:按下映射到QK_BOOT的按键
  2. 硬件重置
    • 按下PCB上的RESET按钮(如果有)
    • 短接RST和GND针脚
    • 特定引导加载程序可能有特殊方法(如RP2040的BOOTSEL按钮)

常见问题与解决方案

  1. 设备未被识别

    • 检查USB连接
    • 确认是否正确进入引导加载模式
    • 某些引导加载程序只有几秒钟的识别窗口期
  2. 刷写失败

    • 确认使用了正确的刷写工具
    • 确认固件与键盘兼容
    • 检查固件大小是否超过限制
  3. 键盘进入引导加载模式后无响应

    • 某些引导加载程序有超时设置,超时后会自动退出
    • 确认引导加载程序的工作方式是否需要特殊步骤

总结

本文详细介绍了各种引导加载程序的特性和刷写方法,希望能帮助各位键盘爱好者更好地理解和掌握固件刷写技术。无论您是刚接触QMK固件的新手,还是经验丰富的DIY键盘玩家,了解这些知识都能让您的定制之路更加顺畅。

掌握了这些知识,您就能够自由定制键盘的功能,实现个性化的使用体验。如果您有任何问题或经验分享,欢迎在评论区交流!


延伸阅读:

  • QMK固件编译指南
  • 自定义键映射完全教程
  • 机械键盘RGB灯效配置方法
  • 分体式键盘同步设置技巧
http://www.xdnf.cn/news/333667.html

相关文章:

  • AppInventor2如何实现写文件不覆盖,而是在文件尾部追加?
  • 使用 React 实现语音识别并转换功能
  • Java游戏服务器开发流水账(2)开发中Maven的管理
  • CROSS 技术全解析:边缘计算如何成为行业价值新引擎
  • Linux下使用openssh搭建sftp服务
  • SQL:MySQL函数:字符串函数
  • 金仓数据库征文-金仓KES数据同步优化实践:逻辑解码与增量同步
  • 深入理解负载均衡:传输层与应用层的原理与实战
  • KRaft (Kafka 4.0) 集群配置指南(超简单,脱离 ZooKeeper 集群)还包含了简化测试指令的脚本!!!
  • WSL部署CosyVoice
  • node.js 实战——express图片保存到本地或服务器(七牛云、腾讯云、阿里云)
  • 能耗优化新引擎:EIOT平台助力企业降本增效
  • 需求分析阶段测试工程师主要做哪些事情
  • 华为云Astro后端开发中对象、事件、脚本、服务编排、触发器、工作流等模块的逻辑关系如何?以iotDA数据传输过程举例演示元素工作过程
  • 精品,架构师总结,MySQL 5.7 查询入门详解
  • trae ai编程工具
  • C++ STL入门:set 集合容器
  • 从父类到子类:C++ 继承的奇妙旅程(1)
  • Windows环境下MySQL Installer安装后执行`mysql`和`mysql -v`报错的问题解决方法
  • git 多个提交记录合并为一个
  • MySQL从入门到精通(四):SQL语言—DML
  • ts-node 深入讲解
  • Open CASCADE学习|ApplicationFramework 框架使用指南
  • linux查java进程CPU高的原因
  • 人工智能数据标注服务规范
  • SQL 更新U9C的请购单终止后不能转PO的问题
  • C++实现摩斯电码
  • 基于房屋框架结构的房屋布局大模型
  • Python操作MySQL
  • 大模型工具与案例:云服务器部署dify与使用