@@ -579,27 +579,64 @@ uint8_t USBDeviceClass::armRecv(uint32_t ep, uint32_t len)
579
579
// Blocking Send of data to an endpoint
580
580
uint32_t USBDeviceClass::send (uint32_t ep, const void *data, uint32_t len)
581
581
{
582
+ uint32_t length = 0 ;
583
+
582
584
if (!_usbConfiguration)
583
585
return -1 ;
586
+ if (len > 16384 )
587
+ return -1 ;
584
588
585
- // armSend(ep, data, len);
589
+ if ((unsigned int )data > 0x20000000 )
590
+ {
591
+ // Buffer in RAM
592
+ usbd.epBank1SetAddress (ep, (void *)data);
593
+ usbd.epBank1SetMultiPacketSize (ep, 0 );
586
594
587
- /* memcopy could be safer in multithreaded environment */
588
- memcpy (&udd_ep_in_cache_buffer[ep], data, len);
595
+ usbd.epBank1SetByteCount (ep, len);
589
596
590
- usbd. epBank1SetAddress (ep, &udd_ep_in_cache_buffer[ep]);
591
- usbd.epBank1SetByteCount (ep, len );
597
+ // Clear the transfer complete flag
598
+ usbd.epBank1AckTransferComplete (ep);
592
599
593
- // Clear the transfer complete flag
594
- usbd.epBank1AckTransferComplete (ep);
600
+ // RAM buffer is full, we can send data (IN)
601
+ usbd.epBank1SetReady (ep);
595
602
596
- // RAM buffer is full, we can send data (IN)
597
- usbd.epBank1SetReady (ep);
603
+ // Wait for transfer to complete
604
+ while (!usbd.epBank1IsTransferComplete (ep)) {
605
+ ; // need fire exit.
606
+ }
607
+ len = 0 ;
608
+ }
609
+ else
610
+ {
611
+ // Flash area
612
+ while (len != 0 )
613
+ {
614
+ if (len >= 64 ) {
615
+ length = 64 ;
616
+ } else {
617
+ length = len;
618
+ }
598
619
599
- // Wait for transfer to complete
600
- while (!usbd.epBank1IsTransferComplete (ep)) {
601
- ; // need fire exit.
620
+ /* memcopy could be safer in multi threaded environment */
621
+ memcpy (&udd_ep_in_cache_buffer[ep], data, length);
622
+
623
+ usbd.epBank1SetAddress (ep, &udd_ep_in_cache_buffer[ep]);
624
+ usbd.epBank1SetByteCount (ep, length);
625
+
626
+ // Clear the transfer complete flag
627
+ usbd.epBank1AckTransferComplete (ep);
628
+
629
+ // RAM buffer is full, we can send data (IN)
630
+ usbd.epBank1SetReady (ep);
631
+
632
+ // Wait for transfer to complete
633
+ while (!usbd.epBank1IsTransferComplete (ep)) {
634
+ ; // need fire exit.
635
+ }
636
+ len -= length;
637
+ }
602
638
}
639
+
603
640
return len;
604
641
}
605
642
0 commit comments