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)

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.
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

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