diff --git a/keyboards/handwired/onekey/keymaps/virtser/keymap.c b/keyboards/handwired/onekey/keymaps/virtser/keymap.c new file mode 100644 index 00000000000..68f891511f6 --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/virtser/keymap.c @@ -0,0 +1,40 @@ +// Copyright 2026 QMK +// SPDX-License-Identifier: GPL-2.0-or-later +#include QMK_KEYBOARD_H +#include "virtser.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + LAYOUT_ortho_1x1(KC_A) +}; + +static uint32_t counter = 0; + +void virtser_recv(const uint8_t ch) { + static const char *lut = "0123456789ABCDEF"; + + counter++; + + virtser_send(lut[(ch & 0xF0) >> 4]); + virtser_send(lut[ch & 0xF]); +} + +#ifdef CONSOLE_ENABLE + +void keyboard_post_init_user(void) { + // Customise these values to desired behaviour + debug_enable = true; + // debug_matrix=true; + // debug_keyboard=true; + // debug_mouse=true; +} + +void housekeeping_task_user(void) { + static uint32_t last = 0; + if (timer_elapsed32(last) > 1000) { + uprintf("recv: %ld!\n", counter); + + last = timer_read32(); + } +} + +#endif diff --git a/keyboards/handwired/onekey/keymaps/virtser/keymap.json b/keyboards/handwired/onekey/keymaps/virtser/keymap.json new file mode 100644 index 00000000000..766633055e9 --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/virtser/keymap.json @@ -0,0 +1,12 @@ +{ + "config": { + "usb": { + "shared_endpoint": { + "keyboard": true + } + }, + "features": { + "virtser": true + } + } +} diff --git a/tmk_core/protocol/chibios/usb_driver.c b/tmk_core/protocol/chibios/usb_driver.c index 8b471cba563..15904155a78 100644 --- a/tmk_core/protocol/chibios/usb_driver.c +++ b/tmk_core/protocol/chibios/usb_driver.c @@ -320,13 +320,13 @@ bool usb_endpoint_in_is_inactive(usb_endpoint_in_t *endpoint) { return inactive; } -bool usb_endpoint_out_receive(usb_endpoint_out_t *endpoint, uint8_t *data, size_t size, sysinterval_t timeout) { +size_t usb_endpoint_out_receive_bytes(usb_endpoint_out_t *endpoint, uint8_t *data, size_t size, sysinterval_t timeout) { osalDbgCheck((endpoint != NULL) && (data != NULL) && (size > 0U)); osalSysLock(); if (usbGetDriverStateI(endpoint->config.usbp) != USB_ACTIVE) { osalSysUnlock(); - return false; + return 0; } if (endpoint->timed_out && timeout != TIME_INFINITE) { @@ -337,5 +337,9 @@ bool usb_endpoint_out_receive(usb_endpoint_out_t *endpoint, uint8_t *data, size_ const size_t received = ibqReadTimeout(&endpoint->ibqueue, data, size, timeout); endpoint->timed_out = received == 0; - return received == size; + return received; +} + +bool usb_endpoint_out_receive(usb_endpoint_out_t *endpoint, uint8_t *data, size_t size, sysinterval_t timeout) { + return usb_endpoint_out_receive_bytes(endpoint, data, size, timeout) == size; } diff --git a/tmk_core/protocol/chibios/usb_driver.h b/tmk_core/protocol/chibios/usb_driver.h index 26787e1eba0..3ddc4d9dba6 100644 --- a/tmk_core/protocol/chibios/usb_driver.h +++ b/tmk_core/protocol/chibios/usb_driver.h @@ -197,7 +197,8 @@ void usb_endpoint_out_init(usb_endpoint_out_t *endpoint); void usb_endpoint_out_start(usb_endpoint_out_t *endpoint); void usb_endpoint_out_stop(usb_endpoint_out_t *endpoint); -bool usb_endpoint_out_receive(usb_endpoint_out_t *endpoint, uint8_t *data, size_t size, sysinterval_t timeout); +bool usb_endpoint_out_receive(usb_endpoint_out_t *endpoint, uint8_t *data, size_t size, sysinterval_t timeout); +size_t usb_endpoint_out_receive_bytes(usb_endpoint_out_t *endpoint, uint8_t *data, size_t size, sysinterval_t timeout); void usb_endpoint_out_suspend_cb(usb_endpoint_out_t *endpoint); void usb_endpoint_out_wakeup_cb(usb_endpoint_out_t *endpoint); diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index f1b977c17f7..5939e3273b9 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -584,8 +584,9 @@ __attribute__((weak)) void virtser_recv(uint8_t c) { void virtser_task(void) { uint8_t buffer[CDC_EPSIZE]; - while (receive_report(USB_ENDPOINT_OUT_CDC_DATA, buffer, sizeof(buffer))) { - for (int i = 0; i < sizeof(buffer); i++) { + size_t received; + while ((received = usb_endpoint_out_receive_bytes(&usb_endpoints_out[USB_ENDPOINT_OUT_CDC_DATA], buffer, sizeof(buffer), TIME_IMMEDIATE)) > 0) { + for (size_t i = 0; i < received; i++) { virtser_recv(buffer[i]); } }