QMK 实战:用 Raspberry Pi Pico 将 ThinkPad 键盘改装为 USB 键盘(converter/thinkpad_t6x/rpi_pico 全面指南)
嵌入式固件驱动开发硬件开发【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址https://gitcode.com/GitHub_Trending/qm/qmk_firmware点击查看免费下载导读本篇文章围绕 QMK 固件仓库中的converter/thinkpad_t6x/rpi_pico转换板方案展开讲解如何借助一块基于 Raspberry Pi PicoRP2040的定制转换 PCB把来自联想 ThinkPad 多个机型T60、T61、X220 等的原厂键盘改造为即插即用的 USB 键盘同时完整保留 TrackPoint 小红点的鼠标能力。读完本文你将掌握该转换方案的硬件接线思路、keyboard.json数据驱动配置、PS/2 与矩阵键盘的底层实现原理、编译烧录流程以及 Bootloader 的三种进入方式可直接上手复刻或在此基础上二次定制键位。一、方案概述ThinkPad 键盘 Pico 转换板ThinkPad 笔记本键盘以优秀的键入手感与标志性的 TrackPoint 小红点著称不少玩家希望把它独立出来作为桌面外设使用。converter/thinkpad_t6x/rpi_pico正是为此设计的一款键盘转换固件它运行在一块定制转换 PCB 上PCB 以 Raspberry Pi Pico 为核心通过键盘排线接口直接驱动来自多种 ThinkPad 机型的原厂键盘。需要说明的是市面上类似的 ThinkPad 键盘转 USB 方案并不少见但 QMK 官方仓库中的这份实现是针对下方链接中特定转换板的专用固件该 PCB 设计详见转换板作者的开源硬件项目strobo5/T61_PiPico_Scanner。其他类似 PCB 在单片机选型以及键盘排线接口与 MCU 的接线方式上均有所不同因此固件不能通用——这一点在移植或复刻时务必注意。该转换板的固件在仓库中的目录结构如下keyboards/converter/thinkpad_t6x/rpi_pico/ ├── keyboard.json # 数据驱动配置矩阵、PS/2、USB 等 ├── readme.md # 官方说明文档 └── keymaps/ └── default/ └── keymap.c # 默认 ISO 布局键位键盘维护者Keyboard MaintainerMichael Büchlerstrobo5支持的硬件Hardware Supported上述定制转换 PCB搭配多种 ThinkPad 机型的键盘硬件来源Hardware Availability作者开源的定制 PCB 项目二、硬件配置拆解keyboard.json 逐项解读QMK 采用数据驱动配置data driven configuration模式绝大部分硬件参数集中在 keyboard.json 中无需手写config.h。下面逐项拆解这份配置。2.1 芯片与引导board: GENERIC_RP_RP2040, bootloader: rp2040, processor: RP2040processor: RP2040主控为树莓派 Pico 搭载的 RP2040 双核 ARM Cortex-M0 微控制器board: GENERIC_RP_RP2040使用 QMK 内置的通用 RP2040 板级定义无需厂家私有 BSPbootloader: rp2040RP2040 使用片上 ROM 引导程序UF2 拖拽烧录这也决定了后面烧录与复位的方式。2.2 矩阵配置16 列 × 8 行diode_direction: COL2ROW, matrix_pins: { cols: [GP7, GP9, GP11, GP13, GP17, GP16, GP14, GP12, GP15, GP8, GP10, GP6, GP4, GP2, GP5, GP3], rows: [GP20, GP26, GP22, GP21, GP18, GP19, GP27, GP28] }键盘主体是一个8 行 × 16 列的矩阵不含 PS/2 通道diode_direction: COL2ROW二极管方向为列到行行线接 MCU 输入列线作为扫描输出行、列分别映射到 RP2040 的 GP2~GP17、GP18~GP28 引脚。由于转换板负责把 ThinkPad 键盘的排线matrix 扫描信号翻译为 QMK 矩阵这些 GPIO 的排布完全由转换板 PCB 走线决定改动硬件时需要同步修改此处。2.3 PS/2 通道TrackPoint 小红点ThinkPad 键盘的 TrackPoint 小红点通过 PS/2 接口输出其配置为ps2: { clock_pin: GP1, data_pin: GP0, driver: vendor, enabled: true, mouse_enabled: true }clock_pin: GP1、data_pin: GP0PS/2 的时钟线与数据线driver: vendorRP2040 平台使用芯片厂商Raspberry Pi的硬件 PIO/外设实现 PS/2 时序对应源码位于 platforms/chibios/drivers/vendor/RP/RP2040/ps2_vendor.c比纯软件忙等busywait方式更省 CPU 且时序更稳定enabled: true启用 PS/2 模块mouse_enabled: true启用 PS/2 鼠标TrackPoint支持将小红点位移实时转换为 USB HID 鼠标报文。此外features中还开启了bootmagicBootmagic 复位、extrakey媒体/系统键、mousekey鼠标键功能它们共同支撑默认键位中的音量键与鼠标相关功能。2.4 USB 描述符usb: { device_version: 1.0.0, pid: 0x0000, vid: 0xFEED }VID 为 QMK 通用的0xFEEDPID 为0x0000本地自定义设备默认值设备版本号 1.0.0。如需批量生产或避免与已有设备冲突可在此修改 PID。三、默认键位解析LAYOUT_iso 与特殊按键默认键位定义在 keymaps/default/keymap.c 中使用LAYOUT_iso布局ISO 回车、#~、\|等欧式键位元素清晰可见共一层键位。摘录核心部分const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] { [0] LAYOUT_iso( KC_ESC, KC_MUTE, KC_VOLD, KC_VOLU, QK_BOOT, KC_PSCR, KC_SCRL, KC_PAUS, KC_INS, KC_HOME, KC_PGUP, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_END, KC_PGDN, ... KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_APP, KC_RCTL, KC_WBAK, KC_UP , KC_WFWD, KC_LEFT, KC_DOWN, KC_RGHT ) };几个值得注意的设计点媒体键与 ThinkVantage顶层一行将KC_MUTE静音、KC_VOLD/KC_VOLU音量减/加映射在左上角并保留 ThinkPad 特有的 ThinkVantage 键位置这正是extrakey特性在起作用QK_BOOT一键复位QK_BOOT被放在首行对应键盘矩阵 (0,0) 附近的顶层按键按下即可直接进入 Bootloader这也是官方 readme 推荐的第三种复位方式欧式键位保留KC_NUHS非美式 #~ 键、KC_NUBS非美式 | 键等键码表明默认布局面向欧洲 ISO 键盘导航键区PrtSc/ScrLk/Pause、Insert/Home/PgUp、Delete/End/PgDn 以及独立的方向键区都被完整映射KC_NO占位矩阵中存在空位如 Fn 键对应位置使用KC_NO显式跳过避免误触发。keyboard.json中LAYOUT_iso的layout数组给出了每个键的物理坐标x/y/w/h与矩阵位置matrix: [row, col]例如Esc位于矩阵 [5,0] 且尺寸为 0.9×0.75Space为 5 个单位宽。修改键位时只需编辑keymap.c中LAYOUT_iso(...)的参数顺序无需改动坐标定义。四、PS/2 与矩阵双通道的底层原理4.1 PS/2 协议在 QMK 中的实现QMK 的 PS/2 支持分为两层与设备无关的协议层和平台相关的 IO 层。协议层的核心实现在 drivers/ps2/ps2.h 与 drivers/ps2/ps2_mouse.cps2_host_init()初始化主机端 IOps2_host_send()/ps2_host_recv()负责字节级收发协议常量如PS2_ACK (0xFA)、PS2_RESEND (0xFE)、PS2_SET_LED (0xED)定义了主机与设备间的握手与命令错误码PS2_ERR_STARTBIT、PS2_ERR_PARITY、PS2_ERR_NODATA用于收发过程中的校验与容错空闲时时钟与数据线均拉高idle()发送前先拉低时钟inhibit()以抑制设备上报——这正是 PS/2 总线时序的基本约定。鼠标数据报文格式见 drivers/ps2/ps2_mouse.h为经典三字节包字节 0 是按键与溢出/符号标志字节 1、2 分别是 X、Y 位移量。ps2_mouse.c在此基础上把位移累加并转换为 USB HID 鼠标报告使 TrackPoint 能够驱动光标。4.2 RP2040 的 vendor 驱动keyboard.json中的driver: vendor指向 RP2040 平台专用实现 platforms/chibios/drivers/vendor/RP/RP2040/ps2_vendor.c。相较 AVR 平台上常用的ps2_busywait.c软件轮询时钟/数据线与ps2_interrupt.c外部中断RP2040 的 vendor 驱动利用芯片自身外设能力完成时序占用 CPU 更少为矩阵扫描与 USB 报告留出更多余量。从源码结构可以推断这也是该转换板选择 Pico 的原因之一——Pico 的 GPIO 充足矩阵 24 线 PS/2 2 线绰绰有余性能对矩阵 PS/2 双通道并发这种负载毫无压力。4.3 矩阵扫描与 PS/2 的协同转换板将 ThinkPad 键盘排线分为两部分键盘矩阵16 列 × 8 行经二极管隔离后接入 Pico 的 GPIO由 QMK 的矩阵扫描驱动COL2ROW以列扫描方式读取TrackPoint 的 PS/2 信号则独立走 GP0/GP1。QMK 主循环中矩阵扫描与 PS/2 鼠标轮询协同工作键盘按键与小红点输入互不干扰最终合并进同一份 USB HID 报告键盘 鼠标 媒体键的复合设备上报主机。五、编译与烧录5.1 编译在配置好 QMK 构建环境后于仓库根目录执行make converter/thinkpad_t6x/rpi_pico:default该命令会为default键位编译固件产出.uf2烧录文件RP2040 平台的标准产物。5.2 烧录make converter/thinkpad_t6x/rpi_pico:default:flashflash目标会自动进入烧录流程。RP2040 的烧录依赖其 ROM Bootloader设备进入 USB 大容量存储模式UF2 模式后将编译出的.uf2文件拖入虚拟磁盘即可完成烧录。若你是 QMK 新手可先参考仓库内的 构建环境搭建文档 与 make 使用指南以及面向新手的 Complete Newbs Guide。六、Bootloader 的三种进入方式官方 readme 明确给出了三种将转换板置于 Bootloader 状态的方法Bootmagic 复位最常用按住矩阵 (0,0) 位置的按键通常是左上角按键或 Esc本方案中对应 Esc不放同时插入 USB 供电。该功能由keyboard.json中features.bootmagic: true开启其实现位于 quantum/bootmagic 相关源码中物理复位按键短按转换板背面的复位按钮部分 PCB 没有按钮而是预留了需要短接的焊盘Pads布局中的复位键码按下映射了QK_BOOT的按键。如上文所述默认键位已把QK_BOOT放在顶层无需进入系统即可一键进入烧录模式日常重刷固件非常方便。三种方式殊途同归让 RP2040 进入 ROM Bootloader 的 UF2 模式随后即可用拖拽.uf2文件的方式烧录新固件。七、二次开发建议改键位编辑 keymaps/default/keymap.c 后重新编译即可。若需新增多层键位如 Fn 层可在keymaps数组中追加[1] LAYOUT_iso(...)并配合MO()层切换键调整矩阵/PS/2 引脚仅在修改 PCB 走线时需要同步更新 keyboard.json 中的matrix_pins与ps2节点TrackPoint 灵敏度调优可通过 PS/2 命令对小红点进行灵敏度设置ps2_mouse.c中封装了相关命令收发也可在keymap.c或用户级代码中调用鼠标调整逻辑自定义 USB 描述符按需修改usb节点中的pid/vid与device_version。结语converter/thinkpad_t6x/rpi_pico是一个旧键盘重生的典型 QMK 案例一块 Pico 级别的低成本主控配合定制转换板即可同时接管 ThinkPad 键盘矩阵与 PS/2 TrackPoint输出为标准的 USB 复合设备。本文从keyboard.json配置、默认键位、PS/2 协议原理到编译烧录与复位方式做了完整拆解希望对你复刻或二次开发这套转换方案有所帮助。若你想深入了解 QMK 数据驱动配置的通用规则可继续阅读仓库内的 data_driven_config.md。赞分享嵌入式固件驱动开发硬件开发【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址https://gitcode.com/GitHub_Trending/qm/qmk_firmware点击查看免费下载相关推荐QMK BLE 适配器实战指南将普通 USB 键盘改装为蓝牙 LE HID 无线键盘QMK BLE 适配器实战指南将普通 USB 键盘改装为蓝牙 LE HID 无线键盘 导读 QMK 固件仓库中的 converter/usb_usb/ble嵌入式固件驱动开发硬件开发QMK 固件下的 1upkeyboards pi50基于 Raspberry Pi Pico 的 5x12 正交键盘移植全解析QMK 固件下的 1upkeyboards pi50基于 Raspberry Pi Pico 的 5x12 正交键盘移植全解析 本篇技术指南聚焦 QMK Fi嵌入式固件驱动开发硬件开发QMK Firmware 中的 Sun 键盘转 USB 协议转换器converter/sun_usb完全指南QMK Firmware 中的 Sun 键盘转 USB 协议转换器converter/sun_usb完全指南 本文以 QMK Firmware 仓库中的 k嵌入式固件驱动开发硬件开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考