102
102
* @{
103
103
*/
104
104
static HAL_StatusTypeDef PCD_WriteEmptyTxFifo (PCD_HandleTypeDef * hpcd , uint32_t epnum );
105
+ static HAL_StatusTypeDef PCD_ReadRxFifo (PCD_HandleTypeDef * hpcd ); // MBED PATCH
105
106
/**
106
107
* @}
107
108
*/
@@ -148,8 +149,9 @@ HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd)
148
149
{
149
150
/* Allocate lock resource and initialize it */
150
151
hpcd -> Lock = HAL_UNLOCKED ;
151
- for (i = 0 ; i < hpcd -> Init .dev_endpoints ; i ++ )
152
- hpcd -> EPLock [i ].Lock = HAL_UNLOCKED ;
152
+ for (i = 0 ; i < hpcd -> Init .dev_endpoints ; i ++ ) { // MBED PATCH
153
+ hpcd -> EPLock [i ].Lock = HAL_UNLOCKED ;
154
+ }
153
155
/* Init the low level hardware : GPIO, CLOCK, NVIC... */
154
156
HAL_PCD_MspInit (hpcd );
155
157
}
@@ -300,10 +302,10 @@ __weak void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd)
300
302
*/
301
303
HAL_StatusTypeDef HAL_PCD_Start (PCD_HandleTypeDef * hpcd )
302
304
{
303
- __HAL_LOCK (hpcd );
305
+ // MBED PATCH __HAL_LOCK(hpcd);
304
306
USB_DevConnect (hpcd -> Instance );
305
307
__HAL_PCD_ENABLE (hpcd );
306
- __HAL_UNLOCK (hpcd );
308
+ // MBED PATCH __HAL_UNLOCK(hpcd);
307
309
return HAL_OK ;
308
310
}
309
311
@@ -314,11 +316,11 @@ HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd)
314
316
*/
315
317
HAL_StatusTypeDef HAL_PCD_Stop (PCD_HandleTypeDef * hpcd )
316
318
{
317
- __HAL_LOCK (hpcd );
319
+ // MBED PATCH __HAL_LOCK(hpcd);
318
320
__HAL_PCD_DISABLE (hpcd );
319
321
USB_StopDevice (hpcd -> Instance );
320
322
USB_DevDisconnect (hpcd -> Instance );
321
- __HAL_UNLOCK (hpcd );
323
+ // MBED PATCH __HAL_UNLOCK(hpcd);
322
324
return HAL_OK ;
323
325
}
324
326
@@ -393,6 +395,13 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
393
395
}
394
396
}
395
397
398
+ // MBED PATCH
399
+ if (( epint & USB_OTG_DOEPINT_EPDISD ) == USB_OTG_DOEPINT_EPDISD )
400
+ {
401
+ CLEAR_OUT_EP_INTR (epnum , USB_OTG_DOEPINT_EPDISD );
402
+ }
403
+ // MBED PATCH
404
+
396
405
if (( epint & USB_OTG_DOEPINT_STUP ) == USB_OTG_DOEPINT_STUP )
397
406
{
398
407
/* setup/out transaction management for Core ID >= 310A */
@@ -440,7 +449,8 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
440
449
if (( epint & USB_OTG_DIEPINT_XFRC ) == USB_OTG_DIEPINT_XFRC )
441
450
{
442
451
fifoemptymsk = 0x1 << epnum ;
443
- atomic_clr_u32 (& USBx_DEVICE -> DIEPEMPMSK , fifoemptymsk ); // MBED: changed
452
+
453
+ atomic_clr_u32 (& USBx_DEVICE -> DIEPEMPMSK , fifoemptymsk ); // MBED PATCH
444
454
445
455
CLEAR_IN_EP_INTR (epnum , USB_OTG_DIEPINT_XFRC );
446
456
@@ -662,25 +672,7 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
662
672
/* Handle RxQLevel Interrupt */
663
673
if (__HAL_PCD_GET_FLAG (hpcd , USB_OTG_GINTSTS_RXFLVL ))
664
674
{
665
- USB_MASK_INTERRUPT (hpcd -> Instance , USB_OTG_GINTSTS_RXFLVL );
666
- temp = USBx -> GRXSTSP ;
667
- ep = & hpcd -> OUT_ep [temp & USB_OTG_GRXSTSP_EPNUM ];
668
-
669
- if (((temp & USB_OTG_GRXSTSP_PKTSTS ) >> 17 ) == STS_DATA_UPDT )
670
- {
671
- if ((temp & USB_OTG_GRXSTSP_BCNT ) != 0 )
672
- {
673
- USB_ReadPacket (USBx , ep -> xfer_buff , (temp & USB_OTG_GRXSTSP_BCNT ) >> 4 );
674
- ep -> xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT ) >> 4 ;
675
- ep -> xfer_count += (temp & USB_OTG_GRXSTSP_BCNT ) >> 4 ;
676
- }
677
- }
678
- else if (((temp & USB_OTG_GRXSTSP_PKTSTS ) >> 17 ) == STS_SETUP_UPDT )
679
- {
680
- USB_ReadPacket (USBx , (uint8_t * )hpcd -> Setup , 8 );
681
- ep -> xfer_count += (temp & USB_OTG_GRXSTSP_BCNT ) >> 4 ;
682
- }
683
- USB_UNMASK_INTERRUPT (hpcd -> Instance , USB_OTG_GINTSTS_RXFLVL );
675
+ PCD_ReadRxFifo (hpcd ); // MBED PATCH
684
676
}
685
677
686
678
/* Handle SOF Interrupt */
@@ -988,9 +980,9 @@ HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint
988
980
ep -> data_pid_start = 0 ;
989
981
}
990
982
991
- __HAL_LOCK (hpcd );
983
+ __HAL_LOCK (& hpcd -> EPLock [ ep_addr & 0x7FU ]); // MBED PATCH
992
984
USB_ActivateEndpoint (hpcd -> Instance , ep );
993
- __HAL_UNLOCK (hpcd );
985
+ __HAL_UNLOCK (& hpcd -> EPLock [ ep_addr & 0x7FU ]); // MBED PATCH
994
986
return ret ;
995
987
}
996
988
@@ -1017,9 +1009,9 @@ HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
1017
1009
1018
1010
ep -> is_in = (0x80 & ep_addr ) != 0 ;
1019
1011
1020
- __HAL_LOCK (hpcd );
1012
+ __HAL_LOCK (& hpcd -> EPLock [ ep_addr & 0x7FU ]); // MBED PATCH
1021
1013
USB_DeactivateEndpoint (hpcd -> Instance , ep );
1022
- __HAL_UNLOCK (hpcd );
1014
+ __HAL_UNLOCK (& hpcd -> EPLock [ ep_addr & 0x7FU ]); // MBED PATCH
1023
1015
return HAL_OK ;
1024
1016
}
1025
1017
@@ -1050,7 +1042,7 @@ HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, u
1050
1042
ep -> dma_addr = (uint32_t )pBuf ;
1051
1043
}
1052
1044
1053
- __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED:added
1045
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1054
1046
1055
1047
if ((ep_addr & 0x7F ) == 0 )
1056
1048
{
@@ -1061,7 +1053,7 @@ HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, u
1061
1053
USB_EPStartXfer (hpcd -> Instance , ep , hpcd -> Init .dma_enable );
1062
1054
}
1063
1055
1064
- __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED: added
1056
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1065
1057
1066
1058
return HAL_OK ;
1067
1059
}
@@ -1102,7 +1094,7 @@ HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr,
1102
1094
ep -> dma_addr = (uint32_t )pBuf ;
1103
1095
}
1104
1096
1105
- __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED: added
1097
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1106
1098
1107
1099
if ((ep_addr & 0x7F ) == 0 )
1108
1100
{
@@ -1113,11 +1105,91 @@ HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr,
1113
1105
USB_EPStartXfer (hpcd -> Instance , ep , hpcd -> Init .dma_enable );
1114
1106
}
1115
1107
1116
- __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED: added
1108
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1117
1109
1118
1110
return HAL_OK ;
1119
1111
}
1120
1112
1113
+ // MBED PATCH
1114
+ /**
1115
+ * @brief Abort a transaction.
1116
+ * @param hpcd: PCD handle
1117
+ * @param ep_addr: endpoint address
1118
+ * @retval HAL status
1119
+ */
1120
+ HAL_StatusTypeDef HAL_PCD_EP_Abort (PCD_HandleTypeDef * hpcd , uint8_t ep_addr )
1121
+ {
1122
+ USB_OTG_GlobalTypeDef * USBx = hpcd -> Instance ;
1123
+ HAL_StatusTypeDef ret = HAL_OK ;
1124
+ USB_OTG_EPTypeDef * ep ;
1125
+
1126
+ if ((0x80 & ep_addr ) == 0x80 )
1127
+ {
1128
+ ep = & hpcd -> IN_ep [ep_addr & 0x7F ];
1129
+ }
1130
+ else
1131
+ {
1132
+ ep = & hpcd -> OUT_ep [ep_addr ];
1133
+ }
1134
+
1135
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1136
+
1137
+ ep -> num = ep_addr & 0x7F ;
1138
+ ep -> is_in = ((ep_addr & 0x80 ) == 0x80 );
1139
+
1140
+ USB_EPSetNak (hpcd -> Instance , ep );
1141
+
1142
+ if ((0x80 & ep_addr ) == 0x80 )
1143
+ {
1144
+ ret = USB_EPStopXfer (hpcd -> Instance , ep );
1145
+ if (ret == HAL_OK )
1146
+ {
1147
+ ret = USB_FlushTxFifo (hpcd -> Instance , ep_addr & 0x7F );
1148
+ }
1149
+ }
1150
+ else
1151
+ {
1152
+ /* Set global NAK */
1153
+ USBx_DEVICE -> DCTL |= USB_OTG_DCTL_SGONAK ;
1154
+
1155
+ /* Read all entries from the fifo so global NAK takes effect */
1156
+ while (__HAL_PCD_GET_FLAG (hpcd , USB_OTG_GINTSTS_RXFLVL ))
1157
+ {
1158
+ PCD_ReadRxFifo (hpcd );
1159
+ }
1160
+
1161
+ /* Stop the transfer */
1162
+ ret = USB_EPStopXfer (hpcd -> Instance , ep );
1163
+ if (ret == HAL_BUSY )
1164
+ {
1165
+ /* If USB_EPStopXfer returns HAL_BUSY then a setup packet
1166
+ * arrived after the rx fifo was processed but before USB_EPStopXfer
1167
+ * was called. Process the rx fifo one more time to read the
1168
+ * setup packet.
1169
+ *
1170
+ * Note - after the setup packet has been received no further
1171
+ * packets will be received over USB. This is because the next
1172
+ * phase (data or status) of the control transfer started by
1173
+ * the setup packet will be naked until global nak is cleared.
1174
+ */
1175
+ while (__HAL_PCD_GET_FLAG (hpcd , USB_OTG_GINTSTS_RXFLVL ))
1176
+ {
1177
+ PCD_ReadRxFifo (hpcd );
1178
+ }
1179
+
1180
+ ret = USB_EPStopXfer (hpcd -> Instance , ep );
1181
+ }
1182
+
1183
+ /* Clear global nak */
1184
+ USBx_DEVICE -> DCTL |= USB_OTG_DCTL_CGONAK ;
1185
+ }
1186
+
1187
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]);
1188
+
1189
+ return ret ;
1190
+ }
1191
+ // MBED PATCH
1192
+
1121
1193
/**
1122
1194
* @brief Set a STALL condition over an endpoint.
1123
1195
* @param hpcd PCD handle
@@ -1146,16 +1218,15 @@ HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
1146
1218
ep -> num = ep_addr & 0x7F ;
1147
1219
ep -> is_in = ((ep_addr & 0x80 ) == 0x80 );
1148
1220
1149
-
1150
- __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED: changed
1221
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1151
1222
1152
1223
USB_EPSetStall (hpcd -> Instance , ep );
1153
1224
if ((ep_addr & 0x7F ) == 0 )
1154
1225
{
1155
1226
USB_EP0_OutStart (hpcd -> Instance , hpcd -> Init .dma_enable , (uint8_t * )hpcd -> Setup );
1156
1227
}
1157
1228
1158
- __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED: changed
1229
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1159
1230
1160
1231
return HAL_OK ;
1161
1232
}
@@ -1188,9 +1259,11 @@ HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
1188
1259
ep -> num = ep_addr & 0x7F ;
1189
1260
ep -> is_in = ((ep_addr & 0x80 ) == 0x80 );
1190
1261
1191
- __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED: changed
1262
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1263
+
1192
1264
USB_EPClearStall (hpcd -> Instance , ep );
1193
- __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED: changed
1265
+
1266
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1194
1267
1195
1268
return HAL_OK ;
1196
1269
}
@@ -1203,7 +1276,7 @@ HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
1203
1276
*/
1204
1277
HAL_StatusTypeDef HAL_PCD_EP_Flush (PCD_HandleTypeDef * hpcd , uint8_t ep_addr )
1205
1278
{
1206
- __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED: changed
1279
+ __HAL_LOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1207
1280
1208
1281
if ((ep_addr & 0x80 ) == 0x80 )
1209
1282
{
@@ -1214,7 +1287,7 @@ HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
1214
1287
USB_FlushRxFifo (hpcd -> Instance );
1215
1288
}
1216
1289
1217
- __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED: change
1290
+ __HAL_UNLOCK (& hpcd -> EPLock [ep_addr & 0x7F ]); // MBED PATCH
1218
1291
1219
1292
return HAL_OK ;
1220
1293
}
@@ -1337,13 +1410,51 @@ static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t
1337
1410
if (ep -> xfer_count >= ep -> xfer_len )
1338
1411
{
1339
1412
fifoemptymsk = 0x1 << epnum ;
1340
- atomic_clr_u32 (& USBx_DEVICE -> DIEPEMPMSK , fifoemptymsk ); // MBED: changed
1413
+ atomic_clr_u32 (& USBx_DEVICE -> DIEPEMPMSK , fifoemptymsk ); // MBED PATCH
1341
1414
1342
1415
}
1343
1416
1344
1417
return HAL_OK ;
1345
1418
}
1346
1419
1420
+ // MBED PATCH
1421
+ /**
1422
+ * @brief Process the next RX fifo entry
1423
+ * @param hpcd: PCD handle
1424
+ * @retval HAL status
1425
+ */
1426
+ static HAL_StatusTypeDef PCD_ReadRxFifo (PCD_HandleTypeDef * hpcd )
1427
+ {
1428
+ USB_OTG_GlobalTypeDef * USBx = hpcd -> Instance ;
1429
+ USB_OTG_EPTypeDef * ep ;
1430
+ uint32_t temp = 0 ;
1431
+
1432
+ USB_MASK_INTERRUPT (hpcd -> Instance , USB_OTG_GINTSTS_RXFLVL );
1433
+
1434
+ temp = USBx -> GRXSTSP ;
1435
+
1436
+ ep = & hpcd -> OUT_ep [temp & USB_OTG_GRXSTSP_EPNUM ];
1437
+
1438
+ if (((temp & USB_OTG_GRXSTSP_PKTSTS ) >> 17U ) == STS_DATA_UPDT )
1439
+ {
1440
+ if ((temp & USB_OTG_GRXSTSP_BCNT ) != 0U )
1441
+ {
1442
+ USB_ReadPacket (USBx , ep -> xfer_buff , (temp & USB_OTG_GRXSTSP_BCNT ) >> 4U );
1443
+ ep -> xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT ) >> 4U ;
1444
+ ep -> xfer_count += (temp & USB_OTG_GRXSTSP_BCNT ) >> 4U ;
1445
+ }
1446
+ }
1447
+ else if (((temp & USB_OTG_GRXSTSP_PKTSTS ) >> 17U ) == STS_SETUP_UPDT )
1448
+ {
1449
+ USB_ReadPacket (USBx , (uint8_t * )hpcd -> Setup , 8U );
1450
+ ep -> xfer_count += (temp & USB_OTG_GRXSTSP_BCNT ) >> 4U ;
1451
+ }
1452
+ USB_UNMASK_INTERRUPT (hpcd -> Instance , USB_OTG_GINTSTS_RXFLVL );
1453
+
1454
+ return HAL_OK ;
1455
+ }
1456
+ // MBED PATCH
1457
+
1347
1458
/**
1348
1459
* @}
1349
1460
*/
0 commit comments