History: usbh_drv_synopsys_otg

This page describes all changes made to the usbh_drv_synopsys_otg package, the USB Synopsys OTG Host Controller, since its release.


3.23 (2021-02-22, 11:55)

  • Removed usage of STM32 specific register writes from synopsys_reset_core() when AHB core is reset.
  • Introduced synopsys_uh_hw_reset_ahb_core() to be able to reset the AHB core in a platform specific way.
  • Fixed register usage. At some places device registers were used instead of host registers.
  • Fixed ISO transfer failures: a completed ISO transfer could cause the next chained ISO transfer state to be set to completed before it was finished.

3.22 (2020-10-02, 18:00)

  • Added timeout check into synopsys_reset_core() to ensure that the process of reset is not hung in case of a HW issue.
  • In case of device disconnection, transfers could sometimes get stuck into the common USB layer, resulting in managing non-existing (timeout) transfers.
    • Added mutex protection into synopsys_reset_core() to handle the situation when the transfer task is waiting for the driver to remove a pending transfer and the port manager issues a core reset because of a disconnect event.
    • Removed the reset of the completed transfer list from synopsys_reset_core() because in case of a disconnect event it can happen that the transfer task was unable to process all transfers before the function is called leading to a situation where a transfer is not gracefully ended.
  • Fixed compiler warnings.

3.21 (2020-06-02, 16:20):

  • Power-off, power-on timings changed during initialization and re-connection to fix seldom connection problems with certain devices. New config options introduced to be able to control these times as those may vary depending on the target HW (SYNOPSYS_RESET_START_WAIT_TIME_MS, SYNOPSYS_RESET_END_WAIT_TIME_MS, SYNOPSYS_POWER_STABILIZE_TIME_MS and SYNOPSYS_POWER_OFF_TIME_MS).

3.20 (2020-04-29, 16:37):

  • Connection and disconnection of devices made more reliable:
    • In case of transfer remove, first the appropriate Tx or Rx FIFO gets flushed after the AHB master got idle, and then the channel gets disabled.
    • The port connect status (PCSTS) bit is used to detect a disconnect event instead of the PCDET bit, which only indicates a connection event.
    • The Synopsys core gets reset if the synopsys_uh_hub_scan() function reports disconnection, in order to avoid the faulty behaviour of the interrupt handler.)

3.19 (2020-03-24, 11:27):

  • Synopsys core reset may be applied if disconnection happens during the USB reset sequence. Previously this could cause enumeration failure in rare situations after a disconnect/connect sequence during enumeration.

3.18 (2020-03-13, 14:57):

  • Warnings removed.
  • PSP added for stm32f47x. 

3.17 (2019-09-23, 09:09):

  • Eliminated compiler warning.

3.16 (2019-05-29, 18:30):

  • Added OTG SRP and HRP support.

3.15 (2019-02-22, 13:14):

  • Introduced new configuration option SYNOPSYS_UH_DISCONNECT_NORESET. When device disconnection happens during port reset, the driver resets the Synopsys core. In certain cases this locks up the core (OTG_GRSTCTL CSRST autoclear never happens). This configuration option disables Synopsys core reset under this circumstance.
  • Removed unnecessary psp_isr.h include. (Build failed with OAL that does not use psp_isr.)

3.14 (2019-02-14, 16:46):

  • Wait for soft reset to complete. In certain cases (high compiler optimization) not waiting for reset complete could hang up USB core.

3.13r2 (2018-08-29, 18:10):

  • Document HTML link added to the documentation folder.
  • History and document files renamed to the package name.

3.13 (2018-02-22, 14:54):

  • Disconnecting a device during a transmission or reception might rarely cause non-deterministic behavior, including a processor fault caused by invalid memory access or the USBH stack becoming inoperative. It could also possibly enter an endless loop in non-RTOS mode.

3.12 (2017-12-14, 14:34):

  • When multiple USB hubs are stacked and hub is disconnected, EP0 may hangup. The transfer's retry count was decreased as a workaround.


  • Calls of oal_task_sleep() eliminated from interrupt context.
  • Missing OAL_ISR_PRE/OAL_ISR_POST macros added.


  • Compiler warning eliminated.


  • STM32's OTG_HS core could hang during initialization when used in HS mode with ULPI.


  • Added workaround reporting port change when port is disabled accidentally without any known reason.


  • Core could unintentionally start acting as device after device disconnection, preventing further connections on the port.
  • Several GCC warnings eliminated.


  • STM32's OTG_HS core could hang during initialization when used in FS mode with internal PHY.


  • Added SW workaround for further port connection related issues.
  • External timer introduced instead of the internal frame counter of the Synopsys core.


  • Accidentally HW reports successful USB reset when a LS device is connected, while it does not start communication to the device. The SW workaround for this case has been introduced and can be enabled with the new configuration parameter SYNOPSYS_UH_CHECK_FS_RESET.
  • psp reset_start() and psp_reset_end() introduced instead of reset().


  • Stopping and starting the FS core could sometimes lead to a lockup in the driver causing further connections to fail.
  • Made compatible to new psp_usbh_synopsys_otg major version.
  • Module init, start, stop, delete functions cleaned up.


  • Disconnection of a device from the root HUB could sometimes lead to a lockup in the driver causing further connections to fail.


  • Module renamed to usbh_synopsys_otg.


  • Updated to work with USB host base major version 3.


  • USB host lockup could occur if transfer status was polled with usbh_transfer_status() function.


  • FS mode working again (if STM32UH_FS_USED is set to 1).


  • used flag never cleared for device address zero.
  • INT transfer NYET/TXERR handling applied for BULK transfers as well.
  • non-periodic transfers prohibited to start (just like INT transfers) in the same frame a SPLIT transaction has started in.


  • Reset USB OTG HS module in stm32uh_start() function.


  • sometimes transfers didn't finish correctly in case of device removal or transfer stop in case of timeout.


  • added support for remote wakeup.
  • fixed the case when a FS/LS device behind a HS hub goes to suspend.
  • fixed the case when a HS Hub responses with a NYET to a CSPLIT-IN.


  • fixed suspend-resume issue.


  • fast connect-disconnect issue solved.


  • No transfers started from transfer_start() api function to avoid possible starvation of pending INT transfers.
  • Added protection against the case when a device sends more data than requested (buffer overflow eliminated).


  • Disconnect of device0 (directly from port) fix.


 - configuration reorganized.

 - resource deletion added to stm32uh_delete.


 - handle INT OUT endpoints as bulk.


 - stm32uh_start(): the PWRDWN bit in the GCCFG register is now set only in case an internal FS transceiver is used (for the OTG_FS, or for the OTG_HS when used with internal FS PHY), PB14 and PB15 couldn't be used as GPIO is PWRDWN was set if used with ULPI.


 - _stm32uh_schedule(): td.retry set back to original value.

 - add_ep(): removed debug code setting interval to constant 1.

 - stm32uh_get_frame_number(): value divided by 8 in case of a HS link.

 - periodic transfers are only allowed at the beginning of the frame and can never be executed after a non-periodic transfer (in the same frame).

 - periodic transfers are not allowed after split transactions in the same frame.


 - SPLIT communication fix in case ONE_NAK_PER_FRAME = 0.

 - disconnect fix in case case ONE_NAK_PER_FRAME = 0.


 - USB reset delay fix: 10ms instead of 1ms.


 - fixes regarding USB reset.


 - several fixes regarding SPLIT transactions.


 - added support for two units (using OTG_FS and OTG_HS parallel).


 - INT endpoint interval calculation fixed for HS devices.


 - root hub disconnect issue fixed.


 - driver made independent of psp (includes psp header instead of stm32f10x/20x reg. def.).


 - hw specific init changed.

 - non hw specific init moved to stm32uh_init().


 - added support to run with internal FS PHY instead of external ULPI.


 - new register definition file hcc_stm32_regs.h used.

 - added call to stm32uh_hw_stop() from stm32uh_stop().


 - fix in add_ep() for when hub is present.

 - fixed issue with fast connect/disconnect when ONE_NAK_PER_FRAME is enabled.


 - _stm32uh_remove_transfer(): calls of oal_task_sleep() removed (interrupt context).

 - KEIL compilation warnings eliminated.

 - call of cb_fn() removed (done in the upper layer).


 - corrected NP_FT_REMAIN value for OTG_FS.

 - fixed problem with fast connect-disconnect.

 - stm32uh.h: always used OTG_xS_IRQn; defined in config_usbh_stm32uh.h if not defined in library include file.


 - _stm32uh_remove_transfer(): fixed channel halting problem.

 - added version number check to stm32uh.c.


 - Initial release.