STM32L4xx_HAL_Driver  1.14.0
HCD Private Functions

Functions

static void HCD_HC_IN_IRQHandler (HCD_HandleTypeDef *hhcd, uint8_t chnum)
 Handle Host Channel IN interrupt requests. More...
 
static void HCD_HC_OUT_IRQHandler (HCD_HandleTypeDef *hhcd, uint8_t chnum)
 Handle Host Channel OUT interrupt requests. More...
 
static void HCD_RXQLVL_IRQHandler (HCD_HandleTypeDef *hhcd)
 Handle Rx Queue Level interrupt requests. More...
 
static void HCD_Port_IRQHandler (HCD_HandleTypeDef *hhcd)
 Handle Host Port interrupt requests. More...
 

Detailed Description

Function Documentation

◆ HCD_HC_IN_IRQHandler()

static void HCD_HC_IN_IRQHandler ( HCD_HandleTypeDef hhcd,
uint8_t  chnum 
)
static

Handle Host Channel IN interrupt requests.

Parameters
hhcdHCD handle
chnumChannel number. This parameter can be a value from 1 to 15
Return values
none

Definition at line 1156 of file stm32l4xx_hal_hcd.c.

1157 {
1158  USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
1159  uint32_t USBx_BASE = (uint32_t)USBx;
1160  uint32_t ch_num = (uint32_t)chnum;
1161 
1162  uint32_t tmpreg;
1163 
1164  if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_AHBERR) == USB_OTG_HCINT_AHBERR)
1165  {
1166  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_AHBERR);
1167  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1168  }
1169  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_ACK) == USB_OTG_HCINT_ACK)
1170  {
1171  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_ACK);
1172  }
1173  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_STALL) == USB_OTG_HCINT_STALL)
1174  {
1175  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1176  hhcd->hc[ch_num].state = HC_STALL;
1177  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK);
1178  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_STALL);
1179  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1180  }
1181  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_DTERR) == USB_OTG_HCINT_DTERR)
1182  {
1183  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1184  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1185  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK);
1186  hhcd->hc[ch_num].state = HC_DATATGLERR;
1187  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_DTERR);
1188  }
1189  else
1190  {
1191  /* ... */
1192  }
1193 
1194  if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_FRMOR) == USB_OTG_HCINT_FRMOR)
1195  {
1196  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1197  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1198  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_FRMOR);
1199  }
1200  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_XFRC) == USB_OTG_HCINT_XFRC)
1201  {
1202  hhcd->hc[ch_num].state = HC_XFRC;
1203  hhcd->hc[ch_num].ErrCnt = 0U;
1204  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_XFRC);
1205 
1206  if ((hhcd->hc[ch_num].ep_type == EP_TYPE_CTRL) ||
1207  (hhcd->hc[ch_num].ep_type == EP_TYPE_BULK))
1208  {
1209  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1210  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1211  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK);
1212  }
1213  else if (hhcd->hc[ch_num].ep_type == EP_TYPE_INTR)
1214  {
1215  USBx_HC(ch_num)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM;
1216  hhcd->hc[ch_num].urb_state = URB_DONE;
1217 
1218 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1219  hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state);
1220 #else
1221  HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state);
1222 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
1223  }
1224  else
1225  {
1226  /* ... */
1227  }
1228  hhcd->hc[ch_num].toggle_in ^= 1U;
1229 
1230  }
1231  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_CHH) == USB_OTG_HCINT_CHH)
1232  {
1233  __HAL_HCD_MASK_HALT_HC_INT(ch_num);
1234 
1235  if (hhcd->hc[ch_num].state == HC_XFRC)
1236  {
1237  hhcd->hc[ch_num].urb_state = URB_DONE;
1238  }
1239  else if (hhcd->hc[ch_num].state == HC_STALL)
1240  {
1241  hhcd->hc[ch_num].urb_state = URB_STALL;
1242  }
1243  else if ((hhcd->hc[ch_num].state == HC_XACTERR) ||
1244  (hhcd->hc[ch_num].state == HC_DATATGLERR))
1245  {
1246  hhcd->hc[ch_num].ErrCnt++;
1247  if (hhcd->hc[ch_num].ErrCnt > 3U)
1248  {
1249  hhcd->hc[ch_num].ErrCnt = 0U;
1250  hhcd->hc[ch_num].urb_state = URB_ERROR;
1251  }
1252  else
1253  {
1254  hhcd->hc[ch_num].urb_state = URB_NOTREADY;
1255  }
1256 
1257  /* re-activate the channel */
1258  tmpreg = USBx_HC(ch_num)->HCCHAR;
1259  tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
1260  tmpreg |= USB_OTG_HCCHAR_CHENA;
1261  USBx_HC(ch_num)->HCCHAR = tmpreg;
1262  }
1263  else if (hhcd->hc[ch_num].state == HC_NAK)
1264  {
1265  hhcd->hc[ch_num].urb_state = URB_NOTREADY;
1266  /* re-activate the channel */
1267  tmpreg = USBx_HC(ch_num)->HCCHAR;
1268  tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
1269  tmpreg |= USB_OTG_HCCHAR_CHENA;
1270  USBx_HC(ch_num)->HCCHAR = tmpreg;
1271  }
1272  else
1273  {
1274  /* ... */
1275  }
1276  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_CHH);
1277  HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state);
1278  }
1279  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_TXERR) == USB_OTG_HCINT_TXERR)
1280  {
1281  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1282  hhcd->hc[ch_num].ErrCnt++;
1283  hhcd->hc[ch_num].state = HC_XACTERR;
1284  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1285  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_TXERR);
1286  }
1287  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_NAK) == USB_OTG_HCINT_NAK)
1288  {
1289  if (hhcd->hc[ch_num].ep_type == EP_TYPE_INTR)
1290  {
1291  hhcd->hc[ch_num].ErrCnt = 0U;
1292  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1293  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1294  }
1295  else if ((hhcd->hc[ch_num].ep_type == EP_TYPE_CTRL) ||
1296  (hhcd->hc[ch_num].ep_type == EP_TYPE_BULK))
1297  {
1298  hhcd->hc[ch_num].ErrCnt = 0U;
1299  hhcd->hc[ch_num].state = HC_NAK;
1300  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1301  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1302  }
1303  else
1304  {
1305  /* ... */
1306  }
1307  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK);
1308  }
1309  else
1310  {
1311  /* ... */
1312  }
1313 }
HAL_StatusTypeDef USB_HC_Halt(USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num)
Halt a host channel.
void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef *hhcd, uint8_t chnum, HCD_URBStateTypeDef urb_state)
Notify URB state change callback.

◆ HCD_HC_OUT_IRQHandler()

static void HCD_HC_OUT_IRQHandler ( HCD_HandleTypeDef hhcd,
uint8_t  chnum 
)
static

Handle Host Channel OUT interrupt requests.

Parameters
hhcdHCD handle
chnumChannel number. This parameter can be a value from 1 to 15
Return values
none

Definition at line 1322 of file stm32l4xx_hal_hcd.c.

1323 {
1324  USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
1325  uint32_t USBx_BASE = (uint32_t)USBx;
1326  uint32_t ch_num = (uint32_t)chnum;
1327  uint32_t tmpreg;
1328 
1329  if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_AHBERR) == USB_OTG_HCINT_AHBERR)
1330  {
1331  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_AHBERR);
1332  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1333  }
1334  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_ACK) == USB_OTG_HCINT_ACK)
1335  {
1336  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_ACK);
1337 
1338  if (hhcd->hc[ch_num].do_ping == 1U)
1339  {
1340  hhcd->hc[ch_num].do_ping = 0U;
1341  hhcd->hc[ch_num].urb_state = URB_NOTREADY;
1342  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1343  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1344  }
1345  }
1346  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_NYET) == USB_OTG_HCINT_NYET)
1347  {
1348  hhcd->hc[ch_num].state = HC_NYET;
1349  hhcd->hc[ch_num].do_ping = 1U;
1350  hhcd->hc[ch_num].ErrCnt = 0U;
1351  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1352  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1353  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NYET);
1354  }
1355  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_FRMOR) == USB_OTG_HCINT_FRMOR)
1356  {
1357  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1358  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1359  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_FRMOR);
1360  }
1361  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_XFRC) == USB_OTG_HCINT_XFRC)
1362  {
1363  hhcd->hc[ch_num].ErrCnt = 0U;
1364  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1365  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1366  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_XFRC);
1367  hhcd->hc[ch_num].state = HC_XFRC;
1368  }
1369  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_STALL) == USB_OTG_HCINT_STALL)
1370  {
1371  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_STALL);
1372  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1373  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1374  hhcd->hc[ch_num].state = HC_STALL;
1375  }
1376  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_NAK) == USB_OTG_HCINT_NAK)
1377  {
1378  hhcd->hc[ch_num].ErrCnt = 0U;
1379  hhcd->hc[ch_num].state = HC_NAK;
1380 
1381  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1382  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1383  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK);
1384  }
1385  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_TXERR) == USB_OTG_HCINT_TXERR)
1386  {
1387  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1388  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1389  hhcd->hc[ch_num].state = HC_XACTERR;
1390  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_TXERR);
1391  }
1392  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_DTERR) == USB_OTG_HCINT_DTERR)
1393  {
1394  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1395  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1396  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK);
1397  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_DTERR);
1398  hhcd->hc[ch_num].state = HC_DATATGLERR;
1399  }
1400  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_CHH) == USB_OTG_HCINT_CHH)
1401  {
1402  __HAL_HCD_MASK_HALT_HC_INT(ch_num);
1403 
1404  if (hhcd->hc[ch_num].state == HC_XFRC)
1405  {
1406  hhcd->hc[ch_num].urb_state = URB_DONE;
1407  if ((hhcd->hc[ch_num].ep_type == EP_TYPE_BULK) ||
1408  (hhcd->hc[ch_num].ep_type == EP_TYPE_INTR))
1409  {
1410  hhcd->hc[ch_num].toggle_out ^= 1U;
1411  }
1412  }
1413  else if (hhcd->hc[ch_num].state == HC_NAK)
1414  {
1415  hhcd->hc[ch_num].urb_state = URB_NOTREADY;
1416  }
1417  else if (hhcd->hc[ch_num].state == HC_NYET)
1418  {
1419  hhcd->hc[ch_num].urb_state = URB_NOTREADY;
1420  }
1421  else if (hhcd->hc[ch_num].state == HC_STALL)
1422  {
1423  hhcd->hc[ch_num].urb_state = URB_STALL;
1424  }
1425  else if ((hhcd->hc[ch_num].state == HC_XACTERR) ||
1426  (hhcd->hc[ch_num].state == HC_DATATGLERR))
1427  {
1428  hhcd->hc[ch_num].ErrCnt++;
1429  if (hhcd->hc[ch_num].ErrCnt > 3U)
1430  {
1431  hhcd->hc[ch_num].ErrCnt = 0U;
1432  hhcd->hc[ch_num].urb_state = URB_ERROR;
1433  }
1434  else
1435  {
1436  hhcd->hc[ch_num].urb_state = URB_NOTREADY;
1437  }
1438 
1439  /* re-activate the channel */
1440  tmpreg = USBx_HC(ch_num)->HCCHAR;
1441  tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
1442  tmpreg |= USB_OTG_HCCHAR_CHENA;
1443  USBx_HC(ch_num)->HCCHAR = tmpreg;
1444  }
1445  else
1446  {
1447  /* ... */
1448  }
1449 
1450  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_CHH);
1451  HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state);
1452  }
1453  else
1454  {
1455  /* ... */
1456  }
1457 }
HAL_StatusTypeDef USB_HC_Halt(USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num)
Halt a host channel.
void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef *hhcd, uint8_t chnum, HCD_URBStateTypeDef urb_state)
Notify URB state change callback.

◆ HCD_Port_IRQHandler()

static void HCD_Port_IRQHandler ( HCD_HandleTypeDef hhcd)
static

Handle Host Port interrupt requests.

Parameters
hhcdHCD handle
Return values
None

Definition at line 1518 of file stm32l4xx_hal_hcd.c.

1519 {
1520  USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
1521  uint32_t USBx_BASE = (uint32_t)USBx;
1522  __IO uint32_t hprt0, hprt0_dup;
1523 
1524  /* Handle Host Port Interrupts */
1525  hprt0 = USBx_HPRT0;
1526  hprt0_dup = USBx_HPRT0;
1527 
1528  hprt0_dup &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | \
1529  USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG);
1530 
1531  /* Check whether Port Connect detected */
1532  if ((hprt0 & USB_OTG_HPRT_PCDET) == USB_OTG_HPRT_PCDET)
1533  {
1534  if ((hprt0 & USB_OTG_HPRT_PCSTS) == USB_OTG_HPRT_PCSTS)
1535  {
1536  USB_MASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_DISCINT);
1537 
1538 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1539  hhcd->ConnectCallback(hhcd);
1540 #else
1542 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
1543  }
1544  hprt0_dup |= USB_OTG_HPRT_PCDET;
1545  }
1546 
1547  /* Check whether Port Enable Changed */
1548  if ((hprt0 & USB_OTG_HPRT_PENCHNG) == USB_OTG_HPRT_PENCHNG)
1549  {
1550  hprt0_dup |= USB_OTG_HPRT_PENCHNG;
1551 
1552  if ((hprt0 & USB_OTG_HPRT_PENA) == USB_OTG_HPRT_PENA)
1553  {
1554  if (hhcd->Init.phy_itface == USB_OTG_EMBEDDED_PHY)
1555  {
1556  if ((hprt0 & USB_OTG_HPRT_PSPD) == (HPRT0_PRTSPD_LOW_SPEED << 17))
1557  {
1558  (void)USB_InitFSLSPClkSel(hhcd->Instance, HCFG_6_MHZ);
1559  }
1560  else
1561  {
1562  (void)USB_InitFSLSPClkSel(hhcd->Instance, HCFG_48_MHZ);
1563  }
1564  }
1565  else
1566  {
1567  if (hhcd->Init.speed == HCD_SPEED_FULL)
1568  {
1569  USBx_HOST->HFIR = 60000U;
1570  }
1571  }
1572 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1573  hhcd->PortEnabledCallback(hhcd);
1574  hhcd->ConnectCallback(hhcd);
1575 #else
1578 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
1579 
1580  }
1581  else
1582  {
1583 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1584  hhcd->PortDisabledCallback(hhcd);
1585 #else
1587 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
1588 
1589  /* Cleanup HPRT */
1590  USBx_HPRT0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | \
1591  USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG);
1592 
1593  USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_DISCINT);
1594  }
1595  }
1596 
1597  /* Check for an overcurrent */
1598  if ((hprt0 & USB_OTG_HPRT_POCCHNG) == USB_OTG_HPRT_POCCHNG)
1599  {
1600  hprt0_dup |= USB_OTG_HPRT_POCCHNG;
1601  }
1602 
1603  /* Clear Port Interrupts */
1604  USBx_HPRT0 = hprt0_dup;
1605 }
void HAL_HCD_PortDisabled_Callback(HCD_HandleTypeDef *hhcd)
Port Disabled Event callback.
HAL_StatusTypeDef USB_InitFSLSPClkSel(USB_OTG_GlobalTypeDef *USBx, uint8_t freq)
USB_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the HCFG register on the PHY type and set ...
void HAL_HCD_PortEnabled_Callback(HCD_HandleTypeDef *hhcd)
Port Enabled Event callback.
void HAL_HCD_Connect_Callback(HCD_HandleTypeDef *hhcd)
Connection Event callback.

◆ HCD_RXQLVL_IRQHandler()

static void HCD_RXQLVL_IRQHandler ( HCD_HandleTypeDef hhcd)
static

Handle Rx Queue Level interrupt requests.

Parameters
hhcdHCD handle
Return values
none

Definition at line 1464 of file stm32l4xx_hal_hcd.c.

1465 {
1466  USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
1467  uint32_t USBx_BASE = (uint32_t)USBx;
1468  uint32_t pktsts;
1469  uint32_t pktcnt;
1470  uint32_t temp;
1471  uint32_t tmpreg;
1472  uint32_t ch_num;
1473 
1474  temp = hhcd->Instance->GRXSTSP;
1475  ch_num = temp & USB_OTG_GRXSTSP_EPNUM;
1476  pktsts = (temp & USB_OTG_GRXSTSP_PKTSTS) >> 17;
1477  pktcnt = (temp & USB_OTG_GRXSTSP_BCNT) >> 4;
1478 
1479  switch (pktsts)
1480  {
1481  case GRXSTS_PKTSTS_IN:
1482  /* Read the data into the host buffer. */
1483  if ((pktcnt > 0U) && (hhcd->hc[ch_num].xfer_buff != (void *)0))
1484  {
1485  (void)USB_ReadPacket(hhcd->Instance, hhcd->hc[ch_num].xfer_buff, (uint16_t)pktcnt);
1486 
1487  /*manage multiple Xfer */
1488  hhcd->hc[ch_num].xfer_buff += pktcnt;
1489  hhcd->hc[ch_num].xfer_count += pktcnt;
1490 
1491  if ((USBx_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_PKTCNT) > 0U)
1492  {
1493  /* re-activate the channel when more packets are expected */
1494  tmpreg = USBx_HC(ch_num)->HCCHAR;
1495  tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
1496  tmpreg |= USB_OTG_HCCHAR_CHENA;
1497  USBx_HC(ch_num)->HCCHAR = tmpreg;
1498  hhcd->hc[ch_num].toggle_in ^= 1U;
1499  }
1500  }
1501  break;
1502 
1503  case GRXSTS_PKTSTS_DATA_TOGGLE_ERR:
1504  break;
1505 
1506  case GRXSTS_PKTSTS_IN_XFER_COMP:
1507  case GRXSTS_PKTSTS_CH_HALTED:
1508  default:
1509  break;
1510  }
1511 }
void * USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len)
USB_ReadPacket : read a packet from the RX FIFO.