@@ -195,6 +195,10 @@ void USBDevice_SAMD21G18x::calibrate() {
195
195
usb.PADCAL .bit .TRIM = pad_trim;
196
196
}
197
197
198
+ /*
199
+ * USB EP generic handlers.
200
+ */
201
+
198
202
class EPHandler {
199
203
public:
200
204
virtual void handleEndpoint () = 0;
@@ -218,6 +222,8 @@ class DoubleBufferedEPOutHandler : public EPHandler {
218
222
usbd.epBank0SetSize (ep, 64 );
219
223
usbd.epBank0SetType (ep, 3 ); // BULK OUT
220
224
225
+ usbd.epBank0SetAddress (ep, data0);
226
+
221
227
release ();
222
228
}
223
229
@@ -229,12 +235,12 @@ class DoubleBufferedEPOutHandler : public EPHandler {
229
235
}
230
236
if (first0 == last0) {
231
237
first0 = 0 ;
232
- last0 = 0 ;
238
+ current = 1 ;
233
239
ready0 = false ;
234
240
if (notify) {
241
+ notify = false ;
235
242
release ();
236
243
}
237
- current = 1 ;
238
244
return -1 ;
239
245
}
240
246
return data0[first0++];
@@ -244,12 +250,12 @@ class DoubleBufferedEPOutHandler : public EPHandler {
244
250
}
245
251
if (first1 == last1) {
246
252
first1 = 0 ;
247
- last1 = 0 ;
253
+ current = 0 ;
248
254
ready1 = false ;
249
255
if (notify) {
256
+ notify = false ;
250
257
release ();
251
258
}
252
- current = 0 ;
253
259
return -1 ;
254
260
}
255
261
return data1[first1++];
@@ -262,16 +268,29 @@ class DoubleBufferedEPOutHandler : public EPHandler {
262
268
{
263
269
// Ack Transfer complete
264
270
usbd.epBank0AckTransferComplete (ep);
271
+ // usbd.epBank0AckTransferFailed(ep);
265
272
266
273
// Update counters and swap banks
267
274
if (incoming == 0 ) {
268
275
last0 = usbd.epBank0ByteCount (ep);
269
- ready0 = true ;
270
276
incoming = 1 ;
277
+ usbd.epBank0SetAddress (ep, data1);
278
+ ready0 = true ;
279
+ if (ready1) {
280
+ notify = true ;
281
+ return ;
282
+ }
283
+ notify = false ;
271
284
} else {
272
285
last1 = usbd.epBank0ByteCount (ep);
273
- ready1 = true ;
274
286
incoming = 0 ;
287
+ usbd.epBank0SetAddress (ep, data0);
288
+ ready1 = true ;
289
+ if (ready0) {
290
+ notify = true ;
291
+ return ;
292
+ }
293
+ notify = false ;
275
294
}
276
295
release ();
277
296
}
@@ -295,28 +314,11 @@ class DoubleBufferedEPOutHandler : public EPHandler {
295
314
}
296
315
297
316
void release () {
298
- if (incoming == 0 ) {
299
- if (ready0) {
300
- notify = true ;
301
- return ;
302
- }
303
- usbd.epBank0SetAddress (ep, data0);
304
- } else {
305
- if (ready1) {
306
- notify = true ;
307
- return ;
308
- }
309
- usbd.epBank0SetAddress (ep, data1);
310
- }
311
- usbd.epBank0AckTransferComplete (ep);
312
- // usbd.epBank0AckTransferFailed(ep);
313
- usbd.epBank0EnableTransferComplete (ep);
314
-
315
317
// Release OUT EP
318
+ usbd.epBank0EnableTransferComplete (ep);
316
319
usbd.epBank0SetMultiPacketSize (ep, size);
317
320
usbd.epBank0SetByteCount (ep, 0 );
318
321
usbd.epBank0ResetReady (ep);
319
- notify = false ;
320
322
}
321
323
322
324
private:
0 commit comments