Fix ChibiOS virtual serial short packet receive (#26356)

* Core: fix ChibiOS virtual serial short packet receive

Signed-off-by: Giridhar <giridharpavan593@gmail.com>

* Add handwired/onekey virtser test keymap

---------

Signed-off-by: Giridhar <giridharpavan593@gmail.com>
Co-authored-by: Giridhar <giridharpavan593@gmail.com>
Co-authored-by: zvecr <git@zvecr.com>
This commit is contained in:
Giridhar
2026-08-12 23:52:49 -07:00
committed by GitHub
co-authored by Giridhar zvecr
parent d7ad3bf8aa
commit bc744bbcaa
5 changed files with 64 additions and 6 deletions
+7 -3
View File
@@ -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;
}
+2 -1
View File
@@ -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);
+3 -2
View File
@@ -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]);
}
}