diff options
| author | hathach <[email protected]> | 2021-09-13 11:52:16 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2021-09-13 11:52:16 +0700 |
| commit | 6feda5ae8f7de26c46402c9b7acad43fbf071175 (patch) | |
| tree | a1ce0accfe6bab9541389c394831ec3a931e629f /src | |
| parent | 501378898970adfe5f84885c12059c3ae8ee8b08 (diff) | |
| parent | 22571ec98ef89a76239b27c86cbdac3db3c42f09 (diff) | |
Merge branch 'nuc_wkp' of https://github.com/HiFiPhile/tinyusb into HiFiPhile-nuc_wkp
Diffstat (limited to 'src')
| -rw-r--r-- | src/portable/nuvoton/nuc121/dcd_nuc121.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/portable/nuvoton/nuc121/dcd_nuc121.c b/src/portable/nuvoton/nuc121/dcd_nuc121.c index 7edafe5d3..5dfc77bb7 100644 --- a/src/portable/nuvoton/nuc121/dcd_nuc121.c +++ b/src/portable/nuvoton/nuc121/dcd_nuc121.c @@ -252,10 +252,23 @@ void dcd_set_address(uint8_t rhport, uint8_t dev_addr) // do it at dcd_edpt0_status_complete() } +static void remote_wakeup_delay(void) +{ + // try to delay for 1 ms + uint32_t count = SystemCoreClock / 1000; + while(count--) __NOP(); +} + void dcd_remote_wakeup(uint8_t rhport) { (void) rhport; - USBD->ATTR = USBD_ATTR_RWAKEUP_Msk; + // Enable PHY before sending Resume('K') state + USBD->ATTR |= USBD_ATTR_PHYEN_Msk; + USBD->ATTR |= USBD_ATTR_RWAKEUP_Msk; + + // Per specs: remote wakeup signal bit must be clear within 1-15ms + remote_wakeup_delay(); + USBD->ATTR &=~USBD_ATTR_RWAKEUP_Msk; } bool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * p_endpoint_desc) @@ -368,13 +381,15 @@ void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) (void) rhport; USBD_EP_T *ep = ep_entry(ep_addr, false); ep->CFG |= USBD_CFG_CSTALL_Msk; + ep->CFG &=~USBD_CFG_DSQSYNC_Msk; } void dcd_int_handler(uint8_t rhport) { (void) rhport; - uint32_t status = USBD->INTSTS; + // Mask non-enabled irqs, ex. SOF + uint32_t status = USBD->INTSTS & (enabled_irqs | 0xffffff00); #ifdef SUPPORT_LPM uint32_t state = USBD->ATTR & 0x300f; #else |
