QMK Split 키보드의 RGBLIGHT를 USB 일시 중단으로 끕니다.

슬레이브측은 빛난 채



QMK 펌웨어로 RGBLIGHT_ENABLE = yes, RGBLIGHT_SLEEP = yes의 설정으로 하면, USB 서스펜드시 Split 키보드의 마스터측만 소등해, 슬레이브측은 빛난 채로 된다.

tmk_core/common/avr/suspend.c에 꺼지는 코드가 있습니다.
tmk_core/protocol/lufa/lufa.c에 있는 함수로부터 불린다. 그러나, lufa.c는 원래 마스터측 밖에 서스펜드에의 대응이 되어 있지 않다. 따라서, 마스터 측이 서스펜드에 들어가도 슬레이브 측은 계속 점등한다.

하드웨어 수정이 필요하지만 슬레이브 측을 소등시킬 수 있었기 때문에 기사를 써 보았다. 또한 #define USE_I2C에는 물리적으로 대응할 수 없습니다.

Split 키보드의 슬레이브 쪽을 일시 중단합니다.



Corne Keyboard에서 수정하고 있지만, 다른 Split 키보드에서도 같다고 생각한다.

하드웨어 수정





마스터측과 슬레이브측을 TRS로 접속한다. 따라서 #define USE_I2C는 사용할 수 없습니다.

소스 코드 수정



keyboards/crkbd/rules.mk에서 RGBLIGHT_ENABLE = yes로 설정
diff --git a/keyboards/crkbd/rules.mk b/keyboards/crkbd/rules.mk
index 16d05b589..f4a639fea 100644
--- a/keyboards/crkbd/rules.mk
+++ b/keyboards/crkbd/rules.mk
@@ -26,7 +26,7 @@ MIDI_ENABLE = no            # MIDI controls
 AUDIO_ENABLE = no           # Audio output on port C6
 UNICODE_ENABLE = no         # Unicode
 BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
-RGBLIGHT_ENABLE = no       # Enable WS2812 RGB underlight.
+RGBLIGHT_ENABLE = yes       # Enable WS2812 RGB underlight.

 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend

keyboards/crkbd/keymaps/default/config.h에서 RGBLIGHT_SLEEP 및 SLAVE_SUSPEND_PIN을 정의합니다. SLAVE_SUSPEND_PIN은 하드웨어의 수정으로 결선한 단자를 쓴다.
diff --git a/keyboards/crkbd/keymaps/default/config.h b/keyboards/crkbd/keymaps/default/config.h
index 899fde008..e14fe9745 100644
--- a/keyboards/crkbd/keymaps/default/config.h
+++ b/keyboards/crkbd/keymaps/default/config.h
@@ -35,9 +35,13 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define TAPPING_FORCE_HOLD
 #define TAPPING_TERM 100

+#define SLAVE_SUSPEND_PIN B6
+
 #ifdef RGBLIGHT_ENABLE
     #undef RGBLED_NUM
     #define RGBLIGHT_ANIMATIONS
+    #define RGBLIGHT_SLEEP
+    #define RGBLED_SPLIT {27, 27}
     #define RGBLED_NUM 27
     #define RGBLIGHT_LIMIT_VAL 120
     #define RGBLIGHT_HUE_STEP 10

수정하는 함수는 matrix_init_user(), suspend_power_down_user(), suspend_wakeup_init_user(), matrix_scan_user().

마스터 측에서 단자 출력의 High/Low를 실행하고, 슬레이브 측에서 단자를 읽고, 슬레이브 측에서는 호출되지 않는 suspend_power_down(), suspend_wakeup_init()를 호출한다.

서스펜드의 루프 처리는 tmk_core/protocol/lufa/lufa.c의 main()에 쓰는 것이 좋지만, 모두 사용자 함수로 대응하기 때문에 matrix_scan_user()에 썼다.
diff --git a/keyboards/crkbd/keymaps/default/keymap.c b/keyboards/crkbd/keymaps/default/keymap.c
index 446e3281e..aecfed41b 100644
--- a/keyboards/crkbd/keymaps/default/keymap.c
+++ b/keyboards/crkbd/keymaps/default/keymap.c
@@ -105,6 +105,25 @@ void matrix_init_user(void) {
     #ifdef SSD1306OLED
         iota_gfx_init(!has_usb());   // turns on the display
     #endif
+      if(has_usb()) {
+        writePinHigh(SLAVE_SUSPEND_PIN);
+        setPinOutput(SLAVE_SUSPEND_PIN);
+      }
+}
+
+extern void suspend_power_down(void);
+extern void suspend_wakeup_init(void);
+
+void suspend_power_down_user(void) {
+    if(is_master) {
+        writePinLow(SLAVE_SUSPEND_PIN);
+    }
+}
+
+void suspend_wakeup_init_user(void) {
+    if(is_master) {
+        writePinHigh(SLAVE_SUSPEND_PIN);
+    }
 }

 //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
@@ -123,6 +142,19 @@ const char *read_keylogs(void);
 // const char *read_timelog(void);

 void matrix_scan_user(void) {
+    static uint8_t recursive_call_guard = 0U;
+    if(!is_master && !recursive_call_guard) {
+        recursive_call_guard = 1U;
+        uint8_t need_suspend_wakeup_init = 0U;
+        while (readPin(SLAVE_SUSPEND_PIN) == 0x00 && !suspend_wakeup_condition()) {
+            suspend_power_down();
+            need_suspend_wakeup_init = 1U;
+        }
+        if (need_suspend_wakeup_init) {
+            suspend_wakeup_init();
+        }
+        recursive_call_guard = 0U;
+    }
    iota_gfx_task();
 }


이것으로 마스터 측의 제어로 슬레이브 측이 서스펜드에 들어가게 된다.

좋은 웹페이지 즐겨찾기