int_fast8_t usb_send_bulk_in(void *data, uint_fast8_t len) { UENUM = USB_CDC_EP_BULK_IN; if (!(UEINTX & (1<<TXINI))) { // Buffer full UEIENX = 1<<TXINE; return -1; } usb_write_packet(data, len); UEINTX = (uint8_t)~((1<<FIFOCON) | (1<<TXINI) | (1<<RXOUTI)); return len; }
static int8_t _usb_send_ep0(const void *data, uint8_t len, uint8_t progmem) { UENUM = 0; uint8_t ueintx = UEINTX; if (ueintx & ((1<<RXSTPI) | (1<<RXOUTI))) return -2; if (!(ueintx & (1<<TXINI))) { // Not ready to send UEIENX = (1<<RXSTPE) | (1<<RXOUTE) | (1<<TXINE); return -1; } if (progmem) usb_write_packet_progmem(data, len); else usb_write_packet(data, len); UEINTX = ~(1<<TXINI); return len; }
int_fast8_t usb_send_setup(const void *data, uint_fast8_t len) { return usb_write_packet(0, 1, data, len); }
int_fast8_t usb_send_bulk_in(void *data, uint_fast8_t len) { return usb_write_packet(USB_CDC_EP_BULK_IN, 1, data, len); }