summaryrefslogtreecommitdiff
path: root/tinyusb
diff options
context:
space:
mode:
authorhathach <[email protected]>2013-11-15 14:15:05 +0700
committerhathach <[email protected]>2013-11-15 14:15:05 +0700
commit699edf9485c08a844182c295e50f2b17e2219c12 (patch)
tree65fbf39765166c98c3e73f66cc70d78f17a8b579 /tinyusb
parent05c439e45adec2a29b73d948ecf96af4e0fae375 (diff)
separate data & status from dcd_pipe_control_xfer
Diffstat (limited to 'tinyusb')
-rw-r--r--tinyusb/class/hid_device.c1
-rw-r--r--tinyusb/device/dcd.h2
-rw-r--r--tinyusb/device/dcd_lpc_11uxx_13uxx.c36
-rw-r--r--tinyusb/device/usbd.c6
4 files changed, 22 insertions, 23 deletions
diff --git a/tinyusb/class/hid_device.c b/tinyusb/class/hid_device.c
index c5e98894e..662691946 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 c196cdc83..3de630949 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 40a4cd996..164ea834f 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 374fd1a74..a2e34746e 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
}
}