@@ -524,7 +524,6 @@ static esp_err_t _cdc_reset_transfer_endpoint(usb_device_handle_t dev_hdl, usb_t
524524{
525525 assert (dev_hdl );
526526 assert (transfer );
527-
528527 ESP_RETURN_ON_ERROR (usb_host_endpoint_halt (dev_hdl , transfer -> bEndpointAddress ), TAG , );
529528 ESP_RETURN_ON_ERROR (usb_host_endpoint_flush (dev_hdl , transfer -> bEndpointAddress ), TAG , );
530529 usb_host_endpoint_clear (dev_hdl , transfer -> bEndpointAddress );
@@ -652,17 +651,24 @@ static esp_err_t _cdc_close(usbh_cdc_t *cdc)
652651 return ESP_ERR_INVALID_STATE ;
653652 }
654653
654+ cdc -> state = USBH_CDC_CLOSE ;
655+
655656 // Cancel polling of BULK IN
656657 if (cdc -> data .in_xfer ) {
657658 ESP_ERROR_CHECK (_cdc_reset_transfer_endpoint (cdc -> dev_hdl , cdc -> data .in_xfer ));
658659 }
659660
661+ if (cdc -> data .out_xfer ) {
662+ ESP_ERROR_CHECK (_cdc_reset_transfer_endpoint (cdc -> dev_hdl , cdc -> data .out_xfer ));
663+ }
664+
665+ // wait for transfers to complete
666+ vTaskDelay (10 / portTICK_PERIOD_MS );
660667 // Release all interfaces
661- ESP_ERROR_CHECK (usb_host_interface_release (p_usbh_cdc_obj -> cdc_client_hdl , cdc -> dev_hdl , cdc -> data . intf_desc -> bInterfaceNumber ));
668+ ESP_ERROR_CHECK (usb_host_interface_release (p_usbh_cdc_obj -> cdc_client_hdl , cdc -> dev_hdl , cdc -> intf_idx ));
662669
663670 _cdc_transfers_free (cdc );
664671 usb_host_device_close (p_usbh_cdc_obj -> cdc_client_hdl , cdc -> dev_hdl );
665- cdc -> state = USBH_CDC_CLOSE ;
666672
667673 _ring_buffer_flush (cdc -> in_ringbuf_handle );
668674 _ring_buffer_flush (cdc -> out_ringbuf_handle );
@@ -802,7 +808,7 @@ esp_err_t usbh_cdc_read_bytes(usbh_cdc_handle_t cdc_handle, const uint8_t *buf,
802808
803809 ret = _ringbuf_pop (cdc -> in_ringbuf_handle , (uint8_t * )buf , data_len , length , ticks_to_wait );
804810 if (ret != ESP_OK ) {
805- ESP_LOGD (TAG , "cdc read failed" );
811+ ESP_LOGE (TAG , "cdc read failed" );
806812 * length = 0 ;
807813 return ret ;
808814 }
0 commit comments