aboutsummaryrefslogtreecommitdiff
path: root/quantum
diff options
context:
space:
mode:
authorStefan Kerkmann <[email protected]>2024-10-18 09:57:08 +0200
committerGitHub <[email protected]>2024-10-18 09:57:08 +0200
commit3f9d4644126483bbd937f2be75a8878a1c986630 (patch)
tree0c91e51941b048b87c816e05f36e8a6b50753b9b /quantum
parent80f8aae3ec733cfbd6957a70f5fe436e5b92e725 (diff)
downloadqmk_firmware-3f9d4644126483bbd937f2be75a8878a1c986630.tar.gz
qmk_firmware-3f9d4644126483bbd937f2be75a8878a1c986630.zip
[Core] `usb_device_state`: consolidate usb state handling across implementations (#24258)
* usb_device_state: add idle_rate, led and protocol Previously all usb drivers and platform implementations (expect for our oddball atsam) tracked the same two global variables: - keyboard_protocol: to indicate if we are in report or boot protocol - keyboard_idle: for the idle_rate of the keyboard endpoint And a local variable that was exposed trough some indirection: - keyboard_led_state: for the currently set indicator leds (caps lock etc.) These have all been moved into the usb_device_state struct wich is accessible by getters and setters. This reduces code duplication and centralizes the state management across platforms and drivers. Signed-off-by: Stefan Kerkmann <[email protected]> * usb_device_state: reset protocol on reset The usb hid specification section 7.2.6 states: When initialized, all devices default to report protocol. However the host should not make any assumptions about the device’s state and should set the desired protocol whenever initializing a device. Thus on reset we should always do exactly that. Signed-off-by: Stefan Kerkmann <[email protected]> * keyboards: fix oversize warnings Signed-off-by: Stefan Kerkmann <[email protected]> --------- Signed-off-by: Stefan Kerkmann <[email protected]>
Diffstat (limited to 'quantum')
-rw-r--r--quantum/action_util.c3
-rw-r--r--quantum/command.c5
-rw-r--r--quantum/haptic.c2
-rw-r--r--quantum/os_detection.c26
-rw-r--r--quantum/os_detection.h2
-rw-r--r--quantum/os_detection/tests/os_detection.cpp14
-rw-r--r--quantum/process_keycode/process_haptic.c2
7 files changed, 29 insertions, 25 deletions
diff --git a/quantum/action_util.c b/quantum/action_util.c
index 52171b5050..c0dc4f3822 100644
--- a/quantum/action_util.c
+++ b/quantum/action_util.c
@@ -21,6 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "action_layer.h"
#include "timer.h"
#include "keycode_config.h"
+#include "usb_device_state.h"
#include <string.h>
extern keymap_config_t keymap_config;
@@ -318,7 +319,7 @@ void send_nkro_report(void) {
*/
void send_keyboard_report(void) {
#ifdef NKRO_ENABLE
- if (keyboard_protocol && keymap_config.nkro) {
+ if (usb_device_state_get_protocol() == USB_PROTOCOL_REPORT && keymap_config.nkro) {
send_nkro_report();
} else {
send_6kro_report();
diff --git a/quantum/command.c b/quantum/command.c
index c188638eb4..024d96917d 100644
--- a/quantum/command.c
+++ b/quantum/command.c
@@ -32,6 +32,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "led.h"
#include "command.h"
#include "quantum.h"
+#include "usb_device_state.h"
#include "version.h"
#ifdef BACKLIGHT_ENABLE
@@ -230,8 +231,8 @@ static void print_status(void) {
"timer_read32(): %08lX\n"
, host_keyboard_leds()
- , keyboard_protocol
- , keyboard_idle
+ , usb_device_state_get_protocol()
+ , usb_device_state_get_idle_rate()
#ifdef NKRO_ENABLE
, keymap_config.nkro
#endif
diff --git a/quantum/haptic.c b/quantum/haptic.c
index 6a466293a7..81bad469b3 100644
--- a/quantum/haptic.c
+++ b/quantum/haptic.c
@@ -36,7 +36,7 @@ extern uint8_t split_haptic_play;
haptic_config_t haptic_config;
static void update_haptic_enable_gpios(void) {
- if (haptic_config.enable && ((!HAPTIC_OFF_IN_LOW_POWER) || (usb_device_state == USB_DEVICE_STATE_CONFIGURED))) {
+ if (haptic_config.enable && ((!HAPTIC_OFF_IN_LOW_POWER) || (usb_device_state_get_configure_state() == USB_DEVICE_STATE_CONFIGURED))) {
#if defined(HAPTIC_ENABLE_PIN)
HAPTIC_ENABLE_PIN_WRITE_ACTIVE();
#endif
diff --git a/quantum/os_detection.c b/quantum/os_detection.c
index 99ffe1927a..4196b3ec8a 100644
--- a/quantum/os_detection.c
+++ b/quantum/os_detection.c
@@ -65,8 +65,8 @@ static volatile os_variant_t reported_os = OS_UNSURE;
static volatile bool first_report = true;
// to react on USB state changes
-static volatile enum usb_device_state current_usb_device_state = USB_DEVICE_STATE_NO_INIT;
-static volatile enum usb_device_state maxprev_usb_device_state = USB_DEVICE_STATE_NO_INIT;
+static volatile struct usb_device_state current_usb_device_state = {.configure_state = USB_DEVICE_STATE_NO_INIT};
+static volatile struct usb_device_state maxprev_usb_device_state = {.configure_state = USB_DEVICE_STATE_NO_INIT};
// the OS detection might be unstable for a while, "debounce" it
static volatile bool debouncing = false;
@@ -88,7 +88,7 @@ void os_detection_task(void) {
return;
}
#endif
- if (current_usb_device_state == USB_DEVICE_STATE_CONFIGURED) {
+ if (current_usb_device_state.configure_state == USB_DEVICE_STATE_CONFIGURED) {
// debouncing goes for both the detected OS as well as the USB state
if (debouncing && timer_elapsed_fast(last_time) >= OS_DETECTION_DEBOUNCE) {
debouncing = false;
@@ -163,19 +163,19 @@ os_variant_t detected_host_os(void) {
void erase_wlength_data(void) {
memset(&setups_data, 0, sizeof(setups_data));
- detected_os = OS_UNSURE;
- reported_os = OS_UNSURE;
- current_usb_device_state = USB_DEVICE_STATE_NO_INIT;
- maxprev_usb_device_state = USB_DEVICE_STATE_NO_INIT;
- debouncing = false;
- last_time = 0;
- first_report = true;
+ detected_os = OS_UNSURE;
+ reported_os = OS_UNSURE;
+ current_usb_device_state.configure_state = USB_DEVICE_STATE_NO_INIT;
+ maxprev_usb_device_state.configure_state = USB_DEVICE_STATE_NO_INIT;
+ debouncing = false;
+ last_time = 0;
+ first_report = true;
}
-void os_detection_notify_usb_device_state_change(enum usb_device_state usb_device_state) {
+void os_detection_notify_usb_device_state_change(struct usb_device_state usb_device_state) {
// treat this like any other source of instability
- if (maxprev_usb_device_state < current_usb_device_state) {
- maxprev_usb_device_state = current_usb_device_state;
+ if (maxprev_usb_device_state.configure_state < current_usb_device_state.configure_state) {
+ maxprev_usb_device_state.configure_state = current_usb_device_state.configure_state;
}
current_usb_device_state = usb_device_state;
last_time = timer_read_fast();
diff --git a/quantum/os_detection.h b/quantum/os_detection.h
index b8cd898335..98a8e805e4 100644
--- a/quantum/os_detection.h
+++ b/quantum/os_detection.h
@@ -31,7 +31,7 @@ typedef enum {
void process_wlength(const uint16_t w_length);
os_variant_t detected_host_os(void);
void erase_wlength_data(void);
-void os_detection_notify_usb_device_state_change(enum usb_device_state usb_device_state);
+void os_detection_notify_usb_device_state_change(struct usb_device_state usb_device_state);
void os_detection_task(void);
diff --git a/quantum/os_detection/tests/os_detection.cpp b/quantum/os_detection/tests/os_detection.cpp
index a9f671156b..ea43de144c 100644
--- a/quantum/os_detection/tests/os_detection.cpp
+++ b/quantum/os_detection/tests/os_detection.cpp
@@ -253,9 +253,11 @@ TEST_F(OsDetectionTest, TestDoNotReportIfUsbUnstable) {
EXPECT_EQ(detected_host_os(), OS_LINUX);
}
+static struct usb_device_state usb_device_state_configured = {.configure_state = USB_DEVICE_STATE_CONFIGURED};
+
TEST_F(OsDetectionTest, TestReportAfterDebounce) {
EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE}), OS_LINUX);
- os_detection_notify_usb_device_state_change(USB_DEVICE_STATE_CONFIGURED);
+ os_detection_notify_usb_device_state_change(usb_device_state_configured);
os_detection_task();
assert_not_reported();
@@ -291,7 +293,7 @@ TEST_F(OsDetectionTest, TestReportAfterDebounce) {
TEST_F(OsDetectionTest, TestReportAfterDebounceLongWait) {
EXPECT_EQ(check_sequence({0x12, 0xFF, 0xFF, 0x4, 0x10, 0xFF, 0xFF, 0xFF, 0x4, 0x10, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A}), OS_WINDOWS);
- os_detection_notify_usb_device_state_change(USB_DEVICE_STATE_CONFIGURED);
+ os_detection_notify_usb_device_state_change(usb_device_state_configured);
os_detection_task();
assert_not_reported();
@@ -318,7 +320,7 @@ TEST_F(OsDetectionTest, TestReportAfterDebounceLongWait) {
TEST_F(OsDetectionTest, TestReportUnsure) {
EXPECT_EQ(check_sequence({0x12, 0xFF}), OS_UNSURE);
- os_detection_notify_usb_device_state_change(USB_DEVICE_STATE_CONFIGURED);
+ os_detection_notify_usb_device_state_change(usb_device_state_configured);
os_detection_task();
assert_not_reported();
@@ -345,7 +347,7 @@ TEST_F(OsDetectionTest, TestReportUnsure) {
TEST_F(OsDetectionTest, TestDoNotReportIntermediateResults) {
EXPECT_EQ(check_sequence({0x12, 0xFF}), OS_UNSURE);
- os_detection_notify_usb_device_state_change(USB_DEVICE_STATE_CONFIGURED);
+ os_detection_notify_usb_device_state_change(usb_device_state_configured);
os_detection_task();
assert_not_reported();
@@ -356,7 +358,7 @@ TEST_F(OsDetectionTest, TestDoNotReportIntermediateResults) {
// at this stage, the final result has not been reached yet
EXPECT_EQ(check_sequence({0xFF}), OS_LINUX);
- os_detection_notify_usb_device_state_change(USB_DEVICE_STATE_CONFIGURED);
+ os_detection_notify_usb_device_state_change(usb_device_state_configured);
advance_time(OS_DETECTION_DEBOUNCE - 1);
os_detection_task();
assert_not_reported();
@@ -365,7 +367,7 @@ TEST_F(OsDetectionTest, TestDoNotReportIntermediateResults) {
// the remainder is processed
EXPECT_EQ(check_sequence({0x4, 0x10, 0xFF, 0xFF, 0xFF, 0x4, 0x10, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A}), OS_WINDOWS);
- os_detection_notify_usb_device_state_change(USB_DEVICE_STATE_CONFIGURED);
+ os_detection_notify_usb_device_state_change(usb_device_state_configured);
advance_time(OS_DETECTION_DEBOUNCE - 1);
os_detection_task();
assert_not_reported();
diff --git a/quantum/process_keycode/process_haptic.c b/quantum/process_keycode/process_haptic.c
index 21d4c5ce30..54cd7b817e 100644
--- a/quantum/process_keycode/process_haptic.c
+++ b/quantum/process_keycode/process_haptic.c
@@ -129,7 +129,7 @@ bool process_haptic(uint16_t keycode, keyrecord_t *record) {
}
}
- if (haptic_get_enable() && ((!HAPTIC_OFF_IN_LOW_POWER) || (usb_device_state == USB_DEVICE_STATE_CONFIGURED))) {
+ if (haptic_get_enable() && ((!HAPTIC_OFF_IN_LOW_POWER) || (usb_device_state_get_configure_state() == USB_DEVICE_STATE_CONFIGURED))) {
if (record->event.pressed) {
// keypress
if (haptic_get_feedback() < 2 && get_haptic_enabled_key(keycode, record)) {