diff --git a/include/libopencm3/usb/dwc/otg_common.h b/include/libopencm3/usb/dwc/otg_common.h
index 8a703713b4..49efa9fa1e 100644
--- a/include/libopencm3/usb/dwc/otg_common.h
+++ b/include/libopencm3/usb/dwc/otg_common.h
@@ -99,6 +99,8 @@
#define OTG_GOTGCTL_HSHNPEN (1 << 10)
#define OTG_GOTGCTL_HNPRQ (1 << 9)
#define OTG_GOTGCTL_HNGSCS (1 << 8)
+#define OTG_GOTGCTL_BVALOVAL (1 << 7)
+#define OTG_GOTGCTL_BVALOEN (1 << 6)
#define OTG_GOTGCTL_SRQ (1 << 1)
#define OTG_GOTGCTL_SRQSCS (1 << 0)
diff --git a/lib/usb/usb_f107.c b/lib/usb/usb_f107.c
index 52df7172a6..e80e638307 100644
--- a/lib/usb/usb_f107.c
+++ b/lib/usb/usb_f107.c
@@ -17,6 +17,12 @@
* along with this library. If not, see .
*/
+/*
+ * USB full-speed driver and peripheral initialization for STM32
+ * F1, F2 and F4 series with a OTG full-speed USB peripheral.
+ * The code support USB device mode only.
+ */
+
#include
#include
#include
@@ -63,11 +69,14 @@ static usbd_device *stm32f107_usbd_init(void)
while (OTG_FS_GRSTCTL & OTG_GRSTCTL_CSRST);
if (OTG_FS_CID >= OTG_CID_HAS_VBDEN) {
- /* Enable VBUS detection in device mode and power up the PHY. */
- OTG_FS_GCCFG |= OTG_GCCFG_VBDEN | OTG_GCCFG_PWRDWN;
+ /* Disable VBUS sensing and power up the PHY. */
+ OTG_FS_GCCFG |= OTG_GCCFG_PWRDWN;
+ OTG_FS_GCCFG &= ~OTG_GCCFG_VBDEN;
+ OTG_FS_GOTGCTL |= OTG_GOTGCTL_BVALOEN| OTG_GOTGCTL_BVALOVAL;
} else {
- /* Enable VBUS sensing in device mode and power up the PHY. */
- OTG_FS_GCCFG |= OTG_GCCFG_VBUSBSEN | OTG_GCCFG_PWRDWN;
+ /* Disable VBUS sensing and power up the PHY. */
+ OTG_FS_GCCFG |= OTG_GCCFG_NOVBUSSENS | OTG_GCCFG_PWRDWN;
+ OTG_FS_GCCFG &= ~(OTG_GCCFG_VBUSBSEN | OTG_GCCFG_VBUSASEN);
}
/* Explicitly enable DP pullup (not all cores do this by default) */
OTG_FS_DCTL &= ~OTG_DCTL_SDIS;