diff --git a/targets/TARGET_STM/USBPhy_STM32.cpp b/targets/TARGET_STM/USBPhy_STM32.cpp index 333cf7883e..7a1dc23c54 100644 --- a/targets/TARGET_STM/USBPhy_STM32.cpp +++ b/targets/TARGET_STM/USBPhy_STM32.cpp @@ -173,6 +173,15 @@ USBPhyHw::~USBPhyHw() } +#if defined(TARGET_STM32F1) +void USB_reenumerate() +{ + // Force USB_DP pin (with external pull up) to 0 + DigitalOut usb_dp_pin(USB_DP, 0) ; + wait_us(10000); // 10ms +} +#endif + void USBPhyHw::init(USBPhyEvents *events) { const PinMap *map = NULL; @@ -190,10 +199,12 @@ void USBPhyHw::init(USBPhyEvents *events) hpcd.Init.dev_endpoints = NB_ENDPOINT; hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0; hpcd.Init.low_power_enable = DISABLE; + #if !defined(TARGET_STM32F2) hpcd.Init.lpm_enable = DISABLE; hpcd.Init.battery_charging_enable = DISABLE; #endif + #if (MBED_CONF_TARGET_USB_SPEED == USE_USB_OTG_HS) hpcd.Instance = USB_OTG_HS; hpcd.Init.phy_itface = PCD_PHY_ULPI; @@ -202,22 +213,32 @@ void USBPhyHw::init(USBPhyEvents *events) hpcd.Init.vbus_sensing_enable = ENABLE; hpcd.Init.use_external_vbus = DISABLE; hpcd.Init.speed = PCD_SPEED_HIGH; + __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE(); map = PinMap_USB_HS; -#elif (MBED_CONF_TARGET_USB_SPEED == USE_USB_OTG_HS) - hpcd.Instance = USB_OTG_HS; - hpcd.Init.phy_itface = PCD_PHY_EMBEDDED; - hpcd.Init.Sof_enable = 1; - hpcd.Init.speed = PCD_SPEED_HIGH; -#elif (MBED_CONF_TARGET_USB_SPEED == USE_USB_OTG_FS) +#elif (MBED_CONF_TARGET_USB_SPEED == USE_USB_HS_IN_FS) + hpcd.Instance = USB_OTG_HS; + hpcd.Init.phy_itface = USB_OTG_EMBEDDED_PHY; + hpcd.Init.Sof_enable = ENABLE; + hpcd.Init.speed = PCD_SPEED_FULL; + hpcd.Init.dma_enable = DISABLE; + hpcd.Init.vbus_sensing_enable = DISABLE; + hpcd.Init.use_external_vbus = DISABLE; + + __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); + map = PinMap_USB_HS; + +#elif (MBED_CONF_TARGET_USB_SPEED == USE_USB_OTG_FS) hpcd.Instance = USB_OTG_FS; hpcd.Init.phy_itface = PCD_PHY_EMBEDDED; hpcd.Init.Sof_enable = 1; hpcd.Init.speed = PCD_SPEED_FULL; + __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); map = PinMap_USB_FS; + #elif (MBED_CONF_TARGET_USB_SPEED == USE_USB_NO_OTG) hpcd.Instance = USB; hpcd.Init.phy_itface = PCD_PHY_EMBEDDED; @@ -225,13 +246,18 @@ void USBPhyHw::init(USBPhyEvents *events) __HAL_RCC_USB_CLK_ENABLE(); map = PinMap_USB_FS; + +#if defined(TARGET_STM32F1) + // USB_DevConnect is empty + USB_reenumerate(); +#endif + #endif // Pass instance for usage inside call back instance = this; - // Configure USB pins and other clocks - + // Configure USB pins while (map->pin != NC) { pin_function(map->pin, map->function); map++; @@ -334,25 +360,29 @@ bool USBPhyHw::powered() void USBPhyHw::connect() { #if (MBED_CONF_TARGET_USB_SPEED == USE_USB_NO_OTG) - DigitalOut usb_disc_pin(USB_DP, 1) ; - wait_ns(1000); - usb_disc_pin = 0; + // Initializes the USB controller registers + USB_DevInit(hpcd.Instance, hpcd.Init); // hpcd.Init not used + +#if defined(TARGET_STM32F1) + // USB_DevConnect is empty + USB_reenumerate(); +#endif + +#endif - uint32_t wInterrupt_Mask = USB_CNTR_CTRM | USB_CNTR_WKUPM | USB_CNTR_SUSPM | USB_CNTR_ERRM | - USB_CNTR_SOFM | USB_CNTR_ESOFM | USB_CNTR_RESETM; - /*Set interrupt mask*/ - hpcd.Instance->CNTR = wInterrupt_Mask; - HAL_PCD_DevConnect(&hpcd); // HAL_PCD_DevConnect always return HAL_OK - wait_us(10000); -#else HAL_StatusTypeDef ret = HAL_PCD_Start(&hpcd); MBED_ASSERT(ret == HAL_OK); -#endif + + wait_us(10000); } void USBPhyHw::disconnect() { - HAL_StatusTypeDef ret = HAL_PCD_Stop(&hpcd); + /* Disable DP Pull-Up bit to disconnect the Internal PU resistor on USB DP line */ + USB_DevDisconnect(hpcd.Instance); + wait_us(10000); + + HAL_StatusTypeDef ret = HAL_PCD_Stop(&hpcd); // USB_DisableGlobalInt + USB_StopDevice MBED_ASSERT(ret == HAL_OK); }