Skip to main content
RhSilicon
Lead
June 21, 2023
Solved

Is it normal for the port reset to be 100ms in the USB Host software? (Min. 10 ms, max. 20ms)

  • June 21, 2023
  • 1 reply
  • 1319 views

Hi,

From RM0090 (Rev 19 - February 2021), page 1393:

"Host enumeration

The application issues an USB reset (single-ended zero) via the USB by keeping the port
reset bit set in the Host port control and status register (PRST bit in OTG_HS_HPRT) for a
minimum of 10 ms and a maximum of 20 ms. The application monitors the time and then
clears the port reset bit."

But apparently the time in the software is 100ms (FW_F4 1.27.1):

stm32f4xx_ll_usb.c

 

 

/**
 * @brief USB_OTG_ResetPort : Reset Host Port
 * USBx Selected device
 * @retval HAL status
 * @note (1)The application must wait at least 10 ms
 * before clearing the reset bit.
 */
HAL_StatusTypeDef USB_ResetPort(USB_OTG_GlobalTypeDef *USBx)
{
 uint32_t USBx_BASE = (uint32_t)USBx;

 __IO uint32_t hprt0 = 0U;

 hprt0 = USBx_HPRT0;

 hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |
 USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG);

 USBx_HPRT0 = (USB_OTG_HPRT_PRST | hprt0);
 HAL_Delay(100U); /* See Note #1 */
 USBx_HPRT0 = ((~USB_OTG_HPRT_PRST) & hprt0);
 HAL_Delay(10U);

 return HAL_OK;
}

 

 

stm32f4xx_hal_hcd.c:

 

/**
 * @brief Reset the host port.
 * hhcd HCD handle
 * @retval HAL status
 */
HAL_StatusTypeDef HAL_HCD_ResetPort(HCD_HandleTypeDef *hhcd)
{
 return (USB_ResetPort(hhcd->Instance));
}

 

usbh_conf.c:

 

/**
 * @brief Reset the Host port of the low level driver.
 * phost: Host handle
 * @retval USBH status
 */
USBH_StatusTypeDef USBH_LL_ResetPort(USBH_HandleTypeDef *phost)
{
 HAL_StatusTypeDef hal_status = HAL_OK;
 USBH_StatusTypeDef usb_status = USBH_OK;

 hal_status = HAL_HCD_ResetPort(phost->pData);

 usb_status = USBH_Get_USB_Status(hal_status);

 return usb_status;
}

 

usbh_core.c:

 

/**
 * @brief USBH_Process
 * Background process of the USB Core.
 * phost: Host Handle
 * @retval USBH Status
 */
USBH_StatusTypeDef USBH_Process(USBH_HandleTypeDef *phost)
{
 __IO USBH_StatusTypeDef status = USBH_FAIL;
 uint8_t idx = 0U;

 /* check for Host pending port disconnect event */
 if (phost->device.is_disconnected == 1U)
 {
 phost->gState = HOST_DEV_DISCONNECTED;
 }

 switch (phost->gState)
 {
 case HOST_IDLE :

 if ((phost->device.is_connected) != 0U)
 {
 USBH_UsrLog("USB Device Connected");

 /* Wait for 200 ms after connection */
 phost->gState = HOST_DEV_WAIT_FOR_ATTACHMENT;
 USBH_Delay(200U);
 (void)USBH_LL_ResetPort(phost);

 

stm32f4xx_hal.c:

 

/**
 * @brief This function provides minimum delay (in milliseconds) based 
 * on variable incremented.
 * @note In the default implementation , SysTick timer is the source of time base.
 * It is used to generate interrupts at regular time intervals where uwTick
 * is incremented.
 * @note This function is declared as __weak to be overwritten in case of other
 * implementations in user file.
 * Delay specifies the delay time length, in milliseconds.
 * @retval None
 */
__weak void HAL_Delay(uint32_t Delay)
{
 uint32_t tickstart = HAL_GetTick();
 uint32_t wait = Delay;

 /* Add a freq to guarantee minimum wait */
 if (wait < HAL_MAX_DELAY)
 {
 wait += (uint32_t)(uwTickFreq);
 }

 while((HAL_GetTick() - tickstart) < wait)
 {
 }
}

 

 

STM32H7 (FW_H7 1.11.0)

stm32h7xx_ll_usb.c

 

/**
 * @brief USB_OTG_ResetPort : Reset Host Port
 * USBx Selected device
 * @retval HAL status
 * @note (1)The application must wait at least 10 ms
 * before clearing the reset bit.
 */
HAL_StatusTypeDef USB_ResetPort(USB_OTG_GlobalTypeDef *USBx)
{
 uint32_t USBx_BASE = (uint32_t)USBx;

 __IO uint32_t hprt0 = 0U;

 hprt0 = USBx_HPRT0;

 hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |
 USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG);

 USBx_HPRT0 = (USB_OTG_HPRT_PRST | hprt0);
 HAL_Delay(100U); /* See Note #1 */
 USBx_HPRT0 = ((~USB_OTG_HPRT_PRST) & hprt0);
 HAL_Delay(10U);

 return HAL_OK;
}

 

 

This topic has been closed for replies.
Best answer by waclawek.jan

> Is it normal for the port reset to be 100ms in the USB Host software?

Yes. The USB specification states, that

> The reset signaling must be driven for a minimum of 10ms (TDRST).

(USB2.0 7.1.7.5). There is no maximum specified.

JW

1 reply

waclawek.jan
waclawek.janBest answer
Super User
June 22, 2023

> Is it normal for the port reset to be 100ms in the USB Host software?

Yes. The USB specification states, that

> The reset signaling must be driven for a minimum of 10ms (TDRST).

(USB2.0 7.1.7.5). There is no maximum specified.

JW