From 699edf9485c08a844182c295e50f2b17e2219c12 Mon Sep 17 00:00:00 2001 From: hathach Date: Fri, 15 Nov 2013 14:15:05 +0700 Subject: [PATCH] separate data & status from dcd_pipe_control_xfer --- tinyusb/class/hid_device.c | 1 - tinyusb/device/dcd.h | 2 +- tinyusb/device/dcd_lpc_11uxx_13uxx.c | 36 ++++++++++++++-------------- tinyusb/device/usbd.c | 6 ++--- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/tinyusb/class/hid_device.c b/tinyusb/class/hid_device.c index c5e98894..66269194 100644 --- a/tinyusb/class/hid_device.c +++ b/tinyusb/class/hid_device.c @@ -160,7 +160,6 @@ tusb_error_t hidd_control_request(uint8_t coreid, tusb_control_request_t const * { case HID_REQUEST_CONTROL_SET_IDLE: // idle_rate = u16_high_u8(p_request->wValue); - dcd_pipe_control_xfer(coreid, TUSB_DIR_HOST_TO_DEV, NULL, 0); break; case HID_REQUEST_CONTROL_SET_REPORT: diff --git a/tinyusb/device/dcd.h b/tinyusb/device/dcd.h index c196cdc8..3de63094 100644 --- a/tinyusb/device/dcd.h +++ b/tinyusb/device/dcd.h @@ -81,7 +81,7 @@ void dcd_controller_set_address(uint8_t coreid, uint8_t dev_addr); void dcd_controller_set_configuration(uint8_t coreid); //------------- PIPE API -------------// -tusb_error_t dcd_pipe_control_xfer(uint8_t coreid, tusb_direction_t dir, void * buffer, uint16_t length); +tusb_error_t dcd_pipe_control_xfer(uint8_t coreid, tusb_direction_t dir, void * p_buffer, uint16_t length); void dcd_pipe_control_stall(uint8_t coreid); //tusb_error_t dcd_pipe_control_write(uint8_t coreid, void const * buffer, uint16_t length); diff --git a/tinyusb/device/dcd_lpc_11uxx_13uxx.c b/tinyusb/device/dcd_lpc_11uxx_13uxx.c index 40a4cd99..164ea834 100644 --- a/tinyusb/device/dcd_lpc_11uxx_13uxx.c +++ b/tinyusb/device/dcd_lpc_11uxx_13uxx.c @@ -283,28 +283,28 @@ void dcd_pipe_control_stall(uint8_t coreid) dcd_data.qhd[0][0].stall = dcd_data.qhd[1][0].stall = 1; } -// control transfer does not need to use qtd find function -tusb_error_t dcd_pipe_control_xfer(uint8_t coreid, tusb_direction_t dir, void * buffer, uint16_t length) +// used for data phase only +//tusb_error_t dcd_pipe_control_queue_xfer(uint8_t coreid, tusb_direction_t dir, void * p_buffer, uint16_t length) +//{ +// (void) coreid; +// +// uint8_t const ep_id = dir; // IN : 1, OUT = 0 +// +// dcd_data.qhd[ep_id][0].buff_addr_offset = (length ? addr_offset(p_buffer) : 0 ); +// dcd_data.qhd[ep_id][0].total_bytes = length; +// +//} + +// can be data phase (long data) or status phase +tusb_error_t dcd_pipe_control_xfer(uint8_t coreid, tusb_direction_t dir, void * p_buffer, uint16_t length) { (void) coreid; - // determine Endpoint where Data & Status phase occurred (IN or OUT) - uint8_t const endpoint_data = (dir == TUSB_DIR_DEV_TO_HOST) ? 1 : 0; - uint8_t const endpoint_status = 1 - endpoint_data; - - //------------- Data Phase -------------// - if (length) - { - dcd_data.qhd[endpoint_data][0].buff_addr_offset = addr_offset(buffer); - dcd_data.qhd[endpoint_data][0].total_bytes = length; - dcd_data.qhd[endpoint_data][0].active = 1 ; - } - - //------------- Status Phase -------------// - dcd_data.qhd[endpoint_status][0].buff_addr_offset = 0; - dcd_data.qhd[endpoint_status][0].total_bytes = 0; - dcd_data.qhd[endpoint_status][0].active = 1 ; + uint8_t const ep_id = dir; // IN : 1, OUT = 0 + dcd_data.qhd[ep_id][0].buff_addr_offset = (length ? addr_offset(p_buffer) : 0 ); + dcd_data.qhd[ep_id][0].total_bytes = length; + dcd_data.qhd[ep_id][0].active = 1 ; return TUSB_ERROR_NONE; } diff --git a/tinyusb/device/usbd.c b/tinyusb/device/usbd.c index 374fd1a7..a2e34746 100644 --- a/tinyusb/device/usbd.c +++ b/tinyusb/device/usbd.c @@ -157,12 +157,10 @@ tusb_error_t usbd_body_subtask(void) { dcd_controller_set_address(event.coreid, (uint8_t) p_request->wValue); p_device->state = TUSB_DEVICE_STATE_ADDRESSED; - dcd_pipe_control_xfer(event.coreid, TUSB_DIR_HOST_TO_DEV, NULL, 0); // zero length } else if ( TUSB_REQUEST_SET_CONFIGURATION == p_request->bRequest ) { usbd_set_configure_received(event.coreid, (uint8_t) p_request->wValue); - dcd_pipe_control_xfer(event.coreid, TUSB_DIR_HOST_TO_DEV, NULL, 0); // zero length }else { error = TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; @@ -189,7 +187,6 @@ tusb_error_t usbd_body_subtask(void) if ( TUSB_REQUEST_CLEAR_FEATURE == p_request->bRequest ) { dcd_pipe_clear_stall(event.coreid, u16_low_u8(p_request->wIndex) ); - dcd_pipe_control_xfer(event.coreid, TUSB_DIR_HOST_TO_DEV, NULL, 0); // zero length } else { error = TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; @@ -203,6 +200,9 @@ tusb_error_t usbd_body_subtask(void) { // Response with Protocol Stall if request is not supported dcd_pipe_control_stall(event.coreid); // ASSERT(error == TUSB_ERROR_NONE, VOID_RETURN); + }else + { // status phase + dcd_pipe_control_xfer(event.coreid, 1-p_request->bmRequestType_bit.direction, NULL, 0); // zero length } }