From 0e02b0c41e47d5f5ad799a9860869b9d30ab881a Mon Sep 17 00:00:00 2001 From: Stefan Kerkmann Date: Wed, 28 Feb 2024 12:00:27 +0100 Subject: [Core] Refactor ChibiOS USB endpoints to be fully async (#21656) --- tmk_core/protocol/chibios/chibios.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'tmk_core/protocol/chibios/chibios.c') diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c index 91bb252c7c..76a37ae538 100644 --- a/tmk_core/protocol/chibios/chibios.c +++ b/tmk_core/protocol/chibios/chibios.c @@ -192,15 +192,18 @@ void protocol_pre_task(void) { /* Remote wakeup */ if ((USB_DRIVER.status & USB_GETSTATUS_REMOTE_WAKEUP_ENABLED) && suspend_wakeup_condition()) { usbWakeupHost(&USB_DRIVER); - restart_usb_driver(&USB_DRIVER); +# if USB_SUSPEND_WAKEUP_DELAY > 0 + // Some hubs, kvm switches, and monitors do + // weird things, with USB device state bouncing + // around wildly on wakeup, yielding race + // conditions that can corrupt the keyboard state. + // + // Pause for a while to let things settle... + wait_ms(USB_SUSPEND_WAKEUP_DELAY); +# endif } } /* Woken up */ - // variables has been already cleared by the wakeup hook - send_keyboard_report(); -# ifdef MOUSEKEY_ENABLE - mousekey_send(); -# endif /* MOUSEKEY_ENABLE */ } #endif } @@ -218,4 +221,5 @@ void protocol_post_task(void) { #ifdef RAW_ENABLE raw_hid_task(); #endif + usb_idle_task(); } -- cgit v1.2.3 From 63dd131d812be4b8d4894fc20ca9968e25996b07 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 14 Mar 2024 10:45:12 +0000 Subject: Refactor vusb to protocol use pre/post task (#14944) --- quantum/main.c | 35 ++++++++++++++++++----------------- tmk_core/protocol/chibios/chibios.c | 13 ------------- tmk_core/protocol/lufa/lufa.c | 6 +----- tmk_core/protocol/vusb/protocol.c | 30 ++++++------------------------ tmk_core/protocol/vusb/vusb.c | 10 +++++++++- 5 files changed, 34 insertions(+), 60 deletions(-) (limited to 'tmk_core/protocol/chibios/chibios.c') diff --git a/quantum/main.c b/quantum/main.c index 3b101c522c..3159c55850 100644 --- a/quantum/main.c +++ b/quantum/main.c @@ -25,22 +25,9 @@ void protocol_pre_task(void); void protocol_post_task(void); // Bodge as refactoring this area sucks.... -void protocol_init(void) __attribute__((weak)); -void protocol_init(void) { - protocol_pre_init(); - - keyboard_init(); - - protocol_post_init(); -} - -void protocol_task(void) __attribute__((weak)); -void protocol_task(void) { - protocol_pre_task(); - +void protocol_keyboard_task(void) __attribute__((weak)); +void protocol_keyboard_task(void) { keyboard_task(); - - protocol_post_task(); } /** \brief Main @@ -53,11 +40,25 @@ int main(void) { protocol_setup(); keyboard_setup(); - protocol_init(); + protocol_pre_init(); + keyboard_init(); + protocol_post_init(); /* Main loop */ while (true) { - protocol_task(); + protocol_pre_task(); + protocol_keyboard_task(); + protocol_post_task(); + +#ifdef RAW_ENABLE + void raw_hid_task(void); + raw_hid_task(); +#endif + +#ifdef CONSOLE_ENABLE + void console_task(void); + console_task(); +#endif #ifdef QUANTUM_PAINTER_ENABLE // Run Quantum Painter task diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c index 76a37ae538..360e6b4b04 100644 --- a/tmk_core/protocol/chibios/chibios.c +++ b/tmk_core/protocol/chibios/chibios.c @@ -70,13 +70,6 @@ host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_nkro, send_mo void virtser_task(void); #endif -#ifdef RAW_ENABLE -void raw_hid_task(void); -#endif - -#ifdef CONSOLE_ENABLE -void console_task(void); -#endif #ifdef MIDI_ENABLE void midi_ep_task(void); #endif @@ -209,17 +202,11 @@ void protocol_pre_task(void) { } void protocol_post_task(void) { -#ifdef CONSOLE_ENABLE - console_task(); -#endif #ifdef MIDI_ENABLE midi_ep_task(); #endif #ifdef VIRTSER_ENABLE virtser_task(); -#endif -#ifdef RAW_ENABLE - raw_hid_task(); #endif usb_idle_task(); } diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 22cc0db8ce..d6f0c69b6b 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -151,7 +151,7 @@ __attribute__((weak)) void raw_hid_receive(uint8_t *data, uint8_t length) { * * FIXME: Needs doc */ -static void raw_hid_task(void) { +void raw_hid_task(void) { // Create a temporary buffer to hold the read in data from the host uint8_t data[RAW_EPSIZE]; bool data_read = false; @@ -865,10 +865,6 @@ void protocol_post_task(void) { CDC_Device_USBTask(&cdc_device); #endif -#ifdef RAW_ENABLE - raw_hid_task(); -#endif - #if !defined(INTERRUPT_CONTROL_ENDPOINT) USB_USBTask(); #endif diff --git a/tmk_core/protocol/vusb/protocol.c b/tmk_core/protocol/vusb/protocol.c index 6178d48ef2..41ccf451fd 100644 --- a/tmk_core/protocol/vusb/protocol.c +++ b/tmk_core/protocol/vusb/protocol.c @@ -31,14 +31,6 @@ # include "sleep_led.h" #endif -#ifdef CONSOLE_ENABLE -void console_task(void); -#endif - -#ifdef RAW_ENABLE -void raw_hid_task(void); -#endif - /* This is from main.c of USBaspLoader */ static void initForUsbConnectivity(void) { uint8_t i = 0; @@ -136,7 +128,7 @@ static inline bool should_do_suspend(void) { return vusb_suspended; } -void protocol_task(void) { +void protocol_pre_task(void) { #if !defined(NO_USB_STARTUP_CHECK) if (should_do_suspend()) { dprintln("suspending keyboard"); @@ -159,7 +151,9 @@ void protocol_task(void) { vusb_wakeup(); } #endif +} +void protocol_keyboard_task(void) { usbPoll(); // TODO: configuration process is inconsistent. it sometime fails. @@ -167,20 +161,8 @@ void protocol_task(void) { if (usbConfiguration && usbInterruptIsReady()) { keyboard_task(); } +} -#ifdef RAW_ENABLE - usbPoll(); - - if (usbConfiguration && usbInterruptIsReady4()) { - raw_hid_task(); - } -#endif - -#ifdef CONSOLE_ENABLE - usbPoll(); - - if (usbConfiguration && usbInterruptIsReady3()) { - console_task(); - } -#endif +void protocol_post_task(void) { + // do nothing } diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index cfeeed3712..c8ab494253 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -162,6 +162,12 @@ __attribute__((weak)) void raw_hid_receive(uint8_t *data, uint8_t length) { } void raw_hid_task(void) { + usbPoll(); + + if (!usbConfiguration || !usbInterruptIsReady4()) { + return; + } + if (raw_output_received_bytes == RAW_BUFFER_SIZE) { raw_hid_receive(raw_output_buffer, RAW_BUFFER_SIZE); raw_output_received_bytes = 0; @@ -182,7 +188,9 @@ int8_t sendchar(uint8_t c) { } void console_task(void) { - if (!usbConfiguration) { + usbPoll(); + + if (!usbConfiguration || !usbInterruptIsReady3()) { return; } -- cgit v1.2.3 From 42a725e355e64d170fc42738ddbb1ed1128892e9 Mon Sep 17 00:00:00 2001 From: Robin Carlier <57142648+robin-carlier@users.noreply.github.com> Date: Fri, 29 Mar 2024 04:40:41 +0100 Subject: Remove midi_ep_task from ChibiOS (#23162) Co-authored-by: Joel Challis --- tmk_core/protocol/chibios/chibios.c | 7 ------- tmk_core/protocol/chibios/usb_main.c | 9 --------- 2 files changed, 16 deletions(-) (limited to 'tmk_core/protocol/chibios/chibios.c') diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c index 360e6b4b04..a02097785f 100644 --- a/tmk_core/protocol/chibios/chibios.c +++ b/tmk_core/protocol/chibios/chibios.c @@ -70,10 +70,6 @@ host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_nkro, send_mo void virtser_task(void); #endif -#ifdef MIDI_ENABLE -void midi_ep_task(void); -#endif - /* TESTING * Amber LED blinker thread, times are in milliseconds. */ @@ -202,9 +198,6 @@ void protocol_pre_task(void) { } void protocol_post_task(void) { -#ifdef MIDI_ENABLE - midi_ep_task(); -#endif #ifdef VIRTSER_ENABLE virtser_task(); #endif diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index ced5fd4fc2..2024a3bc7f 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -561,15 +561,6 @@ bool recv_midi_packet(MIDI_EventPacket_t *const event) { return receive_report(USB_ENDPOINT_OUT_MIDI, (uint8_t *)event, sizeof(MIDI_EventPacket_t)); } -void midi_ep_task(void) { - uint8_t buffer[MIDI_STREAM_EPSIZE]; - while (receive_report(USB_ENDPOINT_OUT_MIDI, buffer, sizeof(buffer))) { - MIDI_EventPacket_t event; - // TODO: this seems totally wrong? The midi task will never see any - // packets if we consume them here - recv_midi_packet(&event); - } -} #endif #ifdef VIRTSER_ENABLE -- cgit v1.2.3 From 16cca527a6b46c2aa365428d7d1e214509068c4a Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 24 Apr 2024 19:33:52 +0100 Subject: Fix WAIT_FOR_USB handling (#23598) --- data/mappings/info_rules.hjson | 2 +- data/schemas/keyboard.jsonschema | 2 +- docs/config_options.md | 2 +- docs/ja/config_options.md | 2 +- docs/reference_info_json.md | 2 +- keyboards/converter/hp_46010a/keyboard.json | 3 ++- keyboards/converter/hp_46010a/rules.mk | 1 - keyboards/geekboards/macropad_v2/config.h | 2 -- keyboards/geekboards/macropad_v2/keyboard.json | 3 ++- keyboards/ristretto/keyboard.json | 3 ++- keyboards/ristretto/rules.mk | 1 - tmk_core/protocol.mk | 4 ++++ tmk_core/protocol/chibios/chibios.c | 7 ++++++- tmk_core/protocol/lufa/lufa.c | 7 ++++++- 14 files changed, 27 insertions(+), 14 deletions(-) delete mode 100644 keyboards/ristretto/rules.mk (limited to 'tmk_core/protocol/chibios/chibios.c') diff --git a/data/mappings/info_rules.hjson b/data/mappings/info_rules.hjson index 35e2e8dfc0..5d08be2fc1 100644 --- a/data/mappings/info_rules.hjson +++ b/data/mappings/info_rules.hjson @@ -44,7 +44,7 @@ "SPLIT_TRANSPORT": {"info_key": "split.transport.protocol", "to_c": false}, "STENO_ENABLE": {"info_key": "stenography.enabled", "value_type": "bool"}, "STENO_PROTOCOL": {"info_key": "stenography.protocol"}, - "WAIT_FOR_USB": {"info_key": "usb.wait_for", "value_type": "bool"}, + "USB_WAIT_FOR_ENUMERATION": {"info_key": "usb.wait_for_enumeration", "value_type": "bool"}, "WEAR_LEVELING_DRIVER": {"info_key": "eeprom.wear_leveling.driver"}, "WS2812_DRIVER": {"info_key": "ws2812.driver"}, diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index f3116fd271..24f7fec9ab 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -894,7 +894,7 @@ } }, "suspend_wakeup_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "wait_for": {"type": "boolean"} + "wait_for_enumeration": {"type": "boolean"} } }, "qmk": { diff --git a/docs/config_options.md b/docs/config_options.md index 045d9c0747..fca80e54fd 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -446,7 +446,7 @@ Use these to enable or disable building certain features. The more you have enab * Allows replacing the standard matrix scanning routine with a custom one. * `DEBOUNCE_TYPE` * Allows replacing the standard key debouncing routine with an alternative or custom one. -* `WAIT_FOR_USB` +* `USB_WAIT_FOR_ENUMERATION` * Forces the keyboard to wait for a USB connection to be established before it starts up * `NO_USB_STARTUP_CHECK` * Disables usb suspend check after keyboard startup. Usually the keyboard waits for the host to wake it up before any tasks are performed. This is useful for split keyboards as one half will not get a wakeup call but must send commands to the master. diff --git a/docs/ja/config_options.md b/docs/ja/config_options.md index a349081d6a..6cc1b6bfcd 100644 --- a/docs/ja/config_options.md +++ b/docs/ja/config_options.md @@ -378,7 +378,7 @@ QMK での全ての利用可能な設定にはデフォルトがあります。 * 標準マトリックス走査ルーチンを独自のものに置き換えることができます。 * `DEBOUNCE_TYPE` * 標準キーデバウンスルーチンを代替または独自のものに置き換えることができます。 -* `WAIT_FOR_USB` +* `USB_WAIT_FOR_ENUMERATION` * キーボードが起動する前に、USB 接続が確立されるのをキーボードに待機させます * `NO_USB_STARTUP_CHECK` * キーボードの起動後の usb サスペンドチェックを無効にします。通常、キーボードはタスクが実行される前にホストがウェイク アップするのを待ちます。分割キーボードは半分はウェイクアップコールを取得できませんが、マスタにコマンドを送信する必要があるため、役に立ちます。 diff --git a/docs/reference_info_json.md b/docs/reference_info_json.md index e6bc34e79e..6f0b84c414 100644 --- a/docs/reference_info_json.md +++ b/docs/reference_info_json.md @@ -833,7 +833,7 @@ Configures the [Stenography](feature_stenography.md) feature. * `suspend_wakeup_delay` * The amount of time to wait after sending a wakeup packet, in milliseconds. * Default: `0` (disabled) - * `wait_for` + * `wait_for_enumeration` * Force the keyboard to wait for USB enumeration before starting up. * Default: `false` diff --git a/keyboards/converter/hp_46010a/keyboard.json b/keyboards/converter/hp_46010a/keyboard.json index 0296bda5e9..4519306981 100644 --- a/keyboards/converter/hp_46010a/keyboard.json +++ b/keyboards/converter/hp_46010a/keyboard.json @@ -6,7 +6,8 @@ "usb": { "vid": "0xFEED", "pid": "0x6060", - "device_version": "0.0.1" + "device_version": "0.0.1", + "wait_for_enumeration": true }, "processor": "atmega32u4", "bootloader": "halfkay", diff --git a/keyboards/converter/hp_46010a/rules.mk b/keyboards/converter/hp_46010a/rules.mk index 3c6124d20a..857395fb40 100644 --- a/keyboards/converter/hp_46010a/rules.mk +++ b/keyboards/converter/hp_46010a/rules.mk @@ -1,4 +1,3 @@ -WAIT_FOR_USB = yes CUSTOM_MATRIX = yes SRC = matrix.c diff --git a/keyboards/geekboards/macropad_v2/config.h b/keyboards/geekboards/macropad_v2/config.h index dca98f0c95..e452c886f6 100644 --- a/keyboards/geekboards/macropad_v2/config.h +++ b/keyboards/geekboards/macropad_v2/config.h @@ -21,5 +21,3 @@ #define WS2812_PWM_PAL_MODE 1 #define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3 #define WS2812_PWM_DMA_CHANNEL 3 - -#define WAIT_FOR_USB diff --git a/keyboards/geekboards/macropad_v2/keyboard.json b/keyboards/geekboards/macropad_v2/keyboard.json index 035a83c157..54d779570a 100644 --- a/keyboards/geekboards/macropad_v2/keyboard.json +++ b/keyboards/geekboards/macropad_v2/keyboard.json @@ -6,7 +6,8 @@ "usb": { "vid": "0x0483", "pid": "0xA372", - "device_version": "0.0.2" + "device_version": "0.0.2", + "wait_for_enumeration": true }, "qmk": { "tap_keycode_delay": 10 diff --git a/keyboards/ristretto/keyboard.json b/keyboards/ristretto/keyboard.json index b28f3c1dc1..e8e812b7d2 100644 --- a/keyboards/ristretto/keyboard.json +++ b/keyboards/ristretto/keyboard.json @@ -6,7 +6,8 @@ "usb": { "vid": "0x666B", "pid": "0x7273", - "device_version": "0.0.1" + "device_version": "0.0.1", + "wait_for_enumeration": true }, "features": { "bootmagic": false, diff --git a/keyboards/ristretto/rules.mk b/keyboards/ristretto/rules.mk deleted file mode 100644 index 908e5e972e..0000000000 --- a/keyboards/ristretto/rules.mk +++ /dev/null @@ -1 +0,0 @@ -WAIT_FOR_USB = yes diff --git a/tmk_core/protocol.mk b/tmk_core/protocol.mk index fd5342d637..796b4e8787 100644 --- a/tmk_core/protocol.mk +++ b/tmk_core/protocol.mk @@ -66,6 +66,10 @@ ifeq ($(strip $(NO_USB_STARTUP_CHECK)), yes) OPT_DEFS += -DNO_USB_STARTUP_CHECK endif +ifeq ($(strip $(USB_WAIT_FOR_ENUMERATION)), yes) + OPT_DEFS += -DUSB_WAIT_FOR_ENUMERATION +endif + ifeq ($(strip $(JOYSTICK_SHARED_EP)), yes) OPT_DEFS += -DJOYSTICK_SHARED_EP SHARED_EP_ENABLE = yes diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c index a02097785f..a249af8d38 100644 --- a/tmk_core/protocol/chibios/chibios.c +++ b/tmk_core/protocol/chibios/chibios.c @@ -51,6 +51,11 @@ #define USB_GETSTATUS_REMOTE_WAKEUP_ENABLED (2U) +#ifdef WAIT_FOR_USB +// TODO: Remove backwards compatibility with old define +# define USB_WAIT_FOR_ENUMERATION +#endif + /* ------------------------- * TMK host driver defs * ------------------------- @@ -143,7 +148,7 @@ void protocol_pre_init(void) { /* Wait until USB is active */ while (true) { -#if defined(WAIT_FOR_USB) +#if defined(USB_WAIT_FOR_ENUMERATION) if (USB_DRIVER.state == USB_ACTIVE) { driver = &chibios_driver; break; diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index d6f0c69b6b..2142b04460 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -67,6 +67,11 @@ # include "raw_hid.h" #endif +#ifdef WAIT_FOR_USB +// TODO: Remove backwards compatibility with old define +# define USB_WAIT_FOR_ENUMERATION +#endif + uint8_t keyboard_idle = 0; /* 0: Boot Protocol, 1: Report Protocol(default) */ uint8_t keyboard_protocol = 1; @@ -807,7 +812,7 @@ void protocol_pre_init(void) { /* wait for USB startup & debug output */ -#ifdef WAIT_FOR_USB +#ifdef USB_WAIT_FOR_ENUMERATION while (USB_DeviceState != DEVICE_STATE_Configured) { # if defined(INTERRUPT_CONTROL_ENDPOINT) ; -- cgit v1.2.3