跳转到内容

从源代码构建固件

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

从源代码构建的步骤:

  1. 此处下载并安装 QMK MSYS

打开 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/signalrgb
git submodule update --init --recursive
  1. 将上述两条命令粘贴到(QMK_MSYS、bash 等)终端窗口中。
  2. 您需要在您特定键盘品牌目录中添加一个包含以下内容的 keymap.json:
{
"modules": [
"signalrgb"
]
}

注意:请将 KEYBOARD BRAND 替换为您的键盘品牌,将 MODEL 替换为键盘型号,将 KM 替换为键位映射类型(default / via / keychron 等)。

键位映射类型:

  • default:如果您不是为 VIA 编译,则使用此键位映射
  • via:如果您是为 VIA 编译,则使用此键位映射 (建议先尝试此选项——您可以在此处找到您的 via 键位映射)

  • 如果固件编译失败,请加入 Discord 并在 QMK 频道寻求帮助。

现在您已经编译了固件,需要将其刷写到键盘上。

  • 您需要在网上查找您的键盘的刷写说明,因为不同键盘的刷写说明有所不同。
  1. 刷写键盘后,您需要修改下面的键盘插件以使 SignalRGB 与您的键盘配合工作。

QMK 插件示例文件夹

  • 下载上述键盘插件后,在文本编辑器中打开它。
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;}
/* global
shutdownColor:readonly
LightingMode:readonly
forcedColor: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"},
];
}
  1. 打开键盘插件后,您将看到类似上面的界面。
  • 您需要填写一些字段,从 Name 字段开始。
  • Name 字段需要填写您为其开发固件的键盘的名称。
export function Name() { return "Massdrop CTRL QMK Keyboard"; }
  1. 接下来,我们需要填写键盘的 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; }
  1. 下一个需要填写的字段是 Publisher 字段。在发布者字段中,您可以填写您的姓名、用户名或句柄。
export function Name() { return "Massdrop CTRL QMK Keyboard"; }
export function VendorId() { return 0x04d8; }
export function ProductId() { return 0xEED2; }
export function Publisher() { return "WhirlwindFX"; }
  1. 现在,我们完成了字段填写,正在继续处理数组。

需要修改 3 个数组:vKeys、vKeynames 和 vKeyPositions

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

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

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

  1. 现在,将您的插件文件保存到 %userprofile%/Documents/WhirlwindFX/plugins,然后重新启动 SignalRGB。
  • 您的键盘应该开始亮起并与 SignalRGB 互动。

如果键盘没有亮起或没有对 SignalRGB 做出正确响应:

Section titled “如果键盘没有亮起或没有对 SignalRGB 做出正确响应:”
  1. 转到 SignalRGB 中的设备页面。

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

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

  • 控制台中应该有设备 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 自定义构建频道寻求帮助,如果您对上述说明有任何问题!**