From b0ec6124e014178601d6090bb251757c92c8adbf Mon Sep 17 00:00:00 2001 From: hathach Date: Thu, 15 Mar 2018 13:22:28 +0700 Subject: nrf52 control transfer work reliably --- tinyusb/device/usbd.c | 9 ++++----- tinyusb/device/usbd.h | 7 +++++++ 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'tinyusb/device') diff --git a/tinyusb/device/usbd.c b/tinyusb/device/usbd.c index ed72a2000..f7500b6ed 100644 --- a/tinyusb/device/usbd.c +++ b/tinyusb/device/usbd.c @@ -302,7 +302,7 @@ tusb_error_t usbd_control_xfer_substak(uint8_t port, tusb_dir_t dir, uint8_t * b } // Status opposite direction with Zero Length - tusb_dcd_control_xfer(port, (tusb_dir_t) (1-dir), NULL, 0, true); + usbd_control_status(port, 1-dir); // no need to blocking wait for status to complete @@ -329,7 +329,6 @@ tusb_error_t usbd_control_request_subtask(uint8_t port, tusb_control_request_t c if ( TUSB_ERROR_NONE == error ) { -// tusb_dcd_control_xfer(port, (tusb_dir_t) p_request->bmRequestType_bit.direction, (uint8_t*) p_buffer, length, false); OSAL_SUBTASK_INVOKED ( usbd_control_xfer_substak(port, (tusb_dir_t) p_request->bmRequestType_bit.direction, (uint8_t*) p_buffer, length ), error );; } } @@ -379,12 +378,12 @@ 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 + { + // Response with Protocol Stall if request is not supported tusb_dcd_control_stall(port); }else if (p_request->wLength == 0) { - // zero length for non-data - tusb_dcd_control_xfer(port, (tusb_dir_t) p_request->bmRequestType_bit.direction, NULL, 0, false); + usbd_control_status(port, (tusb_dir_t) p_request->bmRequestType_bit.direction); } OSAL_SUBTASK_END diff --git a/tinyusb/device/usbd.h b/tinyusb/device/usbd.h index 8926d225c..cf607f645 100644 --- a/tinyusb/device/usbd.h +++ b/tinyusb/device/usbd.h @@ -130,6 +130,13 @@ void tud_umount_cb(uint8_t port); extern osal_semaphore_t usbd_control_xfer_sem_hdl; +tusb_error_t usbd_control_xfer_substak(uint8_t port, tusb_dir_t dir, uint8_t * buffer, uint16_t length); + +static inline bool usbd_control_status(uint8_t port, tusb_dir_t dir) +{ + tusb_dcd_control_xfer(port , dir, NULL, 0, false); +} + tusb_error_t usbd_init(void); void usbd_task( void* param); -- cgit v1.3.1