From c7d0244f723938c3dde50ed66d0ddf9a44125197 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?King=20K=C3=A9vin?= Date: Fri, 3 Jan 2020 20:16:02 +0100 Subject: [PATCH] USB: fix disconnect --- lib/usb_cdcacm.c | 7 +++++-- lib/usb_dfu.c | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/usb_cdcacm.c b/lib/usb_cdcacm.c index 7d25abc..95c1874 100644 --- a/lib/usb_cdcacm.c +++ b/lib/usb_cdcacm.c @@ -262,13 +262,16 @@ static void usb_disconnect(void) // enable USB D+ pull-up rcc_periph_clock_enable(RCC_GPIOB); gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO6); - gpio_set(GPIOB, GPIO6); + gpio_clear(GPIOB, GPIO6); #endif // pull USB D+ low for a short while rcc_periph_clock_enable(RCC_GPIOA); gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO12); gpio_clear(GPIOA, GPIO12); - sleep_ms(50); // USB disconnected must be at least 10 ms long, at most 100 ms + // USB disconnected must be at least 10 ms long, at most 100 ms + for (uint32_t i = 0; i < 0x2000; i++) { + __asm__("nop"); + } } /** DFU detach (disconnect USB and perform core reset) diff --git a/lib/usb_dfu.c b/lib/usb_dfu.c index eab0ec1..1df306a 100644 --- a/lib/usb_dfu.c +++ b/lib/usb_dfu.c @@ -143,13 +143,16 @@ static void usb_disconnect(void) // enable USB D+ pull-up rcc_periph_clock_enable(RCC_GPIOB); gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO6); - gpio_set(GPIOB, GPIO6); + gpio_clear(GPIOB, GPIO6); #endif // pull USB D+ low for a short while rcc_periph_clock_enable(RCC_GPIOA); gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO12); gpio_clear(GPIOA, GPIO12); - sleep_ms(50); // USB disconnected must be at least 10 ms long, at most 100 ms + // USB disconnected must be at least 10 ms long, at most 100 ms + for (uint32_t i = 0; i < 0x2000; i++) { + __asm__("nop"); + } } /** flash downloaded data block