From 3ed83c4d986ef8f74b52144fe6078e6e8f85e94c Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 21 Mar 2018 16:08:42 +0700 Subject: [PATCH] merge tusb_dcd_control_stall() to tusb_dcd_edpt_stall() --- hw/mcu/nordic/nrf52/tusb_port/dcd_nrf52.c | 24 ++++++++++++++-------- hw/mcu/nxp/lpc43xx/tusb_port/dcd_lpc43xx.c | 17 +++++++++------ tinyusb/device/usbd.c | 8 ++++++-- tinyusb/tusb_dcd.h | 20 ++++++++++-------- 4 files changed, 45 insertions(+), 24 deletions(-) diff --git a/hw/mcu/nordic/nrf52/tusb_port/dcd_nrf52.c b/hw/mcu/nordic/nrf52/tusb_port/dcd_nrf52.c index f1a9d549..351814c4 100644 --- a/hw/mcu/nordic/nrf52/tusb_port/dcd_nrf52.c +++ b/hw/mcu/nordic/nrf52/tusb_port/dcd_nrf52.c @@ -85,7 +85,7 @@ typedef struct }_dcd; /*------------------------------------------------------------------*/ -/* Controller API +/* Controller Start up Sequence *------------------------------------------------------------------*/ static bool hfclk_running(void) { @@ -351,12 +351,6 @@ bool tusb_dcd_control_xfer (uint8_t port, tusb_dir_t dir, uint8_t * buffer, uint return true; } -void tusb_dcd_control_stall (uint8_t port) -{ - (void) port; - NRF_USBD->TASKS_EP0STALL = 1; - __ISB(); __DSB(); -} /*------------------------------------------------------------------*/ /* @@ -449,12 +443,26 @@ bool tusb_dcd_edpt_queue_xfer (uint8_t port, uint8_t ep_addr, uint8_t * buffer, void tusb_dcd_edpt_stall (uint8_t port, uint8_t ep_addr) { + (void) port; + if ( ep_addr == 0) + { + NRF_USBD->TASKS_EP0STALL = 1; + }else + { + NRF_USBD->EPSTALL = (USBD_EPSTALL_STALL_Stall << USBD_EPSTALL_STALL_Pos) | ep_addr; + } + + __ISB(); __DSB(); } void tusb_dcd_edpt_clear_stall (uint8_t port, uint8_t ep_addr) { - + (void) port; + if ( ep_addr ) + { + NRF_USBD->EPSTALL = (USBD_EPSTALL_STALL_UnStall << USBD_EPSTALL_STALL_Pos) | ep_addr; + } } bool tusb_dcd_edpt_busy (uint8_t port, uint8_t ep_addr) diff --git a/hw/mcu/nxp/lpc43xx/tusb_port/dcd_lpc43xx.c b/hw/mcu/nxp/lpc43xx/tusb_port/dcd_lpc43xx.c index e44fb8cd..5c12af20 100644 --- a/hw/mcu/nxp/lpc43xx/tusb_port/dcd_lpc43xx.c +++ b/hw/mcu/nxp/lpc43xx/tusb_port/dcd_lpc43xx.c @@ -230,10 +230,6 @@ static inline uint8_t qtd_find_free(uint8_t port) //--------------------------------------------------------------------+ // CONTROL PIPE API //--------------------------------------------------------------------+ -void tusb_dcd_control_stall(uint8_t port) -{ - LPC_USB[port]->ENDPTCTRL0 |= (ENDPTCTRL_MASK_STALL << 16); // stall Control IN TODO stall control OUT as well -} // control transfer does not need to use qtd find function // follows UM 24.10.8.1.1 Setup packet handling using setup lockout mechanism @@ -277,7 +273,14 @@ void tusb_dcd_edpt_stall(uint8_t port, uint8_t ep_addr) uint8_t ep_idx = edpt_addr2phy(ep_addr); volatile uint32_t * reg_control = get_reg_control_addr(port, ep_idx); - (*reg_control) |= ENDPTCTRL_MASK_STALL << (ep_idx & 0x01 ? 16 : 0); + if ( ep_addr == 0) + { + // Stall both Control IN and OUT + (*reg_control) |= ( (ENDPTCTRL_MASK_STALL << 16) || (ENDPTCTRL_MASK_STALL << 0) ); + }else + { + (*reg_control) |= ENDPTCTRL_MASK_STALL << (ep_idx & 0x01 ? 16 : 0); + } } void tusb_dcd_edpt_clear_stall(uint8_t port, uint8_t ep_addr) @@ -475,7 +478,9 @@ void hal_dcd_isr(uint8_t port) if ( p_qtd->int_on_complete ) { bool succeeded = ( p_qtd->xact_err || p_qtd->halted || p_qtd->buffer_err ) ? false : true; - tusb_dcd_xfer_complete(port, 0, 0, succeeded); // TODO xferred bytes for control xfer is not needed yet !!!! + (void) succeeded; + + tusb_dcd_control_complete(port); } } } diff --git a/tinyusb/device/usbd.c b/tinyusb/device/usbd.c index 5ff677b9..a4eac4b9 100644 --- a/tinyusb/device/usbd.c +++ b/tinyusb/device/usbd.c @@ -382,7 +382,7 @@ tusb_error_t usbd_control_request_subtask(uint8_t port, tusb_control_request_t c if(TUSB_ERROR_NONE != error) { // Response with Protocol Stall if request is not supported - tusb_dcd_control_stall(port); + tusb_dcd_edpt_stall(port, 0); }else if (p_request->wLength == 0) { usbd_control_status(port, 1-p_request->bmRequestType_bit.direction); @@ -546,6 +546,10 @@ void tusb_dcd_xfer_complete(uint8_t port, uint8_t ep_addr, uint32_t xferred_byte { if (ep_addr == 0 ) { + (void) port; + (void) xferred_bytes; + (void) succeeded; + // Control Transfer osal_semaphore_post( usbd_control_xfer_sem_hdl ); }else @@ -557,7 +561,7 @@ void tusb_dcd_xfer_complete(uint8_t port, uint8_t ep_addr, uint32_t xferred_byte .sub_event_id = succeeded ? TUSB_EVENT_XFER_COMPLETE : TUSB_EVENT_XFER_ERROR }; - task_event.xfer_done.ep_addr = ep_addr; + task_event.xfer_done.ep_addr = ep_addr; task_event.xfer_done.xferred_byte = xferred_bytes; osal_queue_send(usbd_queue_hdl, &task_event); diff --git a/tinyusb/tusb_dcd.h b/tinyusb/tusb_dcd.h index 077c4db2..f517ef0e 100644 --- a/tinyusb/tusb_dcd.h +++ b/tinyusb/tusb_dcd.h @@ -73,24 +73,28 @@ void tusb_dcd_set_config (uint8_t port, uint8_t config_num); *------------------------------------------------------------------*/ void tusb_dcd_bus_event (uint8_t port, usbd_bus_event_type_t bus_event); void tusb_dcd_setup_received (uint8_t port, uint8_t const* p_request); -void tusb_dcd_xfer_complete (uint8_t port, uint8_t edpt_addr, uint32_t xferred_bytes, bool succeeded); +void tusb_dcd_xfer_complete (uint8_t port, uint8_t ep_addr, uint32_t xferred_bytes, bool succeeded); + +static inline void tusb_dcd_control_complete(uint8_t port) +{ + // TODO all control complete is successful !! + tusb_dcd_xfer_complete(port, 0, 0, true); +} /*------------------------------------------------------------------*/ /* Endpoint API *------------------------------------------------------------------*/ - //------------- Control Endpoint -------------// bool tusb_dcd_control_xfer (uint8_t port, tusb_dir_t dir, uint8_t * buffer, uint16_t length); -void tusb_dcd_control_stall (uint8_t port); //------------- Other Endpoints -------------// bool tusb_dcd_edpt_open (uint8_t port, tusb_descriptor_endpoint_t const * p_endpoint_desc); -bool tusb_dcd_edpt_xfer (uint8_t port, uint8_t edpt_addr, uint8_t * buffer, uint16_t total_bytes, bool int_on_complete); -bool tusb_dcd_edpt_queue_xfer (uint8_t port, uint8_t edpt_addr, uint8_t * buffer, uint16_t total_bytes); // only queue, not transferring yet -bool tusb_dcd_edpt_busy (uint8_t port, uint8_t edpt_addr); +bool tusb_dcd_edpt_xfer (uint8_t port, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool int_on_complete); +bool tusb_dcd_edpt_queue_xfer (uint8_t port, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes); // only queue, not transferring yet +bool tusb_dcd_edpt_busy (uint8_t port, uint8_t ep_addr); -void tusb_dcd_edpt_stall (uint8_t port, uint8_t edpt_addr); -void tusb_dcd_edpt_clear_stall (uint8_t port, uint8_t edpt_addr); +void tusb_dcd_edpt_stall (uint8_t port, uint8_t ep_addr); +void tusb_dcd_edpt_clear_stall (uint8_t port, uint8_t ep_addr); #ifdef __cplusplus }