diff --git a/firmware/apps/dfu/main.c b/firmware/apps/dfu/main.c index a90b9ac9..ff31296c 100644 --- a/firmware/apps/dfu/main.c +++ b/firmware/apps/dfu/main.c @@ -194,6 +194,12 @@ extern int main(void) board_main_top(); TRACE_INFO("USB init...\n\r"); + /* Signal USB reset by disabling the pull-up on USB D+ for at least 10 ms */ + const Pin usb_dp_pullup = PIN_USB_PULLUP; + PIO_Configure(&usb_dp_pullup, 1); + PIO_Set(&usb_dp_pullup); + mdelay(15); + PIO_Clear(&usb_dp_pullup); USBDFU_Initialize(&dfu_descriptors); while (USBD_GetState() < USBD_STATE_CONFIGURED) { diff --git a/firmware/libboard/common/include/board_common.h b/firmware/libboard/common/include/board_common.h index 9cd1f89f..c3bb2357 100644 --- a/firmware/libboard/common/include/board_common.h +++ b/firmware/libboard/common/include/board_common.h @@ -85,11 +85,10 @@ #define SIM_PWEN PIO_PA5 #define VCC_FWD PIO_PA26 - -//** USB **/ -// USB pull-up control pin definition (PA16). -// Default: 1 (USB Pullup deactivated) -#define PIN_USB_PULLUP {1 << 16, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT} +/** Pin configuration to control USB pull-up on D+ + * @details the USB pull-up on D+ is enable by default on the board but can be disabled by setting PA16 high + */ +#define PIN_USB_PULLUP {PIO_PA16, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT} // Board has UDP controller #define BOARD_USB_UDP diff --git a/firmware/libcommon/source/usb.c b/firmware/libcommon/source/usb.c index bb77361b..d317435d 100644 --- a/firmware/libcommon/source/usb.c +++ b/firmware/libcommon/source/usb.c @@ -603,11 +603,17 @@ static const USBDDriverDescriptors driverDescriptors = { void SIMtrace_USB_Initialize(void) { + + /* Signal USB reset by disabling the pull-up on USB D+ for at least 10 ms */ + const Pin usb_dp_pullup = PIN_USB_PULLUP; + PIO_Configure(&usb_dp_pullup, 1); + PIO_Set(&usb_dp_pullup); + mdelay(15); + PIO_Clear(&usb_dp_pullup); + // Get std USB driver USBDDriver *pUsbd = USBD_GetDriver(); - TRACE_DEBUG("."); - // Initialize standard USB driver USBDDriver_Initialize(pUsbd, &driverDescriptors, 0); // Multiple interface settings not supported USBD_Init();