From f5869d4a59ebee1bfc0baa239bedc99e10bd9a0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Redon?= Date: Sun, 17 Jun 2018 22:31:21 +0200 Subject: [PATCH] USB: implement USB reset by setting the on-board pull-up on D+ low --- firmware/apps/dfu/main.c | 6 ++++++ firmware/libboard/common/include/board_common.h | 9 ++++----- firmware/libcommon/source/usb.c | 10 ++++++++-- 3 files changed, 18 insertions(+), 7 deletions(-) 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();