29#if CFG_TUD_ENABLED && \
30 (CFG_TUSB_MCU == OPT_MCU_SAMD11 || CFG_TUSB_MCU == OPT_MCU_SAMD21 || \
31 CFG_TUSB_MCU == OPT_MCU_SAMD51 || CFG_TUSB_MCU == OPT_MCU_SAME5X || \
32 CFG_TUSB_MCU == OPT_MCU_SAML22 || CFG_TUSB_MCU == OPT_MCU_SAML21)
53static inline
void prepare_setup(
void)
58 sram_registers[0][0].PCKSIZE.bit.BYTE_COUNT = 0;
65 UsbDeviceDescBank* bank_out = &sram_registers[0][
TUSB_DIR_OUT];
66 bank_out->PCKSIZE.bit.SIZE = 0x3;
67 UsbDeviceDescBank* bank_in = &sram_registers[0][
TUSB_DIR_IN];
68 bank_in->PCKSIZE.bit.SIZE = 0x3;
70 UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[0];
71 ep->EPCFG.reg = USB_DEVICE_EPCFG_EPTYPE0(0x1) | USB_DEVICE_EPCFG_EPTYPE1(0x1);
72 ep->EPINTENSET.reg = USB_DEVICE_EPINTENSET_TRCPT0 | USB_DEVICE_EPINTENSET_TRCPT1 | USB_DEVICE_EPINTENSET_RXSTP;
86 USB->DEVICE.CTRLA.bit.SWRST =
true;
87 while (USB->DEVICE.SYNCBUSY.bit.SWRST == 0) {}
88 while (USB->DEVICE.SYNCBUSY.bit.SWRST == 1) {}
90 USB->DEVICE.PADCAL.bit.TRANSP = (*((uint32_t*) USB_FUSES_TRANSP_ADDR) & USB_FUSES_TRANSP_Msk) >> USB_FUSES_TRANSP_Pos;
91 USB->DEVICE.PADCAL.bit.TRANSN = (*((uint32_t*) USB_FUSES_TRANSN_ADDR) & USB_FUSES_TRANSN_Msk) >> USB_FUSES_TRANSN_Pos;
92 USB->DEVICE.PADCAL.bit.TRIM = (*((uint32_t*) USB_FUSES_TRIM_ADDR) & USB_FUSES_TRIM_Msk) >> USB_FUSES_TRIM_Pos;
94 USB->DEVICE.QOSCTRL.bit.CQOS = 3;
95 USB->DEVICE.QOSCTRL.bit.DQOS = 3;
98 USB->DEVICE.DESCADD.reg = (uint32_t) &sram_registers;
99 USB->DEVICE.CTRLB.reg = USB_DEVICE_CTRLB_SPDCONF_FS;
100 USB->DEVICE.CTRLA.reg = USB_CTRLA_MODE_DEVICE | USB_CTRLA_ENABLE | USB_CTRLA_RUNSTDBY;
101 while (USB->DEVICE.SYNCBUSY.bit.ENABLE == 1) {}
103 USB->DEVICE.INTFLAG.reg |= USB->DEVICE.INTFLAG.reg;
104 USB->DEVICE.INTENSET.reg = USB_DEVICE_INTENSET_EORST;
109#if CFG_TUSB_MCU == OPT_MCU_SAMD51 || CFG_TUSB_MCU == OPT_MCU_SAME5X
114 NVIC_EnableIRQ(USB_0_IRQn);
115 NVIC_EnableIRQ(USB_1_IRQn);
116 NVIC_EnableIRQ(USB_2_IRQn);
117 NVIC_EnableIRQ(USB_3_IRQn);
123 NVIC_DisableIRQ(USB_3_IRQn);
124 NVIC_DisableIRQ(USB_2_IRQn);
125 NVIC_DisableIRQ(USB_1_IRQn);
126 NVIC_DisableIRQ(USB_0_IRQn);
129#elif CFG_TUSB_MCU == OPT_MCU_SAMD11 || CFG_TUSB_MCU == OPT_MCU_SAMD21 || \
130 CFG_TUSB_MCU == OPT_MCU_SAML22 || CFG_TUSB_MCU == OPT_MCU_SAML21
135 NVIC_EnableIRQ(USB_IRQn);
141 NVIC_DisableIRQ(USB_IRQn);
146#error "No implementation available for dcd_int_enable / dcd_int_disable"
161 USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTENCLR_SUSPEND;
162 USB->DEVICE.INTENSET.reg = USB_DEVICE_INTENSET_SUSPEND;
168 USB->DEVICE.CTRLB.bit.UPRSM = 1;
175 USB->DEVICE.CTRLB.reg |= USB_DEVICE_CTRLB_DETACH;
182 USB->DEVICE.CTRLB.reg &= ~USB_DEVICE_CTRLB_DETACH;
190 USB->DEVICE.INTENSET.bit.SOF = 1;
192 USB->DEVICE.INTENCLR.bit.SOF = 1;
211 USB->DEVICE.DADD.reg = USB_DEVICE_DADD_DADD(
dev_addr) | USB_DEVICE_DADD_ADDEN;
227 UsbDeviceDescBank* bank = &sram_registers[epnum][dir];
228 uint32_t size_value = 0;
229 while (size_value < 7) {
239 bank->PCKSIZE.bit.SIZE = size_value;
241 UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];
245 ep->EPCFG.bit.EPTYPE0 = desc_edpt->
bmAttributes.xfer + 1;
246 ep->EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_STALLRQ0 | USB_DEVICE_EPSTATUSCLR_DTGLOUT;
247 ep->EPINTENSET.bit.TRCPT0 =
true;
250 ep->EPCFG.bit.EPTYPE1 = desc_edpt->
bmAttributes.xfer + 1;
251 ep->EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_STALLRQ1 | USB_DEVICE_EPSTATUSCLR_DTGLIN;
252 ep->EPINTENSET.bit.TRCPT1 =
true;
278 UsbDeviceDescBank* bank = &sram_registers[epnum][dir];
279 UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];
281 bank->ADDR.reg = (uint32_t)
buffer;
293 bank->PCKSIZE.bit.BYTE_COUNT = 0;
294 ep->EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_BK0RDY;
295 ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRFAIL0;
298 bank->PCKSIZE.bit.MULTI_PACKET_SIZE = 0;
300 ep->EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_BK1RDY;
301 ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRFAIL1;
312 UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];
315 ep->EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_STALLRQ1;
317 ep->EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_STALLRQ0;
326 UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];
329 ep->EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_STALLRQ1 | USB_DEVICE_EPSTATUSCLR_DTGLIN;
331 ep->EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_STALLRQ0 | USB_DEVICE_EPSTATUSCLR_DTGLOUT;
339 uint32_t epints = USB->DEVICE.EPINTSMRY.reg;
341 for (uint8_t epnum = 0; epnum < USB_EPT_NUM; epnum++) {
342 if ((epints & (1 << epnum)) == 0) {
346 UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];
347 uint32_t epintflag = ep->EPINTFLAG.reg;
350 if ((epintflag & USB_DEVICE_EPINTFLAG_TRCPT1) != 0) {
351 UsbDeviceDescBank* bank = &sram_registers[epnum][
TUSB_DIR_IN];
352 uint16_t
const total_transfer_size = bank->PCKSIZE.bit.BYTE_COUNT;
356 ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT1;
360 if ((epintflag & USB_DEVICE_EPINTFLAG_TRCPT0) != 0) {
361 UsbDeviceDescBank* bank = &sram_registers[epnum][
TUSB_DIR_OUT];
362 uint16_t
const total_transfer_size = bank->PCKSIZE.bit.BYTE_COUNT;
366 ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT0;
376 uint32_t int_status = USB->DEVICE.INTFLAG.reg & USB->DEVICE.INTENSET.reg;
379 if ( int_status & USB_DEVICE_INTFLAG_SOF )
381 USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTFLAG_SOF;
382 const uint32_t frame = USB->DEVICE.FNUM.bit.FNUM;
391 if ( int_status & USB_DEVICE_INTFLAG_SUSPEND )
393 USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTFLAG_SUSPEND;
396 USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTFLAG_WAKEUP;
397 USB->DEVICE.INTENSET.reg = USB_DEVICE_INTFLAG_WAKEUP;
404 if ( int_status & USB_DEVICE_INTFLAG_WAKEUP )
406 USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTFLAG_WAKEUP;
409 USB->DEVICE.INTENCLR.reg = USB_DEVICE_INTFLAG_WAKEUP;
414 if ( int_status & USB_DEVICE_INTFLAG_EORST )
416 USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTFLAG_EORST;
419 USB->DEVICE.INTENCLR.reg = USB_DEVICE_INTFLAG_WAKEUP | USB_DEVICE_INTFLAG_SUSPEND;
426 if (USB->DEVICE.DeviceEndpoint[0].EPINTFLAG.bit.RXSTP)
434 USB->DEVICE.DeviceEndpoint[0].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_RXSTP | USB_DEVICE_EPINTFLAG_TRCPT0;
static TU_ATTR_ALWAYS_INLINE void dcd_event_bus_signal(uint8_t rhport, dcd_eventid_t eid, bool in_isr)
static TU_ATTR_ALWAYS_INLINE void dcd_event_xfer_complete(uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, uint8_t result, bool in_isr)
static TU_ATTR_ALWAYS_INLINE void dcd_event_sof(uint8_t rhport, uint32_t frame_count, bool in_isr)
static TU_ATTR_ALWAYS_INLINE void dcd_event_setup_received(uint8_t rhport, uint8_t const *setup, bool in_isr)
static TU_ATTR_ALWAYS_INLINE void dcd_event_bus_reset(uint8_t rhport, tusb_speed_t speed, bool in_isr)
void maybe_transfer_complete(void)
void dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)
void dcd_edpt_close(uint8_t rhport, uint8_t ep_addr)
static void bus_reset(void)
void dcd_int_handler(uint8_t rhport)
void dcd_disconnect(uint8_t rhport)
void dcd_edpt_close_all(uint8_t rhport)
static TU_ATTR_ALIGNED(4)
void dcd_int_disable(uint8_t rhport)
void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
void dcd_connect(uint8_t rhport)
bool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const *desc_edpt)
bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)
void dcd_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const *request)
void dcd_set_address(uint8_t rhport, uint8_t dev_addr)
bool dcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init)
void dcd_int_enable(uint8_t rhport)
void dcd_remote_wakeup(uint8_t rhport)
void dcd_sof_enable(uint8_t rhport, bool en)
AUDIO Channel Cluster Descriptor (4.1)
struct TU_ATTR_PACKED::@16::TU_ATTR_PACKED bmRequestType_bit
uint8_t bmAttributes
See: audio_clock_source_attribute_t.
uint8_t bRequest
Request type audio_cs_req_t.
struct TU_ATTR_PACKED tusb_control_request_t
static TU_ATTR_ALWAYS_INLINE uint8_t tu_edpt_number(uint8_t addr)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_edpt_packet_size(tusb_desc_endpoint_t const *desc_ep)
TU_ATTR_PACKED_END TU_ATTR_BIT_FIELD_ORDER_END static TU_ATTR_ALWAYS_INLINE tusb_dir_t tu_edpt_dir(uint8_t addr)
CFG_TUH_MEM_ALIGN tusb_control_request_t request