int_fast8_t usb_read_ep0_setup(void *data, uint_fast8_t max_len) { UENUM = 0; uint8_t ueintx = UEINTX; if (!(ueintx & ((1<<RXSTPI)))) { // No data ready to read UEIENX = 1<<RXSTPE; return -1; } usb_read_packet(data, max_len); UEINTX = ~((1<<RXSTPI) | (1<<RXOUTI)); return max_len; }
int_fast8_t usb_read_bulk_out(void *data, uint_fast8_t max_len) { UENUM = USB_CDC_EP_BULK_OUT; if (!(UEINTX & (1<<RXOUTI))) { // No data ready UEIENX = 1<<RXOUTE; return -1; } uint8_t len = UEBCLX; usb_read_packet(data, len); UEINTX = (uint8_t)~((1<<FIFOCON) | (1<<RXOUTI)); return len; }
int_fast8_t usb_read_ep0(void *data, uint_fast8_t max_len) { UENUM = 0; uint8_t ueintx = UEINTX; if (ueintx & (1<<RXSTPI)) return -2; if (!(ueintx & (1<<RXOUTI))) { // Not ready to receive data UEIENX = (1<<RXSTPE) | (1<<RXOUTE); return -1; } usb_read_packet(data, max_len); if (UEINTX & (1<<RXSTPI)) return -2; UEINTX = ~(1<<RXOUTI); return max_len; }
int_fast8_t usb_read_setup(void *data, uint_fast8_t max_len) { return usb_read_packet(0, 0, data, max_len); }
int_fast8_t usb_read_bulk_out(void *data, uint_fast8_t max_len) { return usb_read_packet(USB_CDC_EP_BULK_OUT, 0, data, max_len); }