从源代码构建固件
如果您想对键盘的键位映射进行任何更改,或为新键盘添加对 SignalRGB QMK 协议的支持,则需要从源代码构建固件。
从源代码构建的步骤:

打开 QMK MSYS,然后对您所需的 QMK 分支/源代码进行 git clone。(这可以是 QMK Mainline _或 SonixQMK)。
然后,您需要将 SignalRGB 协议子模块添加到您正在构建的分支源代码中:
// cd to your source fork you will be compiling against in the terminal (QMK_MSYS, bash, etc)git submodule add https://github.com/SRGBmods/QMK_Community_Module modules/signalrgbgit submodule update --init --recursive- 将上述两条命令粘贴到(QMK_MSYS、bash 等)终端窗口中。
- 您需要在您特定键盘品牌目录中添加一个包含以下内容的 keymap.json:
{ "modules": [ "signalrgb" ]}注意:请将 KEYBOARD BRAND 替换为您的键盘品牌,将 MODEL 替换为键盘型号,将 KM 替换为键位映射类型(default / via / keychron 等)。
键位映射类型:
- default:如果您不是为 VIA 编译,则使用此键位映射
- via:如果您是为 VIA 编译,则使用此键位映射 (建议先尝试此选项——您可以在此处找到您的 via 键位映射)

- 如果固件编译失败,请加入 Discord 并在 QMK 频道寻求帮助。
现在您已经编译了固件,需要将其刷写到键盘上。
- 您需要在网上查找您的键盘的刷写说明,因为不同键盘的刷写说明有所不同。
- 刷写键盘后,您需要修改下面的键盘插件以使 SignalRGB 与您的键盘配合工作。
- 下载上述键盘插件后,在文本编辑器中打开它。
export function Name() { return "QMK Keyboard"; }export function Version() { return "X.X.X"; }export function VendorId() { return 0x0000; }export function ProductId() { return 0x0000; }export function Publisher() { return "WhirlwindFX"; }export function Size() { return [14, 5]; }export function DefaultPosition(){return [10, 100]; }export function DefaultScale(){return 8.0;}/* globalshutdownColor:readonlyLightingMode:readonlyforcedColor:readonly*/export function ControllableParameters(){ return [ {"property":"shutdownColor", "group":"lighting", "label":"Shutdown Color", "min":"0", "max":"360", "type":"color", "default":"009bde"}, {"property":"LightingMode", "group":"lighting", "label":"Lighting Mode", "type":"combobox", "values":["Canvas", "Forced"], "default":"Canvas"}, {"property":"forcedColor", "group":"lighting", "label":"Forced Color", "min":"0", "max":"360", "type":"color", "default":"009bde"}, ];}- 打开键盘插件后,您将看到类似上面的界面。
- 您需要填写一些字段,从 Name 字段开始。
- Name 字段需要填写您为其开发固件的键盘的名称。
export function Name() { return "Massdrop CTRL QMK Keyboard"; }- 接下来,我们需要填写键盘的 VendorId。
- 要找到键盘的 VendorId,请打开 SignalRGB。
- 然后点击左下角的设置齿轮。

然后,点击设备信息。

然后找到您的键盘并记下其 VendorID 和 ProductID。


现在用这些值填写 VendorId 和 ProductId 字段。
export function Name() { return "Massdrop CTRL QMK Keyboard"; }export function VendorId() { return 0x04d8; }export function ProductId() { return 0xEED2; }- 下一个需要填写的字段是 Publisher 字段。在发布者字段中,您可以填写您的姓名、用户名或句柄。
export function Name() { return "Massdrop CTRL QMK Keyboard"; }export function VendorId() { return 0x04d8; }export function ProductId() { return 0xEED2; }export function Publisher() { return "WhirlwindFX"; }- 现在,我们完成了字段填写,正在继续处理数组。
需要修改 3 个数组:vKeys、vKeynames 和 vKeyPositions

- vKeys 数组将每个键盘键映射到发送给键盘的 RGB 数据中的位置。
- vKeyNames 数组告诉我们哪个键对应每个 vKey 和 vKeyPosition。
- vKeyPositions 数组告诉 SignalRGB 键盘上每个键的位置。
- 首先,更改 vKeyNames 数组以反映您的键盘。
- 这意味着您需要重新排列 vKeyNames,使其与您的键盘匹配。
- 在我们的例子中,我们必须删除键并重新组织其余的键,因为我们的主板是 TKL 主板。

然后以与更新 vKeyNames 数组相同的方式更新 vKeyPositions 数组。

最后,更新 vKeys 数组,使其与 vKeyNames 和 vKeysPositions 数组匹配。

- 现在,将您的插件文件保存到 %userprofile%/Documents/WhirlwindFX/plugins,然后重新启动 SignalRGB。
- 您的键盘应该开始亮起并与 SignalRGB 互动。
如果键盘没有亮起或没有对 SignalRGB 做出正确响应:
Section titled “如果键盘没有亮起或没有对 SignalRGB 做出正确响应:”- 转到 SignalRGB 中的设备页面。

- 接下来,转到您的键盘,然后点击设置齿轮。

- 然后,点击显示控制台切换。

- 控制台中应该有设备 LED 总数。将该设备 LED 总数与您分配的 LED 数量进行比较。
- 在我们的例子中,有 119 个 LED。
如果 LED 数量与您拥有的 vKey 数量匹配:
Section titled “如果 LED 数量与您拥有的 vKey 数量匹配:”- 确保您的插件的 size 字段在每个方向上都比您最高的 LED 坐标大 1:
- 在我们的例子中,最远的 LED 在位置 [17,6],因此我们的 Size 字段需要是 [18,7]。
export function Size() { return [18, 7]; }如果 LED 数量与您拥有的 vKey 数量不匹配:
Section titled “如果 LED 数量与您拥有的 vKey 数量不匹配:”- 您需要添加 vKeys、vKeyPositions 和 vKeyNames 以匹配 LED 总数。
- 在我们的例子中,设备有 119 个 LED,因此我们需要为键盘底部灯添加 32 个 LED。



- 如果 vKey 数量与 LED 总数匹配,设备尺寸也正确,但 LED 映射不正确:
- 加入 Discord 并在 QMK 频道寻求帮助。
如何修复指示灯 LED(大写锁定、数字锁定、滚动锁定)在 SignalRGB 激活且按键处于活动状态时闪烁的问题。
Section titled “如何修复指示灯 LED(大写锁定、数字锁定、滚动锁定)在 SignalRGB 激活且按键处于活动状态时闪烁的问题。”这有些复杂,因为它需要您提前了解指示灯(CAPS、NUM、SCROLL)的索引值。(通常可以在设备子类型 ansi/iso 或直接在 <keyboard_name.c> 中找到,查找 g_led_config 并将索引在视觉上映射到它所代表的键,或者一旦您的 SignalRGB 插件正常工作,您可以从那里获取 ID,然后使用此修改重新编译!)

一旦您知道上述值,需要对 signalrgb.c 或 via.c(取决于您的固件构建)进行轻微修改。将 CAPSLOCK_LED_INDEX、NUM_LOCK_LED_INDEX 或 SCROLL_LOCK_LED_INDEX 替换为您的键盘的索引值。
因此,如果 CAPS_LOCK 索引为 61,则此行:
if ((index + i) == CAPS_LOCK_LED_INDEX && host_keyboard_led_state().caps_lock) {变为此行:
if ((index + i) == 61 && hostkeyboard led_state().caps_lock) {完整代码示例如下(这将完全替换特定函数 “led_streaming”):
void led_streaming(uint8_t *data) //Stream data from HID Packets to Keyboard.{ uint8_t index = data[1]; uint8_t numberofleds = data[2];
if(numberofleds >= 10) { packet[1] = DEVICE_ERROR_LEDS; raw_hid_send(packet,32); return; }
for (uint8_t i = 0; i < numberofleds; i++) { uint8_t offset = (i * 3) + 3; uint8_t r = data[offset]; uint8_t g = data[offset + 1]; uint8_t b = data[offset + 2];
/* ONLY USE ONE OF THESE */ /* Remove the // from the beginning of the line you wish to use and update the INDEX accordingly */
/* This is for all three CAPS, NUM, and SCROLL LOCKS */ // if ( ((index + i) == CAPS_LOCK_LED_INDEX && host_keyboard_led_state().caps_lock) || ((index + i) == NUM_LOCK_LED_INDEX && host_keyboard_led_state().num_lock) || ((index + i) == SCROLL_LOCK_LED_INDEX && host_keyboard_led_state().scroll_lock)) {
/* This is for CAPS and NUM LOCK */ // if ( ((index + i) == CAPS_LOCK_LED_INDEX && host_keyboard_led_state().caps_lock) || ((index + i) == NUM_LOCK_LED_INDEX && host_keyboard_led_state().num_lock)) {
/* This is for CAPS LOCK */ // if ((index + i) == CAPS_LOCK_LED_INDEX && host_keyboard_led_state().caps_lock) {
/* This is for NUM LOCK */ // if ((index + i) == NUM_LOCK_LED_INDEX && host_keyboard_led_state().num_lock) {
/* ONLY USE ONE OF THE ABOVE */
rgb_matrix_set_color(index + i, 255, 255, 255); } else { rgb_matrix_set_color(index + i, r, g, b); } }}** 加入 Discord 并在 QMK 自定义构建频道寻求帮助,如果您对上述说明有任何问题!**