@@ -182,7 +182,7 @@ static void USBD_VBUSChangedIrq(void)
182
182
}
183
183
184
184
bool USBD_Initialize (uint16_t vid , uint16_t pid , const uint8_t * manufacturer , const uint8_t * product , void (* initialize )(struct _USBD_HandleTypeDef * ),
185
- unsigned int pin_vbus , unsigned int priority ,
185
+ unsigned int pin_vbus , bool pin_vbus_needs_pulldown , unsigned int priority ,
186
186
void (* connect_callback )(void ), void (* disconnect_callback )(void ), void (* suspend_callback )(void ), void (* resume_callback )(void ))
187
187
{
188
188
if (stm32l0_system_pclk1 () < 10000000 )
@@ -198,9 +198,6 @@ bool USBD_Initialize(uint16_t vid, uint16_t pid, const uint8_t *manufacturer, co
198
198
USBD_ProductString = product ;
199
199
USBD_ClassInitialize = initialize ;
200
200
201
- usbd_pin_vbus = pin_vbus ;
202
- usbd_mask_vbus = 1 << ((pin_vbus & STM32L0_GPIO_PIN_INDEX_MASK ) >> STM32L0_GPIO_PIN_INDEX_SHIFT );
203
-
204
201
/* Set USB Interrupt priority */
205
202
NVIC_SetPriority (USB_IRQn , priority );
206
203
@@ -209,19 +206,32 @@ bool USBD_Initialize(uint16_t vid, uint16_t pid, const uint8_t *manufacturer, co
209
206
usbd_suspend_callback = suspend_callback ;
210
207
usbd_resume_callback = resume_callback ;
211
208
212
- stm32l0_lptim_timeout_create (& USBD_VBUSTimeout );
213
-
214
209
/* Configure USB FS GPIOs */
215
- stm32l0_gpio_pin_configure (usbd_pin_vbus , (STM32L0_GPIO_PARK_HIZ | STM32L0_GPIO_PUPD_PULLDOWN | STM32L0_GPIO_OSPEED_LOW | STM32L0_GPIO_OTYPE_PUSHPULL | STM32L0_GPIO_MODE_INPUT ));
210
+ usbd_pin_vbus = pin_vbus ;
211
+ if (pin_vbus != STM32L0_GPIO_PIN_NONE ) {
212
+ usbd_mask_vbus = 1 << ((pin_vbus & STM32L0_GPIO_PIN_INDEX_MASK ) >> STM32L0_GPIO_PIN_INDEX_SHIFT );
216
213
217
- if (stm32l0_gpio_pin_read (usbd_pin_vbus ))
218
- {
219
- stm32l0_lptim_timeout_start (& USBD_VBUSTimeout , stm32l0_lptim_millis_to_ticks (40 ), (stm32l0_lptim_callback_t )USBD_VBUSTimeoutIrq ); /* 40ms */
214
+ stm32l0_lptim_timeout_create (& USBD_VBUSTimeout );
215
+
216
+ uint32_t mode = (STM32L0_GPIO_PARK_HIZ | STM32L0_GPIO_OSPEED_LOW | STM32L0_GPIO_OTYPE_PUSHPULL | STM32L0_GPIO_MODE_INPUT );
217
+ if (pin_vbus_needs_pulldown )
218
+ mode |= STM32L0_GPIO_PUPD_PULLDOWN ;
219
+ stm32l0_gpio_pin_configure (usbd_pin_vbus , mode );
220
+
221
+ if (stm32l0_gpio_pin_read (usbd_pin_vbus ))
222
+ {
223
+ stm32l0_lptim_timeout_start (& USBD_VBUSTimeout , stm32l0_lptim_millis_to_ticks (40 ), (stm32l0_lptim_callback_t )USBD_VBUSTimeoutIrq ); /* 40ms */
224
+ }
225
+
226
+ stm32l0_exti_attach (usbd_pin_vbus ,
227
+ (STM32L0_EXTI_CONTROL_NOWAKEUP | STM32L0_EXTI_CONTROL_PRIORITY_LOW | STM32L0_EXTI_CONTROL_EDGE_RISING | STM32L0_EXTI_CONTROL_EDGE_FALLING ),
228
+ (stm32l0_exti_callback_t )USBD_VBUSChangedIrq , NULL );
229
+ } else {
230
+ // No VBUS pin, assume VBUS is always present
231
+ usbd_attached = true;
232
+ usbd_mask_vbus = 0 ;
220
233
}
221
-
222
- stm32l0_exti_attach (usbd_pin_vbus ,
223
- (STM32L0_EXTI_CONTROL_NOWAKEUP | STM32L0_EXTI_CONTROL_PRIORITY_LOW | STM32L0_EXTI_CONTROL_EDGE_RISING | STM32L0_EXTI_CONTROL_EDGE_FALLING ),
224
- (stm32l0_exti_callback_t )USBD_VBUSChangedIrq , NULL );
234
+
225
235
226
236
return true;
227
237
}
@@ -230,11 +240,13 @@ void USBD_Teardown()
230
240
{
231
241
USBD_Detach ();
232
242
233
- stm32l0_exti_detach (usbd_pin_vbus );
243
+ if (usbd_pin_vbus != STM32L0_GPIO_PIN_NONE ) {
244
+ stm32l0_exti_detach (usbd_pin_vbus );
234
245
235
- stm32l0_lptim_timeout_stop (& USBD_VBUSTimeout );
246
+ stm32l0_lptim_timeout_stop (& USBD_VBUSTimeout );
236
247
237
- stm32l0_gpio_pin_configure (usbd_pin_vbus , STM32L0_GPIO_MODE_ANALOG );
248
+ stm32l0_gpio_pin_configure (usbd_pin_vbus , STM32L0_GPIO_MODE_ANALOG );
249
+ }
238
250
239
251
usbd_wakeup = false;
240
252
usbd_enabled = false;
@@ -370,16 +382,18 @@ void USBD_SetupVBUS(bool wakeup)
370
382
{
371
383
usbd_wakeup = wakeup ;
372
384
373
- stm32l0_exti_detach (usbd_pin_vbus );
374
-
375
- stm32l0_gpio_pin_configure (usbd_pin_vbus ,
376
- (usbd_wakeup ? STM32L0_GPIO_PARK_NONE : STM32L0_GPIO_PARK_HIZ ) |
377
- (STM32L0_GPIO_PUPD_PULLDOWN | STM32L0_GPIO_OSPEED_LOW | STM32L0_GPIO_OTYPE_PUSHPULL | STM32L0_GPIO_MODE_INPUT ));
378
-
379
- stm32l0_exti_attach (usbd_pin_vbus ,
380
- ((usbd_wakeup ? 0 : STM32L0_EXTI_CONTROL_NOWAKEUP ) |
381
- (STM32L0_EXTI_CONTROL_PRIORITY_LOW | STM32L0_EXTI_CONTROL_EDGE_RISING | STM32L0_EXTI_CONTROL_EDGE_FALLING )),
382
- (stm32l0_exti_callback_t )USBD_VBUSChangedIrq , NULL );
385
+ if (usbd_pin_vbus != STM32L0_GPIO_PIN_NONE ) {
386
+ stm32l0_exti_detach (usbd_pin_vbus );
387
+
388
+ stm32l0_gpio_pin_configure (usbd_pin_vbus ,
389
+ (usbd_wakeup ? STM32L0_GPIO_PARK_NONE : STM32L0_GPIO_PARK_HIZ ) |
390
+ (STM32L0_GPIO_PUPD_PULLDOWN | STM32L0_GPIO_OSPEED_LOW | STM32L0_GPIO_OTYPE_PUSHPULL | STM32L0_GPIO_MODE_INPUT ));
391
+
392
+ stm32l0_exti_attach (usbd_pin_vbus ,
393
+ ((usbd_wakeup ? 0 : STM32L0_EXTI_CONTROL_NOWAKEUP ) |
394
+ (STM32L0_EXTI_CONTROL_PRIORITY_LOW | STM32L0_EXTI_CONTROL_EDGE_RISING | STM32L0_EXTI_CONTROL_EDGE_FALLING )),
395
+ (stm32l0_exti_callback_t )USBD_VBUSChangedIrq , NULL );
396
+ }
383
397
}
384
398
}
385
399
0 commit comments