@@ -49,6 +49,10 @@ PCD_HandleTypeDef pcd_hs_handle;
4949#define USB_OTG_FS USB
5050#endif
5151
52+ #if defined(STM32G0 )
53+ #define USB_OTG_FS USB_DRD_FS
54+ #endif
55+
5256/*******************************************************************************
5357 PCD BSP Routines
5458*******************************************************************************/
@@ -61,6 +65,22 @@ PCD_HandleTypeDef pcd_hs_handle;
6165void HAL_PCD_MspInit (PCD_HandleTypeDef * hpcd ) {
6266 #if MICROPY_HW_USB_FS
6367 if (hpcd -> Instance == USB_OTG_FS ) {
68+ // Configure USB GPIO's.
69+
70+ #if defined(STM32G0 )
71+
72+ // These MCUs don't have an alternate function for USB but rather require
73+ // the pins to be disconnected from all peripherals, ie put in analog mode.
74+
75+ mp_hal_pin_config (pin_A11 , MP_HAL_PIN_MODE_ANALOG , MP_HAL_PIN_PULL_NONE , 0 );
76+ mp_hal_pin_config_speed (pin_A11 , GPIO_SPEED_FREQ_VERY_HIGH );
77+ mp_hal_pin_config (pin_A12 , MP_HAL_PIN_MODE_ANALOG , MP_HAL_PIN_PULL_NONE , 0 );
78+ mp_hal_pin_config_speed (pin_A12 , GPIO_SPEED_FREQ_VERY_HIGH );
79+
80+ #else
81+
82+ // Other MCUs have an alternate function for GPIO's to be in USB mode.
83+
6484 #if defined(STM32H7 )
6585 const uint32_t otg_alt = GPIO_AF10_OTG1_FS ;
6686 #elif defined(STM32L0 )
@@ -78,6 +98,8 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd) {
7898 mp_hal_pin_config (pin_A12 , MP_HAL_PIN_MODE_ALT , MP_HAL_PIN_PULL_NONE , otg_alt );
7999 mp_hal_pin_config_speed (pin_A12 , GPIO_SPEED_FREQ_VERY_HIGH );
80100
101+ #endif
102+
81103 #if defined(MICROPY_HW_USB_VBUS_DETECT_PIN )
82104 // USB VBUS detect pin is always A9
83105 mp_hal_pin_config (MICROPY_HW_USB_VBUS_DETECT_PIN , MP_HAL_PIN_MODE_INPUT , MP_HAL_PIN_PULL_NONE , 0 );
@@ -88,14 +110,16 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd) {
88110 mp_hal_pin_config (MICROPY_HW_USB_OTG_ID_PIN , MP_HAL_PIN_MODE_ALT_OPEN_DRAIN , MP_HAL_PIN_PULL_UP , otg_alt );
89111 #endif
90112
91- #if defined(STM32H7 )
113+ #if defined(STM32G0 )
114+ __HAL_RCC_USB_CLK_SLEEP_ENABLE ();
115+ #elif defined(STM32H7 )
92116 // Keep USB clock running during sleep or else __WFI() will disable the USB
93117 __HAL_RCC_USB2_OTG_FS_CLK_SLEEP_ENABLE ();
94118 __HAL_RCC_USB2_OTG_FS_ULPI_CLK_SLEEP_DISABLE ();
95119 #endif
96120
97121 // Enable USB FS Clocks
98- #if !MICROPY_HW_USB_IS_MULTI_OTG
122+ #if !MICROPY_HW_USB_IS_MULTI_OTG || defined( STM32G0 )
99123 __HAL_RCC_USB_CLK_ENABLE ();
100124 #else
101125 __USB_OTG_FS_CLK_ENABLE ();
@@ -113,7 +137,10 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd) {
113137 #endif
114138
115139 // Configure and enable USB FS interrupt
116- #if defined(STM32L0 )
140+ #if defined(STM32G0 )
141+ NVIC_SetPriority (USB_UCPD1_2_IRQn , IRQ_PRI_OTG_FS );
142+ HAL_NVIC_EnableIRQ (USB_UCPD1_2_IRQn );
143+ #elif defined(STM32L0 )
117144 NVIC_SetPriority (USB_IRQn , IRQ_PRI_OTG_FS );
118145 HAL_NVIC_EnableIRQ (USB_IRQn );
119146 #elif defined(STM32L432xx )
@@ -235,7 +262,11 @@ void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd) {
235262 #if MICROPY_HW_USB_FS
236263 if (hpcd -> Instance == USB_OTG_FS ) {
237264 /* Disable USB FS Clocks */
265+ #if defined(STM32G0 )
266+ __HAL_RCC_USB_CLK_DISABLE ();
267+ #else
238268 __USB_OTG_FS_CLK_DISABLE ();
269+ #endif
239270 return ;
240271 }
241272 #endif
@@ -413,7 +444,9 @@ USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev, int high_speed, const
413444 pcd_fs_handle .Init .lpm_enable = DISABLE ;
414445 pcd_fs_handle .Init .battery_charging_enable = DISABLE ;
415446 #if MICROPY_HW_USB_IS_MULTI_OTG
447+ #if !defined(STM32G0 )
416448 pcd_fs_handle .Init .use_dedicated_ep1 = 0 ;
449+ #endif
417450 pcd_fs_handle .Init .dma_enable = 0 ;
418451 #if !defined(MICROPY_HW_USB_VBUS_DETECT_PIN )
419452 pcd_fs_handle .Init .vbus_sensing_enable = 0 ; // No VBUS Sensing on USB0
@@ -430,7 +463,7 @@ USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev, int high_speed, const
430463 HAL_PCD_Init (& pcd_fs_handle );
431464
432465 // Set FIFO buffer sizes
433- #if !MICROPY_HW_USB_IS_MULTI_OTG
466+ #if !MICROPY_HW_USB_IS_MULTI_OTG || defined( STM32G0 )
434467 uint32_t fifo_offset = USBD_PMA_RESERVE ; // need to reserve some data at start of FIFO
435468 for (size_t i = 0 ; i < USBD_PMA_NUM_FIFO ; ++ i ) {
436469 uint16_t ep_addr = ((i & 1 ) * 0x80 ) | (i >> 1 );
0 commit comments