From b28cc6ddb11ef233b6e6ee25b4a305b4b76cc03c Mon Sep 17 00:00:00 2001 From: hathach Date: Sat, 30 Mar 2019 14:47:11 +0700 Subject: [PATCH] added dcd_remote_wakeup() stub for all ports --- docs/porting.md | 3 + src/device/usbd.c | 2 +- src/device/usbd.h | 11 +++- src/portable/microchip/samd21/dcd_samd21.c | 34 ++++++++++- src/portable/microchip/samd51/dcd_samd51.c | 5 ++ src/portable/nordic/nrf5x/dcd_nrf5x.c | 5 ++ .../nxp/lpc11_13_15/dcd_lpc11_13_15.c | 59 ++++++++++--------- src/portable/nxp/lpc17_40/dcd_lpc17_40.c | 6 +- src/portable/nxp/lpc18_43/dcd_lpc18_43.c | 5 ++ src/portable/st/stm32f3/dcd_stm32f3.c | 8 +++ src/portable/st/stm32f4/dcd_stm32f4.c | 5 ++ 11 files changed, 109 insertions(+), 34 deletions(-) diff --git a/docs/porting.md b/docs/porting.md index 5f1df0d7..5a97b3fb 100644 --- a/docs/porting.md +++ b/docs/porting.md @@ -76,6 +76,9 @@ If your peripheral automatically changes address during enumeration (like the nr ##### dcd_set_config Called when the device received SET_CONFIG request, you can leave this empty if your peripheral does not require any specific action. +##### dcd_remote_wakeup +Called to remote wake up host when suspended (e.g hid keyboard) + #### Special events You must let TinyUSB know when certain events occur so that it can continue its work. There are a few methods you can call to queue events for TinyUSB to process. diff --git a/src/device/usbd.c b/src/device/usbd.c index f90c6b4d..dde98939 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -189,7 +189,7 @@ void tud_set_self_powered(bool self_powered) bool tud_remote_wakeup(void) { // only wake up host if this feature is enabled - if (_usbd_dev.remote_wakeup_en ) dcd_remote_wakeup(TUD_OPT_RHPORT); + if (_usbd_dev.suspended && _usbd_dev.remote_wakeup_en ) dcd_remote_wakeup(TUD_OPT_RHPORT); return _usbd_dev.remote_wakeup_en; } diff --git a/src/device/usbd.h b/src/device/usbd.h index ebf16682..27bfe305 100644 --- a/src/device/usbd.h +++ b/src/device/usbd.h @@ -59,12 +59,19 @@ extern tud_desc_set_t tud_desc_set; //--------------------------------------------------------------------+ // Application API //--------------------------------------------------------------------+ -bool tud_mounted(void); + +// Task function should be called in main/rtos loop void tud_task (void); -bool tud_remote_wakeup(void); +// Check if device is connected and configured +bool tud_mounted(void); + +// Tell stack that device is self or bus powered (default = bus) void tud_set_self_powered(bool self_powered); +// Remote wake up host, only if suspended and enabled by host +bool tud_remote_wakeup(void); + //--------------------------------------------------------------------+ // Application Callbacks (WEAK is optional) //--------------------------------------------------------------------+ diff --git a/src/portable/microchip/samd21/dcd_samd21.c b/src/portable/microchip/samd21/dcd_samd21.c index a340c888..39d59486 100644 --- a/src/portable/microchip/samd21/dcd_samd21.c +++ b/src/portable/microchip/samd21/dcd_samd21.c @@ -110,6 +110,18 @@ void dcd_set_config (uint8_t rhport, uint8_t config_num) (void) rhport; (void) config_num; // Nothing to do + +#if 0 + // Enable suspend to detect disconnection + // TODO need to distinguish Suspend vs Disconnect + USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTENCLR_SUSPEND; + USB->DEVICE.INTENSET.reg |= USB_DEVICE_INTENSET_SUSPEND; +#endif +} + +void dcd_remote_wakeup(uint8_t rhport) +{ + (void) rhport; } /*------------------------------------------------------------------*/ @@ -290,13 +302,14 @@ void maybe_transfer_complete(void) { } } -void USB_Handler(void) { - uint32_t int_status = USB->DEVICE.INTFLAG.reg; +void USB_Handler(void) +{ + uint32_t int_status = USB->DEVICE.INTFLAG.reg & USB->DEVICE.INTENSET.reg; /*------------- Interrupt Processing -------------*/ if ( int_status & USB_DEVICE_INTFLAG_EORST ) { - USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTENCLR_EORST; + USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTFLAG_EORST; bus_reset(); dcd_event_bus_signal(0, DCD_EVENT_BUS_RESET, true); } @@ -307,6 +320,21 @@ void USB_Handler(void) { dcd_event_bus_signal(0, DCD_EVENT_SOF, true); } +#if 0 + if ( int_status & USB_DEVICE_INTFLAG_SUSPEND ) + { + USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTFLAG_SUSPEND; + + // disable interrupt to prevent it continue to trigger + USB->DEVICE.INTENCLR.reg = USB_DEVICE_INTENCLR_SUSPEND; + + // TODO need to distinguish Suspend vs Disconnect + // reset address to 0, force host to re-enumerate after resume + USB->DEVICE.DADD.reg = 0; + dcd_event_bus_signal(0, DCD_EVENT_UNPLUGGED, true); + } +#endif + // Setup packet received. maybe_handle_setup_packet(); diff --git a/src/portable/microchip/samd51/dcd_samd51.c b/src/portable/microchip/samd51/dcd_samd51.c index 13250c38..a1702b05 100644 --- a/src/portable/microchip/samd51/dcd_samd51.c +++ b/src/portable/microchip/samd51/dcd_samd51.c @@ -117,6 +117,11 @@ void dcd_set_config (uint8_t rhport, uint8_t config_num) // Nothing to do } +void dcd_remote_wakeup(uint8_t rhport) +{ + (void) rhport; +} + /*------------------------------------------------------------------*/ /* DCD Endpoint port *------------------------------------------------------------------*/ diff --git a/src/portable/nordic/nrf5x/dcd_nrf5x.c b/src/portable/nordic/nrf5x/dcd_nrf5x.c index e7e9ae01..452f2529 100644 --- a/src/portable/nordic/nrf5x/dcd_nrf5x.c +++ b/src/portable/nordic/nrf5x/dcd_nrf5x.c @@ -216,6 +216,11 @@ void dcd_set_config (uint8_t rhport, uint8_t config_num) NRF_USBD->INTENSET = USBD_INTEN_USBEVENT_Msk; } +void dcd_remote_wakeup(uint8_t rhport) +{ + (void) rhport; +} + //--------------------------------------------------------------------+ // Endpoint API //--------------------------------------------------------------------+ diff --git a/src/portable/nxp/lpc11_13_15/dcd_lpc11_13_15.c b/src/portable/nxp/lpc11_13_15/dcd_lpc11_13_15.c index f01bed1c..fff29d5e 100644 --- a/src/portable/nxp/lpc11_13_15/dcd_lpc11_13_15.c +++ b/src/portable/nxp/lpc11_13_15/dcd_lpc11_13_15.c @@ -126,33 +126,6 @@ static inline uint8_t ep_addr2id(uint8_t endpoint_addr) //--------------------------------------------------------------------+ // CONTROLLER API //--------------------------------------------------------------------+ -void dcd_int_enable(uint8_t rhport) -{ - (void) rhport; - NVIC_EnableIRQ(USB0_IRQn); -} - -void dcd_int_disable(uint8_t rhport) -{ - (void) rhport; - NVIC_DisableIRQ(USB0_IRQn); -} - -void dcd_set_config(uint8_t rhport, uint8_t config_num) -{ - (void) rhport; - (void) config_num; -} - -void dcd_set_address(uint8_t rhport, uint8_t dev_addr) -{ - // Response with status first before changing device address - dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0); - - LPC_USB->DEVCMDSTAT &= ~CMDSTAT_DEVICE_ADDR_MASK; - LPC_USB->DEVCMDSTAT |= dev_addr; -} - void dcd_init(uint8_t rhport) { (void) rhport; @@ -165,9 +138,41 @@ void dcd_init(uint8_t rhport) LPC_USB->DEVCMDSTAT |= CMDSTAT_DEVICE_ENABLE_MASK | CMDSTAT_DEVICE_CONNECT_MASK | CMDSTAT_RESET_CHANGE_MASK | CMDSTAT_CONNECT_CHANGE_MASK | CMDSTAT_SUSPEND_CHANGE_MASK; + NVIC_ClearPendingIRQ(USB0_IRQn); +} + +void dcd_int_enable(uint8_t rhport) +{ + (void) rhport; NVIC_EnableIRQ(USB0_IRQn); } +void dcd_int_disable(uint8_t rhport) +{ + (void) rhport; + NVIC_DisableIRQ(USB0_IRQn); +} + +void dcd_set_address(uint8_t rhport, uint8_t dev_addr) +{ + // Response with status first before changing device address + dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0); + + LPC_USB->DEVCMDSTAT &= ~CMDSTAT_DEVICE_ADDR_MASK; + LPC_USB->DEVCMDSTAT |= dev_addr; +} + +void dcd_set_config(uint8_t rhport, uint8_t config_num) +{ + (void) rhport; + (void) config_num; +} + +void dcd_remote_wakeup(uint8_t rhport) +{ + (void) rhport; +} + //--------------------------------------------------------------------+ // DCD Endpoint Port //--------------------------------------------------------------------+ diff --git a/src/portable/nxp/lpc17_40/dcd_lpc17_40.c b/src/portable/nxp/lpc17_40/dcd_lpc17_40.c index 5da18d52..30252f56 100644 --- a/src/portable/nxp/lpc17_40/dcd_lpc17_40.c +++ b/src/portable/nxp/lpc17_40/dcd_lpc17_40.c @@ -185,7 +185,6 @@ void dcd_init(uint8_t rhport) // USB IRQ priority should be set by application previously NVIC_ClearPendingIRQ(USB_IRQn); - NVIC_EnableIRQ(USB_IRQn); } void dcd_int_enable(uint8_t rhport) @@ -215,6 +214,11 @@ void dcd_set_config(uint8_t rhport, uint8_t config_num) sie_write(SIE_CMDCODE_CONFIGURE_DEVICE, 1, 1); } +void dcd_remote_wakeup(uint8_t rhport) +{ + (void) rhport; +} + //--------------------------------------------------------------------+ // CONTROL HELPER //--------------------------------------------------------------------+ diff --git a/src/portable/nxp/lpc18_43/dcd_lpc18_43.c b/src/portable/nxp/lpc18_43/dcd_lpc18_43.c index b272a143..5c2d27d9 100644 --- a/src/portable/nxp/lpc18_43/dcd_lpc18_43.c +++ b/src/portable/nxp/lpc18_43/dcd_lpc18_43.c @@ -161,6 +161,11 @@ void dcd_set_config(uint8_t rhport, uint8_t config_num) // nothing to do } +void dcd_remote_wakeup(uint8_t rhport) +{ + (void) rhport; +} + //--------------------------------------------------------------------+ // HELPER //--------------------------------------------------------------------+ diff --git a/src/portable/st/stm32f3/dcd_stm32f3.c b/src/portable/st/stm32f3/dcd_stm32f3.c index 41f82891..02303747 100644 --- a/src/portable/st/stm32f3/dcd_stm32f3.c +++ b/src/portable/st/stm32f3/dcd_stm32f3.c @@ -55,6 +55,14 @@ void dcd_set_address(uint8_t rhport, uint8_t dev_addr) void dcd_set_config (uint8_t rhport, uint8_t config_num) {} +void dcd_remote_wakeup(uint8_t rhport) +{ + (void) rhport; +} + +//--------------------------------------------------------------------+ +// Endpoint API +//--------------------------------------------------------------------+ bool dcd_edpt_open (uint8_t rhport, tusb_desc_endpoint_t const * p_endpoint_desc) { return false; diff --git a/src/portable/st/stm32f4/dcd_stm32f4.c b/src/portable/st/stm32f4/dcd_stm32f4.c index f0d6e7d5..f7128344 100644 --- a/src/portable/st/stm32f4/dcd_stm32f4.c +++ b/src/portable/st/stm32f4/dcd_stm32f4.c @@ -194,6 +194,11 @@ void dcd_set_config (uint8_t rhport, uint8_t config_num) // Nothing to do } +void dcd_remote_wakeup(uint8_t rhport) +{ + (void) rhport; +} + /*------------------------------------------------------------------*/ /* DCD Endpoint port *------------------------------------------------------------------*/