@@ -579,27 +579,64 @@ uint8_t USBDeviceClass::armRecv(uint32_t ep, uint32_t len)
579579// Blocking Send of data to an endpoint
580580uint32_t USBDeviceClass::send (uint32_t ep, const void *data, uint32_t len)
581581{
582+ uint32_t length = 0 ;
583+
582584 if (!_usbConfiguration)
583585 return -1 ;
586+ if (len > 16384 )
587+ return -1 ;
584588
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 );
586594
587- /* memcopy could be safer in multithreaded environment */
588- memcpy (&udd_ep_in_cache_buffer[ep], data, len);
595+ usbd.epBank1SetByteCount (ep, len);
589596
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);
592599
593- // Clear the transfer complete flag
594- usbd.epBank1AckTransferComplete (ep);
600+ // RAM buffer is full, we can send data (IN)
601+ usbd.epBank1SetReady (ep);
595602
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+ }
598619
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+ }
602638 }
639+
603640 return len;
604641}
605642
0 commit comments