usbd_conf.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : usbd_conf.c
  5. * @version : v2.0_Cube
  6. * @brief : This file implements the board support package for the USB device library
  7. ******************************************************************************
  8. * @attention
  9. *
  10. * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
  11. * All rights reserved.</center></h2>
  12. *
  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:
  16. * www.st.com/SLA0044
  17. *
  18. ******************************************************************************
  19. */
  20. /* USER CODE END Header */
  21. /* Includes ------------------------------------------------------------------*/
  22. #include "stm32l4xx.h"
  23. #include "stm32l4xx_hal.h"
  24. #include "usbd_def.h"
  25. #include "usbd_core.h"
  26. #include "usbd_cdc.h"
  27. /* USER CODE BEGIN Includes */
  28. /* USER CODE END Includes */
  29. /* Private typedef -----------------------------------------------------------*/
  30. /* Private define ------------------------------------------------------------*/
  31. /* Private macro -------------------------------------------------------------*/
  32. /* USER CODE BEGIN PV */
  33. /* Private variables ---------------------------------------------------------*/
  34. /* USER CODE END PV */
  35. PCD_HandleTypeDef hpcd_USB_OTG_FS;
  36. void Error_Handler(void);
  37. /* USER CODE BEGIN 0 */
  38. /* USER CODE END 0 */
  39. /* Exported function prototypes ----------------------------------------------*/
  40. extern USBD_StatusTypeDef USBD_LL_BatteryCharging(USBD_HandleTypeDef* pdev);
  41. /* USER CODE BEGIN PFP */
  42. /* Private function prototypes -----------------------------------------------*/
  43. /* USER CODE END PFP */
  44. /* Private functions ---------------------------------------------------------*/
  45. /* USER CODE BEGIN 1 */
  46. static void SystemClockConfig_Resume(void);
  47. /* USER CODE END 1 */
  48. extern void SystemClock_Config(void);
  49. /*******************************************************************************
  50. LL Driver Callbacks (PCD -> USB Device Library)
  51. *******************************************************************************/
  52. /* MSP Init */
  53. void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle) {
  54. GPIO_InitTypeDef GPIO_InitStruct = {0};
  55. if(pcdHandle->Instance == USB_OTG_FS) {
  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. /* Enable VDDUSB */
  72. if(__HAL_RCC_PWR_IS_CLK_DISABLED()) {
  73. __HAL_RCC_PWR_CLK_ENABLE();
  74. HAL_PWREx_EnableVddUSB();
  75. __HAL_RCC_PWR_CLK_DISABLE();
  76. } else {
  77. HAL_PWREx_EnableVddUSB();
  78. }
  79. /* Peripheral interrupt init */
  80. HAL_NVIC_SetPriority(OTG_FS_IRQn, 5, 0);
  81. HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
  82. /* USER CODE BEGIN USB_OTG_FS_MspInit 1 */
  83. /* USER CODE END USB_OTG_FS_MspInit 1 */
  84. }
  85. }
  86. void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle) {
  87. if(pcdHandle->Instance == USB_OTG_FS) {
  88. /* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */
  89. /* USER CODE END USB_OTG_FS_MspDeInit 0 */
  90. /* Peripheral clock disable */
  91. __HAL_RCC_USB_OTG_FS_CLK_DISABLE();
  92. /**USB_OTG_FS GPIO Configuration
  93. PA11 ------> USB_OTG_FS_DM
  94. PA12 ------> USB_OTG_FS_DP
  95. */
  96. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11 | GPIO_PIN_12);
  97. /* Disable VDDUSB */
  98. if(__HAL_RCC_PWR_IS_CLK_DISABLED()) {
  99. __HAL_RCC_PWR_CLK_ENABLE();
  100. HAL_PWREx_DisableVddUSB();
  101. __HAL_RCC_PWR_CLK_DISABLE();
  102. } else {
  103. HAL_PWREx_DisableVddUSB();
  104. }
  105. /* Peripheral interrupt Deinit*/
  106. HAL_NVIC_DisableIRQ(OTG_FS_IRQn);
  107. /* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */
  108. /* USER CODE END USB_OTG_FS_MspDeInit 1 */
  109. }
  110. }
  111. /**
  112. * @brief Setup stage callback
  113. * @param hpcd: PCD handle
  114. * @retval None
  115. */
  116. #if(USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  117. static void PCD_SetupStageCallback(PCD_HandleTypeDef* hpcd)
  118. #else
  119. void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef* hpcd)
  120. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  121. {
  122. USBD_LL_SetupStage((USBD_HandleTypeDef*)hpcd->pData, (uint8_t*)hpcd->Setup);
  123. }
  124. /**
  125. * @brief Data Out stage callback.
  126. * @param hpcd: PCD handle
  127. * @param epnum: Endpoint number
  128. * @retval None
  129. */
  130. #if(USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  131. static void PCD_DataOutStageCallback(PCD_HandleTypeDef* hpcd, uint8_t epnum)
  132. #else
  133. void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef* hpcd, uint8_t epnum)
  134. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  135. {
  136. USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff);
  137. }
  138. /**
  139. * @brief Data In stage callback.
  140. * @param hpcd: PCD handle
  141. * @param epnum: Endpoint number
  142. * @retval None
  143. */
  144. #if(USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  145. static void PCD_DataInStageCallback(PCD_HandleTypeDef* hpcd, uint8_t epnum)
  146. #else
  147. void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef* hpcd, uint8_t epnum)
  148. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  149. {
  150. USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff);
  151. }
  152. /**
  153. * @brief SOF callback.
  154. * @param hpcd: PCD handle
  155. * @retval None
  156. */
  157. #if(USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  158. static void PCD_SOFCallback(PCD_HandleTypeDef* hpcd)
  159. #else
  160. void HAL_PCD_SOFCallback(PCD_HandleTypeDef* hpcd)
  161. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  162. {
  163. USBD_LL_SOF((USBD_HandleTypeDef*)hpcd->pData);
  164. }
  165. /**
  166. * @brief Reset callback.
  167. * @param hpcd: PCD handle
  168. * @retval None
  169. */
  170. #if(USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  171. static void PCD_ResetCallback(PCD_HandleTypeDef* hpcd)
  172. #else
  173. void HAL_PCD_ResetCallback(PCD_HandleTypeDef* hpcd)
  174. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  175. {
  176. USBD_SpeedTypeDef speed = USBD_SPEED_FULL;
  177. if(hpcd->Init.speed != PCD_SPEED_FULL) {
  178. Error_Handler();
  179. }
  180. /* Set Speed. */
  181. USBD_LL_SetSpeed((USBD_HandleTypeDef*)hpcd->pData, speed);
  182. /* Reset Device. */
  183. USBD_LL_Reset((USBD_HandleTypeDef*)hpcd->pData);
  184. }
  185. /**
  186. * @brief Suspend callback.
  187. * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it)
  188. * @param hpcd: PCD handle
  189. * @retval None
  190. */
  191. #if(USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  192. static void PCD_SuspendCallback(PCD_HandleTypeDef* hpcd)
  193. #else
  194. void HAL_PCD_SuspendCallback(PCD_HandleTypeDef* hpcd)
  195. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  196. {
  197. __HAL_PCD_GATE_PHYCLOCK(hpcd);
  198. /* Inform USB library that core enters in suspend Mode. */
  199. USBD_LL_Suspend((USBD_HandleTypeDef*)hpcd->pData);
  200. /* Enter in STOP mode. */
  201. /* USER CODE BEGIN 2 */
  202. if(hpcd->Init.low_power_enable) {
  203. /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */
  204. SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
  205. }
  206. /* USER CODE END 2 */
  207. }
  208. /**
  209. * @brief Resume callback.
  210. * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it)
  211. * @param hpcd: PCD handle
  212. * @retval None
  213. */
  214. #if(USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  215. static void PCD_ResumeCallback(PCD_HandleTypeDef* hpcd)
  216. #else
  217. void HAL_PCD_ResumeCallback(PCD_HandleTypeDef* hpcd)
  218. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  219. {
  220. __HAL_PCD_UNGATE_PHYCLOCK(hpcd);
  221. /* USER CODE BEGIN 3 */
  222. if(hpcd->Init.low_power_enable) {
  223. /* Reset SLEEPDEEP bit of Cortex System Control Register. */
  224. SCB->SCR &= (uint32_t) ~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
  225. SystemClockConfig_Resume();
  226. }
  227. /* USER CODE END 3 */
  228. USBD_LL_Resume((USBD_HandleTypeDef*)hpcd->pData);
  229. }
  230. /**
  231. * @brief ISOOUTIncomplete callback.
  232. * @param hpcd: PCD handle
  233. * @param epnum: Endpoint number
  234. * @retval None
  235. */
  236. #if(USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  237. static void PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef* hpcd, uint8_t epnum)
  238. #else
  239. void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef* hpcd, uint8_t epnum)
  240. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  241. {
  242. USBD_LL_IsoOUTIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum);
  243. }
  244. /**
  245. * @brief ISOINIncomplete callback.
  246. * @param hpcd: PCD handle
  247. * @param epnum: Endpoint number
  248. * @retval None
  249. */
  250. #if(USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  251. static void PCD_ISOINIncompleteCallback(PCD_HandleTypeDef* hpcd, uint8_t epnum)
  252. #else
  253. void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef* hpcd, uint8_t epnum)
  254. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  255. {
  256. USBD_LL_IsoINIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum);
  257. }
  258. /**
  259. * @brief Connect callback.
  260. * @param hpcd: PCD handle
  261. * @retval None
  262. */
  263. #if(USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  264. static void PCD_ConnectCallback(PCD_HandleTypeDef* hpcd)
  265. #else
  266. void HAL_PCD_ConnectCallback(PCD_HandleTypeDef* hpcd)
  267. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  268. {
  269. // TODO send UsbConnect event to FURI
  270. USBD_LL_DevConnected((USBD_HandleTypeDef*)hpcd->pData);
  271. }
  272. /**
  273. * @brief Disconnect callback.
  274. * @param hpcd: PCD handle
  275. * @retval None
  276. */
  277. #if(USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  278. static void PCD_DisconnectCallback(PCD_HandleTypeDef* hpcd)
  279. #else
  280. void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef* hpcd)
  281. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  282. {
  283. // TODO send UsbDisconnect event to FURI
  284. USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData);
  285. }
  286. /*******************************************************************************
  287. LL Driver Interface (USB Device Library --> PCD)
  288. *******************************************************************************/
  289. /**
  290. * @brief Initializes the low level portion of the device driver.
  291. * @param pdev: Device handle
  292. * @retval USBD status
  293. */
  294. USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef* pdev) {
  295. /* Init USB Ip. */
  296. if(pdev->id == DEVICE_FS) {
  297. /* Enable USB power on Pwrctrl CR2 register. */
  298. /* Link the driver to the stack. */
  299. hpcd_USB_OTG_FS.pData = pdev;
  300. pdev->pData = &hpcd_USB_OTG_FS;
  301. hpcd_USB_OTG_FS.Instance = USB_OTG_FS;
  302. hpcd_USB_OTG_FS.Init.dev_endpoints = 6;
  303. hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL;
  304. hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
  305. hpcd_USB_OTG_FS.Init.Sof_enable = DISABLE;
  306. hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE;
  307. hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE;
  308. hpcd_USB_OTG_FS.Init.battery_charging_enable = DISABLE;
  309. hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE;
  310. hpcd_USB_OTG_FS.Init.vbus_sensing_enable = DISABLE;
  311. if(HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK) {
  312. Error_Handler();
  313. }
  314. #if(USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
  315. /* Register USB PCD CallBacks */
  316. HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SOF_CB_ID, PCD_SOFCallback);
  317. HAL_PCD_RegisterCallback(
  318. &hpcd_USB_OTG_FS, HAL_PCD_SETUPSTAGE_CB_ID, PCD_SetupStageCallback);
  319. HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_RESET_CB_ID, PCD_ResetCallback);
  320. HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_SUSPEND_CB_ID, PCD_SuspendCallback);
  321. HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_RESUME_CB_ID, PCD_ResumeCallback);
  322. HAL_PCD_RegisterCallback(&hpcd_USB_OTG_FS, HAL_PCD_CONNECT_CB_ID, PCD_ConnectCallback);
  323. HAL_PCD_RegisterCallback(
  324. &hpcd_USB_OTG_FS, HAL_PCD_DISCONNECT_CB_ID, PCD_DisconnectCallback);
  325. HAL_PCD_RegisterDataOutStageCallback(&hpcd_USB_OTG_FS, PCD_DataOutStageCallback);
  326. HAL_PCD_RegisterDataInStageCallback(&hpcd_USB_OTG_FS, PCD_DataInStageCallback);
  327. HAL_PCD_RegisterIsoOutIncpltCallback(&hpcd_USB_OTG_FS, PCD_ISOOUTIncompleteCallback);
  328. HAL_PCD_RegisterIsoInIncpltCallback(&hpcd_USB_OTG_FS, PCD_ISOINIncompleteCallback);
  329. #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
  330. HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 0x80);
  331. HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40);
  332. HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x80);
  333. }
  334. return USBD_OK;
  335. }
  336. /**
  337. * @brief De-Initializes the low level portion of the device driver.
  338. * @param pdev: Device handle
  339. * @retval USBD status
  340. */
  341. USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef* pdev) {
  342. HAL_StatusTypeDef hal_status = HAL_OK;
  343. USBD_StatusTypeDef usb_status = USBD_OK;
  344. hal_status = HAL_PCD_DeInit(pdev->pData);
  345. switch(hal_status) {
  346. case HAL_OK:
  347. usb_status = USBD_OK;
  348. break;
  349. case HAL_ERROR:
  350. usb_status = USBD_FAIL;
  351. break;
  352. case HAL_BUSY:
  353. usb_status = USBD_BUSY;
  354. break;
  355. case HAL_TIMEOUT:
  356. usb_status = USBD_FAIL;
  357. break;
  358. default:
  359. usb_status = USBD_FAIL;
  360. break;
  361. }
  362. return usb_status;
  363. }
  364. /**
  365. * @brief Starts the low level portion of the device driver.
  366. * @param pdev: Device handle
  367. * @retval USBD status
  368. */
  369. USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef* pdev) {
  370. HAL_StatusTypeDef hal_status = HAL_OK;
  371. USBD_StatusTypeDef usb_status = USBD_OK;
  372. hal_status = HAL_PCD_Start(pdev->pData);
  373. switch(hal_status) {
  374. case HAL_OK:
  375. usb_status = USBD_OK;
  376. break;
  377. case HAL_ERROR:
  378. usb_status = USBD_FAIL;
  379. break;
  380. case HAL_BUSY:
  381. usb_status = USBD_BUSY;
  382. break;
  383. case HAL_TIMEOUT:
  384. usb_status = USBD_FAIL;
  385. break;
  386. default:
  387. usb_status = USBD_FAIL;
  388. break;
  389. }
  390. return usb_status;
  391. }
  392. /**
  393. * @brief Stops the low level portion of the device driver.
  394. * @param pdev: Device handle
  395. * @retval USBD status
  396. */
  397. USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef* pdev) {
  398. HAL_StatusTypeDef hal_status = HAL_OK;
  399. USBD_StatusTypeDef usb_status = USBD_OK;
  400. hal_status = HAL_PCD_Stop(pdev->pData);
  401. switch(hal_status) {
  402. case HAL_OK:
  403. usb_status = USBD_OK;
  404. break;
  405. case HAL_ERROR:
  406. usb_status = USBD_FAIL;
  407. break;
  408. case HAL_BUSY:
  409. usb_status = USBD_BUSY;
  410. break;
  411. case HAL_TIMEOUT:
  412. usb_status = USBD_FAIL;
  413. break;
  414. default:
  415. usb_status = USBD_FAIL;
  416. break;
  417. }
  418. return usb_status;
  419. }
  420. /**
  421. * @brief Opens an endpoint of the low level driver.
  422. * @param pdev: Device handle
  423. * @param ep_addr: Endpoint number
  424. * @param ep_type: Endpoint type
  425. * @param ep_mps: Endpoint max packet size
  426. * @retval USBD status
  427. */
  428. USBD_StatusTypeDef
  429. USBD_LL_OpenEP(USBD_HandleTypeDef* pdev, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps) {
  430. HAL_StatusTypeDef hal_status = HAL_OK;
  431. USBD_StatusTypeDef usb_status = USBD_OK;
  432. hal_status = HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type);
  433. switch(hal_status) {
  434. case HAL_OK:
  435. usb_status = USBD_OK;
  436. break;
  437. case HAL_ERROR:
  438. usb_status = USBD_FAIL;
  439. break;
  440. case HAL_BUSY:
  441. usb_status = USBD_BUSY;
  442. break;
  443. case HAL_TIMEOUT:
  444. usb_status = USBD_FAIL;
  445. break;
  446. default:
  447. usb_status = USBD_FAIL;
  448. break;
  449. }
  450. return usb_status;
  451. }
  452. /**
  453. * @brief Closes an endpoint of the low level driver.
  454. * @param pdev: Device handle
  455. * @param ep_addr: Endpoint number
  456. * @retval USBD status
  457. */
  458. USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef* pdev, uint8_t ep_addr) {
  459. HAL_StatusTypeDef hal_status = HAL_OK;
  460. USBD_StatusTypeDef usb_status = USBD_OK;
  461. hal_status = HAL_PCD_EP_Close(pdev->pData, ep_addr);
  462. switch(hal_status) {
  463. case HAL_OK:
  464. usb_status = USBD_OK;
  465. break;
  466. case HAL_ERROR:
  467. usb_status = USBD_FAIL;
  468. break;
  469. case HAL_BUSY:
  470. usb_status = USBD_BUSY;
  471. break;
  472. case HAL_TIMEOUT:
  473. usb_status = USBD_FAIL;
  474. break;
  475. default:
  476. usb_status = USBD_FAIL;
  477. break;
  478. }
  479. return usb_status;
  480. }
  481. /**
  482. * @brief Flushes an endpoint of the Low Level Driver.
  483. * @param pdev: Device handle
  484. * @param ep_addr: Endpoint number
  485. * @retval USBD status
  486. */
  487. USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef* pdev, uint8_t ep_addr) {
  488. HAL_StatusTypeDef hal_status = HAL_OK;
  489. USBD_StatusTypeDef usb_status = USBD_OK;
  490. hal_status = HAL_PCD_EP_Flush(pdev->pData, ep_addr);
  491. switch(hal_status) {
  492. case HAL_OK:
  493. usb_status = USBD_OK;
  494. break;
  495. case HAL_ERROR:
  496. usb_status = USBD_FAIL;
  497. break;
  498. case HAL_BUSY:
  499. usb_status = USBD_BUSY;
  500. break;
  501. case HAL_TIMEOUT:
  502. usb_status = USBD_FAIL;
  503. break;
  504. default:
  505. usb_status = USBD_FAIL;
  506. break;
  507. }
  508. return usb_status;
  509. }
  510. /**
  511. * @brief Sets a Stall condition on an endpoint of the Low Level Driver.
  512. * @param pdev: Device handle
  513. * @param ep_addr: Endpoint number
  514. * @retval USBD status
  515. */
  516. USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef* pdev, uint8_t ep_addr) {
  517. HAL_StatusTypeDef hal_status = HAL_OK;
  518. USBD_StatusTypeDef usb_status = USBD_OK;
  519. hal_status = HAL_PCD_EP_SetStall(pdev->pData, ep_addr);
  520. switch(hal_status) {
  521. case HAL_OK:
  522. usb_status = USBD_OK;
  523. break;
  524. case HAL_ERROR:
  525. usb_status = USBD_FAIL;
  526. break;
  527. case HAL_BUSY:
  528. usb_status = USBD_BUSY;
  529. break;
  530. case HAL_TIMEOUT:
  531. usb_status = USBD_FAIL;
  532. break;
  533. default:
  534. usb_status = USBD_FAIL;
  535. break;
  536. }
  537. return usb_status;
  538. }
  539. /**
  540. * @brief Clears a Stall condition on an endpoint of the Low Level Driver.
  541. * @param pdev: Device handle
  542. * @param ep_addr: Endpoint number
  543. * @retval USBD status
  544. */
  545. USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef* pdev, uint8_t ep_addr) {
  546. HAL_StatusTypeDef hal_status = HAL_OK;
  547. USBD_StatusTypeDef usb_status = USBD_OK;
  548. hal_status = HAL_PCD_EP_ClrStall(pdev->pData, ep_addr);
  549. switch(hal_status) {
  550. case HAL_OK:
  551. usb_status = USBD_OK;
  552. break;
  553. case HAL_ERROR:
  554. usb_status = USBD_FAIL;
  555. break;
  556. case HAL_BUSY:
  557. usb_status = USBD_BUSY;
  558. break;
  559. case HAL_TIMEOUT:
  560. usb_status = USBD_FAIL;
  561. break;
  562. default:
  563. usb_status = USBD_FAIL;
  564. break;
  565. }
  566. return usb_status;
  567. }
  568. /**
  569. * @brief Returns Stall condition.
  570. * @param pdev: Device handle
  571. * @param ep_addr: Endpoint number
  572. * @retval Stall (1: Yes, 0: No)
  573. */
  574. uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef* pdev, uint8_t ep_addr) {
  575. PCD_HandleTypeDef* hpcd = (PCD_HandleTypeDef*)pdev->pData;
  576. if((ep_addr & 0x80) == 0x80) {
  577. return hpcd->IN_ep[ep_addr & 0x7F].is_stall;
  578. } else {
  579. return hpcd->OUT_ep[ep_addr & 0x7F].is_stall;
  580. }
  581. }
  582. /**
  583. * @brief Assigns a USB address to the device.
  584. * @param pdev: Device handle
  585. * @param dev_addr: Device address
  586. * @retval USBD status
  587. */
  588. USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef* pdev, uint8_t dev_addr) {
  589. HAL_StatusTypeDef hal_status = HAL_OK;
  590. USBD_StatusTypeDef usb_status = USBD_OK;
  591. hal_status = HAL_PCD_SetAddress(pdev->pData, dev_addr);
  592. switch(hal_status) {
  593. case HAL_OK:
  594. usb_status = USBD_OK;
  595. break;
  596. case HAL_ERROR:
  597. usb_status = USBD_FAIL;
  598. break;
  599. case HAL_BUSY:
  600. usb_status = USBD_BUSY;
  601. break;
  602. case HAL_TIMEOUT:
  603. usb_status = USBD_FAIL;
  604. break;
  605. default:
  606. usb_status = USBD_FAIL;
  607. break;
  608. }
  609. return usb_status;
  610. }
  611. /**
  612. * @brief Transmits data over an endpoint.
  613. * @param pdev: Device handle
  614. * @param ep_addr: Endpoint number
  615. * @param pbuf: Pointer to data to be sent
  616. * @param size: Data size
  617. * @retval USBD status
  618. */
  619. USBD_StatusTypeDef
  620. USBD_LL_Transmit(USBD_HandleTypeDef* pdev, uint8_t ep_addr, uint8_t* pbuf, uint16_t size) {
  621. HAL_StatusTypeDef hal_status = HAL_OK;
  622. USBD_StatusTypeDef usb_status = USBD_OK;
  623. hal_status = HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size);
  624. switch(hal_status) {
  625. case HAL_OK:
  626. usb_status = USBD_OK;
  627. break;
  628. case HAL_ERROR:
  629. usb_status = USBD_FAIL;
  630. break;
  631. case HAL_BUSY:
  632. usb_status = USBD_BUSY;
  633. break;
  634. case HAL_TIMEOUT:
  635. usb_status = USBD_FAIL;
  636. break;
  637. default:
  638. usb_status = USBD_FAIL;
  639. break;
  640. }
  641. return usb_status;
  642. }
  643. /**
  644. * @brief Prepares an endpoint for reception.
  645. * @param pdev: Device handle
  646. * @param ep_addr: Endpoint number
  647. * @param pbuf: Pointer to data to be received
  648. * @param size: Data size
  649. * @retval USBD status
  650. */
  651. USBD_StatusTypeDef
  652. USBD_LL_PrepareReceive(USBD_HandleTypeDef* pdev, uint8_t ep_addr, uint8_t* pbuf, uint16_t size) {
  653. HAL_StatusTypeDef hal_status = HAL_OK;
  654. USBD_StatusTypeDef usb_status = USBD_OK;
  655. hal_status = HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size);
  656. switch(hal_status) {
  657. case HAL_OK:
  658. usb_status = USBD_OK;
  659. break;
  660. case HAL_ERROR:
  661. usb_status = USBD_FAIL;
  662. break;
  663. case HAL_BUSY:
  664. usb_status = USBD_BUSY;
  665. break;
  666. case HAL_TIMEOUT:
  667. usb_status = USBD_FAIL;
  668. break;
  669. default:
  670. usb_status = USBD_FAIL;
  671. break;
  672. }
  673. return usb_status;
  674. }
  675. /**
  676. * @brief Returns the last transfered packet size.
  677. * @param pdev: Device handle
  678. * @param ep_addr: Endpoint number
  679. * @retval Recived Data Size
  680. */
  681. uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef* pdev, uint8_t ep_addr) {
  682. return HAL_PCD_EP_GetRxCount((PCD_HandleTypeDef*)pdev->pData, ep_addr);
  683. }
  684. /**
  685. * @brief Send LPM message to user layer
  686. * @param hpcd: PCD handle
  687. * @param msg: LPM message
  688. * @retval None
  689. */
  690. void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef* hpcd, PCD_LPM_MsgTypeDef msg) {
  691. switch(msg) {
  692. case PCD_LPM_L0_ACTIVE:
  693. if(hpcd->Init.low_power_enable) {
  694. SystemClockConfig_Resume();
  695. /* Reset SLEEPDEEP bit of Cortex System Control Register. */
  696. SCB->SCR &= (uint32_t) ~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
  697. }
  698. __HAL_PCD_UNGATE_PHYCLOCK(hpcd);
  699. USBD_LL_Resume(hpcd->pData);
  700. break;
  701. case PCD_LPM_L1_ACTIVE:
  702. __HAL_PCD_GATE_PHYCLOCK(hpcd);
  703. USBD_LL_Suspend(hpcd->pData);
  704. /* Enter in STOP mode. */
  705. if(hpcd->Init.low_power_enable) {
  706. /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */
  707. SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
  708. }
  709. break;
  710. }
  711. }
  712. /**
  713. * @brief Delays routine for the USB Device Library.
  714. * @param Delay: Delay in ms
  715. * @retval None
  716. */
  717. void USBD_LL_Delay(uint32_t Delay) {
  718. HAL_Delay(Delay);
  719. }
  720. /**
  721. * @brief Static single allocation.
  722. * @param size: Size of allocated memory
  723. * @retval None
  724. */
  725. void* USBD_static_malloc(uint32_t size) {
  726. static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef) / 4) + 1]; /* On 32-bit boundary */
  727. return mem;
  728. }
  729. /**
  730. * @brief Dummy memory free
  731. * @param p: Pointer to allocated memory address
  732. * @retval None
  733. */
  734. void USBD_static_free(void* p) {
  735. }
  736. /* USER CODE BEGIN 5 */
  737. /**
  738. * @brief Configures system clock after wake-up from USB resume callBack:
  739. * enable HSI, PLL and select PLL as system clock source.
  740. * @retval None
  741. */
  742. static void SystemClockConfig_Resume(void) {
  743. SystemClock_Config();
  744. }
  745. /* USER CODE END 5 */
  746. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/