@@ -53,7 +53,68 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
53
53
HAL_PWREx_EnableVddUSB ();
54
54
}
55
55
#endif
56
+ #if defined (USB )
57
+ if (hpcd -> Instance == USB ) {
58
+ /* Configure USB FS GPIOs */
59
+ __HAL_RCC_GPIOA_CLK_ENABLE ();
60
+
61
+ /* Configure DM DP Pins */
62
+ GPIO_InitStruct .Pin = (GPIO_PIN_11 | GPIO_PIN_12 );
63
+ #ifdef GPIO_MODE_AF_INPUT
64
+ GPIO_InitStruct .Mode = GPIO_MODE_AF_INPUT ;
65
+ #else
66
+ GPIO_InitStruct .Mode = GPIO_MODE_AF_PP ;
67
+ #endif
68
+ GPIO_InitStruct .Pull = GPIO_PULLUP ;
69
+ #ifdef GPIO_SPEED_FREQ_VERY_HIGH
70
+ GPIO_InitStruct .Speed = GPIO_SPEED_FREQ_VERY_HIGH ;
71
+ #else
72
+ GPIO_InitStruct .Speed = GPIO_SPEED_FREQ_HIGH ;
73
+ #endif
74
+ HAL_GPIO_Init (GPIOA , & GPIO_InitStruct );
75
+
76
+ /* Configure VBUS Pin */
77
+ GPIO_InitStruct .Pin = GPIO_PIN_9 ;
78
+ GPIO_InitStruct .Mode = GPIO_MODE_INPUT ;
79
+ GPIO_InitStruct .Pull = GPIO_NOPULL ;
80
+ HAL_GPIO_Init (GPIOA , & GPIO_InitStruct );
81
+
82
+ /* Configure ID pin */
83
+ GPIO_InitStruct .Pin = GPIO_PIN_10 ;
84
+ GPIO_InitStruct .Mode = GPIO_MODE_AF_OD ;
85
+ GPIO_InitStruct .Pull = GPIO_PULLUP ;
86
+ HAL_GPIO_Init (GPIOA , & GPIO_InitStruct );
56
87
88
+ /* Enable USB FS Clock */
89
+ __HAL_RCC_USB_CLK_ENABLE ();
90
+
91
+ #if defined (USE_USB_INTERRUPT_REMAPPED )
92
+ /*USB interrupt remapping enable */
93
+ __HAL_REMAPINTERRUPT_USB_ENABLE ();
94
+ #endif
95
+
96
+ /* Set USB FS Interrupt priority */
97
+ HAL_NVIC_SetPriority (USB_IRQn , 5 , 0 );
98
+
99
+ /* Enable USB FS Interrupt */
100
+ HAL_NVIC_EnableIRQ (USB_IRQn );
101
+
102
+ if (hpcd -> Init .low_power_enable == 1 ) {
103
+ /* Enable EXTI for USB wakeup */
104
+ __HAL_USB_WAKEUP_EXTI_CLEAR_FLAG ();
105
+ __HAL_USB_WAKEUP_EXTI_ENABLE_RISING_EDGE ();
106
+ __HAL_USB_WAKEUP_EXTI_ENABLE_IT ();
107
+ #if defined(STM32F1xx ) || defined(STM32F3xx )
108
+ /* USB Wakeup Interrupt */
109
+ HAL_NVIC_EnableIRQ (USBWakeUp_IRQn );
110
+
111
+ /* Enable USB Wake-up interrupt */
112
+ HAL_NVIC_SetPriority (USBWakeUp_IRQn , 0 , 0 );
113
+ #endif
114
+ }
115
+ }
116
+ #endif /* USB */
117
+ #if defined (USB_OTG_FS )
57
118
if (hpcd -> Instance == USB_OTG_FS ) {
58
119
/* Configure USB FS GPIOs */
59
120
__HAL_RCC_GPIOA_CLK_ENABLE ();
@@ -93,10 +154,21 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
93
154
__HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG ();
94
155
__HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE ();
95
156
__HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT ();
157
+ #if !defined(STM32L4xx )
158
+ /* Set EXTI Wakeup Interrupt priority */
159
+ HAL_NVIC_SetPriority (OTG_FS_WKUP_IRQn , 0 , 0 );
160
+
161
+ /* Enable EXTI Interrupt */
162
+ HAL_NVIC_EnableIRQ (OTG_FS_WKUP_IRQn );
163
+ #endif
96
164
}
97
165
}
166
+ #endif /* USB_OTG_FS */
98
167
#if defined (USB_OTG_HS )
99
- else if (hpcd -> Instance == USB_OTG_HS ) {
168
+ if (hpcd -> Instance == USB_OTG_HS ) {
169
+ #ifdef USE_USB_HS_IN_FS
170
+
171
+ #else
100
172
/* Configure USB FS GPIOs */
101
173
__HAL_RCC_GPIOA_CLK_ENABLE ();
102
174
__HAL_RCC_GPIOB_CLK_ENABLE ();
@@ -149,6 +221,7 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
149
221
HAL_GPIO_Init (GPIOC , & GPIO_InitStruct );
150
222
151
223
__HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE ();
224
+ #endif /* USE_USB_HS_IN_FS */
152
225
153
226
/* Enable USB HS Clocks */
154
227
__HAL_RCC_USB_OTG_HS_CLK_ENABLE ();
@@ -160,12 +233,12 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
160
233
HAL_NVIC_EnableIRQ (OTG_HS_IRQn );
161
234
162
235
if (hpcd -> Init .low_power_enable == 1 ) {
163
- /* Enable EXTI Line 20 for USB wakeup*/
236
+ /* Enable EXTI Line 20 for USB wakeup */
164
237
__HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG ();
165
238
__HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE ();
166
239
__HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_IT ();
167
240
168
- /* Set EXTI Wakeup Interrupt priority*/
241
+ /* Set EXTI Wakeup Interrupt priority */
169
242
HAL_NVIC_SetPriority (OTG_HS_WKUP_IRQn , 0 , 0 );
170
243
171
244
/* Enable EXTI Interrupt */
@@ -182,18 +255,26 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
182
255
*/
183
256
void HAL_PCD_MspDeInit (PCD_HandleTypeDef * hpcd )
184
257
{
258
+ /* Disable USB FS Clock */
259
+ #if defined (USB )
260
+ if (hpcd -> Instance == USB ) {
261
+ __HAL_RCC_USB_CLK_DISABLE ();
262
+ }
263
+ #endif
264
+ #if defined (USB_OTG_FS )
185
265
if (hpcd -> Instance == USB_OTG_FS ) {
186
266
/* Disable USB FS Clock */
187
267
__HAL_RCC_USB_OTG_FS_CLK_DISABLE ();
188
- __HAL_RCC_SYSCFG_CLK_DISABLE ();
189
268
}
269
+ #endif
190
270
#if defined (USB_OTG_HS )
191
- else if (hpcd -> Instance == USB_OTG_HS ) {
271
+ if (hpcd -> Instance == USB_OTG_HS ) {
192
272
/* Disable USB HS Clocks */
193
273
__HAL_RCC_USB_OTG_HS_CLK_DISABLE ();
194
- __HAL_RCC_SYSCFG_CLK_DISABLE ();
195
274
}
196
275
#endif /* USB_OTG_HS */
276
+ /* Disable SYSCFG Clock */
277
+ __HAL_RCC_SYSCFG_CLK_DISABLE ();
197
278
}
198
279
199
280
/*******************************************************************************
@@ -284,9 +365,8 @@ void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
284
365
USBD_LL_Suspend (hpcd -> pData );
285
366
__HAL_PCD_GATE_PHYCLOCK (hpcd );
286
367
287
- /*Enter in STOP mode */
288
- if (hpcd -> Init .low_power_enable )
289
- {
368
+ /*Enter in STOP mode */
369
+ if (hpcd -> Init .low_power_enable ) {
290
370
/* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register */
291
371
SCB -> SCR |= (uint32_t )((uint32_t )(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk ));
292
372
}
@@ -299,6 +379,12 @@ void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
299
379
*/
300
380
void HAL_PCD_ResumeCallback (PCD_HandleTypeDef * hpcd )
301
381
{
382
+ if (hpcd -> Init .low_power_enable ) {
383
+ SystemClock_Config ();
384
+
385
+ /* Reset SLEEPDEEP bit of Cortex System Control Register */
386
+ SCB -> SCR &= (uint32_t )~((uint32_t )(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk ));
387
+ }
302
388
__HAL_PCD_UNGATE_PHYCLOCK (hpcd );
303
389
USBD_LL_Resume (hpcd -> pData );
304
390
}
@@ -354,13 +440,17 @@ void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
354
440
*/
355
441
#ifdef USE_USB_HS
356
442
void OTG_HS_IRQHandler (void )
357
- #else
443
+ #elif defined( USB_OTG_FS )
358
444
void OTG_FS_IRQHandler (void )
445
+ #else /* USB */
446
+ void USB_IRQHandler (void )
359
447
#endif
360
448
{
361
449
HAL_PCD_IRQHandler (& g_hpcd );
362
450
}
363
451
452
+
453
+
364
454
/**
365
455
* @brief This function handles USB OTG FS Wakeup IRQ Handler.
366
456
* @param None
@@ -369,8 +459,10 @@ void OTG_FS_IRQHandler(void)
369
459
370
460
#ifdef USE_USB_HS
371
461
void OTG_HS_WKUP_IRQHandler (void )
372
- #else
462
+ #elif defined( USB_OTG_FS )
373
463
void OTG_FS_WKUP_IRQHandler (void )
464
+ #else
465
+ void USBWakeUp_IRQHandler (void )
374
466
#endif
375
467
{
376
468
if ((& g_hpcd )-> Init .low_power_enable )
@@ -386,11 +478,13 @@ void OTG_FS_WKUP_IRQHandler(void)
386
478
__HAL_PCD_UNGATE_PHYCLOCK ((& g_hpcd ));
387
479
}
388
480
#ifdef USE_USB_HS
389
- /* Clear EXTI pending Bit*/
481
+ /* Clear EXTI pending Bit*/
390
482
__HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG ();
391
- #else
483
+ #elif defined( USB_OTG_FS )
392
484
/* Clear EXTI pending Bit*/
393
485
__HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG ();
486
+ #else
487
+ __HAL_USB_WAKEUP_EXTI_CLEAR_FLAG ();
394
488
#endif
395
489
}
396
490
/*******************************************************************************
@@ -403,64 +497,72 @@ void OTG_FS_WKUP_IRQHandler(void)
403
497
*/
404
498
USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef * pdev )
405
499
{
500
+ /* Set common LL Driver parameters */
501
+ g_hpcd .Init .dev_endpoints = 4 ;
502
+ g_hpcd .Init .ep0_mps = DEP0CTL_MPS_64 ;
503
+ #if !defined(STM32F1xx ) && !defined(STM32F2xx ) || defined(USB )
504
+ g_hpcd .Init .lpm_enable = DISABLE ;
505
+ g_hpcd .Init .battery_charging_enable = DISABLE ;
506
+ #endif
507
+ g_hpcd .Init .low_power_enable = DISABLE ;
508
+ g_hpcd .Init .Sof_enable = DISABLE ;
509
+
510
+ /* Set specific LL Driver parameters */
406
511
#ifdef USE_USB_HS
407
- /* Set LL Driver parameters */
408
512
g_hpcd .Instance = USB_OTG_HS ;
409
- g_hpcd .Init .dev_endpoints = 3 ;
410
513
g_hpcd .Init .use_dedicated_ep1 = DISABLE ;
411
- g_hpcd .Init .ep0_mps = DEP0CTL_MPS_64 ;
412
514
g_hpcd .Init .dma_enable = DISABLE ;
413
- g_hpcd . Init . low_power_enable = DISABLE ;
414
- g_hpcd .Init .lpm_enable = DISABLE ;
415
- g_hpcd . Init . battery_charging_enable = DISABLE ;
515
+ #ifdef USE_USB_HS_IN_FS
516
+ g_hpcd .Init .phy_itface = PCD_PHY_EMBEDDED ;
517
+ #else
416
518
g_hpcd .Init .phy_itface = PCD_PHY_ULPI ;
417
- g_hpcd . Init . Sof_enable = ENABLE ;
519
+ #endif
418
520
g_hpcd .Init .speed = PCD_SPEED_HIGH ;
419
521
g_hpcd .Init .vbus_sensing_enable = ENABLE ;
420
522
g_hpcd .Init .use_external_vbus = DISABLE ;
421
- /* Link The driver to the stack */
422
- g_hpcd .pData = pdev ;
423
- pdev -> pData = & g_hpcd ;
424
- /* Initialize LL Driver */
425
- if (HAL_PCD_Init (& g_hpcd ) != HAL_OK ) {
426
- Error_Handler ();
427
- }
428
-
429
- /* configure EPs FIFOs */
430
- HAL_PCDEx_SetRxFiFo (& g_hpcd , 0x200 );
431
- HAL_PCDEx_SetTxFiFo (& g_hpcd , 0 , 0x80 );
432
- HAL_PCDEx_SetTxFiFo (& g_hpcd , 1 , 0x40 );
433
- HAL_PCDEx_SetTxFiFo (& g_hpcd , 2 , 0x160 );
434
-
435
523
#else /* USE_USB_FS */
436
- /* Set LL Driver parameters */
524
+ #ifdef USB_OTG_FS
437
525
g_hpcd .Instance = USB_OTG_FS ;
438
- g_hpcd .Init .dev_endpoints = 3 ;
439
526
g_hpcd .Init .use_dedicated_ep1 = DISABLE ;
440
- g_hpcd .Init .ep0_mps = DEP0CTL_MPS_64 ;
441
527
g_hpcd .Init .dma_enable = DISABLE ;
442
- g_hpcd .Init .low_power_enable = DISABLE ;
443
- g_hpcd .Init .lpm_enable = DISABLE ;
444
- g_hpcd .Init .battery_charging_enable = DISABLE ;
445
- g_hpcd .Init .phy_itface = PCD_PHY_EMBEDDED ;
446
- g_hpcd .Init .Sof_enable = DISABLE ;
447
- g_hpcd .Init .speed = PCD_SPEED_FULL ;
448
528
g_hpcd .Init .vbus_sensing_enable = DISABLE ;
449
529
g_hpcd .Init .use_external_vbus = DISABLE ;
530
+ #else
531
+ g_hpcd .Instance = USB ;
532
+ #endif
533
+ g_hpcd .Init .phy_itface = PCD_PHY_EMBEDDED ;
534
+ g_hpcd .Init .speed = PCD_SPEED_FULL ;
535
+ #endif /* USE_USB_HS */
536
+
450
537
/* Link The driver to the stack */
451
538
g_hpcd .pData = pdev ;
452
539
pdev -> pData = & g_hpcd ;
540
+
453
541
/* Initialize LL Driver */
454
542
if (HAL_PCD_Init (& g_hpcd ) != HAL_OK ) {
455
543
Error_Handler ();
456
544
}
457
545
546
+ #ifdef USE_USB_HS
547
+ /* configure EPs FIFOs */
548
+ HAL_PCDEx_SetRxFiFo (& g_hpcd , 0x200 );
549
+ HAL_PCDEx_SetTxFiFo (& g_hpcd , 0 , 0x80 );
550
+ HAL_PCDEx_SetTxFiFo (& g_hpcd , 1 , 0x40 );
551
+ HAL_PCDEx_SetTxFiFo (& g_hpcd , 2 , 0x160 );
552
+ #else /* USE_USB_FS */
553
+ #ifdef USB_OTG_FS
458
554
/* configure EPs FIFOs */
459
555
HAL_PCDEx_SetRxFiFo (& g_hpcd , 0x80 );
460
556
HAL_PCDEx_SetTxFiFo (& g_hpcd , 0 , 0x40 );
461
557
HAL_PCDEx_SetTxFiFo (& g_hpcd , 1 , 0x40 );
462
558
HAL_PCDEx_SetTxFiFo (& g_hpcd , 2 , 0x40 );
463
- #endif /* USE_USB_(F|H)S */
559
+ #else
560
+ HAL_PCDEx_PMAConfig (& g_hpcd , 0x00 , PCD_SNG_BUF , 0x18 );
561
+ HAL_PCDEx_PMAConfig (& g_hpcd , 0x80 , PCD_SNG_BUF , 0x58 );
562
+ HAL_PCDEx_PMAConfig (& g_hpcd , 0x81 , PCD_SNG_BUF , 0x100 );
563
+ HAL_PCDEx_PMAConfig (& g_hpcd , 0x82 , PCD_SNG_BUF , 0x100 );
564
+ #endif
565
+ #endif /* USE_USB_HS */
464
566
return USBD_OK ;
465
567
}
466
568
0 commit comments