- 固件
- 嵌入式
- 智能硬件
- 蓝牙
【免费下载链接】zmk
ZMK Firmware Repository
BFO-9000 是一款可自定义尺寸的全尺寸(full-size)分体正交(split ortholinear)键盘,由 keeb.io 推出。本文以 ZMK 固件仓库中 app/boards/shields/bfo9000 目录下的 shield 实现为核心,从硬件特性、分体双胞胎(siblings)结构、kscan 矩阵定义、matrix-transform 映射到内置默认键位,逐层拆解这套 6 行 × 18 列分体布局在 ZMK 中是如何被描述、接线和固化的,并给出在 bfo9000.keymap 基础上进行二次定制的实操指引。
硬件特性概览
ZMK 仓库为该 shield 维护的 README.md 明确列出了三项核心硬件特性,这也是理解后续所有配置文件的物理前提:
- 轴体兼容性广:同时兼容 MX 兼容轴、Alps 兼容轴以及 Kailh 矮轴(Low-Profile Choc)开关;
- 可拆分尺寸(breakoff pieces):PCB 提供可掰断的模块,允许用户自由组合出4~6 行、7~9 列的不同矩阵规模;
- RGB LED 连接:PCB 预留 RGB LED 的接线点,可配合 ZMK 的
&rgb_ug行为实现底灯/轴灯控制。
正因如此,"BFO" 之名对应 "Big Freaking Ortholinear"——它本质上是一块"想要多大就有多大"的正交布局 PCB。ZMK 的默认实现选择了其最大规模:6 行 × 18 列(左右半区各 6 行 × 9 列),这一点在 bfo9000.dtsi 的default_transform中直接体现:
default_transform: keymap_transform_0 { compatible = "zmk,matrix-transform"; columns = <18>; rows = <6>; map = < RC(0,0) RC(0,1) ... RC(0,17) RC(1,0) RC(1,1) ... RC(1,17) RC(2,0) RC(2,1) ... RC(2,17) RC(3,0) RC(3,1) ... RC(3,17) RC(4,0) RC(4,1) ... RC(4,17) RC(5,0) RC(5,1) ... RC(5,17) >; };RC(行, 列)宏来自 ZMK 的 app/include/dt-bindings/zmk 头文件族(其中包含matrix-transform.h),用于按物理行列位置描述键位;当物理矩阵与逻辑键位布局不一致时,开发者可以在map中重新排布这些RC()条目来完成矩阵变换。
分体结构:left / right 双胞胎与 Kconfig 开关
ZMK 中一块物理 PCB 对应一个 shield,分体键盘的左右两半则通过siblings(双胞胎)机制表达。在 bfo9000.zmk.yml 中可以看到:
file_format: "1" id: bfo9000 name: BFO-9000 type: shield url: https://keeb.io/products/bfo-9000-keyboard-customizable-full-size-split-ortholinear requires: [pro_micro] features: - keys siblings: - bfo9000_left - bfo9000_right几个关键字段的含义:
id: bfo9000:shield 的唯一标识;requires: [pro_micro]:该 shield 依赖 Pro Micro 兼容主控板(引脚定义在 app/boards/shields 体系内的pro_microinterconnect 中);siblings:声明bfo9000_left与bfo9000_right两个可独立构建的变体,构建时通过SHIELD=bfo9000_left或SHIELD=bfo9000_right选择。
与此对应的 Kconfig.shield 定义了编译开关:
config SHIELD_BFO9000_LEFT def_bool $(shields_list_contains,bfo9000_left) config SHIELD_BFO9000_RIGHT def_bool $(shields_list_contains,bfo9000_right)而 Kconfig.defconfig 则完成了分体相关的默认配置注入:
if SHIELD_BFO9000_LEFT config ZMK_KEYBOARD_NAME default "BFO-9000" config ZMK_SPLIT_ROLE_CENTRAL default y endif if SHIELD_BFO9000_LEFT || SHIELD_BFO9000_RIGHT config ZMK_SPLIT default y endif从这段源码可以清楚读出 ZMK 的分体角色约定:左半(bfo9000_left)默认充当 central(中心)角色,负责蓝牙连接、USB 枚举与组合键处理;右半作为 peripheral 通过 BLE 或有线方式与左半通信。ZMK_SPLIT对左右两半都启用,确保双方都具备分体通信能力。
矩阵接线:kscan0 与左右 overlay 的 GPIO 分工
ZMK 使用zmk,kscan-gpio-matrix兼容节点来描述"行列扫描"物理接线。公共部分写在 bfo9000.dtsi 中:
kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; wakeup-source; diode-direction = "col2row"; row-gpios = <&pro_micro 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; };要点解读:
wakeup-source:该矩阵可作为系统唤醒源,允许键盘在睡眠状态下通过按键唤醒;diode-direction = "col2row":二极管方向为列到行,这是扫描方向的硬件约定,必须与 PCB 实际二极管焊接方向一致;row-gpios:6 个行引脚分别接到 Pro Micro 的 1、0、4、5、6、7 号引脚,并配置为GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN(默认拉低、按键按下时被拉高,从而判定按下)。
列引脚则因左右半区不同而拆分为两个 overlay:
- bfo9000_left.overlay:include 公共 dtsi 后,为
&kscan0追加 9 个col-gpios,分别接 Pro Micro 的 9、10、16、14、15、18、19、20、21 号引脚; - bfo9000_right.overlay:同样追加相同的 9 个列引脚定义,额外再通过
&default_transform设置col-offset = <9>。
col-offset = <9>是理解分体矩阵的关键:左右两半共用同一份 6 行 × 18 列的矩阵变换模板,右半从物理第 0 列开始扫描,但其逻辑列号需要整体偏移 9 列(映射到第 9~17 列),左右两半各自的 9 列拼合起来恰好构成完整的 18 列逻辑矩阵。这样左右两半可以烧录同一份 keymap 文件,键位坐标在逻辑上无缝衔接。
默认键位:bfo9000.keymap 全解析
app/boards/shields/bfo9000/bfo9000.keymap 是该 shield 的开箱即用键位,共定义两个层:default_layer(DEFAULT,层 0)与lower_layer(LOWER,层 1)。它通过#include <behaviors.dtsi>(见 app/dts/behaviors.dtsi)以及keys.h、bt.h、outputs.h、ext_power.h、rgb.h等 dt-bindings 头文件引入全部行为与键码宏。
Default Layer:全尺寸对称布局
默认层共 108 个键位,采用"左半区 + 右半区镜像"的对称设计,布局从上到下依次为:
| 行 | 左半区(第 0~8 列) | 右半区(第 9~17 列) |
|---|---|---|
| 第 0 行 | Esc、Vol Up、Esc、F1~F6 | F5、F6~F12、Del |
| 第 1 行 | Home、Vol Dn、`、1~6 | 5、6~0、-、=、Backspace |
| 第 2 行 | End、Tab、Tab、Q~Y | T、Y~P、[、]、\ |
| 第 3 行 | PgUp、Caps、Ctrl、A~H | G、H~L、;、'、Enter、Enter |
| 第 4 行 | PgDn、↑、Shift、Z~N | B、N~M、,、.、/、Shift、↑、&mo LOWER |
| 第 5 行 | ←、↓、→、Ctrl、Alt、Win、Space、Space、Enter | Backspace、Space、Space、Win、Alt、Ctrl、←、↓、→ |
键位定义摘录如下(完整定义见源码):
bindings = < &kp ESC &kp C_VOL_UP &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &kp HOME &kp C_VOL_DN &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC ... &kp LEFT &kp DOWN &kp RIGHT &kp LCTRL &kp LALT &kp LMETA &kp SPACE &kp SPACE &kp ENTER &kp BSPC &kp SPACE &kp SPACE &kp RMETA &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT >;其中值得注意的细节:
- 卷屏/导航键(Esc、Home、End、PgUp、PgDn、方向键)在左右两半均有镜像副本,方便双手就近操作;
- 音量控制通过
C_VOL_UP/C_VOL_DN消费类键码实现; - 第 4 行最右一列绑定了
&mo LOWER(momentary layer),按住即临时切入 Lower 层; - 第 5 行左右拇指区对称布置 Space、Enter、Backspace,符合分体键盘的拇指列使用习惯。
Lower Layer:功能与系统控制层
Lower 层(bfo9000.keymap 第 39~55 行)是典型的功能层,左右半区镜像布置,提供四类能力:
- 蓝牙连接管理(
&bt):BT_CLR(清除配对)与BT_SEL 0~BT_SEL 7(选择 0~7 号蓝牙配置文件)。ZMK 最多支持 8 个蓝牙 profile,此层将其全部暴露在 F 区上方; - 输出切换(
&out):OUT_USB(切换 USB 输出)与OUT_BLE(切换蓝牙输出),其余位置用&trans透明透传; - 外部电源控制(
&ext_power):EP_ON/EP_OFF用于开关外设电源轨(例如 RGB 或扩展供电); - 系统与重置:
&sys_reset(软复位固件)与&bootloader(进入刷写模式); - RGB 底灯控制(
&rgb_ug):RGB_TOG(开关)、RGB_HUI/RGB_HUD(色调)、RGB_SAI/RGB_SAD(饱和度)、RGB_BRI/RGB_BRD(亮度)、RGB_SPI/RGB_SPD(速度)、RGB_EFF/RGB_EFR(效果切换),完整覆盖 ZMK RGB 行为的主要控制维度。
&trans(transparent)行为意味着该键位在 Lower 层不生效、透传到更低层,从而保证功能键之外的位置不干扰默认层输入。
如何构建与使用
该 shield 的构建遵循 ZMK 标准的 west 构建流程(对应 app/CMakeLists.txt 与 app/west.yml 定义的 ZMK 应用骨架)。以 Pro Micro 兼容板(requires: [pro_micro])为例,典型构建命令形如:
west build -b pro_micro -- -DSHIELD=bfo9000_left west build -b pro_micro -- -DSHIELD=bfo9000_right需要烧录的两份固件分别对应左右半区;左半默认承担 central 角色(由ZMK_SPLIT_ROLE_CENTRAL注入,见 Kconfig.defconfig)。若你的实际硬件是 4/5 行或 7/8 列的非最大配置,则需在个人 keymap 项目中对 bfo9000.dtsi 的rows/columns与map按实际矩阵规模裁剪,并同步调整左右 overlay 中使用的列 GPIO 数量。
小结
BFO-9000 shield 是 ZMK 分体键盘实现中非常典型且信息完整的范例:硬件侧通过kscan0的row-gpios与左右 overlay 的col-gpios描述 6 × 18 物理矩阵,逻辑侧用matrix-transform的col-offset完成左右半区坐标拼接,软件侧用siblings+Kconfig.defconfig表达 central/peripheral 角色,最后以一份 bfo9000.keymap 同时服务左右两半。理解了这一整套从 GPIO 到键位的映射链路,你就能轻松在 app/boards/shields/bfo9000 基础上定制属于自己的全尺寸正交分体布局。
- 固件
- 嵌入式
- 智能硬件
- 蓝牙
【免费下载链接】zmk
ZMK Firmware Repository
相关推荐
ZMK 固件 TG4x Shield 适配指南:40% 键盘矩阵、键位分层与 RGB 灯带配置
ZMK 固件 TG4x Shield 适配指南:40% 键盘矩阵、键位分层与 RGB 灯带配置 TG4x 是一款采用 8×7 矩阵扫描的 40% 键盘,其 ZM
固件嵌入式智能硬件蓝牙ZMK Microdox 分体键盘 Shield 全解析:V1/V2 版本选型、构建烧录与默认键位配置
ZMK Microdox 分体键盘 Shield 全解析:V1/V2 版本选型、构建烧录与默认键位配置 Microdox 是由 Boardsource 推出的一
固件嵌入式智能硬件蓝牙QMK Firmware 中的 Southern Breeze Rev1:分体键盘的矩阵配置、USB 描述与默认键位全解析
QMK Firmware 中的 Southern Breeze Rev1:分体键盘的矩阵配置、USB 描述与默认键位全解析 本文以 QMK Firmware 仓
嵌入式固件驱动开发硬件开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考