Skip to content

Commit

Permalink
Merge pull request #1763 from hathach/host-retry-failed-enumeration-r…
Browse files Browse the repository at this point in the history
…equest

Retry a few times with transfers in enumeration since device can be unstable when starting up
  • Loading branch information
hathach committed Nov 28, 2022
2 parents 081e4ee + be6f6f2 commit 52a9098
Show file tree
Hide file tree
Showing 8 changed files with 29 additions and 27 deletions.
4 changes: 0 additions & 4 deletions examples/host/bare_api/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,8 @@ if(FAMILY STREQUAL "rp2040")

# due to warnings from Pico-PIO-USB
target_compile_options(${PROJECT} PUBLIC
-Wno-error=shadow
-Wno-error=cast-align
-Wno-error=cast-qual
-Wno-error=redundant-decls
-Wno-error=sign-conversion
-Wno-error=conversion
-Wno-error=unused-function
)
endif()
4 changes: 0 additions & 4 deletions examples/host/cdc_msc_hid/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,8 @@ if(FAMILY STREQUAL "rp2040")

# due to warnings from Pico-PIO-USB
target_compile_options(${PROJECT} PUBLIC
-Wno-error=shadow
-Wno-error=cast-align
-Wno-error=cast-qual
-Wno-error=redundant-decls
-Wno-error=sign-conversion
-Wno-error=conversion
-Wno-error=unused-function
)
endif()
4 changes: 0 additions & 4 deletions examples/host/hid_controller/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,8 @@ if(FAMILY STREQUAL "rp2040")

# due to warnings from Pico-PIO-USB
target_compile_options(${PROJECT} PUBLIC
-Wno-error=shadow
-Wno-error=cast-align
-Wno-error=cast-qual
-Wno-error=redundant-decls
-Wno-error=sign-conversion
-Wno-error=conversion
-Wno-error=unused-function
)
endif()
4 changes: 0 additions & 4 deletions examples/host/msc_file_explorer/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,8 @@ if(FAMILY STREQUAL "rp2040")

# due to warnings from Pico-PIO-USB
target_compile_options(${PROJECT} PUBLIC
-Wno-error=shadow
-Wno-error=cast-align
-Wno-error=cast-qual
-Wno-error=redundant-decls
-Wno-error=sign-conversion
-Wno-error=conversion
-Wno-error=unused-function
)
endif()
2 changes: 1 addition & 1 deletion hw/mcu/raspberry_pi/Pico-PIO-USB
2 changes: 1 addition & 1 deletion src/common/tusb_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ enum {

typedef enum
{
XFER_RESULT_SUCCESS,
XFER_RESULT_SUCCESS = 0,
XFER_RESULT_FAILED,
XFER_RESULT_STALLED,
XFER_RESULT_TIMEOUT,
Expand Down
24 changes: 19 additions & 5 deletions src/host/usbh.c
Original file line number Diff line number Diff line change
Expand Up @@ -620,9 +620,7 @@ static void _xfer_complete(uint8_t daddr, xfer_result_t result)
.user_data = _ctrl_xfer.user_data
};

usbh_lock();
_ctrl_xfer.stage = CONTROL_STAGE_IDLE;
usbh_unlock();
_set_control_xfer_stage(CONTROL_STAGE_IDLE);

if (xfer_temp.complete_cb)
{
Expand Down Expand Up @@ -1182,12 +1180,28 @@ static void enum_full_complete(void);
// process device enumeration
static void process_enumeration(tuh_xfer_t* xfer)
{
// Retry a few times with transfers in enumeration since device can be unstable when starting up
enum {
ATTEMPT_COUNT_MAX = 3,
ATTEMPT_DELAY_MS = 100
};
static uint8_t failed_count = 0;

if (XFER_RESULT_SUCCESS != xfer->result)
{
// stop enumeration, maybe we could retry this
enum_full_complete();
// retry if not reaching max attempt
if ( failed_count < ATTEMPT_COUNT_MAX )
{
failed_count++;
osal_task_delay(ATTEMPT_DELAY_MS); // delay a bit
TU_ASSERT(tuh_control_xfer(xfer), );
}else
{
enum_full_complete();
}
return;
}
failed_count = 0;

uint8_t const daddr = xfer->daddr;
uintptr_t const state = xfer->user_data;
Expand Down
12 changes: 8 additions & 4 deletions src/host/usbh.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,15 @@ struct tuh_xfer_s
{
uint8_t daddr;
uint8_t ep_addr;

uint8_t TU_RESERVED; // reserved
xfer_result_t result;

uint32_t actual_len; // excluding setup packet

union
{
tusb_control_request_t const* setup; // setup packet pointer if control transfer
uint32_t buflen; // expected length if not control transfer (not available in callback)
uint32_t buflen; // expected length if not control transfer (not available in callback)
};

uint8_t* buffer; // not available in callback if not control transfer
Expand All @@ -80,10 +81,13 @@ enum

//TU_ATTR_WEAK uint8_t tuh_attach_cb (tusb_desc_device_t const *desc_device);

// Invoked when device is mounted (configured)
// Invoked when a device is mounted (configured)
TU_ATTR_WEAK void tuh_mount_cb (uint8_t daddr);

/// Invoked when device is unmounted (bus reset/unplugged)
// Invoked when a device failed to mount during enumeration process
// TU_ATTR_WEAK void tuh_mount_failed_cb (uint8_t daddr);

/// Invoked when a device is unmounted (detached)
TU_ATTR_WEAK void tuh_umount_cb(uint8_t daddr);

//--------------------------------------------------------------------+
Expand Down

0 comments on commit 52a9098

Please sign in to comment.