1 /* USER CODE BEGIN Header */
3 ******************************************************************************
6 * @brief : This file implements the board support package for the USB device library
7 ******************************************************************************
10 * <h2><center>© Copyright (c) 2021 STMicroelectronics.
11 * All rights reserved.</center></h2>
13 * This software component is licensed by ST under Ultimate Liberty license
14 * SLA0044, the "License"; You may not use this file except in compliance with
15 * the License. You may obtain a copy of the License at:
18 ******************************************************************************
20 /* USER CODE END Header */
22 /* Includes ------------------------------------------------------------------*/
23 #include "stm32f4xx.h"
24 #include "stm32f4xx_hal.h"
26 #include "usbd_core.h"
28 /* USER CODE BEGIN Includes */
30 /* USER CODE END Includes */
32 /* Private typedef -----------------------------------------------------------*/
33 /* Private define ------------------------------------------------------------*/
34 /* Private macro -------------------------------------------------------------*/
36 /* USER CODE BEGIN PV */
37 /* Private variables ---------------------------------------------------------*/
39 /* USER CODE END PV */
41 PCD_HandleTypeDef hpcd_USB_OTG_FS;
42 void Error_Handler(void);
44 PCD_HandleTypeDef hpcd_USB_OTG_HS;
45 void Error_Handler(void);
47 /* External functions --------------------------------------------------------*/
48 void SystemClock_Config(void);
50 /* USER CODE BEGIN 0 */
54 /* USER CODE BEGIN PFP */
55 /* Private function prototypes -----------------------------------------------*/
56 USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status);
58 /* USER CODE END PFP */
60 /* Private functions ---------------------------------------------------------*/
62 /* USER CODE BEGIN 1 */
66 /*******************************************************************************
67 LL Driver Callbacks (PCD -> USB Device Library)
68 *******************************************************************************/
71 void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle)
73 GPIO_InitTypeDef GPIO_InitStruct = {0};
74 if(pcdHandle->Instance==USB_OTG_FS)
76 /* USER CODE BEGIN USB_OTG_FS_MspInit 0 */
78 /* USER CODE END USB_OTG_FS_MspInit 0 */
80 __HAL_RCC_GPIOA_CLK_ENABLE();
81 /**USB_OTG_FS GPIO Configuration
82 PA10 ------> USB_OTG_FS_ID
83 PA11 ------> USB_OTG_FS_DM
84 PA12 ------> USB_OTG_FS_DP
86 GPIO_InitStruct.Pin = GPIO_PIN_10;
87 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
88 GPIO_InitStruct.Pull = GPIO_NOPULL;
89 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
90 GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
91 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
93 GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
94 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
95 GPIO_InitStruct.Pull = GPIO_NOPULL;
96 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
97 GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
98 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
100 /* Peripheral clock enable */
101 __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
103 /* Peripheral interrupt init */
104 HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0);
105 HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
106 /* USER CODE BEGIN USB_OTG_FS_MspInit 1 */
108 /* USER CODE END USB_OTG_FS_MspInit 1 */
110 else if(pcdHandle->Instance==USB_OTG_HS)
112 /* USER CODE BEGIN USB_OTG_HS_MspInit 0 */
114 /* USER CODE END USB_OTG_HS_MspInit 0 */
116 __HAL_RCC_GPIOC_CLK_ENABLE();
117 __HAL_RCC_GPIOA_CLK_ENABLE();
118 __HAL_RCC_GPIOB_CLK_ENABLE();
119 /**USB_OTG_HS GPIO Configuration
120 PC0 ------> USB_OTG_HS_ULPI_STP
121 PC2 ------> USB_OTG_HS_ULPI_DIR
122 PC3 ------> USB_OTG_HS_ULPI_NXT
123 PA3 ------> USB_OTG_HS_ULPI_D0
124 PA5 ------> USB_OTG_HS_ULPI_CK
125 PB0 ------> USB_OTG_HS_ULPI_D1
126 PB1 ------> USB_OTG_HS_ULPI_D2
127 PB2 ------> USB_OTG_HS_ULPI_D4
128 PB10 ------> USB_OTG_HS_ULPI_D3
129 PB12 ------> USB_OTG_HS_ULPI_D5
130 PB13 ------> USB_OTG_HS_ULPI_D6
131 PB5 ------> USB_OTG_HS_ULPI_D7
133 GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3;
134 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
135 GPIO_InitStruct.Pull = GPIO_NOPULL;
136 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
137 GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
138 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
140 GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_5;
141 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
142 GPIO_InitStruct.Pull = GPIO_NOPULL;
143 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
144 GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
145 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
147 GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_10
148 |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_5;
149 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
150 GPIO_InitStruct.Pull = GPIO_NOPULL;
151 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
152 GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
153 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
155 /* Peripheral clock enable */
156 __HAL_RCC_USB_OTG_HS_CLK_ENABLE();
157 __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE();
159 /* Peripheral interrupt init */
160 HAL_NVIC_SetPriority(OTG_HS_IRQn, 0, 0);
161 HAL_NVIC_EnableIRQ(OTG_HS_IRQn);
162 /* USER CODE BEGIN USB_OTG_HS_MspInit 1 */
164 /* USER CODE END USB_OTG_HS_MspInit 1 */
168 void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle)
170 if(pcdHandle->Instance==USB_OTG_FS)
172 /* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */
174 /* USER CODE END USB_OTG_FS_MspDeInit 0 */
175 /* Peripheral clock disable */
176 __HAL_RCC_USB_OTG_FS_CLK_DISABLE();
178 /**USB_OTG_FS GPIO Configuration
179 PA10 ------> USB_OTG_FS_ID
180 PA11 ------> USB_OTG_FS_DM
181 PA12 ------> USB_OTG_FS_DP
183 HAL_GPIO_DeInit(GPIOA, GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12);
185 /* Peripheral interrupt Deinit*/
186 HAL_NVIC_DisableIRQ(OTG_FS_IRQn);
188 /* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */
190 /* USER CODE END USB_OTG_FS_MspDeInit 1 */
192 else if(pcdHandle->Instance==USB_OTG_HS)
194 /* USER CODE BEGIN USB_OTG_HS_MspDeInit 0 */
196 /* USER CODE END USB_OTG_HS_MspDeInit 0 */
197 /* Disable Peripheral clock */
198 __HAL_RCC_USB_OTG_HS_CLK_DISABLE();
199 __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE();
201 /**USB_OTG_HS GPIO Configuration
202 PC0 ------> USB_OTG_HS_ULPI_STP
203 PC2 ------> USB_OTG_HS_ULPI_DIR
204 PC3 ------> USB_OTG_HS_ULPI_NXT
205 PA3 ------> USB_OTG_HS_ULPI_D0
206 PA5 ------> USB_OTG_HS_ULPI_CK
207 PB0 ------> USB_OTG_HS_ULPI_D1
208 PB1 ------> USB_OTG_HS_ULPI_D2
209 PB2 ------> USB_OTG_HS_ULPI_D4
210 PB10 ------> USB_OTG_HS_ULPI_D3
211 PB12 ------> USB_OTG_HS_ULPI_D5
212 PB13 ------> USB_OTG_HS_ULPI_D6
213 PB5 ------> USB_OTG_HS_ULPI_D7
215 HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3);
217 HAL_GPIO_DeInit(GPIOA, GPIO_PIN_3|GPIO_PIN_5);
219 HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_10
220 |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_5);
222 /* Peripheral interrupt Deinit*/
223 HAL_NVIC_DisableIRQ(OTG_HS_IRQn);
225 /* USER CODE BEGIN USB_OTG_HS_MspDeInit 1 */
227 /* USER CODE END USB_OTG_HS_MspDeInit 1 */
232 * @brief Setup stage callback
233 * @param hpcd: PCD handle
236 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
237 static void PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
239 void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
240 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
242 USBD_LL_SetupStage((USBD_HandleTypeDef*)hpcd->pData, (uint8_t *)hpcd->Setup);
246 * @brief Data Out stage callback.
247 * @param hpcd: PCD handle
248 * @param epnum: Endpoint number
251 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
252 static void PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
254 void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
255 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
257 USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff);
261 * @brief Data In stage callback.
262 * @param hpcd: PCD handle
263 * @param epnum: Endpoint number
266 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
267 static void PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
269 void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
270 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
272 USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff);
276 * @brief SOF callback.
277 * @param hpcd: PCD handle
280 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
281 static void PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
283 void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
284 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
286 USBD_LL_SOF((USBD_HandleTypeDef*)hpcd->pData);
290 * @brief Reset callback.
291 * @param hpcd: PCD handle
294 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
295 static void PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
297 void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
298 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
300 USBD_SpeedTypeDef speed = USBD_SPEED_FULL;
302 if ( hpcd->Init.speed == PCD_SPEED_HIGH)
304 speed = USBD_SPEED_HIGH;
306 else if ( hpcd->Init.speed == PCD_SPEED_FULL)
308 speed = USBD_SPEED_FULL;
315 USBD_LL_SetSpeed((USBD_HandleTypeDef*)hpcd->pData, speed);
318 USBD_LL_Reset((USBD_HandleTypeDef*)hpcd->pData);
322 * @brief Suspend callback.
323 * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it)
324 * @param hpcd: PCD handle
327 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
328 static void PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
330 void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
331 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
333 /* Inform USB library that core enters in suspend Mode. */
334 USBD_LL_Suspend((USBD_HandleTypeDef*)hpcd->pData);
335 __HAL_PCD_GATE_PHYCLOCK(hpcd);
336 /* Enter in STOP mode. */
337 /* USER CODE BEGIN 2 */
338 if (hpcd->Init.low_power_enable)
340 /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */
341 SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
343 /* USER CODE END 2 */
347 * @brief Resume callback.
348 * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it)
349 * @param hpcd: PCD handle
352 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
353 static void PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
355 void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
356 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
358 /* USER CODE BEGIN 3 */
360 /* USER CODE END 3 */
361 USBD_LL_Resume((USBD_HandleTypeDef*)hpcd->pData);
365 * @brief ISOOUTIncomplete callback.
366 * @param hpcd: PCD handle
367 * @param epnum: Endpoint number
370 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
371 static void PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
373 void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
374 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
376 USBD_LL_IsoOUTIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum);
380 * @brief ISOINIncomplete callback.
381 * @param hpcd: PCD handle
382 * @param epnum: Endpoint number
385 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
386 static void PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
388 void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
389 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
391 USBD_LL_IsoINIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum);
395 * @brief Connect callback.
396 * @param hpcd: PCD handle
399 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
400 static void PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
402 void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
403 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
405 USBD_LL_DevConnected((USBD_HandleTypeDef*)hpcd->pData);
409 * @brief Disconnect callback.
410 * @param hpcd: PCD handle
413 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
414 static void PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
416 void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
417 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
419 USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData);
422 /*******************************************************************************
423 LL Driver Interface (USB Device Library --> PCD)
424 *******************************************************************************/
427 * @brief Initializes the low level portion of the device driver.
428 * @param pdev: Device handle
429 * @retval USBD status
431 USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev)
434 if (pdev->id == DEVICE_FS) {
435 /* Link the driver to the stack. */
436 hpcd_USB_OTG_FS.pData = pdev;
437 pdev->pData = &hpcd_USB_OTG_FS;
439 hpcd_USB_OTG_FS.Instance = USB_OTG_FS;
440 hpcd_USB_OTG_FS.Init.dev_endpoints = 6;
441 hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL;
442 hpcd_USB_OTG_FS.Init.dma_enable = DISABLE;
443 hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
444 hpcd_USB_OTG_FS.Init.Sof_enable = DISABLE;
445 hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE;
446 hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE;
447 hpcd_USB_OTG_FS.Init.vbus_sensing_enable = DISABLE;
448 hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE;
449 if (HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK)
454 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
455 /* Register USB PCD CallBacks */
456 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SOF_CB_ID, PCD_SOFCallback);
457 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SETUPSTAGE_CB_ID, PCD_SetupStageCallback);
458 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_RESET_CB_ID, PCD_ResetCallback);
459 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SUSPEND_CB_ID, PCD_SuspendCallback);
460 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_RESUME_CB_ID, PCD_ResumeCallback);
461 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_CONNECT_CB_ID, PCD_ConnectCallback);
462 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_DISCONNECT_CB_ID, PCD_DisconnectCallback);
464 HAL_PCD_RegisterDataOutStageCallback(&hpcd_USB_OTG_FS, PCD_DataOutStageCallback);
465 HAL_PCD_RegisterDataInStageCallback(&hpcd_USB_OTG_FS, PCD_DataInStageCallback);
466 HAL_PCD_RegisterIsoOutIncpltCallback(&hpcd_USB_OTG_FS, PCD_ISOOUTIncompleteCallback);
467 HAL_PCD_RegisterIsoInIncpltCallback(&hpcd_USB_OTG_FS, PCD_ISOINIncompleteCallback);
468 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
469 HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 0x80);
470 HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40);
471 HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x80);
473 if (pdev->id == DEVICE_HS) {
474 /* Link the driver to the stack. */
475 hpcd_USB_OTG_HS.pData = pdev;
476 pdev->pData = &hpcd_USB_OTG_HS;
478 hpcd_USB_OTG_HS.Instance = USB_OTG_HS;
479 hpcd_USB_OTG_HS.Init.dev_endpoints = 8;
480 hpcd_USB_OTG_HS.Init.speed = PCD_SPEED_HIGH;
481 hpcd_USB_OTG_HS.Init.dma_enable = ENABLE;
482 hpcd_USB_OTG_HS.Init.phy_itface = USB_OTG_ULPI_PHY;
483 hpcd_USB_OTG_HS.Init.Sof_enable = DISABLE;
484 hpcd_USB_OTG_HS.Init.low_power_enable = DISABLE;
485 hpcd_USB_OTG_HS.Init.lpm_enable = DISABLE;
486 hpcd_USB_OTG_HS.Init.vbus_sensing_enable = DISABLE;
487 hpcd_USB_OTG_HS.Init.use_dedicated_ep1 = DISABLE;
488 hpcd_USB_OTG_HS.Init.use_external_vbus = DISABLE;
489 if (HAL_PCD_Init(&hpcd_USB_OTG_HS) != HAL_OK)
494 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
495 /* Register USB PCD CallBacks */
496 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_HS, HAL_PCD_SOF_CB_ID, PCD_SOFCallback);
497 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_HS, HAL_PCD_SETUPSTAGE_CB_ID, PCD_SetupStageCallback);
498 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_HS, HAL_PCD_RESET_CB_ID, PCD_ResetCallback);
499 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_HS, HAL_PCD_SUSPEND_CB_ID, PCD_SuspendCallback);
500 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_HS, HAL_PCD_RESUME_CB_ID, PCD_ResumeCallback);
501 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_HS, HAL_PCD_CONNECT_CB_ID, PCD_ConnectCallback);
502 HAL_PCD_RegisterCallback(&hpcd_USB_OTG_HS, HAL_PCD_DISCONNECT_CB_ID, PCD_DisconnectCallback);
504 HAL_PCD_RegisterDataOutStageCallback(&hpcd_USB_OTG_HS, PCD_DataOutStageCallback);
505 HAL_PCD_RegisterDataInStageCallback(&hpcd_USB_OTG_HS, PCD_DataInStageCallback);
506 HAL_PCD_RegisterIsoOutIncpltCallback(&hpcd_USB_OTG_HS, PCD_ISOOUTIncompleteCallback);
507 HAL_PCD_RegisterIsoInIncpltCallback(&hpcd_USB_OTG_HS, PCD_ISOINIncompleteCallback);
508 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
509 HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_HS, 0x200);
510 HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_HS, 0, 0x80);
511 HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_HS, 1, 0x174);
517 * @brief De-Initializes the low level portion of the device driver.
518 * @param pdev: Device handle
519 * @retval USBD status
521 USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev)
523 HAL_StatusTypeDef hal_status = HAL_OK;
524 USBD_StatusTypeDef usb_status = USBD_OK;
526 hal_status = HAL_PCD_DeInit(pdev->pData);
528 usb_status = USBD_Get_USB_Status(hal_status);
534 * @brief Starts the low level portion of the device driver.
535 * @param pdev: Device handle
536 * @retval USBD status
538 USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev)
540 HAL_StatusTypeDef hal_status = HAL_OK;
541 USBD_StatusTypeDef usb_status = USBD_OK;
543 hal_status = HAL_PCD_Start(pdev->pData);
545 usb_status = USBD_Get_USB_Status(hal_status);
551 * @brief Stops the low level portion of the device driver.
552 * @param pdev: Device handle
553 * @retval USBD status
555 USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev)
557 HAL_StatusTypeDef hal_status = HAL_OK;
558 USBD_StatusTypeDef usb_status = USBD_OK;
560 hal_status = HAL_PCD_Stop(pdev->pData);
562 usb_status = USBD_Get_USB_Status(hal_status);
568 * @brief Opens an endpoint of the low level driver.
569 * @param pdev: Device handle
570 * @param ep_addr: Endpoint number
571 * @param ep_type: Endpoint type
572 * @param ep_mps: Endpoint max packet size
573 * @retval USBD status
575 USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps)
577 HAL_StatusTypeDef hal_status = HAL_OK;
578 USBD_StatusTypeDef usb_status = USBD_OK;
580 hal_status = HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type);
582 usb_status = USBD_Get_USB_Status(hal_status);
588 * @brief Closes an endpoint of the low level driver.
589 * @param pdev: Device handle
590 * @param ep_addr: Endpoint number
591 * @retval USBD status
593 USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
595 HAL_StatusTypeDef hal_status = HAL_OK;
596 USBD_StatusTypeDef usb_status = USBD_OK;
598 hal_status = HAL_PCD_EP_Close(pdev->pData, ep_addr);
600 usb_status = USBD_Get_USB_Status(hal_status);
606 * @brief Flushes an endpoint of the Low Level Driver.
607 * @param pdev: Device handle
608 * @param ep_addr: Endpoint number
609 * @retval USBD status
611 USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
613 HAL_StatusTypeDef hal_status = HAL_OK;
614 USBD_StatusTypeDef usb_status = USBD_OK;
616 hal_status = HAL_PCD_EP_Flush(pdev->pData, ep_addr);
618 usb_status = USBD_Get_USB_Status(hal_status);
624 * @brief Sets a Stall condition on an endpoint of the Low Level Driver.
625 * @param pdev: Device handle
626 * @param ep_addr: Endpoint number
627 * @retval USBD status
629 USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
631 HAL_StatusTypeDef hal_status = HAL_OK;
632 USBD_StatusTypeDef usb_status = USBD_OK;
634 hal_status = HAL_PCD_EP_SetStall(pdev->pData, ep_addr);
636 usb_status = USBD_Get_USB_Status(hal_status);
642 * @brief Clears a Stall condition on an endpoint of the Low Level Driver.
643 * @param pdev: Device handle
644 * @param ep_addr: Endpoint number
645 * @retval USBD status
647 USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
649 HAL_StatusTypeDef hal_status = HAL_OK;
650 USBD_StatusTypeDef usb_status = USBD_OK;
652 hal_status = HAL_PCD_EP_ClrStall(pdev->pData, ep_addr);
654 usb_status = USBD_Get_USB_Status(hal_status);
660 * @brief Returns Stall condition.
661 * @param pdev: Device handle
662 * @param ep_addr: Endpoint number
663 * @retval Stall (1: Yes, 0: No)
665 uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
667 PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef*) pdev->pData;
669 if((ep_addr & 0x80) == 0x80)
671 return hpcd->IN_ep[ep_addr & 0x7F].is_stall;
675 return hpcd->OUT_ep[ep_addr & 0x7F].is_stall;
680 * @brief Assigns a USB address to the device.
681 * @param pdev: Device handle
682 * @param dev_addr: Device address
683 * @retval USBD status
685 USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr)
687 HAL_StatusTypeDef hal_status = HAL_OK;
688 USBD_StatusTypeDef usb_status = USBD_OK;
690 hal_status = HAL_PCD_SetAddress(pdev->pData, dev_addr);
692 usb_status = USBD_Get_USB_Status(hal_status);
698 * @brief Transmits data over an endpoint.
699 * @param pdev: Device handle
700 * @param ep_addr: Endpoint number
701 * @param pbuf: Pointer to data to be sent
702 * @param size: Data size
703 * @retval USBD status
705 USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size)
707 HAL_StatusTypeDef hal_status = HAL_OK;
708 USBD_StatusTypeDef usb_status = USBD_OK;
710 hal_status = HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size);
712 usb_status = USBD_Get_USB_Status(hal_status);
718 * @brief Prepares an endpoint for reception.
719 * @param pdev: Device handle
720 * @param ep_addr: Endpoint number
721 * @param pbuf: Pointer to data to be received
722 * @param size: Data size
723 * @retval USBD status
725 USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size)
727 HAL_StatusTypeDef hal_status = HAL_OK;
728 USBD_StatusTypeDef usb_status = USBD_OK;
730 hal_status = HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size);
732 usb_status = USBD_Get_USB_Status(hal_status);
738 * @brief Returns the last transfered packet size.
739 * @param pdev: Device handle
740 * @param ep_addr: Endpoint number
741 * @retval Recived Data Size
743 uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
745 return HAL_PCD_EP_GetRxCount((PCD_HandleTypeDef*) pdev->pData, ep_addr);
749 * @brief Send LPM message to user layer
750 * @param hpcd: PCD handle
751 * @param msg: LPM message
754 void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg)
758 case PCD_LPM_L0_ACTIVE:
759 if (hpcd->Init.low_power_enable)
761 SystemClock_Config();
763 /* Reset SLEEPDEEP bit of Cortex System Control Register. */
764 SCB->SCR &= (uint32_t)~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
766 __HAL_PCD_UNGATE_PHYCLOCK(hpcd);
767 USBD_LL_Resume(hpcd->pData);
770 case PCD_LPM_L1_ACTIVE:
771 __HAL_PCD_GATE_PHYCLOCK(hpcd);
772 USBD_LL_Suspend(hpcd->pData);
774 /* Enter in STOP mode. */
775 if (hpcd->Init.low_power_enable)
777 /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */
778 SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
785 * @brief Delays routine for the USB Device Library.
786 * @param Delay: Delay in ms
789 void USBD_LL_Delay(uint32_t Delay)
795 * @brief Retuns the USB status depending on the HAL status:
796 * @param hal_status: HAL status
799 USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status)
801 USBD_StatusTypeDef usb_status = USBD_OK;
806 usb_status = USBD_OK;
809 usb_status = USBD_FAIL;
812 usb_status = USBD_BUSY;
815 usb_status = USBD_FAIL;
818 usb_status = USBD_FAIL;
824 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/