stm32f7xx_hal_hcd.c 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267
  1. /**
  2. ******************************************************************************
  3. * @file stm32f7xx_hal_hcd.c
  4. * @author MCD Application Team
  5. * @brief HCD HAL module driver.
  6. * This file provides firmware functions to manage the following
  7. * functionalities of the USB Peripheral Controller:
  8. * + Initialization and de-initialization functions
  9. * + IO operation functions
  10. * + Peripheral Control functions
  11. * + Peripheral State functions
  12. *
  13. @verbatim
  14. ==============================================================================
  15. ##### How to use this driver #####
  16. ==============================================================================
  17. [..]
  18. (#)Declare a HCD_HandleTypeDef handle structure, for example:
  19. HCD_HandleTypeDef hhcd;
  20. (#)Fill parameters of Init structure in HCD handle
  21. (#)Call HAL_HCD_Init() API to initialize the HCD peripheral (Core, Host core, ...)
  22. (#)Initialize the HCD low level resources through the HAL_HCD_MspInit() API:
  23. (##) Enable the HCD/USB Low Level interface clock using the following macros
  24. (+++) __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
  25. (+++) __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); (For High Speed Mode)
  26. (+++) __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE(); (For High Speed Mode)
  27. (##) Initialize the related GPIO clocks
  28. (##) Configure HCD pin-out
  29. (##) Configure HCD NVIC interrupt
  30. (#)Associate the Upper USB Host stack to the HAL HCD Driver:
  31. (##) hhcd.pData = phost;
  32. (#)Enable HCD transmission and reception:
  33. (##) HAL_HCD_Start();
  34. @endverbatim
  35. ******************************************************************************
  36. * @attention
  37. *
  38. * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
  39. *
  40. * Redistribution and use in source and binary forms, with or without modification,
  41. * are permitted provided that the following conditions are met:
  42. * 1. Redistributions of source code must retain the above copyright notice,
  43. * this list of conditions and the following disclaimer.
  44. * 2. Redistributions in binary form must reproduce the above copyright notice,
  45. * this list of conditions and the following disclaimer in the documentation
  46. * and/or other materials provided with the distribution.
  47. * 3. Neither the name of STMicroelectronics nor the names of its contributors
  48. * may be used to endorse or promote products derived from this software
  49. * without specific prior written permission.
  50. *
  51. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  52. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  53. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  54. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  55. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  56. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  57. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  58. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  59. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  60. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  61. *
  62. ******************************************************************************
  63. */
  64. /* Includes ------------------------------------------------------------------*/
  65. #include "stm32f7xx_hal.h"
  66. /** @addtogroup STM32F7xx_HAL_Driver
  67. * @{
  68. */
  69. /** @defgroup HCD HCD
  70. * @brief HCD HAL module driver
  71. * @{
  72. */
  73. #ifdef HAL_HCD_MODULE_ENABLED
  74. /* Private typedef -----------------------------------------------------------*/
  75. /* Private define ------------------------------------------------------------*/
  76. /* Private macro -------------------------------------------------------------*/
  77. /* Private variables ---------------------------------------------------------*/
  78. /* Private function ----------------------------------------------------------*/
  79. /** @defgroup HCD_Private_Functions HCD Private Functions
  80. * @{
  81. */
  82. static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum);
  83. static void HCD_HC_OUT_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum);
  84. static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd);
  85. static void HCD_Port_IRQHandler(HCD_HandleTypeDef *hhcd);
  86. /**
  87. * @}
  88. */
  89. /* Exported functions --------------------------------------------------------*/
  90. /** @defgroup HCD_Exported_Functions HCD Exported Functions
  91. * @{
  92. */
  93. /** @defgroup HCD_Exported_Functions_Group1 Initialization and de-initialization functions
  94. * @brief Initialization and Configuration functions
  95. *
  96. @verbatim
  97. ===============================================================================
  98. ##### Initialization and de-initialization functions #####
  99. ===============================================================================
  100. [..] This section provides functions allowing to:
  101. @endverbatim
  102. * @{
  103. */
  104. /**
  105. * @brief Initialize the host driver.
  106. * @param hhcd HCD handle
  107. * @retval HAL status
  108. */
  109. HAL_StatusTypeDef HAL_HCD_Init(HCD_HandleTypeDef *hhcd)
  110. {
  111. /* Check the HCD handle allocation */
  112. if(hhcd == NULL)
  113. {
  114. return HAL_ERROR;
  115. }
  116. /* Check the parameters */
  117. assert_param(IS_HCD_ALL_INSTANCE(hhcd->Instance));
  118. hhcd->State = HAL_HCD_STATE_BUSY;
  119. /* Init the low level hardware : GPIO, CLOCK, NVIC... */
  120. HAL_HCD_MspInit(hhcd);
  121. /* Disable the Interrupts */
  122. __HAL_HCD_DISABLE(hhcd);
  123. /*Init the Core (common init.) */
  124. USB_CoreInit(hhcd->Instance, hhcd->Init);
  125. /* Force Host Mode*/
  126. USB_SetCurrentMode(hhcd->Instance , USB_OTG_HOST_MODE);
  127. /* Init Host */
  128. USB_HostInit(hhcd->Instance, hhcd->Init);
  129. hhcd->State= HAL_HCD_STATE_READY;
  130. return HAL_OK;
  131. }
  132. /**
  133. * @brief Initialize a host channel.
  134. * @param hhcd HCD handle
  135. * @param ch_num Channel number.
  136. * This parameter can be a value from 1 to 15
  137. * @param epnum Endpoint number.
  138. * This parameter can be a value from 1 to 15
  139. * @param dev_address Current device address
  140. * This parameter can be a value from 0 to 255
  141. * @param speed Current device speed.
  142. * This parameter can be one of these values:
  143. * HCD_SPEED_HIGH: High speed mode,
  144. * HCD_SPEED_FULL: Full speed mode,
  145. * HCD_SPEED_LOW: Low speed mode
  146. * @param ep_type Endpoint Type.
  147. * This parameter can be one of these values:
  148. * EP_TYPE_CTRL: Control type,
  149. * EP_TYPE_ISOC: Isochronous type,
  150. * EP_TYPE_BULK: Bulk type,
  151. * EP_TYPE_INTR: Interrupt type
  152. * @param mps Max Packet Size.
  153. * This parameter can be a value from 0 to32K
  154. * @retval HAL status
  155. */
  156. HAL_StatusTypeDef HAL_HCD_HC_Init(HCD_HandleTypeDef *hhcd,
  157. uint8_t ch_num,
  158. uint8_t epnum,
  159. uint8_t dev_address,
  160. uint8_t speed,
  161. uint8_t ep_type,
  162. uint16_t mps)
  163. {
  164. HAL_StatusTypeDef status = HAL_OK;
  165. __HAL_LOCK(hhcd);
  166. hhcd->hc[ch_num].do_ping = 0;
  167. hhcd->hc[ch_num].dev_addr = dev_address;
  168. hhcd->hc[ch_num].max_packet = mps;
  169. hhcd->hc[ch_num].ch_num = ch_num;
  170. hhcd->hc[ch_num].ep_type = ep_type;
  171. hhcd->hc[ch_num].ep_num = epnum & 0x7F;
  172. hhcd->hc[ch_num].ep_is_in = ((epnum & 0x80) == 0x80);
  173. hhcd->hc[ch_num].speed = speed;
  174. status = USB_HC_Init(hhcd->Instance,
  175. ch_num,
  176. epnum,
  177. dev_address,
  178. speed,
  179. ep_type,
  180. mps);
  181. __HAL_UNLOCK(hhcd);
  182. return status;
  183. }
  184. /**
  185. * @brief Halt a host channel.
  186. * @param hhcd HCD handle
  187. * @param ch_num Channel number.
  188. * This parameter can be a value from 1 to 15
  189. * @retval HAL status
  190. */
  191. HAL_StatusTypeDef HAL_HCD_HC_Halt(HCD_HandleTypeDef *hhcd, uint8_t ch_num)
  192. {
  193. HAL_StatusTypeDef status = HAL_OK;
  194. __HAL_LOCK(hhcd);
  195. USB_HC_Halt(hhcd->Instance, ch_num);
  196. __HAL_UNLOCK(hhcd);
  197. return status;
  198. }
  199. /**
  200. * @brief DeInitialize the host driver.
  201. * @param hhcd HCD handle
  202. * @retval HAL status
  203. */
  204. HAL_StatusTypeDef HAL_HCD_DeInit(HCD_HandleTypeDef *hhcd)
  205. {
  206. /* Check the HCD handle allocation */
  207. if(hhcd == NULL)
  208. {
  209. return HAL_ERROR;
  210. }
  211. hhcd->State = HAL_HCD_STATE_BUSY;
  212. /* DeInit the low level hardware */
  213. HAL_HCD_MspDeInit(hhcd);
  214. __HAL_HCD_DISABLE(hhcd);
  215. hhcd->State = HAL_HCD_STATE_RESET;
  216. return HAL_OK;
  217. }
  218. /**
  219. * @brief Initialize the HCD MSP.
  220. * @param hhcd HCD handle
  221. * @retval None
  222. */
  223. __weak void HAL_HCD_MspInit(HCD_HandleTypeDef *hhcd)
  224. {
  225. /* Prevent unused argument(s) compilation warning */
  226. UNUSED(hhcd);
  227. /* NOTE : This function Should not be modified, when the callback is needed,
  228. the HAL_HCD_MspInit could be implemented in the user file
  229. */
  230. }
  231. /**
  232. * @brief DeInitialize the HCD MSP.
  233. * @param hhcd HCD handle
  234. * @retval None
  235. */
  236. __weak void HAL_HCD_MspDeInit(HCD_HandleTypeDef *hhcd)
  237. {
  238. /* Prevent unused argument(s) compilation warning */
  239. UNUSED(hhcd);
  240. /* NOTE : This function Should not be modified, when the callback is needed,
  241. the HAL_HCD_MspDeInit could be implemented in the user file
  242. */
  243. }
  244. /**
  245. * @}
  246. */
  247. /** @defgroup HCD_Exported_Functions_Group2 Input and Output operation functions
  248. * @brief HCD IO operation functions
  249. *
  250. @verbatim
  251. ===============================================================================
  252. ##### IO operation functions #####
  253. ===============================================================================
  254. [..] This subsection provides a set of functions allowing to manage the USB Host Data
  255. Transfer
  256. @endverbatim
  257. * @{
  258. */
  259. /**
  260. * @brief Submit a new URB for processing.
  261. * @param hhcd HCD handle
  262. * @param ch_num Channel number.
  263. * This parameter can be a value from 1 to 15
  264. * @param direction Channel number.
  265. * This parameter can be one of these values:
  266. * 0 : Output / 1 : Input
  267. * @param ep_type Endpoint Type.
  268. * This parameter can be one of these values:
  269. * EP_TYPE_CTRL: Control type/
  270. * EP_TYPE_ISOC: Isochronous type/
  271. * EP_TYPE_BULK: Bulk type/
  272. * EP_TYPE_INTR: Interrupt type/
  273. * @param token Endpoint Type.
  274. * This parameter can be one of these values:
  275. * 0: HC_PID_SETUP / 1: HC_PID_DATA1
  276. * @param pbuff pointer to URB data
  277. * @param length Length of URB data
  278. * @param do_ping activate do ping protocol (for high speed only).
  279. * This parameter can be one of these values:
  280. * 0 : do ping inactive / 1 : do ping active
  281. * @retval HAL status
  282. */
  283. HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd,
  284. uint8_t ch_num,
  285. uint8_t direction ,
  286. uint8_t ep_type,
  287. uint8_t token,
  288. uint8_t* pbuff,
  289. uint16_t length,
  290. uint8_t do_ping)
  291. {
  292. hhcd->hc[ch_num].ep_is_in = direction;
  293. hhcd->hc[ch_num].ep_type = ep_type;
  294. if(token == 0)
  295. {
  296. hhcd->hc[ch_num].data_pid = HC_PID_SETUP;
  297. }
  298. else
  299. {
  300. hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
  301. }
  302. /* Manage Data Toggle */
  303. switch(ep_type)
  304. {
  305. case EP_TYPE_CTRL:
  306. if((token == 1) && (direction == 0)) /*send data */
  307. {
  308. if ( length == 0 )
  309. { /* For Status OUT stage, Length==0, Status Out PID = 1 */
  310. hhcd->hc[ch_num].toggle_out = 1;
  311. }
  312. /* Set the Data Toggle bit as per the Flag */
  313. if ( hhcd->hc[ch_num].toggle_out == 0)
  314. { /* Put the PID 0 */
  315. hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
  316. }
  317. else
  318. { /* Put the PID 1 */
  319. hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
  320. }
  321. }
  322. break;
  323. case EP_TYPE_BULK:
  324. if(direction == 0)
  325. {
  326. /* Set the Data Toggle bit as per the Flag */
  327. if ( hhcd->hc[ch_num].toggle_out == 0)
  328. { /* Put the PID 0 */
  329. hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
  330. }
  331. else
  332. { /* Put the PID 1 */
  333. hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
  334. }
  335. }
  336. else
  337. {
  338. if( hhcd->hc[ch_num].toggle_in == 0)
  339. {
  340. hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
  341. }
  342. else
  343. {
  344. hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
  345. }
  346. }
  347. break;
  348. case EP_TYPE_INTR:
  349. if(direction == 0)
  350. {
  351. /* Set the Data Toggle bit as per the Flag */
  352. if ( hhcd->hc[ch_num].toggle_out == 0)
  353. { /* Put the PID 0 */
  354. hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
  355. }
  356. else
  357. { /* Put the PID 1 */
  358. hhcd->hc[ch_num].data_pid = HC_PID_DATA1 ;
  359. }
  360. }
  361. else
  362. {
  363. if( hhcd->hc[ch_num].toggle_in == 0)
  364. {
  365. hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
  366. }
  367. else
  368. {
  369. hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
  370. }
  371. }
  372. break;
  373. case EP_TYPE_ISOC:
  374. hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
  375. break;
  376. }
  377. hhcd->hc[ch_num].xfer_buff = pbuff;
  378. hhcd->hc[ch_num].xfer_len = length;
  379. hhcd->hc[ch_num].urb_state = URB_IDLE;
  380. hhcd->hc[ch_num].xfer_count = 0 ;
  381. hhcd->hc[ch_num].ch_num = ch_num;
  382. hhcd->hc[ch_num].state = HC_IDLE;
  383. return USB_HC_StartXfer(hhcd->Instance, &(hhcd->hc[ch_num]), hhcd->Init.dma_enable);
  384. }
  385. /**
  386. * @brief Handle HCD interrupt request.
  387. * @param hhcd HCD handle
  388. * @retval None
  389. */
  390. void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd)
  391. {
  392. USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
  393. uint32_t i = 0 , interrupt = 0;
  394. /* ensure that we are in device mode */
  395. if (USB_GetMode(hhcd->Instance) == USB_OTG_MODE_HOST)
  396. {
  397. /* avoid spurious interrupt */
  398. if(__HAL_HCD_IS_INVALID_INTERRUPT(hhcd))
  399. {
  400. return;
  401. }
  402. if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT))
  403. {
  404. /* incorrect mode, acknowledge the interrupt */
  405. __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT);
  406. }
  407. if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_IISOIXFR))
  408. {
  409. /* incorrect mode, acknowledge the interrupt */
  410. __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_IISOIXFR);
  411. }
  412. if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_PTXFE))
  413. {
  414. /* incorrect mode, acknowledge the interrupt */
  415. __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_PTXFE);
  416. }
  417. if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_MMIS))
  418. {
  419. /* incorrect mode, acknowledge the interrupt */
  420. __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_MMIS);
  421. }
  422. /* Handle Host Disconnect Interrupts */
  423. if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_DISCINT))
  424. {
  425. /* Cleanup HPRT */
  426. USBx_HPRT0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\
  427. USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG );
  428. /* Handle Host Port Interrupts */
  429. HAL_HCD_Disconnect_Callback(hhcd);
  430. USB_InitFSLSPClkSel(hhcd->Instance ,HCFG_48_MHZ );
  431. __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_DISCINT);
  432. }
  433. /* Handle Host Port Interrupts */
  434. if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HPRTINT))
  435. {
  436. HCD_Port_IRQHandler (hhcd);
  437. }
  438. /* Handle Host SOF Interrupts */
  439. if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_SOF))
  440. {
  441. HAL_HCD_SOF_Callback(hhcd);
  442. __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_SOF);
  443. }
  444. /* Handle Host channel Interrupts */
  445. if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HCINT))
  446. {
  447. interrupt = USB_HC_ReadInterrupt(hhcd->Instance);
  448. for (i = 0; i < hhcd->Init.Host_channels ; i++)
  449. {
  450. if (interrupt & (1 << i))
  451. {
  452. if ((USBx_HC(i)->HCCHAR) & USB_OTG_HCCHAR_EPDIR)
  453. {
  454. HCD_HC_IN_IRQHandler (hhcd, i);
  455. }
  456. else
  457. {
  458. HCD_HC_OUT_IRQHandler (hhcd, i);
  459. }
  460. }
  461. }
  462. __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_HCINT);
  463. }
  464. /* Handle Rx Queue Level Interrupts */
  465. if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_RXFLVL))
  466. {
  467. USB_MASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_RXFLVL);
  468. HCD_RXQLVL_IRQHandler (hhcd);
  469. USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_RXFLVL);
  470. }
  471. }
  472. }
  473. /**
  474. * @brief SOF callback.
  475. * @param hhcd HCD handle
  476. * @retval None
  477. */
  478. __weak void HAL_HCD_SOF_Callback(HCD_HandleTypeDef *hhcd)
  479. {
  480. /* Prevent unused argument(s) compilation warning */
  481. UNUSED(hhcd);
  482. /* NOTE : This function Should not be modified, when the callback is needed,
  483. the HAL_HCD_SOF_Callback could be implemented in the user file
  484. */
  485. }
  486. /**
  487. * @brief Connection Event callback.
  488. * @param hhcd HCD handle
  489. * @retval None
  490. */
  491. __weak void HAL_HCD_Connect_Callback(HCD_HandleTypeDef *hhcd)
  492. {
  493. /* Prevent unused argument(s) compilation warning */
  494. UNUSED(hhcd);
  495. /* NOTE : This function Should not be modified, when the callback is needed,
  496. the HAL_HCD_Connect_Callback could be implemented in the user file
  497. */
  498. }
  499. /**
  500. * @brief Disconnection Event callback.
  501. * @param hhcd HCD handle
  502. * @retval None
  503. */
  504. __weak void HAL_HCD_Disconnect_Callback(HCD_HandleTypeDef *hhcd)
  505. {
  506. /* Prevent unused argument(s) compilation warning */
  507. UNUSED(hhcd);
  508. /* NOTE : This function Should not be modified, when the callback is needed,
  509. the HAL_HCD_Disconnect_Callback could be implemented in the user file
  510. */
  511. }
  512. /**
  513. * @brief Port Enabled Event callback.
  514. * @param hhcd: HCD handle
  515. * @retval None
  516. */
  517. __weak void HAL_HCD_PortEnabled_Callback(HCD_HandleTypeDef *hhcd)
  518. {
  519. /* Prevent unused argument(s) compilation warning */
  520. UNUSED(hhcd);
  521. /* NOTE : This function Should not be modified, when the callback is needed,
  522. the HAL_HCD_Disconnect_Callback could be implemented in the user file
  523. */
  524. }
  525. /**
  526. * @brief Port Disabled Event callback.
  527. * @param hhcd: HCD handle
  528. * @retval None
  529. */
  530. __weak void HAL_HCD_PortDisabled_Callback(HCD_HandleTypeDef *hhcd)
  531. {
  532. /* Prevent unused argument(s) compilation warning */
  533. UNUSED(hhcd);
  534. /* NOTE : This function Should not be modified, when the callback is needed,
  535. the HAL_HCD_Disconnect_Callback could be implemented in the user file
  536. */
  537. }
  538. /**
  539. * @brief Notify URB state change callback.
  540. * @param hhcd HCD handle
  541. * @param chnum Channel number.
  542. * This parameter can be a value from 1 to 15
  543. * @param urb_state:
  544. * This parameter can be one of these values:
  545. * URB_IDLE/
  546. * URB_DONE/
  547. * URB_NOTREADY/
  548. * URB_NYET/
  549. * URB_ERROR/
  550. * URB_STALL/
  551. * @retval None
  552. */
  553. __weak void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef *hhcd, uint8_t chnum, HCD_URBStateTypeDef urb_state)
  554. {
  555. /* Prevent unused argument(s) compilation warning */
  556. UNUSED(hhcd);
  557. /* NOTE : This function Should not be modified, when the callback is needed,
  558. the HAL_HCD_HC_NotifyURBChange_Callback could be implemented in the user file
  559. */
  560. }
  561. /**
  562. * @}
  563. */
  564. /** @defgroup HCD_Exported_Functions_Group3 Peripheral Control functions
  565. * @brief Management functions
  566. *
  567. @verbatim
  568. ===============================================================================
  569. ##### Peripheral Control functions #####
  570. ===============================================================================
  571. [..]
  572. This subsection provides a set of functions allowing to control the HCD data
  573. transfers.
  574. @endverbatim
  575. * @{
  576. */
  577. /**
  578. * @brief Start the host driver.
  579. * @param hhcd HCD handle
  580. * @retval HAL status
  581. */
  582. HAL_StatusTypeDef HAL_HCD_Start(HCD_HandleTypeDef *hhcd)
  583. {
  584. __HAL_LOCK(hhcd);
  585. __HAL_HCD_ENABLE(hhcd);
  586. USB_DriveVbus(hhcd->Instance, 1);
  587. __HAL_UNLOCK(hhcd);
  588. return HAL_OK;
  589. }
  590. /**
  591. * @brief Stop the host driver.
  592. * @param hhcd HCD handle
  593. * @retval HAL status
  594. */
  595. HAL_StatusTypeDef HAL_HCD_Stop(HCD_HandleTypeDef *hhcd)
  596. {
  597. __HAL_LOCK(hhcd);
  598. USB_StopHost(hhcd->Instance);
  599. __HAL_UNLOCK(hhcd);
  600. return HAL_OK;
  601. }
  602. /**
  603. * @brief Reset the host port.
  604. * @param hhcd HCD handle
  605. * @retval HAL status
  606. */
  607. HAL_StatusTypeDef HAL_HCD_ResetPort(HCD_HandleTypeDef *hhcd)
  608. {
  609. return (USB_ResetPort(hhcd->Instance));
  610. }
  611. /**
  612. * @}
  613. */
  614. /** @defgroup HCD_Exported_Functions_Group4 Peripheral State functions
  615. * @brief Peripheral State functions
  616. *
  617. @verbatim
  618. ===============================================================================
  619. ##### Peripheral State functions #####
  620. ===============================================================================
  621. [..]
  622. This subsection permits to get in run-time the status of the peripheral
  623. and the data flow.
  624. @endverbatim
  625. * @{
  626. */
  627. /**
  628. * @brief Return the HCD handle state.
  629. * @param hhcd HCD handle
  630. * @retval HAL state
  631. */
  632. HCD_StateTypeDef HAL_HCD_GetState(HCD_HandleTypeDef *hhcd)
  633. {
  634. return hhcd->State;
  635. }
  636. /**
  637. * @brief Return URB state for a channel.
  638. * @param hhcd HCD handle
  639. * @param chnum Channel number.
  640. * This parameter can be a value from 1 to 15
  641. * @retval URB state.
  642. * This parameter can be one of these values:
  643. * URB_IDLE/
  644. * URB_DONE/
  645. * URB_NOTREADY/
  646. * URB_NYET/
  647. * URB_ERROR/
  648. * URB_STALL
  649. */
  650. HCD_URBStateTypeDef HAL_HCD_HC_GetURBState(HCD_HandleTypeDef *hhcd, uint8_t chnum)
  651. {
  652. return hhcd->hc[chnum].urb_state;
  653. }
  654. /**
  655. * @brief Return the last host transfer size.
  656. * @param hhcd HCD handle
  657. * @param chnum Channel number.
  658. * This parameter can be a value from 1 to 15
  659. * @retval last transfer size in byte
  660. */
  661. uint32_t HAL_HCD_HC_GetXferCount(HCD_HandleTypeDef *hhcd, uint8_t chnum)
  662. {
  663. return hhcd->hc[chnum].xfer_count;
  664. }
  665. /**
  666. * @brief Return the Host Channel state.
  667. * @param hhcd HCD handle
  668. * @param chnum Channel number.
  669. * This parameter can be a value from 1 to 15
  670. * @retval Host channel state
  671. * This parameter can be one of these values:
  672. * HC_IDLE/
  673. * HC_XFRC/
  674. * HC_HALTED/
  675. * HC_NYET/
  676. * HC_NAK/
  677. * HC_STALL/
  678. * HC_XACTERR/
  679. * HC_BBLERR/
  680. * HC_DATATGLERR
  681. */
  682. HCD_HCStateTypeDef HAL_HCD_HC_GetState(HCD_HandleTypeDef *hhcd, uint8_t chnum)
  683. {
  684. return hhcd->hc[chnum].state;
  685. }
  686. /**
  687. * @brief Return the current Host frame number.
  688. * @param hhcd HCD handle
  689. * @retval Current Host frame number
  690. */
  691. uint32_t HAL_HCD_GetCurrentFrame(HCD_HandleTypeDef *hhcd)
  692. {
  693. return (USB_GetCurrentFrame(hhcd->Instance));
  694. }
  695. /**
  696. * @brief Return the Host enumeration speed.
  697. * @param hhcd HCD handle
  698. * @retval Enumeration speed
  699. */
  700. uint32_t HAL_HCD_GetCurrentSpeed(HCD_HandleTypeDef *hhcd)
  701. {
  702. return (USB_GetHostSpeed(hhcd->Instance));
  703. }
  704. /**
  705. * @}
  706. */
  707. /**
  708. * @}
  709. */
  710. /** @addtogroup HCD_Private_Functions
  711. * @{
  712. */
  713. /**
  714. * @brief Handle Host Channel IN interrupt requests.
  715. * @param hhcd HCD handle
  716. * @param chnum Channel number.
  717. * This parameter can be a value from 1 to 15
  718. * @retval none
  719. */
  720. static void HCD_HC_IN_IRQHandler (HCD_HandleTypeDef *hhcd, uint8_t chnum)
  721. {
  722. USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
  723. uint32_t tmpreg = 0;
  724. if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_AHBERR)
  725. {
  726. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_AHBERR);
  727. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  728. }
  729. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_ACK)
  730. {
  731. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_ACK);
  732. }
  733. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_STALL)
  734. {
  735. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  736. hhcd->hc[chnum].state = HC_STALL;
  737. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
  738. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_STALL);
  739. USB_HC_Halt(hhcd->Instance, chnum);
  740. }
  741. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_DTERR)
  742. {
  743. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  744. USB_HC_Halt(hhcd->Instance, chnum);
  745. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
  746. hhcd->hc[chnum].state = HC_DATATGLERR;
  747. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_DTERR);
  748. }
  749. if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_FRMOR)
  750. {
  751. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  752. USB_HC_Halt(hhcd->Instance, chnum);
  753. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_FRMOR);
  754. }
  755. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_XFRC)
  756. {
  757. if (hhcd->Init.dma_enable)
  758. {
  759. hhcd->hc[chnum].xfer_count = hhcd->hc[chnum].xfer_len - \
  760. (USBx_HC(chnum)->HCTSIZ & USB_OTG_HCTSIZ_XFRSIZ);
  761. }
  762. hhcd->hc[chnum].state = HC_XFRC;
  763. hhcd->hc[chnum].ErrCnt = 0;
  764. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_XFRC);
  765. if ((hhcd->hc[chnum].ep_type == EP_TYPE_CTRL)||
  766. (hhcd->hc[chnum].ep_type == EP_TYPE_BULK))
  767. {
  768. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  769. USB_HC_Halt(hhcd->Instance, chnum);
  770. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
  771. }
  772. else if(hhcd->hc[chnum].ep_type == EP_TYPE_INTR)
  773. {
  774. USBx_HC(chnum)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM;
  775. hhcd->hc[chnum].urb_state = URB_DONE;
  776. HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
  777. }
  778. hhcd->hc[chnum].toggle_in ^= 1;
  779. }
  780. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH)
  781. {
  782. __HAL_HCD_MASK_HALT_HC_INT(chnum);
  783. if(hhcd->hc[chnum].state == HC_XFRC)
  784. {
  785. hhcd->hc[chnum].urb_state = URB_DONE;
  786. }
  787. else if (hhcd->hc[chnum].state == HC_STALL)
  788. {
  789. hhcd->hc[chnum].urb_state = URB_STALL;
  790. }
  791. else if((hhcd->hc[chnum].state == HC_XACTERR) ||
  792. (hhcd->hc[chnum].state == HC_DATATGLERR))
  793. {
  794. if(hhcd->hc[chnum].ErrCnt++ > 3)
  795. {
  796. hhcd->hc[chnum].ErrCnt = 0;
  797. hhcd->hc[chnum].urb_state = URB_ERROR;
  798. }
  799. else
  800. {
  801. hhcd->hc[chnum].urb_state = URB_NOTREADY;
  802. }
  803. /* re-activate the channel */
  804. tmpreg = USBx_HC(chnum)->HCCHAR;
  805. tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
  806. tmpreg |= USB_OTG_HCCHAR_CHENA;
  807. USBx_HC(chnum)->HCCHAR = tmpreg;
  808. }
  809. else if (hhcd->hc[chnum].state == HC_NAK)
  810. {
  811. hhcd->hc[chnum].urb_state = URB_NOTREADY;
  812. /* re-activate the channel */
  813. tmpreg = USBx_HC(chnum)->HCCHAR;
  814. tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
  815. tmpreg |= USB_OTG_HCCHAR_CHENA;
  816. USBx_HC(chnum)->HCCHAR = tmpreg;
  817. }
  818. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH);
  819. HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
  820. }
  821. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR)
  822. {
  823. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  824. hhcd->hc[chnum].ErrCnt++;
  825. hhcd->hc[chnum].state = HC_XACTERR;
  826. USB_HC_Halt(hhcd->Instance, chnum);
  827. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_TXERR);
  828. }
  829. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_NAK)
  830. {
  831. if(hhcd->hc[chnum].ep_type == EP_TYPE_INTR)
  832. {
  833. hhcd->hc[chnum].ErrCnt = 0;
  834. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  835. USB_HC_Halt(hhcd->Instance, chnum);
  836. }
  837. else if ((hhcd->hc[chnum].ep_type == EP_TYPE_CTRL)||
  838. (hhcd->hc[chnum].ep_type == EP_TYPE_BULK))
  839. {
  840. hhcd->hc[chnum].ErrCnt = 0;
  841. if (!hhcd->Init.dma_enable)
  842. {
  843. hhcd->hc[chnum].state = HC_NAK;
  844. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  845. USB_HC_Halt(hhcd->Instance, chnum);
  846. }
  847. }
  848. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
  849. }
  850. }
  851. /**
  852. * @brief Handle Host Channel OUT interrupt requests.
  853. * @param hhcd HCD handle
  854. * @param chnum Channel number.
  855. * This parameter can be a value from 1 to 15
  856. * @retval none
  857. */
  858. static void HCD_HC_OUT_IRQHandler (HCD_HandleTypeDef *hhcd, uint8_t chnum)
  859. {
  860. USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
  861. uint32_t tmpreg = 0;
  862. if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_AHBERR)
  863. {
  864. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_AHBERR);
  865. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  866. }
  867. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_ACK)
  868. {
  869. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_ACK);
  870. if( hhcd->hc[chnum].do_ping == 1)
  871. {
  872. hhcd->hc[chnum].do_ping = 0;
  873. hhcd->hc[chnum].urb_state = URB_NOTREADY;
  874. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  875. USB_HC_Halt(hhcd->Instance, chnum);
  876. }
  877. }
  878. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_NYET)
  879. {
  880. hhcd->hc[chnum].state = HC_NYET;
  881. hhcd->hc[chnum].do_ping = 1;
  882. hhcd->hc[chnum].ErrCnt= 0;
  883. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  884. USB_HC_Halt(hhcd->Instance, chnum);
  885. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NYET);
  886. }
  887. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_FRMOR)
  888. {
  889. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  890. USB_HC_Halt(hhcd->Instance, chnum);
  891. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_FRMOR);
  892. }
  893. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_XFRC)
  894. {
  895. hhcd->hc[chnum].ErrCnt = 0;
  896. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  897. USB_HC_Halt(hhcd->Instance, chnum);
  898. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_XFRC);
  899. hhcd->hc[chnum].state = HC_XFRC;
  900. }
  901. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_STALL)
  902. {
  903. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_STALL);
  904. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  905. USB_HC_Halt(hhcd->Instance, chnum);
  906. hhcd->hc[chnum].state = HC_STALL;
  907. }
  908. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_NAK)
  909. {
  910. hhcd->hc[chnum].ErrCnt = 0;
  911. hhcd->hc[chnum].state = HC_NAK;
  912. if ( hhcd->hc[chnum].do_ping == 0)
  913. {
  914. if (hhcd->hc[chnum].speed == HCD_SPEED_HIGH)
  915. {
  916. hhcd->hc[chnum].do_ping = 1;
  917. }
  918. }
  919. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  920. USB_HC_Halt(hhcd->Instance, chnum);
  921. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
  922. }
  923. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR)
  924. {
  925. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  926. USB_HC_Halt(hhcd->Instance, chnum);
  927. hhcd->hc[chnum].state = HC_XACTERR;
  928. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_TXERR);
  929. }
  930. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_DTERR)
  931. {
  932. __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
  933. USB_HC_Halt(hhcd->Instance, chnum);
  934. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
  935. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_DTERR);
  936. hhcd->hc[chnum].state = HC_DATATGLERR;
  937. }
  938. else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH)
  939. {
  940. __HAL_HCD_MASK_HALT_HC_INT(chnum);
  941. if(hhcd->hc[chnum].state == HC_XFRC)
  942. {
  943. hhcd->hc[chnum].urb_state = URB_DONE;
  944. if (hhcd->hc[chnum].ep_type == EP_TYPE_BULK)
  945. {
  946. hhcd->hc[chnum].toggle_out ^= 1;
  947. }
  948. }
  949. else if (hhcd->hc[chnum].state == HC_NAK)
  950. {
  951. hhcd->hc[chnum].urb_state = URB_NOTREADY;
  952. }
  953. else if (hhcd->hc[chnum].state == HC_NYET)
  954. {
  955. hhcd->hc[chnum].urb_state = URB_NOTREADY;
  956. }
  957. else if (hhcd->hc[chnum].state == HC_STALL)
  958. {
  959. hhcd->hc[chnum].urb_state = URB_STALL;
  960. }
  961. else if((hhcd->hc[chnum].state == HC_XACTERR) ||
  962. (hhcd->hc[chnum].state == HC_DATATGLERR))
  963. {
  964. if(hhcd->hc[chnum].ErrCnt++ > 3)
  965. {
  966. hhcd->hc[chnum].ErrCnt = 0;
  967. hhcd->hc[chnum].urb_state = URB_ERROR;
  968. }
  969. else
  970. {
  971. hhcd->hc[chnum].urb_state = URB_NOTREADY;
  972. }
  973. /* re-activate the channel */
  974. tmpreg = USBx_HC(chnum)->HCCHAR;
  975. tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
  976. tmpreg |= USB_OTG_HCCHAR_CHENA;
  977. USBx_HC(chnum)->HCCHAR = tmpreg;
  978. }
  979. __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH);
  980. HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
  981. }
  982. }
  983. /**
  984. * @brief Handle Rx Queue Level interrupt requests.
  985. * @param hhcd HCD handle
  986. * @retval none
  987. */
  988. static void HCD_RXQLVL_IRQHandler (HCD_HandleTypeDef *hhcd)
  989. {
  990. USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
  991. uint8_t channelnum =0;
  992. uint32_t pktsts;
  993. uint32_t pktcnt;
  994. uint32_t temp = 0;
  995. uint32_t tmpreg = 0;
  996. temp = hhcd->Instance->GRXSTSP ;
  997. channelnum = temp & USB_OTG_GRXSTSP_EPNUM;
  998. pktsts = (temp & USB_OTG_GRXSTSP_PKTSTS) >> 17;
  999. pktcnt = (temp & USB_OTG_GRXSTSP_BCNT) >> 4;
  1000. switch (pktsts)
  1001. {
  1002. case GRXSTS_PKTSTS_IN:
  1003. /* Read the data into the host buffer. */
  1004. if ((pktcnt > 0) && (hhcd->hc[channelnum].xfer_buff != (void *)0))
  1005. {
  1006. USB_ReadPacket(hhcd->Instance, hhcd->hc[channelnum].xfer_buff, pktcnt);
  1007. /*manage multiple Xfer */
  1008. hhcd->hc[channelnum].xfer_buff += pktcnt;
  1009. hhcd->hc[channelnum].xfer_count += pktcnt;
  1010. if((USBx_HC(channelnum)->HCTSIZ & USB_OTG_HCTSIZ_PKTCNT) > 0)
  1011. {
  1012. /* re-activate the channel when more packets are expected */
  1013. tmpreg = USBx_HC(channelnum)->HCCHAR;
  1014. tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
  1015. tmpreg |= USB_OTG_HCCHAR_CHENA;
  1016. USBx_HC(channelnum)->HCCHAR = tmpreg;
  1017. hhcd->hc[channelnum].toggle_in ^= 1;
  1018. }
  1019. }
  1020. break;
  1021. case GRXSTS_PKTSTS_DATA_TOGGLE_ERR:
  1022. break;
  1023. case GRXSTS_PKTSTS_IN_XFER_COMP:
  1024. case GRXSTS_PKTSTS_CH_HALTED:
  1025. default:
  1026. break;
  1027. }
  1028. }
  1029. /**
  1030. * @brief Handle Host Port interrupt requests.
  1031. * @param hhcd HCD handle
  1032. * @retval None
  1033. */
  1034. static void HCD_Port_IRQHandler (HCD_HandleTypeDef *hhcd)
  1035. {
  1036. USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
  1037. __IO uint32_t hprt0, hprt0_dup;
  1038. /* Handle Host Port Interrupts */
  1039. hprt0 = USBx_HPRT0;
  1040. hprt0_dup = USBx_HPRT0;
  1041. hprt0_dup &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\
  1042. USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG );
  1043. /* Check whether Port Connect detected */
  1044. if((hprt0 & USB_OTG_HPRT_PCDET) == USB_OTG_HPRT_PCDET)
  1045. {
  1046. if((hprt0 & USB_OTG_HPRT_PCSTS) == USB_OTG_HPRT_PCSTS)
  1047. {
  1048. USB_MASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_DISCINT);
  1049. HAL_HCD_Connect_Callback(hhcd);
  1050. }
  1051. hprt0_dup |= USB_OTG_HPRT_PCDET;
  1052. }
  1053. /* Check whether Port Enable Changed */
  1054. if((hprt0 & USB_OTG_HPRT_PENCHNG) == USB_OTG_HPRT_PENCHNG)
  1055. {
  1056. hprt0_dup |= USB_OTG_HPRT_PENCHNG;
  1057. if((hprt0 & USB_OTG_HPRT_PENA) == USB_OTG_HPRT_PENA)
  1058. {
  1059. if(hhcd->Init.phy_itface == USB_OTG_EMBEDDED_PHY)
  1060. {
  1061. if ((hprt0 & USB_OTG_HPRT_PSPD) == (HPRT0_PRTSPD_LOW_SPEED << 17))
  1062. {
  1063. USB_InitFSLSPClkSel(hhcd->Instance ,HCFG_6_MHZ );
  1064. }
  1065. else
  1066. {
  1067. USB_InitFSLSPClkSel(hhcd->Instance ,HCFG_48_MHZ );
  1068. }
  1069. }
  1070. else
  1071. {
  1072. if(hhcd->Init.speed == HCD_SPEED_FULL)
  1073. {
  1074. USBx_HOST->HFIR = (uint32_t)60000;
  1075. }
  1076. }
  1077. HAL_HCD_PortEnabled_Callback(hhcd);
  1078. HAL_HCD_Connect_Callback(hhcd);
  1079. }
  1080. else
  1081. {
  1082. HAL_HCD_PortDisabled_Callback(hhcd);
  1083. /* Cleanup HPRT */
  1084. USBx_HPRT0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\
  1085. USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG );
  1086. USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_DISCINT);
  1087. }
  1088. }
  1089. /* Check For an overcurrent */
  1090. if((hprt0 & USB_OTG_HPRT_POCCHNG) == USB_OTG_HPRT_POCCHNG)
  1091. {
  1092. hprt0_dup |= USB_OTG_HPRT_POCCHNG;
  1093. }
  1094. /* Clear Port Interrupts */
  1095. USBx_HPRT0 = hprt0_dup;
  1096. }
  1097. /**
  1098. * @}
  1099. */
  1100. /**
  1101. * @}
  1102. */
  1103. #endif /* HAL_HCD_MODULE_ENABLED */
  1104. /**
  1105. * @}
  1106. */
  1107. /**
  1108. * @}
  1109. */
  1110. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/