summaryrefslogtreecommitdiff
path: root/tinyusb
diff options
context:
space:
mode:
authorhathach <[email protected]>2013-07-04 14:00:41 +0700
committerhathach <[email protected]>2013-07-04 14:00:41 +0700
commit0d37c4a319dad5bda2d52585f17418175bb2f6ca (patch)
tree7ec81c7c0ecb187b05bb2ec25580592ccbb95807 /tinyusb
parent97cbb39f6ff3f64f8816830c278c888ffd7a0b18 (diff)
refractor control request used in enumeration task to reduce task data
--> enum task now can work with 128 depth
Diffstat (limited to 'tinyusb')
-rw-r--r--tinyusb/host/usbh.c104
1 files changed, 46 insertions, 58 deletions
diff --git a/tinyusb/host/usbh.c b/tinyusb/host/usbh.c
index 43c3b5ae6..293688bfc 100644
--- a/tinyusb/host/usbh.c
+++ b/tinyusb/host/usbh.c
@@ -298,6 +298,36 @@ void usbh_device_unplugged_isr(uint8_t hostid)
//--------------------------------------------------------------------+
// ENUMERATION TASK
//--------------------------------------------------------------------+
+static tusb_control_request_t request_get_device_desc =
+{
+ .bmRequestType = { .direction = TUSB_DIR_DEV_TO_HOST, .type = TUSB_REQUEST_TYPE_STANDARD, .recipient = TUSB_REQUEST_RECIPIENT_DEVICE },
+ .bRequest = TUSB_REQUEST_GET_DESCRIPTOR,
+ .wValue = (TUSB_DESC_TYPE_DEVICE << 8),
+ .wLength = 8
+};
+
+static tusb_control_request_t request_set_addr =
+{
+ .bmRequestType = { .direction = TUSB_DIR_HOST_TO_DEV, .type = TUSB_REQUEST_TYPE_STANDARD, .recipient = TUSB_REQUEST_RECIPIENT_DEVICE },
+ .bRequest = TUSB_REQUEST_SET_ADDRESS
+// .wValue = new_addr
+};
+
+static tusb_control_request_t request_get_config_desc =
+{
+ .bmRequestType = { .direction = TUSB_DIR_DEV_TO_HOST, .type = TUSB_REQUEST_TYPE_STANDARD, .recipient = TUSB_REQUEST_RECIPIENT_DEVICE },
+ .bRequest = TUSB_REQUEST_GET_DESCRIPTOR
+// .wValue = (TUSB_DESC_TYPE_CONFIGURATION << 8) | (configure_selected - 1),
+// .wLength = 9
+};
+
+static tusb_control_request_t request_set_config =
+{
+ .bmRequestType = { .direction = TUSB_DIR_HOST_TO_DEV, .type = TUSB_REQUEST_TYPE_STANDARD, .recipient = TUSB_REQUEST_RECIPIENT_DEVICE },
+ .bRequest = TUSB_REQUEST_SET_CONFIGURATION,
+// .wValue = configure_selected
+};
+
static tusb_error_t enumeration_body_subtask(void);
// To enable the TASK_ASSERT style (quick return on false condition) in a real RTOS, a task must act as a wrapper
@@ -344,17 +374,9 @@ tusb_error_t enumeration_body_subtask(void)
#endif
//------------- Get first 8 bytes of device descriptor to get Control Endpoint Size -------------//
+ request_get_device_desc.wLength = 8;
OSAL_SUBTASK_INVOKED_AND_WAIT(
- usbh_control_xfer_subtask(
- 0,
- &(tusb_control_request_t)
- {
- .bmRequestType = { .direction = TUSB_DIR_DEV_TO_HOST, .type = TUSB_REQUEST_TYPE_STANDARD, .recipient = TUSB_REQUEST_RECIPIENT_DEVICE },
- .bRequest = TUSB_REQUEST_GET_DESCRIPTOR,
- .wValue = (TUSB_DESC_TYPE_DEVICE << 8),
- .wLength = 8
- },
- enum_data_buffer ),
+ usbh_control_xfer_subtask( 0, &request_get_device_desc, enum_data_buffer ),
error
);
SUBTASK_ASSERT_STATUS(error); // TODO some slow device is observed to fail the very fist controler xfer, can try more times
@@ -365,16 +387,9 @@ tusb_error_t enumeration_body_subtask(void)
new_addr = get_new_address();
SUBTASK_ASSERT(new_addr <= TUSB_CFG_HOST_DEVICE_MAX); // TODO notify application we reach max devices
+ request_set_addr.wValue = new_addr;
OSAL_SUBTASK_INVOKED_AND_WAIT(
- usbh_control_xfer_subtask(
- 0,
- &(tusb_control_request_t)
- {
- .bmRequestType = { .direction = TUSB_DIR_HOST_TO_DEV, .type = TUSB_REQUEST_TYPE_STANDARD, .recipient = TUSB_REQUEST_RECIPIENT_DEVICE },
- .bRequest = TUSB_REQUEST_SET_ADDRESS,
- .wValue = new_addr
- },
- NULL ),
+ usbh_control_xfer_subtask( 0, &request_set_addr, NULL ),
error
);
SUBTASK_ASSERT_STATUS(error);
@@ -393,17 +408,9 @@ tusb_error_t enumeration_body_subtask(void)
SUBTASK_ASSERT_STATUS ( usbh_pipe_control_open(new_addr, ((tusb_descriptor_device_t*) enum_data_buffer)->bMaxPacketSize0 ) );
//------------- Get full device descriptor -------------//
+ request_get_device_desc.wLength = sizeof(tusb_descriptor_device_t);
OSAL_SUBTASK_INVOKED_AND_WAIT(
- usbh_control_xfer_subtask(
- new_addr,
- &(tusb_control_request_t)
- {
- .bmRequestType = { .direction = TUSB_DIR_DEV_TO_HOST, .type = TUSB_REQUEST_TYPE_STANDARD, .recipient = TUSB_REQUEST_RECIPIENT_DEVICE },
- .bRequest = TUSB_REQUEST_GET_DESCRIPTOR,
- .wValue = (TUSB_DESC_TYPE_DEVICE << 8),
- .wLength = 18
- },
- enum_data_buffer ),
+ usbh_control_xfer_subtask( new_addr, &request_get_device_desc, enum_data_buffer ),
error
);
SUBTASK_ASSERT_STATUS(error);
@@ -417,17 +424,11 @@ tusb_error_t enumeration_body_subtask(void)
SUBTASK_ASSERT(configure_selected <= usbh_devices[new_addr].configure_count); // TODO notify application when invalid configuration
//------------- Get 9 bytes of configuration descriptor -------------//
+ request_get_config_desc.wValue = (TUSB_DESC_TYPE_CONFIGURATION << 8) | (configure_selected - 1);
+ request_get_config_desc.wLength = 9;
+
OSAL_SUBTASK_INVOKED_AND_WAIT(
- usbh_control_xfer_subtask(
- new_addr,
- &(tusb_control_request_t)
- {
- .bmRequestType = { .direction = TUSB_DIR_DEV_TO_HOST, .type = TUSB_REQUEST_TYPE_STANDARD, .recipient = TUSB_REQUEST_RECIPIENT_DEVICE },
- .bRequest = TUSB_REQUEST_GET_DESCRIPTOR,
- .wValue = (TUSB_DESC_TYPE_CONFIGURATION << 8) | (configure_selected - 1),
- .wLength = 9
- },
- enum_data_buffer ),
+ usbh_control_xfer_subtask( new_addr, &request_get_config_desc, enum_data_buffer ),
error
);
SUBTASK_ASSERT_STATUS(error);
@@ -435,17 +436,11 @@ tusb_error_t enumeration_body_subtask(void)
tusbh_device_mount_failed_cb(TUSB_ERROR_USBH_MOUNT_CONFIG_DESC_TOO_LONG, NULL) );
//------------- Get full configuration descriptor -------------//
+ request_get_config_desc.wValue = (TUSB_DESC_TYPE_CONFIGURATION << 8) | (configure_selected - 1);
+ request_get_config_desc.wLength = ((tusb_descriptor_configuration_t*) enum_data_buffer)->wTotalLength;
+
OSAL_SUBTASK_INVOKED_AND_WAIT(
- usbh_control_xfer_subtask(
- new_addr,
- &(tusb_control_request_t)
- {
- .bmRequestType = { .direction = TUSB_DIR_DEV_TO_HOST, .type = TUSB_REQUEST_TYPE_STANDARD, .recipient = TUSB_REQUEST_RECIPIENT_DEVICE },
- .bRequest = TUSB_REQUEST_GET_DESCRIPTOR,
- .wValue = (TUSB_DESC_TYPE_CONFIGURATION << 8) | (configure_selected - 1),
- .wLength = ((tusb_descriptor_configuration_t*) enum_data_buffer)->wTotalLength
- },
- enum_data_buffer ),
+ usbh_control_xfer_subtask( new_addr, &request_get_config_desc, enum_data_buffer ),
error
);
SUBTASK_ASSERT_STATUS(error);
@@ -454,16 +449,9 @@ tusb_error_t enumeration_body_subtask(void)
usbh_devices[new_addr].interface_count = ((tusb_descriptor_configuration_t*) enum_data_buffer)->bNumInterfaces;
//------------- Set Configure -------------//
+ request_set_config.wValue = configure_selected;
OSAL_SUBTASK_INVOKED_AND_WAIT (
- usbh_control_xfer_subtask(
- new_addr,
- &(tusb_control_request_t)
- {
- .bmRequestType = { .direction = TUSB_DIR_HOST_TO_DEV, .type = TUSB_REQUEST_TYPE_STANDARD, .recipient = TUSB_REQUEST_RECIPIENT_DEVICE },
- .bRequest = TUSB_REQUEST_SET_CONFIGURATION,
- .wValue = configure_selected
- },
- NULL ),
+ usbh_control_xfer_subtask( new_addr, &request_set_config, NULL ),
error
);
SUBTASK_ASSERT_STATUS(error);