int USBGetChar() { for(;;) { USBSetupInterrupt(); USBGeneralInterrupt(); // Read a char if (HasData(CDC_RX)) { u8 c = Recv8(); if (!ReadWriteAllowed()) ReleaseRX(); return c; } if (!--_timeout) { Reboot(); // USB not connected, run firmware } _delay_us(100); // stretch out the bootloader period to about 5 seconds after enumeration LEDPulse(); } return -1; }
void Recv(u8 ep, u8* dst, u8 len) { SetEP(ep); while (len--) { while (!ReadWriteAllowed()) ; *dst++ = Recv8(); if (!ReadWriteAllowed()) // release empty buffer ReleaseRX(); } }
int USB_Recv(uint8_t ep, void* d, int len) { if (!_usbConfiguration || len < 0) return (-1); LockEP lock(ep); uint8_t n = FifoByteCount(); len = min(n,len); n = len; uint8_t* dst = (uint8_t*)d; while (n--) *dst++ = Recv8(); if (len && !FifoByteCount()) ReleaseRX(); return (len); }
// Non Blocking receive // Return number of bytes read int USB_Recv(u8 ep, void* d, int len) { if (!_usbConfiguration || len < 0) return -1; LockEP lock(ep); u8 n = FifoByteCount(); len = min(n,len); n = len; u8* dst = (u8*)d; while (n--) *dst++ = Recv8(); if (len && !FifoByteCount()) // release empty buffer ReleaseRX(); return len; }