1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-12 19:10:32 +03:00

Merge pull request #11669 from SteveCEvans/hal_usb_timeout

Use timed timeouts for USB HAL functions, not simple counts, as per H7
This commit is contained in:
haslinghuis 2022-06-28 02:13:05 +02:00 committed by GitHub
commit 88ae4e907e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 101 additions and 42 deletions

View file

@ -71,6 +71,27 @@
/* Private typedef -----------------------------------------------------------*/ /* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/
/** @defgroup USB_OTG_GRSTCTL_AHBIDL_TIMEOUT_MS AHB master idle timeout
* @{
*/
#define USB_OTG_GRSTCTL_AHBIDL_TIMEOUT_MS ((uint32_t)50U)
/** @defgroup USB_OTG_GRSTCTL_CSRST_TIMEOUT_MS Core soft reset timeout
* @{
*/
#define USB_OTG_GRSTCTL_CSRST_TIMEOUT_MS ((uint32_t)10U)
/** @defgroup USB_OTG_GRSTCTL_TXFFLSH_TIMEOUT_MS Tx FIFO flush timeout
* @{
*/
#define USB_OTG_GRSTCTL_TXFFLSH_TIMEOUT_MS ((uint32_t)5U)
/** @defgroup USB_OTG_GRSTCTL_RXFFLSH_TIMEOUT_MS Rx FIFO flush timeout
* @{
*/
#define USB_OTG_GRSTCTL_RXFFLSH_TIMEOUT_MS ((uint32_t)5U)
/* Private variables ---------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/ /* Private functions ---------------------------------------------------------*/
@ -350,18 +371,21 @@ HAL_StatusTypeDef USB_DevInit (USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c
*/ */
HAL_StatusTypeDef USB_FlushTxFifo (USB_OTG_GlobalTypeDef *USBx, uint32_t num ) HAL_StatusTypeDef USB_FlushTxFifo (USB_OTG_GlobalTypeDef *USBx, uint32_t num )
{ {
uint32_t count = 0; uint32_t tickstart;
USBx->GRSTCTL = ( USB_OTG_GRSTCTL_TXFFLSH |(uint32_t)( num << 6)); USBx->GRSTCTL = (USB_OTG_GRSTCTL_TXFFLSH | (num << 6));
do /* Get tick */
tickstart = HAL_GetTick();
/* Wait for AHB master IDLE state. */
while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_TXFFLSH) == USB_OTG_GRSTCTL_TXFFLSH)
{ {
if (++count > 200000) if ((HAL_GetTick() - tickstart) > USB_OTG_GRSTCTL_TXFFLSH_TIMEOUT_MS)
{ {
return HAL_TIMEOUT; return HAL_TIMEOUT;
} }
} }
while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_TXFFLSH) == USB_OTG_GRSTCTL_TXFFLSH);
return HAL_OK; return HAL_OK;
} }
@ -374,19 +398,22 @@ HAL_StatusTypeDef USB_FlushTxFifo (USB_OTG_GlobalTypeDef *USBx, uint32_t num )
*/ */
HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx) HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx)
{ {
uint32_t count = 0; uint32_t tickstart;
USBx->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH; USBx->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH;
do /* Get tick */
tickstart = HAL_GetTick();
/* Wait for AHB master IDLE state. */
while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_RXFFLSH) == USB_OTG_GRSTCTL_RXFFLSH)
{ {
if (++count > 200000) if ((HAL_GetTick() - tickstart) > USB_OTG_GRSTCTL_RXFFLSH_TIMEOUT_MS)
{ {
return HAL_TIMEOUT; return HAL_TIMEOUT;
} }
} }
while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_RXFFLSH) == USB_OTG_GRSTCTL_RXFFLSH);
return HAL_OK; return HAL_OK;
} }
@ -1195,35 +1222,37 @@ HAL_StatusTypeDef USB_EP0_OutStart(USB_OTG_GlobalTypeDef *USBx, uint8_t dma, uin
*/ */
static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx) static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx)
{ {
uint32_t count = 0U; uint32_t tickstart;
/* Get tick */
tickstart = HAL_GetTick();
/* Wait for AHB master IDLE state. */ /* Wait for AHB master IDLE state. */
do while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U)
{ {
if (++count > 200000U) if ((HAL_GetTick() - tickstart) > USB_OTG_GRSTCTL_AHBIDL_TIMEOUT_MS)
{ {
return HAL_TIMEOUT; return HAL_TIMEOUT;
} }
} }
while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U);
/* Core Soft Reset */ /* Core Soft Reset */
count = 0U;
USBx->GRSTCTL |= USB_OTG_GRSTCTL_CSRST; USBx->GRSTCTL |= USB_OTG_GRSTCTL_CSRST;
do /* Get tick */
tickstart = HAL_GetTick();
while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST)
{ {
if (++count > 200000U) if ((HAL_GetTick() - tickstart) > USB_OTG_GRSTCTL_CSRST_TIMEOUT_MS)
{ {
return HAL_TIMEOUT; return HAL_TIMEOUT;
} }
} }
while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST);
return HAL_OK; return HAL_OK;
} }
/** /**
* @brief USB_HostInit : Initializes the USB OTG controller registers * @brief USB_HostInit : Initializes the USB OTG controller registers
* for Host mode * for Host mode

View file

@ -49,6 +49,27 @@
/* Private typedef -----------------------------------------------------------*/ /* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/
/** @defgroup USB_OTG_GRSTCTL_AHBIDL_TIMEOUT_MS AHB master idle timeout
* @{
*/
#define USB_OTG_GRSTCTL_AHBIDL_TIMEOUT_MS ((uint32_t)50U)
/** @defgroup USB_OTG_GRSTCTL_CSRST_TIMEOUT_MS Core soft reset timeout
* @{
*/
#define USB_OTG_GRSTCTL_CSRST_TIMEOUT_MS ((uint32_t)10U)
/** @defgroup USB_OTG_GRSTCTL_TXFFLSH_TIMEOUT_MS Tx FIFO flush timeout
* @{
*/
#define USB_OTG_GRSTCTL_TXFFLSH_TIMEOUT_MS ((uint32_t)5U)
/** @defgroup USB_OTG_GRSTCTL_RXFFLSH_TIMEOUT_MS Rx FIFO flush timeout
* @{
*/
#define USB_OTG_GRSTCTL_RXFFLSH_TIMEOUT_MS ((uint32_t)5U)
/* Private variables ---------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/ /* Private functions ---------------------------------------------------------*/
@ -479,19 +500,22 @@ HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cf
*/ */
HAL_StatusTypeDef USB_FlushTxFifo(USB_OTG_GlobalTypeDef *USBx, uint32_t num) HAL_StatusTypeDef USB_FlushTxFifo(USB_OTG_GlobalTypeDef *USBx, uint32_t num)
{ {
uint32_t count = 0U; uint32_t tickstart;
USBx->GRSTCTL = (USB_OTG_GRSTCTL_TXFFLSH | (num << 6)); USBx->GRSTCTL = (USB_OTG_GRSTCTL_TXFFLSH | (num << 6));
do /* Get tick */
tickstart = HAL_GetTick();
/* Wait for AHB master IDLE state. */
while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_TXFFLSH) == USB_OTG_GRSTCTL_TXFFLSH)
{ {
if (++count > 200000U) if ((HAL_GetTick() - tickstart) > USB_OTG_GRSTCTL_TXFFLSH_TIMEOUT_MS)
{ {
return HAL_TIMEOUT; return HAL_TIMEOUT;
} }
} }
while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_TXFFLSH) == USB_OTG_GRSTCTL_TXFFLSH);
return HAL_OK; return HAL_OK;
} }
@ -502,18 +526,21 @@ HAL_StatusTypeDef USB_FlushTxFifo(USB_OTG_GlobalTypeDef *USBx, uint32_t num)
*/ */
HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx) HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx)
{ {
uint32_t count = 0; uint32_t tickstart;
USBx->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH; USBx->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH;
do /* Get tick */
tickstart = HAL_GetTick();
/* Wait for AHB master IDLE state. */
while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_RXFFLSH) == USB_OTG_GRSTCTL_RXFFLSH)
{ {
if (++count > 200000U) if ((HAL_GetTick() - tickstart) > USB_OTG_GRSTCTL_RXFFLSH_TIMEOUT_MS)
{ {
return HAL_TIMEOUT; return HAL_TIMEOUT;
} }
} }
while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_RXFFLSH) == USB_OTG_GRSTCTL_RXFFLSH);
return HAL_OK; return HAL_OK;
} }
@ -1313,30 +1340,33 @@ HAL_StatusTypeDef USB_EP0_OutStart(USB_OTG_GlobalTypeDef *USBx, uint8_t dma, uin
*/ */
static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx) static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx)
{ {
uint32_t count = 0U; uint32_t tickstart;
/* Get tick */
tickstart = HAL_GetTick();
/* Wait for AHB master IDLE state. */ /* Wait for AHB master IDLE state. */
do while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U)
{ {
if (++count > 200000U) if ((HAL_GetTick() - tickstart) > USB_OTG_GRSTCTL_AHBIDL_TIMEOUT_MS)
{ {
return HAL_TIMEOUT; return HAL_TIMEOUT;
} }
} }
while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U);
/* Core Soft Reset */ /* Core Soft Reset */
count = 0U;
USBx->GRSTCTL |= USB_OTG_GRSTCTL_CSRST; USBx->GRSTCTL |= USB_OTG_GRSTCTL_CSRST;
do /* Get tick */
tickstart = HAL_GetTick();
while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST)
{ {
if (++count > 200000U) if ((HAL_GetTick() - tickstart) > USB_OTG_GRSTCTL_CSRST_TIMEOUT_MS)
{ {
return HAL_TIMEOUT; return HAL_TIMEOUT;
} }
} }
while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST);
return HAL_OK; return HAL_OK;
} }