Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 
 

683 rader
19 KiB

  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : Target/usbd_conf.c
  5. * @version : v1.0_Cube
  6. * @brief : This file implements the board support package for the USB device library
  7. ******************************************************************************
  8. * @attention
  9. *
  10. * Copyright (c) 2026 STMicroelectronics.
  11. * All rights reserved.
  12. *
  13. * This software is licensed under terms that can be found in the LICENSE file
  14. * in the root directory of this software component.
  15. * If no LICENSE file comes with this software, it is provided AS-IS.
  16. *
  17. ******************************************************************************
  18. */
  19. /* USER CODE END Header */
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "stm32f4xx.h"
  22. #include "stm32f4xx_hal.h"
  23. #include "usbd_def.h"
  24. #include "usbd_core.h"
  25. #include "usbd_cdc.h"
  26. /* USER CODE BEGIN Includes */
  27. /* USER CODE END Includes */
  28. /* Private typedef -----------------------------------------------------------*/
  29. /* Private define ------------------------------------------------------------*/
  30. /* Private macro -------------------------------------------------------------*/
  31. /* USER CODE BEGIN PV */
  32. /* Private variables ---------------------------------------------------------*/
  33. /* USER CODE END PV */
  34. PCD_HandleTypeDef hpcd_USB_OTG_FS;
  35. void Error_Handler(void);
  36. /* External functions --------------------------------------------------------*/
  37. void SystemClock_Config(void);
  38. /* USER CODE BEGIN 0 */
  39. /* USER CODE END 0 */
  40. /* USER CODE BEGIN PFP */
  41. /* Private function prototypes -----------------------------------------------*/
  42. USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status);
  43. /* USER CODE END PFP */
  44. /* Private functions ---------------------------------------------------------*/
  45. /* USER CODE BEGIN 1 */
  46. /* USER CODE END 1 */
  47. /*******************************************************************************
  48. LL Driver Callbacks (PCD -> USB Device Library)
  49. *******************************************************************************/
  50. /* MSP Init */
  51. void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle)
  52. {
  53. GPIO_InitTypeDef GPIO_InitStruct = {0};
  54. if(pcdHandle->Instance==USB_OTG_FS)
  55. {
  56. /* USER CODE BEGIN USB_OTG_FS_MspInit 0 */
  57. /* USER CODE END USB_OTG_FS_MspInit 0 */
  58. __HAL_RCC_GPIOA_CLK_ENABLE();
  59. /**USB_OTG_FS GPIO Configuration
  60. PA11 ------> USB_OTG_FS_DM
  61. PA12 ------> USB_OTG_FS_DP
  62. */
  63. GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
  64. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  65. GPIO_InitStruct.Pull = GPIO_NOPULL;
  66. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  67. GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
  68. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  69. /* Peripheral clock enable */
  70. __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
  71. /* Peripheral interrupt init */
  72. /* Motion timers run at priorities 1/2. USB is intentionally lower so a
  73. burst of CDC traffic cannot delay pulse generation or the 10 kHz
  74. control ISR; it remains above the USART/DMA communication IRQs (5). */
  75. HAL_NVIC_SetPriority(OTG_FS_IRQn, 4, 0);
  76. HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
  77. /* USER CODE BEGIN USB_OTG_FS_MspInit 1 */
  78. /* USER CODE END USB_OTG_FS_MspInit 1 */
  79. }
  80. }
  81. void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle)
  82. {
  83. if(pcdHandle->Instance==USB_OTG_FS)
  84. {
  85. /* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */
  86. /* USER CODE END USB_OTG_FS_MspDeInit 0 */
  87. /* Peripheral clock disable */
  88. __HAL_RCC_USB_OTG_FS_CLK_DISABLE();
  89. /**USB_OTG_FS GPIO Configuration
  90. PA11 ------> USB_OTG_FS_DM
  91. PA12 ------> USB_OTG_FS_DP
  92. */
  93. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12);
  94. /* Peripheral interrupt Deinit*/
  95. HAL_NVIC_DisableIRQ(OTG_FS_IRQn);
  96. /* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */
  97. /* USER CODE END USB_OTG_FS_MspDeInit 1 */
  98. }
  99. }
  100. /**
  101. * @brief Setup stage callback
  102. * @param hpcd: PCD handle
  103. * @retval None
  104. */
  105. #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  106. static void PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
  107. #else
  108. void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
  109. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  110. {
  111. USBD_LL_SetupStage((USBD_HandleTypeDef*)hpcd->pData, (uint8_t *)hpcd->Setup);
  112. }
  113. /**
  114. * @brief Data Out stage callback.
  115. * @param hpcd: PCD handle
  116. * @param epnum: Endpoint number
  117. * @retval None
  118. */
  119. #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  120. static void PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
  121. #else
  122. void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
  123. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  124. {
  125. USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff);
  126. }
  127. /**
  128. * @brief Data In stage callback.
  129. * @param hpcd: PCD handle
  130. * @param epnum: Endpoint number
  131. * @retval None
  132. */
  133. #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  134. static void PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
  135. #else
  136. void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
  137. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  138. {
  139. USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff);
  140. }
  141. /**
  142. * @brief SOF callback.
  143. * @param hpcd: PCD handle
  144. * @retval None
  145. */
  146. #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  147. static void PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
  148. #else
  149. void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
  150. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  151. {
  152. USBD_LL_SOF((USBD_HandleTypeDef*)hpcd->pData);
  153. }
  154. /**
  155. * @brief Reset callback.
  156. * @param hpcd: PCD handle
  157. * @retval None
  158. */
  159. #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  160. static void PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
  161. #else
  162. void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
  163. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  164. {
  165. USBD_SpeedTypeDef speed = USBD_SPEED_FULL;
  166. if ( hpcd->Init.speed == PCD_SPEED_HIGH)
  167. {
  168. speed = USBD_SPEED_HIGH;
  169. }
  170. else if ( hpcd->Init.speed == PCD_SPEED_FULL)
  171. {
  172. speed = USBD_SPEED_FULL;
  173. }
  174. else
  175. {
  176. Error_Handler();
  177. }
  178. /* Set Speed. */
  179. USBD_LL_SetSpeed((USBD_HandleTypeDef*)hpcd->pData, speed);
  180. /* Reset Device. */
  181. USBD_LL_Reset((USBD_HandleTypeDef*)hpcd->pData);
  182. }
  183. /**
  184. * @brief Suspend callback.
  185. * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it)
  186. * @param hpcd: PCD handle
  187. * @retval None
  188. */
  189. #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  190. static void PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
  191. #else
  192. void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
  193. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  194. {
  195. /* Inform USB library that core enters in suspend Mode. */
  196. USBD_LL_Suspend((USBD_HandleTypeDef*)hpcd->pData);
  197. __HAL_PCD_GATE_PHYCLOCK(hpcd);
  198. /* Enter in STOP mode. */
  199. /* USER CODE BEGIN 2 */
  200. if (hpcd->Init.low_power_enable)
  201. {
  202. /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */
  203. SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
  204. }
  205. /* USER CODE END 2 */
  206. }
  207. /**
  208. * @brief Resume callback.
  209. * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it)
  210. * @param hpcd: PCD handle
  211. * @retval None
  212. */
  213. #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  214. static void PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
  215. #else
  216. void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
  217. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  218. {
  219. /* USER CODE BEGIN 3 */
  220. /* USER CODE END 3 */
  221. USBD_LL_Resume((USBD_HandleTypeDef*)hpcd->pData);
  222. }
  223. /**
  224. * @brief ISOOUTIncomplete callback.
  225. * @param hpcd: PCD handle
  226. * @param epnum: Endpoint number
  227. * @retval None
  228. */
  229. #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  230. static void PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
  231. #else
  232. void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
  233. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  234. {
  235. USBD_LL_IsoOUTIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum);
  236. }
  237. /**
  238. * @brief ISOINIncomplete callback.
  239. * @param hpcd: PCD handle
  240. * @param epnum: Endpoint number
  241. * @retval None
  242. */
  243. #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  244. static void PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
  245. #else
  246. void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
  247. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  248. {
  249. USBD_LL_IsoINIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum);
  250. }
  251. /**
  252. * @brief Connect callback.
  253. * @param hpcd: PCD handle
  254. * @retval None
  255. */
  256. #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  257. static void PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
  258. #else
  259. void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
  260. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  261. {
  262. USBD_LL_DevConnected((USBD_HandleTypeDef*)hpcd->pData);
  263. }
  264. /**
  265. * @brief Disconnect callback.
  266. * @param hpcd: PCD handle
  267. * @retval None
  268. */
  269. #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  270. static void PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
  271. #else
  272. void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
  273. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  274. {
  275. USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData);
  276. }
  277. /*******************************************************************************
  278. LL Driver Interface (USB Device Library --> PCD)
  279. *******************************************************************************/
  280. /**
  281. * @brief Initializes the low level portion of the device driver.
  282. * @param pdev: Device handle
  283. * @retval USBD status
  284. */
  285. USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev)
  286. {
  287. /* Init USB Ip. */
  288. if (pdev->id == DEVICE_FS) {
  289. /* Link the driver to the stack. */
  290. hpcd_USB_OTG_FS.pData = pdev;
  291. pdev->pData = &hpcd_USB_OTG_FS;
  292. hpcd_USB_OTG_FS.Instance = USB_OTG_FS;
  293. hpcd_USB_OTG_FS.Init.dev_endpoints = 4;
  294. hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL;
  295. hpcd_USB_OTG_FS.Init.dma_enable = DISABLE;
  296. hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
  297. hpcd_USB_OTG_FS.Init.Sof_enable = DISABLE;
  298. hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE;
  299. hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE;
  300. hpcd_USB_OTG_FS.Init.vbus_sensing_enable = DISABLE;
  301. hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE;
  302. if (HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK)
  303. {
  304. Error_Handler( );
  305. }
  306. #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  307. /* Register USB PCD CallBacks */
  308. HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SOF_CB_ID, PCD_SOFCallback);
  309. HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SETUPSTAGE_CB_ID, PCD_SetupStageCallback);
  310. HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_RESET_CB_ID, PCD_ResetCallback);
  311. HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SUSPEND_CB_ID, PCD_SuspendCallback);
  312. HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_RESUME_CB_ID, PCD_ResumeCallback);
  313. HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_CONNECT_CB_ID, PCD_ConnectCallback);
  314. HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_DISCONNECT_CB_ID, PCD_DisconnectCallback);
  315. HAL_PCD_RegisterDataOutStageCallback(&hpcd_USB_OTG_FS, PCD_DataOutStageCallback);
  316. HAL_PCD_RegisterDataInStageCallback(&hpcd_USB_OTG_FS, PCD_DataInStageCallback);
  317. HAL_PCD_RegisterIsoOutIncpltCallback(&hpcd_USB_OTG_FS, PCD_ISOOUTIncompleteCallback);
  318. HAL_PCD_RegisterIsoInIncpltCallback(&hpcd_USB_OTG_FS, PCD_ISOINIncompleteCallback);
  319. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  320. HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 0x80);
  321. HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40);
  322. HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x80);
  323. }
  324. return USBD_OK;
  325. }
  326. /**
  327. * @brief De-Initializes the low level portion of the device driver.
  328. * @param pdev: Device handle
  329. * @retval USBD status
  330. */
  331. USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev)
  332. {
  333. HAL_StatusTypeDef hal_status = HAL_OK;
  334. USBD_StatusTypeDef usb_status = USBD_OK;
  335. hal_status = HAL_PCD_DeInit(pdev->pData);
  336. usb_status = USBD_Get_USB_Status(hal_status);
  337. return usb_status;
  338. }
  339. /**
  340. * @brief Starts the low level portion of the device driver.
  341. * @param pdev: Device handle
  342. * @retval USBD status
  343. */
  344. USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev)
  345. {
  346. HAL_StatusTypeDef hal_status = HAL_OK;
  347. USBD_StatusTypeDef usb_status = USBD_OK;
  348. hal_status = HAL_PCD_Start(pdev->pData);
  349. usb_status = USBD_Get_USB_Status(hal_status);
  350. return usb_status;
  351. }
  352. /**
  353. * @brief Stops the low level portion of the device driver.
  354. * @param pdev: Device handle
  355. * @retval USBD status
  356. */
  357. USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev)
  358. {
  359. HAL_StatusTypeDef hal_status = HAL_OK;
  360. USBD_StatusTypeDef usb_status = USBD_OK;
  361. hal_status = HAL_PCD_Stop(pdev->pData);
  362. usb_status = USBD_Get_USB_Status(hal_status);
  363. return usb_status;
  364. }
  365. /**
  366. * @brief Opens an endpoint of the low level driver.
  367. * @param pdev: Device handle
  368. * @param ep_addr: Endpoint number
  369. * @param ep_type: Endpoint type
  370. * @param ep_mps: Endpoint max packet size
  371. * @retval USBD status
  372. */
  373. USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps)
  374. {
  375. HAL_StatusTypeDef hal_status = HAL_OK;
  376. USBD_StatusTypeDef usb_status = USBD_OK;
  377. hal_status = HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type);
  378. usb_status = USBD_Get_USB_Status(hal_status);
  379. return usb_status;
  380. }
  381. /**
  382. * @brief Closes an endpoint of the low level driver.
  383. * @param pdev: Device handle
  384. * @param ep_addr: Endpoint number
  385. * @retval USBD status
  386. */
  387. USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
  388. {
  389. HAL_StatusTypeDef hal_status = HAL_OK;
  390. USBD_StatusTypeDef usb_status = USBD_OK;
  391. hal_status = HAL_PCD_EP_Close(pdev->pData, ep_addr);
  392. usb_status = USBD_Get_USB_Status(hal_status);
  393. return usb_status;
  394. }
  395. /**
  396. * @brief Flushes an endpoint of the Low Level Driver.
  397. * @param pdev: Device handle
  398. * @param ep_addr: Endpoint number
  399. * @retval USBD status
  400. */
  401. USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
  402. {
  403. HAL_StatusTypeDef hal_status = HAL_OK;
  404. USBD_StatusTypeDef usb_status = USBD_OK;
  405. hal_status = HAL_PCD_EP_Flush(pdev->pData, ep_addr);
  406. usb_status = USBD_Get_USB_Status(hal_status);
  407. return usb_status;
  408. }
  409. /**
  410. * @brief Sets a Stall condition on an endpoint of the Low Level Driver.
  411. * @param pdev: Device handle
  412. * @param ep_addr: Endpoint number
  413. * @retval USBD status
  414. */
  415. USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
  416. {
  417. HAL_StatusTypeDef hal_status = HAL_OK;
  418. USBD_StatusTypeDef usb_status = USBD_OK;
  419. hal_status = HAL_PCD_EP_SetStall(pdev->pData, ep_addr);
  420. usb_status = USBD_Get_USB_Status(hal_status);
  421. return usb_status;
  422. }
  423. /**
  424. * @brief Clears a Stall condition on an endpoint of the Low Level Driver.
  425. * @param pdev: Device handle
  426. * @param ep_addr: Endpoint number
  427. * @retval USBD status
  428. */
  429. USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
  430. {
  431. HAL_StatusTypeDef hal_status = HAL_OK;
  432. USBD_StatusTypeDef usb_status = USBD_OK;
  433. hal_status = HAL_PCD_EP_ClrStall(pdev->pData, ep_addr);
  434. usb_status = USBD_Get_USB_Status(hal_status);
  435. return usb_status;
  436. }
  437. /**
  438. * @brief Returns Stall condition.
  439. * @param pdev: Device handle
  440. * @param ep_addr: Endpoint number
  441. * @retval Stall (1: Yes, 0: No)
  442. */
  443. uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
  444. {
  445. PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef*) pdev->pData;
  446. if((ep_addr & 0x80) == 0x80)
  447. {
  448. return hpcd->IN_ep[ep_addr & 0x7F].is_stall;
  449. }
  450. else
  451. {
  452. return hpcd->OUT_ep[ep_addr & 0x7F].is_stall;
  453. }
  454. }
  455. /**
  456. * @brief Assigns a USB address to the device.
  457. * @param pdev: Device handle
  458. * @param dev_addr: Device address
  459. * @retval USBD status
  460. */
  461. USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr)
  462. {
  463. HAL_StatusTypeDef hal_status = HAL_OK;
  464. USBD_StatusTypeDef usb_status = USBD_OK;
  465. hal_status = HAL_PCD_SetAddress(pdev->pData, dev_addr);
  466. usb_status = USBD_Get_USB_Status(hal_status);
  467. return usb_status;
  468. }
  469. /**
  470. * @brief Transmits data over an endpoint.
  471. * @param pdev: Device handle
  472. * @param ep_addr: Endpoint number
  473. * @param pbuf: Pointer to data to be sent
  474. * @param size: Data size
  475. * @retval USBD status
  476. */
  477. USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size)
  478. {
  479. HAL_StatusTypeDef hal_status = HAL_OK;
  480. USBD_StatusTypeDef usb_status = USBD_OK;
  481. hal_status = HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size);
  482. usb_status = USBD_Get_USB_Status(hal_status);
  483. return usb_status;
  484. }
  485. /**
  486. * @brief Prepares an endpoint for reception.
  487. * @param pdev: Device handle
  488. * @param ep_addr: Endpoint number
  489. * @param pbuf: Pointer to data to be received
  490. * @param size: Data size
  491. * @retval USBD status
  492. */
  493. USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size)
  494. {
  495. HAL_StatusTypeDef hal_status = HAL_OK;
  496. USBD_StatusTypeDef usb_status = USBD_OK;
  497. hal_status = HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size);
  498. usb_status = USBD_Get_USB_Status(hal_status);
  499. return usb_status;
  500. }
  501. /**
  502. * @brief Returns the last transferred packet size.
  503. * @param pdev: Device handle
  504. * @param ep_addr: Endpoint number
  505. * @retval Received Data Size
  506. */
  507. uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
  508. {
  509. return HAL_PCD_EP_GetRxCount((PCD_HandleTypeDef*) pdev->pData, ep_addr);
  510. }
  511. #ifdef USBD_HS_TESTMODE_ENABLE
  512. /**
  513. * @brief Set High speed Test mode.
  514. * @param pdev: Device handle
  515. * @param testmode: test mode
  516. * @retval USBD Status
  517. */
  518. USBD_StatusTypeDef USBD_LL_SetTestMode(USBD_HandleTypeDef *pdev, uint8_t testmode)
  519. {
  520. UNUSED(pdev);
  521. UNUSED(testmode);
  522. return USBD_OK;
  523. }
  524. #endif /* USBD_HS_TESTMODE_ENABLE */
  525. /**
  526. * @brief Static single allocation.
  527. * @param size: Size of allocated memory
  528. * @retval None
  529. */
  530. void *USBD_static_malloc(uint32_t size)
  531. {
  532. static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef)/4)+1];/* On 32-bit boundary */
  533. return mem;
  534. }
  535. /**
  536. * @brief Dummy memory free
  537. * @param p: Pointer to allocated memory address
  538. * @retval None
  539. */
  540. void USBD_static_free(void *p)
  541. {
  542. }
  543. /**
  544. * @brief Delays routine for the USB Device Library.
  545. * @param Delay: Delay in ms
  546. * @retval None
  547. */
  548. void USBD_LL_Delay(uint32_t Delay)
  549. {
  550. HAL_Delay(Delay);
  551. }
  552. /**
  553. * @brief Returns the USB status depending on the HAL status:
  554. * @param hal_status: HAL status
  555. * @retval USB status
  556. */
  557. USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status)
  558. {
  559. USBD_StatusTypeDef usb_status = USBD_OK;
  560. switch (hal_status)
  561. {
  562. case HAL_OK :
  563. usb_status = USBD_OK;
  564. break;
  565. case HAL_ERROR :
  566. usb_status = USBD_FAIL;
  567. break;
  568. case HAL_BUSY :
  569. usb_status = USBD_BUSY;
  570. break;
  571. case HAL_TIMEOUT :
  572. usb_status = USBD_FAIL;
  573. break;
  574. default :
  575. usb_status = USBD_FAIL;
  576. break;
  577. }
  578. return usb_status;
  579. }