113
113
*/
114
114
#if defined (USB_OTG_FS )
115
115
static HAL_StatusTypeDef PCD_WriteEmptyTxFifo (PCD_HandleTypeDef * hpcd , uint32_t epnum );
116
+ static HAL_StatusTypeDef PCD_ReadRxFifo (PCD_HandleTypeDef * hpcd ); // MBED PATCH
116
117
#endif /* USB_OTG_FS */
117
118
#if defined (USB )
118
119
static HAL_StatusTypeDef PCD_EP_ISR_Handler (PCD_HandleTypeDef * hpcd );
@@ -162,11 +163,9 @@ HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd)
162
163
{
163
164
/* Allocate lock resource and initialize it */
164
165
hpcd -> Lock = HAL_UNLOCKED ;
165
-
166
- // Added for MBED PR #3062
167
- for (index = 0 ; index < hpcd -> Init .dev_endpoints ; index ++ )
168
- hpcd -> EPLock [index ].Lock = HAL_UNLOCKED ;
169
-
166
+ for (index = 0 ; index < hpcd -> Init .dev_endpoints ; index ++ ) { // MBED PATCH
167
+ hpcd -> EPLock [index ].Lock = HAL_UNLOCKED ;
168
+ }
170
169
/* Init the low level hardware : GPIO, CLOCK, NVIC... */
171
170
HAL_PCD_MspInit (hpcd );
172
171
}
@@ -311,10 +310,10 @@ __weak void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd)
311
310
*/
312
311
HAL_StatusTypeDef HAL_PCD_Start (PCD_HandleTypeDef * hpcd )
313
312
{
314
- __HAL_LOCK (hpcd );
313
+ // MBED PATCH __HAL_LOCK(hpcd);
315
314
USB_DevConnect (hpcd -> Instance );
316
315
__HAL_PCD_ENABLE (hpcd );
317
- __HAL_UNLOCK (hpcd );
316
+ // MBED PATCH __HAL_UNLOCK(hpcd);
318
317
return HAL_OK ;
319
318
}
320
319
@@ -325,13 +324,14 @@ HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd)
325
324
*/
326
325
HAL_StatusTypeDef HAL_PCD_Stop (PCD_HandleTypeDef * hpcd )
327
326
{
328
- __HAL_LOCK (hpcd );
327
+ // MBED PATCH __HAL_LOCK(hpcd);
329
328
__HAL_PCD_DISABLE (hpcd );
330
329
USB_StopDevice (hpcd -> Instance );
331
330
USB_DevDisconnect (hpcd -> Instance );
332
- __HAL_UNLOCK (hpcd );
331
+ // MBED PATCH __HAL_UNLOCK(hpcd);
333
332
return HAL_OK ;
334
333
}
334
+
335
335
#if defined (USB_OTG_FS )
336
336
/**
337
337
* @brief Handles PCD interrupt request.
@@ -431,6 +431,13 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
431
431
}
432
432
}
433
433
434
+ // MBED PATCH
435
+ if (( epint & USB_OTG_DOEPINT_EPDISD ) == USB_OTG_DOEPINT_EPDISD )
436
+ {
437
+ CLEAR_OUT_EP_INTR (epnum , USB_OTG_DOEPINT_EPDISD );
438
+ }
439
+ // MBED PATCH
440
+
434
441
if (( epint & USB_OTG_DOEPINT_STUP ) == USB_OTG_DOEPINT_STUP )
435
442
{
436
443
/* Inform the upper layer that a setup packet is available */
@@ -473,8 +480,7 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
473
480
{
474
481
fifoemptymsk = 0x1 << epnum ;
475
482
476
- // Added for MBED PR #3062
477
- atomic_clr_u32 (& USBx_DEVICE -> DIEPEMPMSK , fifoemptymsk );
483
+ atomic_clr_u32 (& USBx_DEVICE -> DIEPEMPMSK , fifoemptymsk ); // MBED PATCH
478
484
479
485
CLEAR_IN_EP_INTR (epnum , USB_OTG_DIEPINT_XFRC );
480
486
@@ -690,27 +696,7 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
690
696
/* Handle RxQLevel Interrupt */
691
697
if (__HAL_PCD_GET_FLAG (hpcd , USB_OTG_GINTSTS_RXFLVL ))
692
698
{
693
- USB_MASK_INTERRUPT (hpcd -> Instance , USB_OTG_GINTSTS_RXFLVL );
694
-
695
- temp = USBx -> GRXSTSP ;
696
-
697
- ep = & hpcd -> OUT_ep [temp & USB_OTG_GRXSTSP_EPNUM ];
698
-
699
- if (((temp & USB_OTG_GRXSTSP_PKTSTS ) >> 17 ) == STS_DATA_UPDT )
700
- {
701
- if ((temp & USB_OTG_GRXSTSP_BCNT ) != 0 )
702
- {
703
- USB_ReadPacket (USBx , ep -> xfer_buff , (temp & USB_OTG_GRXSTSP_BCNT ) >> 4 );
704
- ep -> xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT ) >> 4 ;
705
- ep -> xfer_count += (temp & USB_OTG_GRXSTSP_BCNT ) >> 4 ;
706
- }
707
- }
708
- else if (((temp & USB_OTG_GRXSTSP_PKTSTS ) >> 17 ) == STS_SETUP_UPDT )
709
- {
710
- USB_ReadPacket (USBx , (uint8_t * )hpcd -> Setup , 8 );
711
- ep -> xfer_count += (temp & USB_OTG_GRXSTSP_BCNT ) >> 4 ;
712
- }
713
- USB_UNMASK_INTERRUPT (hpcd -> Instance , USB_OTG_GINTSTS_RXFLVL );
699
+ PCD_ReadRxFifo (hpcd ); // MBED PATCH
714
700
}
715
701
716
702
/* Handle SOF Interrupt */
@@ -1135,9 +1121,11 @@ HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint
1135
1121
ep -> maxpacket = ep_mps ;
1136
1122
ep -> type = ep_type ;
1137
1123
1138
- __HAL_LOCK (hpcd );
1124
+ // MBED PATCH __HAL_LOCK(hpcd);
1125
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7FU ]); // MBED PATCH
1139
1126
USB_ActivateEndpoint (hpcd -> Instance , ep );
1140
- __HAL_UNLOCK (hpcd );
1127
+ // MBED PATCH __HAL_UNLOCK(hpcd);
1128
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7FU ]); // MBED PATCH
1141
1129
return ret ;
1142
1130
1143
1131
}
@@ -1165,9 +1153,11 @@ HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
1165
1153
1166
1154
ep -> is_in = (0x80 & ep_addr ) != 0 ;
1167
1155
1168
- __HAL_LOCK (hpcd );
1156
+ // MBED PATCH __HAL_LOCK(hpcd);
1157
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7FU ]); // MBED PATCH
1169
1158
USB_DeactivateEndpoint (hpcd -> Instance , ep );
1170
- __HAL_UNLOCK (hpcd );
1159
+ // MBED PATCH __HAL_UNLOCK(hpcd);
1160
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7FU ]); // MBED PATCH
1171
1161
return HAL_OK ;
1172
1162
}
1173
1163
@@ -1193,8 +1183,7 @@ HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, u
1193
1183
ep -> is_in = 0 ;
1194
1184
ep -> num = ep_addr & 0x7F ;
1195
1185
1196
- // Added for MBED PR #3062
1197
- __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1186
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1198
1187
1199
1188
if ((ep_addr & 0x7F ) == 0 )
1200
1189
{
@@ -1205,8 +1194,7 @@ HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, u
1205
1194
USB_EPStartXfer (hpcd -> Instance , ep , hpcd -> Init .dma_enable );
1206
1195
}
1207
1196
1208
- // Added for MBED PR #3062
1209
- __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1197
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1210
1198
1211
1199
return HAL_OK ;
1212
1200
}
@@ -1242,9 +1230,8 @@ HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr,
1242
1230
ep -> is_in = 1 ;
1243
1231
ep -> num = ep_addr & 0x7F ;
1244
1232
1245
- // Added for MBED PR #3062
1246
- __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1247
-
1233
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1234
+
1248
1235
if ((ep_addr & 0x7F ) == 0 )
1249
1236
{
1250
1237
USB_EP0StartXfer (hpcd -> Instance ,ep , hpcd -> Init .dma_enable );
@@ -1254,12 +1241,91 @@ HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr,
1254
1241
USB_EPStartXfer (hpcd -> Instance , ep , hpcd -> Init .dma_enable );
1255
1242
}
1256
1243
1257
- // Added for MBED PR #3062
1258
- __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1259
-
1244
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1245
+
1260
1246
return HAL_OK ;
1261
1247
}
1262
1248
1249
+ // MBED PATCH
1250
+ /**
1251
+ * @brief Abort a transaction.
1252
+ * @param hpcd: PCD handle
1253
+ * @param ep_addr: endpoint address
1254
+ * @retval HAL status
1255
+ */
1256
+ HAL_StatusTypeDef HAL_PCD_EP_Abort (PCD_HandleTypeDef * hpcd , uint8_t ep_addr )
1257
+ {
1258
+ USB_OTG_GlobalTypeDef * USBx = hpcd -> Instance ;
1259
+ HAL_StatusTypeDef ret = HAL_OK ;
1260
+ USB_OTG_EPTypeDef * ep ;
1261
+
1262
+ if ((0x80 & ep_addr ) == 0x80 )
1263
+ {
1264
+ ep = & hpcd -> IN_ep [ep_addr & 0x7F ];
1265
+ }
1266
+ else
1267
+ {
1268
+ ep = & hpcd -> OUT_ep [ep_addr ];
1269
+ }
1270
+
1271
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1272
+
1273
+ ep -> num = ep_addr & 0x7F ;
1274
+ ep -> is_in = ((ep_addr & 0x80 ) == 0x80 );
1275
+
1276
+ USB_EPSetNak (hpcd -> Instance , ep );
1277
+
1278
+ if ((0x80 & ep_addr ) == 0x80 )
1279
+ {
1280
+ ret = USB_EPStopXfer (hpcd -> Instance , ep );
1281
+ if (ret == HAL_OK )
1282
+ {
1283
+ ret = USB_FlushTxFifo (hpcd -> Instance , ep_addr & 0x7F );
1284
+ }
1285
+ }
1286
+ else
1287
+ {
1288
+ /* Set global NAK */
1289
+ USBx_DEVICE -> DCTL |= USB_OTG_DCTL_SGONAK ;
1290
+
1291
+ /* Read all entries from the fifo so global NAK takes effect */
1292
+ while (__HAL_PCD_GET_FLAG (hpcd , USB_OTG_GINTSTS_RXFLVL ))
1293
+ {
1294
+ PCD_ReadRxFifo (hpcd );
1295
+ }
1296
+
1297
+ /* Stop the transfer */
1298
+ ret = USB_EPStopXfer (hpcd -> Instance , ep );
1299
+ if (ret == HAL_BUSY )
1300
+ {
1301
+ /* If USB_EPStopXfer returns HAL_BUSY then a setup packet
1302
+ * arrived after the rx fifo was processed but before USB_EPStopXfer
1303
+ * was called. Process the rx fifo one more time to read the
1304
+ * setup packet.
1305
+ *
1306
+ * Note - after the setup packet has been received no further
1307
+ * packets will be received over USB. This is because the next
1308
+ * phase (data or status) of the control transfer started by
1309
+ * the setup packet will be naked until global nak is cleared.
1310
+ */
1311
+ while (__HAL_PCD_GET_FLAG (hpcd , USB_OTG_GINTSTS_RXFLVL ))
1312
+ {
1313
+ PCD_ReadRxFifo (hpcd );
1314
+ }
1315
+
1316
+ ret = USB_EPStopXfer (hpcd -> Instance , ep );
1317
+ }
1318
+
1319
+ /* Clear global nak */
1320
+ USBx_DEVICE -> DCTL |= USB_OTG_DCTL_CGONAK ;
1321
+ }
1322
+
1323
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1324
+
1325
+ return ret ;
1326
+ }
1327
+ // MBED PATCH
1328
+
1263
1329
/**
1264
1330
* @brief Set a STALL condition over an endpoint.
1265
1331
* @param hpcd: PCD handle
@@ -1283,17 +1349,15 @@ HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
1283
1349
ep -> num = ep_addr & 0x7F ;
1284
1350
ep -> is_in = ((ep_addr & 0x80 ) == 0x80 );
1285
1351
1286
- // Added for MBED PR #3062
1287
- __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1352
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1288
1353
1289
1354
USB_EPSetStall (hpcd -> Instance , ep );
1290
1355
if ((ep_addr & 0x7F ) == 0 )
1291
1356
{
1292
1357
USB_EP0_OutStart (hpcd -> Instance , hpcd -> Init .dma_enable , (uint8_t * )hpcd -> Setup );
1293
1358
}
1294
1359
1295
- // Added for MBED PR #3062
1296
- __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1360
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1297
1361
1298
1362
return HAL_OK ;
1299
1363
}
@@ -1321,13 +1385,11 @@ HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
1321
1385
ep -> num = ep_addr & 0x7F ;
1322
1386
ep -> is_in = ((ep_addr & 0x80 ) == 0x80 );
1323
1387
1324
- // Added for MBED PR #3062
1325
- __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1388
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1326
1389
1327
1390
USB_EPClearStall (hpcd -> Instance , ep );
1328
1391
1329
- // Added for MBED PR #3062
1330
- __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1392
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1331
1393
1332
1394
return HAL_OK ;
1333
1395
}
@@ -1340,8 +1402,7 @@ HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
1340
1402
*/
1341
1403
HAL_StatusTypeDef HAL_PCD_EP_Flush (PCD_HandleTypeDef * hpcd , uint8_t ep_addr )
1342
1404
{
1343
- // Added for MBED PR #3062
1344
- __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1405
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1345
1406
1346
1407
if ((ep_addr & 0x80 ) == 0x80 )
1347
1408
{
@@ -1352,9 +1413,8 @@ HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
1352
1413
USB_FlushRxFifo (hpcd -> Instance );
1353
1414
}
1354
1415
1355
- // Added for MBED PR #3062
1356
- __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1357
-
1416
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1417
+
1358
1418
return HAL_OK ;
1359
1419
}
1360
1420
@@ -1465,13 +1525,50 @@ static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t
1465
1525
if (ep -> xfer_count >= ep -> xfer_len )
1466
1526
{
1467
1527
fifoemptymsk = 0x1 << epnum ;
1468
- // Added for MBED PR #3062
1469
- atomic_clr_u32 (& USBx_DEVICE -> DIEPEMPMSK , fifoemptymsk );
1470
-
1528
+ atomic_clr_u32 (& USBx_DEVICE -> DIEPEMPMSK , fifoemptymsk ); // MBED PATCH
1471
1529
}
1472
1530
1473
1531
return HAL_OK ;
1474
1532
}
1533
+
1534
+ // MBED PATCH
1535
+ /**
1536
+ * @brief Process the next RX fifo entry
1537
+ * @param hpcd: PCD handle
1538
+ * @retval HAL status
1539
+ */
1540
+ static HAL_StatusTypeDef PCD_ReadRxFifo (PCD_HandleTypeDef * hpcd )
1541
+ {
1542
+ USB_OTG_GlobalTypeDef * USBx = hpcd -> Instance ;
1543
+ USB_OTG_EPTypeDef * ep ;
1544
+ uint32_t temp = 0 ;
1545
+
1546
+ USB_MASK_INTERRUPT (hpcd -> Instance , USB_OTG_GINTSTS_RXFLVL );
1547
+
1548
+ temp = USBx -> GRXSTSP ;
1549
+
1550
+ ep = & hpcd -> OUT_ep [temp & USB_OTG_GRXSTSP_EPNUM ];
1551
+
1552
+ if (((temp & USB_OTG_GRXSTSP_PKTSTS ) >> 17U ) == STS_DATA_UPDT )
1553
+ {
1554
+ if ((temp & USB_OTG_GRXSTSP_BCNT ) != 0U )
1555
+ {
1556
+ USB_ReadPacket (USBx , ep -> xfer_buff , (temp & USB_OTG_GRXSTSP_BCNT ) >> 4U );
1557
+ ep -> xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT ) >> 4U ;
1558
+ ep -> xfer_count += (temp & USB_OTG_GRXSTSP_BCNT ) >> 4U ;
1559
+ }
1560
+ }
1561
+ else if (((temp & USB_OTG_GRXSTSP_PKTSTS ) >> 17U ) == STS_SETUP_UPDT )
1562
+ {
1563
+ USB_ReadPacket (USBx , (uint8_t * )hpcd -> Setup , 8U );
1564
+ ep -> xfer_count += (temp & USB_OTG_GRXSTSP_BCNT ) >> 4U ;
1565
+ }
1566
+ USB_UNMASK_INTERRUPT (hpcd -> Instance , USB_OTG_GINTSTS_RXFLVL );
1567
+
1568
+ return HAL_OK ;
1569
+ }
1570
+ // MBED PATCH
1571
+
1475
1572
#endif /* USB_OTG_FS */
1476
1573
1477
1574
#if defined (USB )
0 commit comments