@@ -486,7 +486,14 @@ static bool endpoint_callback(usbh_ep_handle_t ep_hdl, usbh_ep_event_t ep_event,
486486 return yield ;
487487}
488488
489- static void get_config_desc_transfer_cb (usb_transfer_t * transfer )
489+ /**
490+ * @brief Control transfer callback
491+ *
492+ * This callback is used in ctrl transfers for remote wakeup feature and multiconfig feature
493+ *
494+ * @param[in] transfer Pointer to ctrl transfer
495+ */
496+ static void ctrl_transfer_cb (usb_transfer_t * transfer )
490497{
491498 SemaphoreHandle_t transfer_done = (SemaphoreHandle_t )transfer -> context ;
492499 xSemaphoreGive (transfer_done );
@@ -1333,7 +1340,9 @@ esp_err_t usb_host_get_active_config_descriptor(usb_device_handle_t dev_hdl, con
13331340static usb_transfer_status_t wait_for_transmission_done (usb_transfer_t * transfer )
13341341{
13351342 SemaphoreHandle_t transfer_done = (SemaphoreHandle_t )transfer -> context ;
1343+ esp_rom_printf ("Transfer wait\n" );
13361344 xSemaphoreTake (transfer_done , portMAX_DELAY );
1345+ esp_rom_printf ("Transfer done\n" );
13371346 usb_transfer_status_t status = transfer -> status ;
13381347
13391348 // EP0 halt->flush->clear is managed by USBH and lower layers
@@ -1409,7 +1418,7 @@ esp_err_t usb_host_get_config_desc(usb_host_client_handle_t client_hdl, usb_devi
14091418
14101419 ctrl_transfer -> device_handle = dev_hdl ;
14111420 ctrl_transfer -> bEndpointAddress = 0 ;
1412- ctrl_transfer -> callback = get_config_desc_transfer_cb ;
1421+ ctrl_transfer -> callback = ctrl_transfer_cb ;
14131422 ctrl_transfer -> context = (void * )transfer_done ;
14141423
14151424 // Initiate control transfer for short config descriptor
@@ -1460,7 +1469,7 @@ esp_err_t usb_host_free_config_desc(const usb_config_desc_t *config_desc)
14601469}
14611470
14621471/**
1463- * @brief Do control transfer
1472+ * @brief Do control transfer to get/set remote wakeup feature
14641473 *
14651474 * This function: allocates transfer, sets the transfer params, submits the transfer and evaluates it
14661475 *
@@ -1474,10 +1483,12 @@ esp_err_t usb_host_free_config_desc(const usb_config_desc_t *config_desc)
14741483 *
14751484 * @return
14761485 * - ESP_OK: Transfer successful
1477- * TODO
1486+ * - ESP_ERR_NO_MEM: Not enough memory
1487+ * - ESP_ERR_INVALID_STATE: Control transfer failed
1488+ * - ESP_ERR_INVALID_RESPONSE: Invalid number of bytest returned by IN transfer stage
14781489 */
1479- static esp_err_t do_control_transfer (usb_host_client_handle_t client_hdl , usb_device_handle_t dev_hdl ,
1480- usb_setup_packet_t * setup_packet , void * data_buf , size_t data_len )
1490+ static esp_err_t remote_wake_do_control_transfer (usb_host_client_handle_t client_hdl , usb_device_handle_t dev_hdl ,
1491+ usb_setup_packet_t * setup_packet , void * data_buf , size_t data_len )
14811492{
14821493 esp_err_t ret ;
14831494 usb_transfer_t * ctrl_transfer = NULL ;
@@ -1494,7 +1505,7 @@ static esp_err_t do_control_transfer(usb_host_client_handle_t client_hdl, usb_de
14941505
14951506 ctrl_transfer -> device_handle = dev_hdl ;
14961507 ctrl_transfer -> bEndpointAddress = 0 ;
1497- ctrl_transfer -> callback = get_config_desc_transfer_cb ;
1508+ ctrl_transfer -> callback = ctrl_transfer_cb ;
14981509 ctrl_transfer -> context = (void * )transfer_done ;
14991510
15001511 // Copy setup packet
@@ -1512,15 +1523,9 @@ static esp_err_t do_control_transfer(usb_host_client_handle_t client_hdl, usb_de
15121523 goto transfer_error ;
15131524 }
15141525
1515- // Wait for completion
1516- //wait_for_transmission_done(ctrl_transfer);
1517- if (xSemaphoreTake (transfer_done , portMAX_DELAY ) != pdTRUE ) {
1518- ret = ESP_ERR_TIMEOUT ; // should not happen, but just in case
1519- goto transfer_error ;
1520- }
1521-
1522- // Check transfer status
1523- if (ctrl_transfer -> status != USB_TRANSFER_STATUS_COMPLETED ) {
1526+ // Wait for transfer to finish
1527+ const usb_transfer_status_t status_short_desc = wait_for_transmission_done (ctrl_transfer );
1528+ if (status_short_desc != USB_TRANSFER_STATUS_COMPLETED ) {
15241529 ESP_LOGE (USB_HOST_TAG , "Control transfer failed, status=%d" , ctrl_transfer -> status );
15251530 ret = ESP_ERR_INVALID_STATE ;
15261531 goto transfer_error ;
@@ -1602,7 +1607,6 @@ static esp_err_t validate_device_remote_wakeup(usb_host_client_handle_t client_h
16021607esp_err_t usb_host_device_remote_wakeup_enable (usb_host_client_handle_t client_hdl , usb_device_handle_t dev_hdl , bool enable )
16031608{
16041609 HOST_CHECK (client_hdl != NULL && dev_hdl != NULL , ESP_ERR_INVALID_ARG );
1605- esp_err_t ret ;
16061610 ESP_RETURN_ON_ERROR (validate_device_remote_wakeup (client_hdl , dev_hdl ), USB_HOST_TAG , "Device remote wakeup validation failed" );
16071611
16081612 usb_setup_packet_t setup_packet = {0 };
@@ -1615,25 +1619,22 @@ esp_err_t usb_host_device_remote_wakeup_enable(usb_host_client_handle_t client_h
16151619 }
16161620
16171621 // Send ctrl transfer enabling/disabling the remote wakeup
1618- ESP_RETURN_ON_ERROR (do_control_transfer (client_hdl , dev_hdl , & setup_packet , NULL , 0 ), USB_HOST_TAG , "CTRL transfer failed" );
1622+ ESP_RETURN_ON_ERROR (remote_wake_do_control_transfer (client_hdl , dev_hdl , & setup_packet , NULL , 0 ), USB_HOST_TAG , "CTRL transfer failed" );
16191623
16201624 return ESP_OK ;
16211625}
16221626
16231627esp_err_t usb_host_device_remote_wakeup_check (usb_host_client_handle_t client_hdl , usb_device_handle_t dev_hdl , bool * enabled )
16241628{
1625- HOST_CHECK (client_hdl != NULL && dev_hdl != NULL , ESP_ERR_INVALID_ARG );
1626- esp_err_t ret ;
1629+ HOST_CHECK (client_hdl != NULL && dev_hdl != NULL && enabled != NULL , ESP_ERR_INVALID_ARG );
16271630 ESP_RETURN_ON_ERROR (validate_device_remote_wakeup (client_hdl , dev_hdl ), USB_HOST_TAG , "Device remote wakeup validation failed" );
16281631
16291632 usb_setup_packet_t setup_packet = {0 };
16301633 usb_device_status_t device_status ;
16311634 USB_SETUP_PACKET_INIT_GET_STATUS (& setup_packet );
16321635
16331636 // Send ctrl transfer checking the remote wakeup
1634- ESP_RETURN_ON_ERROR (
1635- do_control_transfer (client_hdl , dev_hdl , & setup_packet , & device_status , sizeof (device_status )),
1636- USB_HOST_TAG , "CTRL transfer failed" );
1637+ ESP_RETURN_ON_ERROR (remote_wake_do_control_transfer (client_hdl , dev_hdl , & setup_packet , & device_status , sizeof (device_status )), USB_HOST_TAG , "CTRL transfer failed" );
16371638
16381639 // Check current status of remote wakeup
16391640 * enabled = device_status .remote_wakeup ;
@@ -2063,7 +2064,7 @@ esp_err_t usb_host_transfer_submit_control(usb_host_client_handle_t client_hdl,
20632064 // Check if the root port is suspended (global suspend)
20642065 if (hub_root_is_suspended ()) {
20652066 // Root port is suspended at the time we are submitting a ctrl transfer
2066- ESP_LOGD (USB_HOST_TAG , "Resuming the root port" );
2067+ ESP_LOGI (USB_HOST_TAG , "Resuming the root port" );
20672068
20682069 ret = usb_host_lib_root_port_resume ();
20692070 if (ret != ESP_OK ) {
0 commit comments