summaryrefslogtreecommitdiff
path: root/shared
diff options
context:
space:
mode:
Diffstat (limited to 'shared')
-rw-r--r--shared/tinyusb/mp_usbd.c23
-rw-r--r--shared/tinyusb/mp_usbd.h3
2 files changed, 23 insertions, 3 deletions
diff --git a/shared/tinyusb/mp_usbd.c b/shared/tinyusb/mp_usbd.c
index ea1de674b..87c10310f 100644
--- a/shared/tinyusb/mp_usbd.c
+++ b/shared/tinyusb/mp_usbd.c
@@ -27,17 +27,40 @@
#include <stdlib.h>
#include "py/mpconfig.h"
+#include "py/runtime.h"
#if MICROPY_HW_ENABLE_USBDEV
#ifndef NO_QSTR
#include "tusb.h" // TinyUSB is not available when running the string preprocessor
+#include "device/dcd.h"
#include "device/usbd.h"
#include "device/usbd_pvt.h"
#endif
+// Legacy TinyUSB task function wrapper, called by some ports from the interpreter hook
void usbd_task(void) {
tud_task_ext(0, false);
}
+// TinyUSB task function wrapper, as scheduled from the USB IRQ
+static void mp_usbd_task(mp_sched_node_t *node);
+
+extern void __real_dcd_event_handler(dcd_event_t const *event, bool in_isr);
+
+// If -Wl,--wrap=dcd_event_handler is passed to the linker, then this wrapper
+// will be called and allows MicroPython to schedule the TinyUSB task when
+// dcd_event_handler() is called from an ISR.
+TU_ATTR_FAST_FUNC void __wrap_dcd_event_handler(dcd_event_t const *event, bool in_isr) {
+ static mp_sched_node_t usbd_task_node;
+
+ __real_dcd_event_handler(event, in_isr);
+ mp_sched_schedule_node(&usbd_task_node, mp_usbd_task);
+}
+
+static void mp_usbd_task(mp_sched_node_t *node) {
+ (void)node;
+ tud_task_ext(0, false);
+}
+
#endif
diff --git a/shared/tinyusb/mp_usbd.h b/shared/tinyusb/mp_usbd.h
index 3a93b929c..2e4feaca9 100644
--- a/shared/tinyusb/mp_usbd.h
+++ b/shared/tinyusb/mp_usbd.h
@@ -29,9 +29,6 @@
#include "py/obj.h"
-// Call instead of tud_task()
-void mp_usbd_task(void);
-
// Function to be implemented in port code.
// Can write a string up to MICROPY_HW_USB_DESC_STR_MAX characters long, plus terminating byte.
extern void mp_usbd_port_get_serial_number(char *buf);