From 4b4c63f797e739d47320f8ba9990dc25f93b62c3 Mon Sep 17 00:00:00 2001 From: Koen Zandberg Date: Sun, 9 Jun 2019 21:50:30 +0200 Subject: [PATCH] usbus: Allow setting USB thread flags outside IRQ --- sys/usb/usbus/usbus.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/sys/usb/usbus/usbus.c b/sys/usb/usbus/usbus.c index 830b8fa156..321d526589 100644 --- a/sys/usb/usbus/usbus.c +++ b/sys/usb/usbus/usbus.c @@ -168,6 +168,21 @@ static inline uint32_t _get_ep_bitflag(usbdev_ep_t *ep) : 0x00) + ep->num); } +static void _set_ep_event(usbus_t *usbus, usbdev_ep_t *ep) +{ + if (irq_is_in()) { + usbus->ep_events |= _get_ep_bitflag(ep); + } + else { + unsigned state = irq_disable(); + usbus->ep_events |= _get_ep_bitflag(ep); + irq_restore(state); + } + + thread_flags_set((thread_t *)thread_get(usbus->pid), + USBUS_THREAD_FLAG_USBDEV_EP); +} + static uint32_t _get_and_reset_ep_events(usbus_t *usbus) { unsigned state = irq_disable(); @@ -316,16 +331,14 @@ static void _event_cb(usbdev_t *usbdev, usbdev_event_t event) } } + /* USB generic endpoint callback */ static void _event_ep_cb(usbdev_ep_t *ep, usbdev_event_t event) { usbus_t *usbus = (usbus_t *)ep->dev->context; if (event == USBDEV_EVENT_ESR) { - assert(irq_is_in()); - usbus->ep_events |= _get_ep_bitflag(ep); - thread_flags_set((thread_t *)thread_get(usbus->pid), - USBUS_THREAD_FLAG_USBDEV_EP); + _set_ep_event(usbus, ep); } else { usbus_handler_t *handler = _ep_to_handler(usbus, ep);