diff options
| author | hathach <[email protected]> | 2022-03-17 16:24:43 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2022-03-17 16:24:43 +0700 |
| commit | 6df420f7f31b4fbf9b95987211e9ed9fef58ac00 (patch) | |
| tree | 5cff0e3e550e1c6db72311f1941fa617c78beb27 /src/host | |
| parent | 68bfd048a54d1ff2def4cb1ee5285eacdb55f143 (diff) | |
move result into transfer struct
Diffstat (limited to 'src/host')
| -rw-r--r-- | src/host/hub.c | 31 | ||||
| -rw-r--r-- | src/host/usbh.c | 26 | ||||
| -rw-r--r-- | src/host/usbh.h | 6 |
3 files changed, 33 insertions, 30 deletions
diff --git a/src/host/hub.c b/src/host/hub.c index 6ce9e4cc6..5255fdf7c 100644 --- a/src/host/hub.c +++ b/src/host/hub.c @@ -225,8 +225,8 @@ bool hub_edpt_status_xfer(uint8_t dev_addr) // Set Configure //--------------------------------------------------------------------+ -static bool config_set_port_power (uint8_t dev_addr, tuh_control_xfer_t const * xfer, xfer_result_t result); -static bool config_port_power_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer, xfer_result_t result); +static bool config_set_port_power (uint8_t dev_addr, tuh_control_xfer_t const * xfer); +static bool config_port_power_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer); bool hub_set_config(uint8_t dev_addr, uint8_t itf_num) { @@ -262,10 +262,9 @@ bool hub_set_config(uint8_t dev_addr, uint8_t itf_num) return true; } -static bool config_set_port_power (uint8_t dev_addr, tuh_control_xfer_t const * xfer, xfer_result_t result) +static bool config_set_port_power (uint8_t dev_addr, tuh_control_xfer_t const * xfer) { - (void) xfer; - TU_ASSERT(XFER_RESULT_SUCCESS == result); + TU_ASSERT(XFER_RESULT_SUCCESS == xfer->result); hub_interface_t* p_hub = get_itf(dev_addr); @@ -280,9 +279,9 @@ static bool config_set_port_power (uint8_t dev_addr, tuh_control_xfer_t const * return hub_port_set_feature(dev_addr, hub_port, HUB_FEATURE_PORT_POWER, config_port_power_complete, 0); } -static bool config_port_power_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer, xfer_result_t result) +static bool config_port_power_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer) { - TU_ASSERT(XFER_RESULT_SUCCESS == result); + TU_ASSERT(XFER_RESULT_SUCCESS == xfer->result); hub_interface_t* p_hub = get_itf(dev_addr); if (xfer->setup->wIndex == p_hub->port_count) @@ -306,9 +305,9 @@ static bool config_port_power_complete (uint8_t dev_addr, tuh_control_xfer_t con // Connection Changes //--------------------------------------------------------------------+ -static bool connection_get_status_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer, xfer_result_t result); -static bool connection_clear_conn_change_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer, xfer_result_t result); -static bool connection_port_reset_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer, xfer_result_t result); +static bool connection_get_status_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer); +static bool connection_clear_conn_change_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer); +static bool connection_port_reset_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer); // callback as response of interrupt endpoint polling bool hub_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) @@ -336,9 +335,9 @@ bool hub_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32 return true; } -static bool connection_get_status_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer, xfer_result_t result) +static bool connection_get_status_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer) { - TU_ASSERT(result == XFER_RESULT_SUCCESS); + TU_ASSERT(xfer->result == XFER_RESULT_SUCCESS); hub_interface_t* p_hub = get_itf(dev_addr); uint8_t const port_num = (uint8_t) xfer->setup->wIndex; @@ -364,9 +363,9 @@ static bool connection_get_status_complete (uint8_t dev_addr, tuh_control_xfer_t return true; } -static bool connection_clear_conn_change_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer, xfer_result_t result) +static bool connection_clear_conn_change_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer) { - TU_ASSERT(result == XFER_RESULT_SUCCESS); + TU_ASSERT(xfer->result == XFER_RESULT_SUCCESS); hub_interface_t* p_hub = get_itf(dev_addr); uint8_t const port_num = (uint8_t) xfer->setup->wIndex; @@ -395,9 +394,9 @@ static bool connection_clear_conn_change_complete (uint8_t dev_addr, tuh_control return true; } -static bool connection_port_reset_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer, xfer_result_t result) +static bool connection_port_reset_complete (uint8_t dev_addr, tuh_control_xfer_t const * xfer) { - TU_ASSERT(result == XFER_RESULT_SUCCESS); + TU_ASSERT(xfer->result == XFER_RESULT_SUCCESS); // hub_interface_t* p_hub = get_itf(dev_addr); uint8_t const port_num = (uint8_t) xfer->setup->wIndex; diff --git a/src/host/usbh.c b/src/host/usbh.c index d2d819ec2..00afe609f 100644 --- a/src/host/usbh.c +++ b/src/host/usbh.c @@ -882,12 +882,12 @@ bool usbh_edpt_busy(uint8_t dev_addr, uint8_t ep_addr) // Control transfer //--------------------------------------------------------------------+ -static bool _control_blocking_complete_cb(uint8_t daddr, tuh_control_xfer_t const * xfer, xfer_result_t result) +static bool _control_blocking_complete_cb(uint8_t daddr, tuh_control_xfer_t const * xfer) { (void) daddr; // update result - *((xfer_result_t*) xfer->user_arg) = result; + *((xfer_result_t*) xfer->user_arg) = xfer->result; return true; } @@ -924,19 +924,17 @@ bool tuh_control_xfer (uint8_t daddr, tuh_control_xfer_t const* xfer) TU_ASSERT( hcd_setup_send(rhport, daddr, (uint8_t*) &_ctrl_xfer.request) ); }else { - // user_arg must point to xfer_result_t to hold result - TU_VERIFY(xfer->user_arg); - // blocking if complete callback is not provided // change callback to internal blocking, and result as user argument - volatile xfer_result_t* result = (volatile xfer_result_t*) xfer->user_arg; + volatile xfer_result_t result = XFER_RESULT_INVALID; + // use user_arg to point to xfer_result_t + _ctrl_xfer.user_arg = (uintptr_t) &result; _ctrl_xfer.complete_cb = _control_blocking_complete_cb; - *result = XFER_RESULT_INVALID; TU_ASSERT( hcd_setup_send(rhport, daddr, (uint8_t*) &_ctrl_xfer.request) ); - while ((*result) == XFER_RESULT_INVALID) + while (result == XFER_RESULT_INVALID) { // only need to call task if not preempted RTOS #if CFG_TUSB_OS == OPT_OS_NONE || CFG_TUSB_OS == OPT_OS_PICO @@ -982,6 +980,7 @@ static void _xfer_complete(uint8_t dev_addr, xfer_result_t result) tuh_control_xfer_t const xfer_temp = { .ep_addr = 0, + .result = result, .setup = &request, .actual_len = 0, .buffer = _ctrl_xfer.buffer, @@ -995,7 +994,7 @@ static void _xfer_complete(uint8_t dev_addr, xfer_result_t result) if (xfer_temp.complete_cb) { - xfer_temp.complete_cb(dev_addr, &xfer_temp, result); + xfer_temp.complete_cb(dev_addr, &xfer_temp); } } @@ -1120,9 +1119,9 @@ static bool parse_configuration_descriptor (uint8_t dev_addr, tusb_desc_configur static void enum_full_complete(void); // process device enumeration -static bool process_enumeration(uint8_t dev_addr, tuh_control_xfer_t const * xfer, xfer_result_t result) +static bool process_enumeration(uint8_t dev_addr, tuh_control_xfer_t const * xfer) { - if (XFER_RESULT_SUCCESS != result) + if (XFER_RESULT_SUCCESS != xfer->result) { // stop enumeration, maybe we could retry this enum_full_complete(); @@ -1323,11 +1322,12 @@ static bool enum_new_device(hcd_event_t* event) _dev0.speed = hcd_port_speed_get(_dev0.rhport ); TU_LOG2("%s Speed\r\n", tu_str_speed[_dev0.speed]); - // start the enumeration process + // fake transfer to kick-off the enumeration process tuh_control_xfer_t xfer; + xfer.result = XFER_RESULT_SUCCESS; xfer.user_arg = ENUM_ADDR0_DEVICE_DESC; - process_enumeration(0, &xfer, XFER_RESULT_SUCCESS); + process_enumeration(0, &xfer); } #if CFG_TUH_HUB diff --git a/src/host/usbh.h b/src/host/usbh.h index 7dffcb453..a2372ad01 100644 --- a/src/host/usbh.h +++ b/src/host/usbh.h @@ -42,15 +42,19 @@ struct tuh_control_xfer_s; typedef struct tuh_control_xfer_s tuh_control_xfer_t; -typedef bool (*tuh_control_xfer_cb_t)(uint8_t daddr, tuh_control_xfer_t const * xfer, xfer_result_t result); +typedef bool (*tuh_control_xfer_cb_t)(uint8_t daddr, tuh_control_xfer_t const * xfer); struct tuh_control_xfer_s { uint8_t ep_addr; + xfer_result_t result; + tusb_control_request_t const* setup; uint32_t actual_len; uint8_t* buffer; + + tuh_control_xfer_cb_t complete_cb; uintptr_t user_arg; }; |
