@@ -29,6 +29,15 @@ USBDevice_SAMD21G18x usbd;
2929static char isRemoteWakeUpEnabled = 0 ;
3030static char isEndpointHalt = 0 ;
3131
32+ extern void (*gpf_isr)(void );
33+
34+ // USB_Handler ISR
35+ extern " C" void UDD_Handler (void ) {
36+ USBDevice.ISRHandler ();
37+ }
38+
39+
40+
3241const uint16_t STRING_LANGUAGE[2 ] = {
3342 (3 <<8 ) | (2 +2 ),
3443 0x0409 // English
@@ -285,6 +294,8 @@ void USBDeviceClass::init()
285294 while (GCLK->STATUS .bit .SYNCBUSY )
286295 ;
287296
297+ UHD_SetStack (&UDD_Handler);
298+
288299 // Reset USB Device
289300 usbd.reset ();
290301
@@ -388,9 +399,6 @@ void USBDeviceClass::initEP(uint32_t ep, uint32_t config)
388399 // Release OUT EP
389400 usbd.epBank0SetMultiPacketSize (ep, 64 );
390401 usbd.epBank0SetByteCount (ep, 0 );
391-
392- // The RAM Buffer is empty: we can receive data
393- // usbd.epBank0ResetReady(ep);
394402 }
395403 else if (config == (USB_ENDPOINT_TYPE_BULK | USB_ENDPOINT_IN (0 )))
396404 {
@@ -405,12 +413,12 @@ void USBDeviceClass::initEP(uint32_t ep, uint32_t config)
405413 else if (config == USB_ENDPOINT_TYPE_CONTROL)
406414 {
407415 // XXX: Needed?
408- usbd.epBank0DisableAutoZLP (ep);
409- usbd.epBank1DisableAutoZLP (ep);
416+ // usbd.epBank0DisableAutoZLP(ep);
417+ // usbd.epBank1DisableAutoZLP(ep);
410418
411419 // Setup Control OUT
412420 usbd.epBank0SetSize (ep, 64 );
413- usbd.epBank0SetAddress (ep, &udd_ep_out_cache_buffer[0 ]);
421+ usbd.epBank0SetAddress (ep, &udd_ep_out_cache_buffer[ep ]);
414422 usbd.epBank0SetType (ep, 1 ); // CONTROL OUT / SETUP
415423
416424 // Setup Control IN
@@ -424,8 +432,6 @@ void USBDeviceClass::initEP(uint32_t ep, uint32_t config)
424432
425433 // NAK on endpoint OUT, the bank is full.
426434 usbd.epBank0SetReady (ep);
427- // NAK on endpoint IN, the bank is not yet filled in.
428- // usbd.epBank1ResetReady(ep);
429435 }
430436}
431437
@@ -461,7 +467,6 @@ bool USBDeviceClass::connected()
461467uint32_t USBDeviceClass::recvControl (void *_data, uint32_t len)
462468{
463469 uint8_t *data = reinterpret_cast <uint8_t *>(_data);
464- // NO RXOUT ???????
465470
466471 // The RAM Buffer is empty: we can receive data
467472 usbd.epBank0ResetReady (0 );
@@ -499,17 +504,8 @@ uint32_t USBDeviceClass::recv(uint32_t ep, void *_data, uint32_t len)
499504
500505 usbd.epBank0DisableTransferComplete (ep);
501506
502- // NAK on endpoint OUT, the bank is full.
503- // usbd.epBank0SetReady(CDC_ENDPOINT_OUT);
504-
505507 memcpy (_data, udd_ep_out_cache_buffer[ep], len);
506508
507- // uint8_t *buffer = udd_ep_out_cache_buffer[ep];
508- // uint8_t *data = reinterpret_cast<uint8_t *>(_data);
509- // for (uint32_t i=0; i<len; i++) {
510- // data[i] = buffer[i];
511- // }
512-
513509 // release empty buffer
514510 if (len && !available (ep)) {
515511 // The RAM Buffer is empty: we can receive data
@@ -539,40 +535,23 @@ uint8_t USBDeviceClass::armRecvCtrlOUT(uint32_t ep, uint32_t len)
539535 usbd.epBank0SetAddress (ep, &udd_ep_out_cache_buffer[ep]);
540536 usbd.epBank0SetMultiPacketSize (ep, 8 );
541537 usbd.epBank0SetByteCount (ep, 0 );
542- // usbd.epBank0ResetReady(0);
543- // while (!usbd.epBank0IsTransferComplete(ep)) {}
544- // while (usbd.epBank0IsReady(ep)) {}
545538
546- // usbd.epBank0SetByteCount(0, 0);
547- // usbd.epBank0SetMultiPacketSize(0, 8);
548539 usbd.epBank0ResetReady (ep);
549540
550541 // Wait OUT
551542 while (!usbd.epBank0IsReady (ep)) {}
552- while (!usbd.epBank0IsTransferComplete (ep)) {} // XXX: while(USB->DEVICE.DeviceEndpoint[ep].EPINTFLAG.bit.TRCPT == 0);
543+ while (!usbd.epBank0IsTransferComplete (ep)) {}
553544 return usbd.epBank0ByteCount (ep);
554545}
555546
556547uint8_t USBDeviceClass::armRecv (uint32_t ep, uint32_t len)
557548{
558- // usbd.epBank0SetSize(ep, 64);
559- // usbd.epBank0SetAddress(ep, &udd_ep_out_cache_buffer[ep]);
560- // usbd.epBank0SetMultiPacketSize(ep, 64); // XXX: Should be "len"?
561549 uint16_t count = usbd.epBank0ByteCount (ep);
562550 if (count >= 64 ) {
563551 usbd.epBank0SetByteCount (ep, count - 64 );
564552 } else {
565553 usbd.epBank0SetByteCount (ep, 0 );
566554 }
567- // The RAM Buffer is empty: we can receive data
568- // usbd.epBank0ResetReady(ep);
569-
570- // Wait for transfer to complete
571- // while (!usbd.epBank0IsTransferComplete(ep)) {}
572- // while (usbd.epBank0IsReady(ep)) {}
573- // NAK on endpoint OUT, the bank is full.
574- // usbd.epBank0ResetReady(ep);
575-
576555 return usbd.epBank0ByteCount (ep);
577556}
578557
@@ -837,8 +816,7 @@ void USBDeviceClass::ISRHandler()
837816 stall (0 );
838817 }
839818
840- // XXX: Should be really cleared?
841- if (usbd.epBank1IsStalled (0 )) // XXX:(USB->DEVICE.DeviceEndpoint[0].EPINTFLAG.bit.STALL)
819+ if (usbd.epBank1IsStalled (0 ))
842820 {
843821 usbd.epBank1AckStalled (0 );
844822
@@ -878,6 +856,6 @@ void USBDeviceClass::ISRHandler()
878856USBDeviceClass USBDevice;
879857
880858// USB_Handler ISR
881- extern " C" void USB_Handler (void ) {
882- USBDevice.ISRHandler ();
883- }
859+ // extern "C" void USB_Handler(void) {
860+ // USBDevice.ISRHandler();
861+ // }
0 commit comments