aboutsummaryrefslogtreecommitdiff
path: root/tmk_core/protocol/chibios
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 /tmk_core/protocol/chibios
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 'tmk_core/protocol/chibios')
-rw-r--r--tmk_core/protocol/chibios/chibios.c11
-rw-r--r--tmk_core/protocol/chibios/usb_main.c24
2 files changed, 14 insertions, 21 deletions
diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c
index b879bdac77..cf948154f9 100644
--- a/tmk_core/protocol/chibios/chibios.c
+++ b/tmk_core/protocol/chibios/chibios.c
@@ -62,14 +62,13 @@
*/
/* declarations */
-uint8_t keyboard_leds(void);
-void send_keyboard(report_keyboard_t *report);
-void send_nkro(report_nkro_t *report);
-void send_mouse(report_mouse_t *report);
-void send_extra(report_extra_t *report);
+void send_keyboard(report_keyboard_t *report);
+void send_nkro(report_nkro_t *report);
+void send_mouse(report_mouse_t *report);
+void send_extra(report_extra_t *report);
/* host struct */
-host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_nkro, send_mouse, send_extra};
+host_driver_t chibios_driver = {.keyboard_leds = usb_device_state_get_leds, .send_keyboard = send_keyboard, .send_nkro = send_nkro, .send_mouse = send_mouse, .send_extra = send_extra};
#ifdef VIRTSER_ENABLE
void virtser_task(void);
diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c
index 2024a3bc7f..2a287e0d98 100644
--- a/tmk_core/protocol/chibios/usb_main.c
+++ b/tmk_core/protocol/chibios/usb_main.c
@@ -54,10 +54,6 @@ extern keymap_config_t keymap_config;
extern usb_endpoint_in_t usb_endpoints_in[USB_ENDPOINT_IN_COUNT];
extern usb_endpoint_out_t usb_endpoints_out[USB_ENDPOINT_OUT_COUNT];
-uint8_t _Alignas(2) keyboard_idle = 0;
-uint8_t _Alignas(2) keyboard_protocol = 1;
-uint8_t keyboard_led_state = 0;
-
static bool __attribute__((__unused__)) send_report_buffered(usb_endpoint_in_lut_t endpoint, void *report, size_t size);
static void __attribute__((__unused__)) flush_report_buffered(usb_endpoint_in_lut_t endpoint, bool padded);
static bool __attribute__((__unused__)) receive_report(usb_endpoint_out_lut_t endpoint, void *report, size_t size);
@@ -168,6 +164,7 @@ void usb_event_queue_task(void) {
break;
case USB_EVENT_RESET:
usb_device_state_set_reset();
+ usb_device_state_set_protocol(USB_PROTOCOL_REPORT);
break;
default:
// Nothing to do, we don't handle it.
@@ -250,10 +247,10 @@ static void set_led_transfer_cb(USBDriver *usbp) {
if (setup->wLength == 2) {
uint8_t report_id = set_report_buf[0];
if ((report_id == REPORT_ID_KEYBOARD) || (report_id == REPORT_ID_NKRO)) {
- keyboard_led_state = set_report_buf[1];
+ usb_device_state_set_leds(set_report_buf[1]);
}
} else {
- keyboard_led_state = set_report_buf[0];
+ usb_device_state_set_leds(set_report_buf[0]);
}
}
@@ -269,7 +266,9 @@ static bool usb_requests_hook_cb(USBDriver *usbp) {
return usb_get_report_cb(usbp);
case HID_REQ_GetProtocol:
if (setup->wIndex == KEYBOARD_INTERFACE) {
- usbSetupTransfer(usbp, &keyboard_protocol, sizeof(uint8_t), NULL);
+ static uint8_t keyboard_protocol;
+ keyboard_protocol = usb_device_state_get_protocol();
+ usbSetupTransfer(usbp, &keyboard_protocol, sizeof(keyboard_protocol), NULL);
return true;
}
break;
@@ -292,12 +291,12 @@ static bool usb_requests_hook_cb(USBDriver *usbp) {
break;
case HID_REQ_SetProtocol:
if (setup->wIndex == KEYBOARD_INTERFACE) {
- keyboard_protocol = setup->wValue.word;
+ usb_device_state_set_protocol(setup->wValue.lbyte);
}
usbSetupTransfer(usbp, NULL, 0, NULL);
return true;
case HID_REQ_SetIdle:
- keyboard_idle = setup->wValue.hbyte;
+ usb_device_state_set_idle_rate(setup->wValue.hbyte);
return usb_set_idle_cb(usbp);
}
break;
@@ -396,11 +395,6 @@ __attribute__((weak)) void restart_usb_driver(USBDriver *usbp) {
* ---------------------------------------------------------
*/
-/* LED status */
-uint8_t keyboard_leds(void) {
- return keyboard_led_state;
-}
-
/**
* @brief Send a report to the host, the report is enqueued into an output
* queue and send once the USB endpoint becomes empty.
@@ -458,7 +452,7 @@ static bool receive_report(usb_endpoint_out_lut_t endpoint, void *report, size_t
void send_keyboard(report_keyboard_t *report) {
/* If we're in Boot Protocol, don't send any report ID or other funky fields */
- if (!keyboard_protocol) {
+ if (usb_device_state_get_protocol() == USB_PROTOCOL_BOOT) {
send_report(USB_ENDPOINT_IN_KEYBOARD, &report->mods, 8);
} else {
send_report(USB_ENDPOINT_IN_KEYBOARD, report, KEYBOARD_REPORT_SIZE);