fix(usb): detect USB power mode to fallback to BLE

* Add tracking to see if we ever hit a configured status before
  suspend, so we can properly track "is connected" even when
  connected to a suspended/asleep host.
This commit is contained in:
angweekiat 2024-10-15 07:15:45 +08:00 committed by GitHub
parent 6cbf25f04a
commit 0adb80c02b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 11 additions and 3 deletions

View File

@ -24,6 +24,4 @@ enum zmk_usb_conn_state zmk_usb_get_conn_state(void);
static inline bool zmk_usb_is_powered(void) {
return zmk_usb_get_conn_state() != ZMK_USB_CONN_NONE;
}
static inline bool zmk_usb_is_hid_ready(void) {
return zmk_usb_get_conn_state() == ZMK_USB_CONN_HID;
}
bool zmk_usb_is_hid_ready(void);

View File

@ -20,6 +20,7 @@
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
static enum usb_dc_status_code usb_status = USB_DC_UNKNOWN;
static bool is_configured;
static void raise_usb_status_changed_event(struct k_work *_work) {
raise_zmk_usb_conn_state_changed(
@ -49,6 +50,10 @@ enum zmk_usb_conn_state zmk_usb_get_conn_state(void) {
}
}
bool zmk_usb_is_hid_ready(void) {
return zmk_usb_get_conn_state() == ZMK_USB_CONN_HID && is_configured;
}
void usb_status_cb(enum usb_dc_status_code status, const uint8_t *params) {
// Start-of-frame events are too frequent and noisy to notify, and they're
// not used within ZMK
@ -62,6 +67,11 @@ void usb_status_cb(enum usb_dc_status_code status, const uint8_t *params) {
}
#endif
usb_status = status;
if (zmk_usb_get_conn_state() == ZMK_USB_CONN_HID) {
is_configured |= usb_status == USB_DC_CONFIGURED;
} else {
is_configured = false;
}
k_work_submit(&usb_status_notifier_work);
};