mirror of
https://github.com/hathach/tinyusb.git
synced 2025-02-21 21:41:09 +00:00
Merge pull request #1087 from HiFiPhile/nuc_wkp
NUC126: fix remote_wakeup
This commit is contained in:
commit
6d3fb7eb98
@ -200,11 +200,10 @@ static void bus_reset(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* centralized location for USBD interrupt enable bit mask */
|
/* centralized location for USBD interrupt enable bit mask */
|
||||||
#if USE_SOF
|
enum {
|
||||||
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;
|
ENABLED_IRQS = USBD_INTSTS_VBDETIF_Msk | USBD_INTSTS_BUSIF_Msk | USBD_INTSTS_SETUP_Msk |
|
||||||
#else
|
USBD_INTSTS_USBIF_Msk | (USE_SOF ? USBD_INTSTS_SOFIF_Msk : 0)
|
||||||
static const uint32_t enabled_irqs = USBD_INTSTS_VBDETIF_Msk | USBD_INTSTS_BUSIF_Msk | USBD_INTSTS_SETUP_Msk | USBD_INTSTS_USBIF_Msk;
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
NUC121/NUC125/NUC126 TinyUSB API driver implementation
|
NUC121/NUC125/NUC126 TinyUSB API driver implementation
|
||||||
@ -226,8 +225,8 @@ void dcd_init(uint8_t rhport)
|
|||||||
|
|
||||||
usb_attach();
|
usb_attach();
|
||||||
|
|
||||||
USBD->INTSTS = enabled_irqs;
|
USBD->INTSTS = ENABLED_IRQS;
|
||||||
USBD->INTEN = enabled_irqs;
|
USBD->INTEN = ENABLED_IRQS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dcd_int_enable(uint8_t rhport)
|
void dcd_int_enable(uint8_t rhport)
|
||||||
@ -252,10 +251,23 @@ void dcd_set_address(uint8_t rhport, uint8_t dev_addr)
|
|||||||
// do it at dcd_edpt0_status_complete()
|
// 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 dcd_remote_wakeup(uint8_t rhport)
|
||||||
{
|
{
|
||||||
(void) 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)
|
bool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * p_endpoint_desc)
|
||||||
@ -367,14 +379,16 @@ void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
|
|||||||
{
|
{
|
||||||
(void) rhport;
|
(void) rhport;
|
||||||
USBD_EP_T *ep = ep_entry(ep_addr, false);
|
USBD_EP_T *ep = ep_entry(ep_addr, false);
|
||||||
ep->CFG |= USBD_CFG_CSTALL_Msk;
|
ep->CFG = (ep->CFG & ~USBD_CFG_DSQSYNC_Msk) | USBD_CFG_CSTALL_Msk;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dcd_int_handler(uint8_t rhport)
|
void dcd_int_handler(uint8_t rhport)
|
||||||
{
|
{
|
||||||
(void) 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
|
#ifdef SUPPORT_LPM
|
||||||
uint32_t state = USBD->ATTR & 0x300f;
|
uint32_t state = USBD->ATTR & 0x300f;
|
||||||
#else
|
#else
|
||||||
@ -505,7 +519,7 @@ void dcd_int_handler(uint8_t rhport)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* acknowledge all interrupts */
|
/* acknowledge all interrupts */
|
||||||
USBD->INTSTS = status & enabled_irqs;
|
USBD->INTSTS = status & ENABLED_IRQS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invoked when a control transfer's status stage is complete.
|
// Invoked when a control transfer's status stage is complete.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user