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 */
@@ -755,6 +741,86 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
755
741
}
756
742
}
757
743
744
+ // MBED PATCH
745
+ /**
746
+ * @brief Abort a transaction.
747
+ * @param hpcd: PCD handle
748
+ * @param ep_addr: endpoint address
749
+ * @retval HAL status
750
+ */
751
+ HAL_StatusTypeDef HAL_PCD_EP_Abort (PCD_HandleTypeDef * hpcd , uint8_t ep_addr )
752
+ {
753
+ USB_OTG_GlobalTypeDef * USBx = hpcd -> Instance ;
754
+ HAL_StatusTypeDef ret = HAL_OK ;
755
+ USB_OTG_EPTypeDef * ep ;
756
+
757
+ if ((0x80 & ep_addr ) == 0x80 )
758
+ {
759
+ ep = & hpcd -> IN_ep [ep_addr & 0x7F ];
760
+ }
761
+ else
762
+ {
763
+ ep = & hpcd -> OUT_ep [ep_addr ];
764
+ }
765
+
766
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
767
+
768
+ ep -> num = ep_addr & 0x7F ;
769
+ ep -> is_in = ((ep_addr & 0x80 ) == 0x80 );
770
+
771
+ USB_EPSetNak (hpcd -> Instance , ep );
772
+
773
+ if ((0x80 & ep_addr ) == 0x80 )
774
+ {
775
+ ret = USB_EPStopXfer (hpcd -> Instance , ep );
776
+ if (ret == HAL_OK )
777
+ {
778
+ ret = USB_FlushTxFifo (hpcd -> Instance , ep_addr & 0x7F );
779
+ }
780
+ }
781
+ else
782
+ {
783
+ /* Set global NAK */
784
+ USBx_DEVICE -> DCTL |= USB_OTG_DCTL_SGONAK ;
785
+
786
+ /* Read all entries from the fifo so global NAK takes effect */
787
+ while (__HAL_PCD_GET_FLAG (hpcd , USB_OTG_GINTSTS_RXFLVL ))
788
+ {
789
+ PCD_ReadRxFifo (hpcd );
790
+ }
791
+
792
+ /* Stop the transfer */
793
+ ret = USB_EPStopXfer (hpcd -> Instance , ep );
794
+ if (ret == HAL_BUSY )
795
+ {
796
+ /* If USB_EPStopXfer returns HAL_BUSY then a setup packet
797
+ * arrived after the rx fifo was processed but before USB_EPStopXfer
798
+ * was called. Process the rx fifo one more time to read the
799
+ * setup packet.
800
+ *
801
+ * Note - after the setup packet has been received no further
802
+ * packets will be received over USB. This is because the next
803
+ * phase (data or status) of the control transfer started by
804
+ * the setup packet will be naked until global nak is cleared.
805
+ */
806
+ while (__HAL_PCD_GET_FLAG (hpcd , USB_OTG_GINTSTS_RXFLVL ))
807
+ {
808
+ PCD_ReadRxFifo (hpcd );
809
+ }
810
+
811
+ ret = USB_EPStopXfer (hpcd -> Instance , ep );
812
+ }
813
+
814
+ /* Clear global nak */
815
+ USBx_DEVICE -> DCTL |= USB_OTG_DCTL_CGONAK ;
816
+ }
817
+
818
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
819
+
820
+ return ret ;
821
+ }
822
+ // MBED PATCH
823
+
758
824
#endif /* USB_OTG_FS */
759
825
760
826
#if defined (USB )
@@ -1135,9 +1201,11 @@ HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint
1135
1201
ep -> maxpacket = ep_mps ;
1136
1202
ep -> type = ep_type ;
1137
1203
1138
- __HAL_LOCK (hpcd );
1204
+ // MBED PATCH __HAL_LOCK(hpcd);
1205
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7FU ]); // MBED PATCH
1139
1206
USB_ActivateEndpoint (hpcd -> Instance , ep );
1140
- __HAL_UNLOCK (hpcd );
1207
+ // MBED PATCH __HAL_UNLOCK(hpcd);
1208
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7FU ]); // MBED PATCH
1141
1209
return ret ;
1142
1210
1143
1211
}
@@ -1165,9 +1233,11 @@ HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
1165
1233
1166
1234
ep -> is_in = (0x80 & ep_addr ) != 0 ;
1167
1235
1168
- __HAL_LOCK (hpcd );
1236
+ // MBED PATCH __HAL_LOCK(hpcd);
1237
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7FU ]); // MBED PATCH
1169
1238
USB_DeactivateEndpoint (hpcd -> Instance , ep );
1170
- __HAL_UNLOCK (hpcd );
1239
+ // MBED PATCH __HAL_UNLOCK(hpcd);
1240
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7FU ]); // MBED PATCH
1171
1241
return HAL_OK ;
1172
1242
}
1173
1243
@@ -1193,8 +1263,7 @@ HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, u
1193
1263
ep -> is_in = 0 ;
1194
1264
ep -> num = ep_addr & 0x7F ;
1195
1265
1196
- // Added for MBED PR #3062
1197
- __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1266
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1198
1267
1199
1268
if ((ep_addr & 0x7F ) == 0 )
1200
1269
{
@@ -1205,8 +1274,7 @@ HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, u
1205
1274
USB_EPStartXfer (hpcd -> Instance , ep , hpcd -> Init .dma_enable );
1206
1275
}
1207
1276
1208
- // Added for MBED PR #3062
1209
- __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1277
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1210
1278
1211
1279
return HAL_OK ;
1212
1280
}
@@ -1242,9 +1310,8 @@ HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr,
1242
1310
ep -> is_in = 1 ;
1243
1311
ep -> num = ep_addr & 0x7F ;
1244
1312
1245
- // Added for MBED PR #3062
1246
- __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1247
-
1313
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1314
+
1248
1315
if ((ep_addr & 0x7F ) == 0 )
1249
1316
{
1250
1317
USB_EP0StartXfer (hpcd -> Instance ,ep , hpcd -> Init .dma_enable );
@@ -1254,9 +1321,8 @@ HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr,
1254
1321
USB_EPStartXfer (hpcd -> Instance , ep , hpcd -> Init .dma_enable );
1255
1322
}
1256
1323
1257
- // Added for MBED PR #3062
1258
- __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1259
-
1324
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1325
+
1260
1326
return HAL_OK ;
1261
1327
}
1262
1328
@@ -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