@@ -1115,8 +1115,19 @@ USB_TYPE USBHost::generalTransfer(USBDeviceConnected * dev, USBEndpoint * ep, ui
1115
1115
res = addTransfer (ep, buf, len);
1116
1116
1117
1117
if ((blocking)&& (res == USB_TYPE_PROCESSING)) {
1118
-
1118
+ #ifdef USBHOST_OTHER
1119
+ osEvent event = ep->ep_queue .get (TD_TIMEOUT);
1120
+ if (event.status == osEventTimeout) {
1121
+ /* control endpoint is confusing for merge on b */
1122
+ disableList (CONTROL_ENDPOINT);
1123
+ ep->setState (USB_TYPE_ERROR);
1124
+ ep->ep_queue .get (0 );
1125
+ ep->unqueueTransfer (ep->getProcessedTD ());
1126
+ enableList (CONTROL_ENDPOINT);
1127
+ }
1128
+ #else
1119
1129
ep->ep_queue .get ();
1130
+ #endif
1120
1131
res = ep->getState ();
1121
1132
1122
1133
USB_DBG_TRANSFER (" %s TRANSFER res: %s on ep: %p\r\n " , type_str, ep->getStateString (), ep);
@@ -1174,9 +1185,21 @@ USB_TYPE USBHost::controlTransfer(USBDeviceConnected * dev, uint8_t requestType,
1174
1185
control->setNextToken (TD_SETUP);
1175
1186
res = addTransfer (control, (uint8_t *)setupPacket, 8 );
1176
1187
1177
- if (res == USB_TYPE_PROCESSING) {
1178
- control->ep_queue .get ();
1188
+ if (res == USB_TYPE_PROCESSING)
1189
+ #ifdef USBHOST_OTHER
1190
+ {
1191
+ osEvent event = control->ep_queue .get (TD_TIMEOUT_CTRL);
1192
+ if (event.status == osEventTimeout) {
1193
+ disableList (CONTROL_ENDPOINT);
1194
+ control->setState (USB_TYPE_ERROR);
1195
+ control->ep_queue .get (0 );
1196
+ control->unqueueTransfer (control->getProcessedTD ());
1197
+ enableList (CONTROL_ENDPOINT);
1198
+ }
1179
1199
}
1200
+ #else
1201
+ control->ep_queue .get ();
1202
+ #endif
1180
1203
res = control->getState ();
1181
1204
1182
1205
USB_DBG_TRANSFER (" CONTROL setup stage %s" , control->getStateString ());
@@ -1190,9 +1213,21 @@ USB_TYPE USBHost::controlTransfer(USBDeviceConnected * dev, uint8_t requestType,
1190
1213
control->setNextToken (token);
1191
1214
res = addTransfer (control, (uint8_t *)buf, length_transfer);
1192
1215
1193
- if (res == USB_TYPE_PROCESSING) {
1194
- control->ep_queue .get ();
1216
+ if (res == USB_TYPE_PROCESSING)
1217
+ #ifdef USBHOST_OTHER
1218
+ {
1219
+ osEvent event = control->ep_queue .get (TD_TIMEOUT_CTRL);
1220
+ if (event.status == osEventTimeout) {
1221
+ disableList (CONTROL_ENDPOINT);
1222
+ control->setState (USB_TYPE_ERROR);
1223
+ control->ep_queue .get (0 );
1224
+ control->unqueueTransfer (control->getProcessedTD ());
1225
+ enableList (CONTROL_ENDPOINT);
1226
+ }
1195
1227
}
1228
+ #else
1229
+ control->ep_queue .get ();
1230
+ #endif
1196
1231
res = control->getState ();
1197
1232
1198
1233
#if DEBUG_TRANSFER
@@ -1220,10 +1255,21 @@ USB_TYPE USBHost::controlTransfer(USBDeviceConnected * dev, uint8_t requestType,
1220
1255
token = (write) ? TD_IN : TD_OUT;
1221
1256
control->setNextToken (token);
1222
1257
res = addTransfer (control, NULL , 0 );
1223
-
1224
- if (res == USB_TYPE_PROCESSING) {
1225
- control->ep_queue .get ();
1258
+ if (res == USB_TYPE_PROCESSING)
1259
+ #ifdef USBHOST_OTHER
1260
+ {
1261
+ osEvent event = control->ep_queue .get (TD_TIMEOUT_CTRL);
1262
+ if (event.status == osEventTimeout) {
1263
+ disableList (CONTROL_ENDPOINT);
1264
+ control->setState (USB_TYPE_ERROR);
1265
+ control->ep_queue .get (0 );
1266
+ control->unqueueTransfer (control->getProcessedTD ());
1267
+ enableList (CONTROL_ENDPOINT);
1268
+ }
1226
1269
}
1270
+ #else
1271
+ control->ep_queue .get ();
1272
+ #endif
1227
1273
res = control->getState ();
1228
1274
1229
1275
USB_DBG_TRANSFER (" CONTROL ack stage %s" , control->getStateString ());
0 commit comments