30#if CFG_TUD_ENABLED && CFG_TUSB_MCU == OPT_MCU_SAMX7X
49# if TUD_OPT_HIGH_SPEED
50# define USE_DUAL_BANK 0
52# define USE_DUAL_BANK 1
56#define EP_GET_FIFO_PTR(ep, scale) (((TU_XSTRCAT(TU_STRCAT(uint, scale),_t) (*)[0x8000 / ((scale) / 8)])FIFO_RAM_ADDR)[(ep)])
71 uint16_t max_packet_size;
87 .wMaxPacketSize = CFG_TUD_ENDPOINT0_SIZE,
92 if (SCB->CCR & SCB_CCR_DC_Msk)
94 SCB_CleanInvalidateDCache_by_Addr(addr, size);
117 NVIC_EnableIRQ((IRQn_Type) ID_USBHS);
124 NVIC_DisableIRQ((IRQn_Type) ID_USBHS);
142 USB_REG->DEVCTRL |= DEVCTRL_RMWKUP;
151 USB_REG->CTRL = CTRL_UIMOD | CTRL_USBE;
152 while (!(USB_REG->SR & SR_CLKUSABLE));
153#if TUD_OPT_HIGH_SPEED
154 USB_REG->DEVCTRL &= ~DEVCTRL_SPDCONF;
156 USB_REG->DEVCTRL |= DEVCTRL_SPDCONF_LOW_POWER;
159 USB_REG->DEVIER = (DEVIER_EORSTES | DEVIER_SUSPES | DEVIER_WAKEUPES);
161 USB_REG->DEVIER = DEVIER_SOFES;
164 USB_REG->DEVICR = (DEVICR_EORSTC | DEVICR_SOFC | DEVICR_WAKEUPC);
166 USB_REG->DEVIFR |= DEVIFR_SUSPS;
168 USB_REG->DEVICR = DEVICR_WAKEUPC;
170 USB_REG->DEVCTRL &= ~DEVCTRL_DETACH;
172 USB_REG->CTRL |= CTRL_FRZCLK;
181 USB_REG->DEVEPT &= ~(0x3FF << DEVEPT_EPEN0_Pos);
183 USB_REG->CTRL &= ~CTRL_FRZCLK;
184 while (!(USB_REG->SR & SR_CLKUSABLE));
186 USB_REG->DEVICR = DEVICR_Msk;
188 USB_REG->DEVIDR = DEVIDR_Msk;
190 USB_REG->DEVCTRL |= DEVCTRL_DETACH;
192 USB_REG->DEVCTRL &=~(DEVCTRL_ADDEN | DEVCTRL_UADD);
205 switch (USB_REG->SR & SR_SPEED) {
206 case SR_SPEED_FULL_SPEED:
209 case SR_SPEED_HIGH_SPEED:
211 case SR_SPEED_LOW_SPEED:
218 uint32_t int_status = USB_REG->DEVEPTISR[ep_ix];
219 int_status &= USB_REG->DEVEPTIMR[ep_ix];
221 uint16_t count = (USB_REG->DEVEPTISR[ep_ix] &
222 DEVEPTISR_BYCT) >> DEVEPTISR_BYCT_Pos;
227 static uint8_t ctrl_dir;
229 if (int_status & DEVEPTISR_CTRL_RXSTPI)
231 ctrl_dir = (USB_REG->DEVEPTISR[0] & DEVEPTISR_CTRL_CTRLDIR) >> DEVEPTISR_CTRL_CTRLDIR_Pos;
235 uint8_t *ptr = EP_GET_FIFO_PTR(0,8);
239 USB_REG->DEVEPTICR[0] = DEVEPTICR_CTRL_RXSTPIC;
240 USB_REG->DEVEPTIDR[0] = DEVEPTIDR_CTRL_RXSTPEC;
242 if (int_status & DEVEPTISR_RXOUTI)
244 uint8_t *ptr = EP_GET_FIFO_PTR(0,8);
260 xfer->queued_len = (uint16_t)(
xfer->queued_len + count);
263 USB_REG->DEVEPTICR[0] = DEVEPTICR_RXOUTIC;
269 USB_REG->DEVEPTIDR[0] = DEVEPTIDR_RXOUTEC;
273 USB_REG->DEVEPTIER[0] = DEVEPTIER_CTRL_RXSTPES;
277 if (int_status & DEVEPTISR_TXINI)
280 USB_REG->DEVEPTIDR[0] = DEVEPTIDR_TXINEC;
292 USB_REG->DEVEPTIER[0] = DEVEPTIER_CTRL_RXSTPES;
298 if (int_status & DEVEPTISR_RXOUTI)
307 uint8_t *ptr = EP_GET_FIFO_PTR(ep_ix,8);
314 xfer->queued_len = (uint16_t)(
xfer->queued_len + count);
317 USB_REG->DEVEPTIDR[ep_ix] = DEVEPTIDR_FIFOCONC;
319 USB_REG->DEVEPTICR[ep_ix] = DEVEPTICR_RXOUTIC;
325 USB_REG->DEVEPTIDR[ep_ix] = DEVEPTIDR_RXOUTEC;
329 if (int_status & DEVEPTISR_TXINI)
332 USB_REG->DEVEPTICR[ep_ix] = DEVEPTICR_TXINIC;
342 USB_REG->DEVEPTIDR[ep_ix] = DEVEPTIDR_TXINEC;
350 uint32_t status = USB_REG->DEVDMA[ep_ix - 1].DEVDMASTATUS;
351 if (status & DEVDMASTATUS_CHANN_ENB)
356 USB_REG->DEVIDR = DEVIDR_DMA_1 << (ep_ix - 1);
359 uint16_t count =
xfer->
total_len - ((status & DEVDMASTATUS_BUFF_COUNT) >> DEVDMASTATUS_BUFF_COUNT_Pos);
360 if(USB_REG->DEVEPTCFG[ep_ix] & DEVEPTCFG_EPDIR)
372 uint32_t int_status = USB_REG->DEVISR;
373 int_status &= USB_REG->DEVIMR;
375 if (int_status & DEVISR_EORST)
378 USB_REG->CTRL &= ~CTRL_FRZCLK;
379 while(!(USB_REG->SR & SR_CLKUSABLE));
381 for (
int ep_ix = 1; ep_ix < EP_MAX; ep_ix++)
383 USB_REG->DEVEPT |= 1 << (DEVEPT_EPRST0_Pos + ep_ix);
384 USB_REG->DEVEPT &=~(1 << (DEVEPT_EPRST0_Pos + ep_ix));
387 USB_REG->DEVICR = DEVICR_EORSTC;
388 USB_REG->DEVICR = DEVICR_WAKEUPC;
389 USB_REG->DEVICR = DEVICR_SUSPC;
390 USB_REG->DEVIER = DEVIER_SUSPES;
395 if (int_status & DEVISR_WAKEUP)
397 USB_REG->CTRL &= ~CTRL_FRZCLK;
398 while (!(USB_REG->SR & SR_CLKUSABLE));
399 USB_REG->DEVICR = DEVICR_WAKEUPC;
400 USB_REG->DEVIDR = DEVIDR_WAKEUPEC;
401 USB_REG->DEVIER = DEVIER_SUSPES;
406 if (int_status & DEVISR_SUSP)
409 USB_REG->CTRL &= ~CTRL_FRZCLK;
410 while (!(USB_REG->SR & SR_CLKUSABLE));
411 USB_REG->DEVICR = DEVICR_SUSPC;
412 USB_REG->DEVIDR = DEVIDR_SUSPEC;
413 USB_REG->DEVIER = DEVIER_WAKEUPES;
414 USB_REG->CTRL |= CTRL_FRZCLK;
419 if(int_status & DEVISR_SOF)
421 USB_REG->DEVICR = DEVICR_SOFC;
427 for (
int ep_ix = 0; ep_ix < EP_MAX; ep_ix++)
429 if (int_status & (DEVISR_PEP_0 << ep_ix))
435 for (
int ep_ix = 0; ep_ix < EP_MAX; ep_ix++)
437 if (EP_DMA_SUPPORT(ep_ix))
439 if (int_status & (DEVISR_DMA_1 << (ep_ix - 1)))
462 USB_REG->DEVCTRL |=
dev_addr | DEVCTRL_ADDEN;
474 uint8_t fifoSize = 0;
475 uint16_t defaultEndpointSize = 8;
479 while (defaultEndpointSize < epMaxPktSize)
482 defaultEndpointSize <<= 1;
487 USB_REG->DEVEPT |= 1 << (DEVEPT_EPRST0_Pos + epnum);
488 USB_REG->DEVEPT &=~(1 << (DEVEPT_EPRST0_Pos + epnum));
493 USB_REG->DEVEPT |= DEVEPT_EPEN0;
495 USB_REG->DEVEPTCFG[0] =
497 (fifoSize << DEVEPTCFG_EPSIZE_Pos) |
499 (DEVEPTCFG_EPBK_1_BANK << DEVEPTCFG_EPBK_Pos) |
502 USB_REG->DEVEPTIER[0] = DEVEPTIER_RSTDTS;
503 USB_REG->DEVEPTIDR[0] = DEVEPTIDR_CTRL_STALLRQC;
504 if (DEVEPTISR_CFGOK == (USB_REG->DEVEPTISR[0] & DEVEPTISR_CFGOK))
507 USB_REG->DEVEPTIER[0] = DEVEPTIER_CTRL_RXSTPES;
509 USB_REG->DEVIER = DEVIER_PEP_0;
519 USB_REG->DEVEPT |= ((0x01 << epnum) << DEVEPT_EPEN0_Pos);
523 USB_REG->DEVEPTCFG[epnum] =
525 (fifoSize << DEVEPTCFG_EPSIZE_Pos) |
526 (eptype << DEVEPTCFG_EPTYPE_Pos) |
527 (DEVEPTCFG_EPBK_1_BANK << DEVEPTCFG_EPBK_Pos) |
529 ((dir & 0x01) << DEVEPTCFG_EPDIR_Pos)
533 USB_REG->DEVEPTCFG[epnum] |= DEVEPTCFG_NBTRANS_1_TRANS;
538 USB_REG->DEVEPTCFG[epnum] |= DEVEPTCFG_EPBK_2_BANK;
541 USB_REG->DEVEPTCFG[epnum] |= DEVEPTCFG_ALLOC;
542 USB_REG->DEVEPTIER[epnum] = DEVEPTIER_RSTDTS;
543 USB_REG->DEVEPTIDR[epnum] = DEVEPTIDR_CTRL_STALLRQC;
544 if (DEVEPTISR_CFGOK == (USB_REG->DEVEPTISR[epnum] & DEVEPTISR_CFGOK))
546 USB_REG->DEVIER = ((0x01 << epnum) << DEVIER_PEP_0_Pos);
568 USB_REG->DEVIDR = 1 << (DEVIDR_PEP_0_Pos + epnum);
570 USB_REG->DEVEPT &=~(1 << (DEVEPT_EPEN0_Pos + epnum));
578 if (len >
xfer->max_packet_size)
580 len =
xfer->max_packet_size;
582 uint8_t *ptr = EP_GET_FIFO_PTR(ep_ix,8);
593 xfer->queued_len = (uint16_t)(
xfer->queued_len + len);
598 USB_REG->DEVEPTICR[0] = DEVEPTICR_TXINIC;
602 USB_REG->DEVEPTIDR[ep_ix] = DEVEPTIDR_FIFOCONC;
604 USB_REG->DEVEPTIER[ep_ix] = DEVEPTIER_TXINES;
618 xfer->queued_len = 0;
626 uint32_t udd_dma_ctrl =
total_bytes << DEVDMACONTROL_BUFF_LENGTH_Pos;
629 udd_dma_ctrl |= DEVDMACONTROL_END_TR_IT | DEVDMACONTROL_END_TR_EN;
631 udd_dma_ctrl |= DEVDMACONTROL_END_B_EN;
633 USB_REG->DEVDMA[epnum - 1].DEVDMAADDRESS = (uint32_t)
buffer;
634 udd_dma_ctrl |= DEVDMACONTROL_END_BUFFIT | DEVDMACONTROL_CHANN_ENB;
637 uint32_t irq_state = __get_PRIMASK();
639 if (!(USB_REG->DEVDMA[epnum - 1].DEVDMASTATUS & DEVDMASTATUS_END_TR_ST))
641 USB_REG->DEVDMA[epnum - 1].DEVDMACONTROL = udd_dma_ctrl;
642 USB_REG->DEVIER = DEVIER_DMA_1 << (epnum - 1);
643 __set_PRIMASK(irq_state);
646 __set_PRIMASK(irq_state);
656 USB_REG->DEVEPTIER[epnum] = DEVEPTIER_RXOUTES;
681 xfer->queued_len = 0;
687 uint32_t udd_dma_ctrl_lin = DEVDMACONTROL_CHANN_ENB;
688 uint32_t udd_dma_ctrl_wrap = DEVDMACONTROL_CHANN_ENB | DEVDMACONTROL_END_BUFFIT;
692 udd_dma_ctrl_lin |= DEVDMACONTROL_END_TR_IT | DEVDMACONTROL_END_TR_EN;
693 udd_dma_ctrl_wrap |= DEVDMACONTROL_END_TR_IT | DEVDMACONTROL_END_TR_EN;
696 if(
info.len_wrap == 0)
698 udd_dma_ctrl_lin |= DEVDMACONTROL_END_B_EN;
700 udd_dma_ctrl_wrap |= DEVDMACONTROL_END_B_EN;
706 USB_REG->DEVDMA[epnum - 1].DEVDMAADDRESS = (uint32_t)
info.ptr_lin;
715 udd_dma_ctrl_wrap | (
info.len_wrap << DEVDMACONTROL_BUFF_LENGTH_Pos);
719 udd_dma_ctrl_lin |= DEVDMASTATUS_DESC_LDST;
720 USB_REG->DEVDMA[epnum - 1].DEVDMANXTDSC = (uint32_t)&
dma_desc[epnum - 1];
722 udd_dma_ctrl_lin |= DEVDMACONTROL_END_BUFFIT;
724 udd_dma_ctrl_lin |= (
info.len_lin << DEVDMACONTROL_BUFF_LENGTH_Pos);
727 uint32_t irq_state = __get_PRIMASK();
729 if (!(USB_REG->DEVDMA[epnum - 1].DEVDMASTATUS & DEVDMASTATUS_END_TR_ST))
731 USB_REG->DEVDMA[epnum - 1].DEVDMACONTROL = udd_dma_ctrl_lin;
732 USB_REG->DEVIER = DEVIER_DMA_1 << (epnum - 1);
733 __set_PRIMASK(irq_state);
736 __set_PRIMASK(irq_state);
746 USB_REG->DEVEPTIER[epnum] = DEVEPTIER_RXOUTES;
760 USB_REG->DEVEPTIER[epnum] = DEVEPTIER_CTRL_STALLRQS;
764 USB_REG->DEVEPTIER[0] = DEVEPTIER_CTRL_RXSTPES;
773 USB_REG->DEVEPTIDR[epnum] = DEVEPTIDR_CTRL_STALLRQC;
774 USB_REG->DEVEPTIER[epnum] = HSTPIPIER_RSTDTS;
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_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)
xfer_td_t xfer[EP_CBI_COUNT+1][2]
bool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t *ff, uint16_t total_bytes)
static CFG_TUD_MEM_SECTION dma_desc_t dma_desc[6]
void dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)
static tusb_speed_t get_speed(void)
void dcd_edpt_close(uint8_t rhport, uint8_t ep_addr)
static const tusb_desc_endpoint_t ep0_desc
void dcd_int_handler(uint8_t rhport)
void dcd_disconnect(uint8_t rhport)
static void dcd_ep_handler(uint8_t ep_ix)
void dcd_edpt_close_all(uint8_t rhport)
void dcd_int_disable(uint8_t rhport)
bool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const *ep_desc)
void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
static xfer_ctl_t xfer_status[EP_MAX]
void dcd_connect(uint8_t rhport)
bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)
static TU_ATTR_ALWAYS_INLINE void CleanInValidateCache(uint32_t *addr, int32_t size)
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)
static void dcd_transmit_packet(xfer_ctl_t *xfer, uint8_t ep_ix)
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)
static void dcd_dma_handler(uint8_t ep_ix)
static void * memcpy(void *dst, const void *src, size_t n)
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.
volatile uint32_t next_desc
volatile uint32_t buff_addr
volatile uint32_t chnl_ctrl
static TU_ATTR_ALWAYS_INLINE uint32_t tu_align(uint32_t value, uint32_t alignment)
void tu_fifo_get_write_info(tu_fifo_t *f, tu_fifo_buffer_info_t *info)
Get linear write info.
uint16_t tu_fifo_write_n(tu_fifo_t *f, const void *data, uint16_t n)
This function will write n elements into the array index specified by the write pointer and increment...
uint16_t tu_fifo_read_n(tu_fifo_t *f, void *buffer, uint16_t n)
This function will read n elements from the array index specified by the read pointer and increment t...
void tu_fifo_get_read_info(tu_fifo_t *f, tu_fifo_buffer_info_t *info)
Get read info.
tusb_speed_t
defined base on EHCI specs value for Endpoint Speed
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)
tusb_xfer_type_t
defined base on USB Specs Endpoint's bmAttributes
TU_ATTR_PACKED_END TU_ATTR_BIT_FIELD_ORDER_END static TU_ATTR_ALWAYS_INLINE tusb_dir_t tu_edpt_dir(uint8_t addr)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_edpt_addr(uint8_t num, uint8_t dir)
CFG_TUH_MEM_ALIGN tusb_control_request_t request