從原始碼構建韌體
如果您想對鍵盤的按鍵映射進行任何更改,或為新鍵盤添加對 SignalRGB QMK 協定的支援,您將需要從原始碼構建。
從原始碼構建的步驟:

打開 QMK MSYS 並對您所需的 QMK 分支/原始碼執行 git clone。(這可能是 QMK 主線 或 SonixQMK)。
然後,您需要將 SignalRGB Protocol 子模組添加到您正在構建的分支原始碼中:
// 在終端機中 cd 到您將要編譯的原始碼分支(QMK_MSYS、bash 等)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"}, ];}- 開啟鍵盤外掛程式後,您將看到類似上面的畫面。
- 您需要填寫其中一些欄位,從名稱欄位開始。
- 名稱欄位需要填入您為其開發韌體的鍵盤名稱。
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 欄位。在 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 陣列將每個鍵盤按鍵映射到發送到鍵盤的 RGBData 中的位置。
- 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 數量與您的 vKeys 數量匹配:
Section titled “如果 LED 數量與您的 vKeys 數量匹配:”- 確保您的外掛程式的 size 欄位在每個方向上都比您最高的 LED 座標大 1:
- 在我們的例子中,最遠的 LED 在位置 [17,6],因此我們的 Size 欄位需要是 [18,7]。
export function Size() { return [18, 7]; }如果 LED 數量與您的 vKeys 數量不匹配:
Section titled “如果 LED 數量與您的 vKeys 數量不匹配:”- 您需要添加 vKeys、vKeyPositions 和 vKeyNames 以匹配 LED 總數。
- 在我們的例子中,裝置有 119 個 LED,所以我們需要為鍵盤的底部發光添加 32 個 LED。



- 如果 vKeys 的數量與 LED 總數匹配且裝置大小正確,但 LED 映射不正確:
- 加入 Discord 並在 QMK 頻道中尋求幫助。
如何修復指示燈 LED(CAPSLOCK、NUMLOCK、SCROLL-LOCK)在 SignalRGB 和按鍵啟動時閃爍的問題。
Section titled “如何修復指示燈 LED(CAPSLOCK、NUMLOCK、SCROLL-LOCK)在 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 自訂構建頻道中尋求幫助,如果您有上述說明的任何問題!**