Просмотр исходного кода

Merge pull request #273 from majbthrd/nucbusreset

nuc121: survive USB bus reset
Ha Thach 6 лет назад
Родитель
Сommit
4daeb38185
1 измененных файлов с 33 добавлено и 28 удалено
  1. 33 28
      src/portable/nuvoton/nuc121/dcd_nuc121.c

+ 33 - 28
src/portable/nuvoton/nuc121/dcd_nuc121.c

@@ -148,30 +148,15 @@ static void dcd_in_xfer(struct xfer_ctl_t *xfer, USBD_EP_T *ep)
   ep->MXPLD = bytes_now;
 }
 
-/* centralized location for USBD interrupt enable bit mask */
-static const uint32_t enabled_irqs = USBD_INTSTS_VBDETIF_Msk | USBD_INTSTS_BUSIF_Msk | USBD_INTSTS_SETUP_Msk | USBD_INTSTS_USBIF_Msk | USBD_INTSTS_SOFIF_Msk;
-
-/*
-  NUC121/NUC125/NUC126 TinyUSB API driver implementation
-*/
-
-void dcd_init(uint8_t rhport)
+/* called by dcd_init() as well as by the ISR during a USB bus reset */
+static void bus_reset(void)
 {
-  (void) rhport;
-
-#ifdef SUPPORT_LPM
-  USBD->ATTR = 0x7D0 | USBD_LPMACK;
-#else
-  USBD->ATTR = 0x7D0;
-#endif
-
-  usb_detach();
-
   USBD->STBUFSEG = PERIPH_SETUP_BUF_BASE;
 
   for (enum ep_enum ep_index = PERIPH_EP0; ep_index < PERIPH_MAX_EP; ep_index++)
   {
-    USBD->EP[ep_index].CFGP &= ~USBD_CFG_STATE_Msk;
+    USBD->EP[ep_index].CFG = 0;
+    USBD->EP[ep_index].CFGP = 0;
   }
 
   /* allocate the default EP0 endpoints */
@@ -187,6 +172,34 @@ void dcd_init(uint8_t rhport)
   /* USB RAM beyond what we've allocated above is available to the user */
   bufseg_addr = PERIPH_EP2_BUF_BASE;
 
+  /* Reset USB device address */
+  USBD->FADDR = 0;
+
+  /* reset EP0_IN flag */
+  active_ep0_xfer = false;
+}
+
+/* centralized location for USBD interrupt enable bit mask */
+static const uint32_t enabled_irqs = USBD_INTSTS_VBDETIF_Msk | USBD_INTSTS_BUSIF_Msk | USBD_INTSTS_SETUP_Msk | USBD_INTSTS_USBIF_Msk | USBD_INTSTS_SOFIF_Msk;
+
+/*
+  NUC121/NUC125/NUC126 TinyUSB API driver implementation
+*/
+
+void dcd_init(uint8_t rhport)
+{
+  (void) rhport;
+
+#ifdef SUPPORT_LPM
+  USBD->ATTR = 0x7D0 | USBD_LPMACK;
+#else
+  USBD->ATTR = 0x7D0;
+#endif
+
+  usb_detach();
+
+  bus_reset();
+
   usb_attach();
 
   USBD->INTSTS = enabled_irqs;
@@ -329,15 +342,7 @@ void USBD_IRQHandler(void)
       /* USB bus reset */
       USBD->ATTR |= USBD_ATTR_USBEN_Msk | USBD_ATTR_PHYEN_Msk;
 
-      /* Reset all endpoints to DATA0 */
-      for(enum ep_enum ep_index = PERIPH_EP0; ep_index < PERIPH_MAX_EP; ep_index++)
-        USBD->EP[ep_index].CFG &= ~USBD_CFG_DSQSYNC_Msk;
-
-      /* Reset USB device address */
-      USBD->FADDR = 0;
-
-      /* reset EP0_IN flag */
-      active_ep0_xfer = false;
+      bus_reset();
 
       dcd_event_bus_signal(0, DCD_EVENT_BUS_RESET, true);
     }