29#if CFG_TUSB_MCU == OPT_MCU_SAMG
57 xfer->epsize = epsize;
95 for(uint16_t i=0; i<xact_len; i++)
97 UDP->UDP_FDR[epnum] = (uint32_t)
buffer[i];
104 for(uint16_t i=0; i<xact_len; i++)
106 buffer[i] = (uint8_t) UDP->UDP_FDR[epnum];
112#define CSR_NO_EFFECT_1_ALL (UDP_CSR_RX_DATA_BK0 | UDP_CSR_RX_DATA_BK1 | UDP_CSR_STALLSENT | UDP_CSR_RXSETUP | UDP_CSR_TXCOMP)
115static inline void csr_write(uint8_t epnum, uint32_t value)
117 uint32_t
const csr = value;
118 UDP->UDP_CSR[epnum] = csr;
120 volatile uint32_t nop_count;
121 for (nop_count = 0; nop_count < 20; nop_count ++) __NOP();
125static inline void csr_set(uint8_t epnum, uint32_t mask)
127 csr_write(epnum, UDP->UDP_CSR[epnum] | CSR_NO_EFFECT_1_ALL | mask);
131static inline void csr_clear(uint8_t epnum, uint32_t mask)
133 csr_write(epnum, (UDP->UDP_CSR[epnum] | CSR_NO_EFFECT_1_ALL) & ~mask);
151 UDP->UDP_IER = UDP_IER_EP0INT_Msk | UDP_IER_RXSUSP_Msk | UDP_IER_RXRSM_Msk | UDP_IER_WAKEUP_Msk;
154 UDP->UDP_TXVC &= ~UDP_TXVC_TXVDIS_Msk;
171 NVIC_EnableIRQ(UDP_IRQn);
178 NVIC_DisableIRQ(UDP_IRQn);
205 UDP->UDP_TXVC = UDP_TXVC_PUON | UDP_TXVC_TXVDIS_Msk;
213 UDP->UDP_TXVC = UDP_TXVC_TXVDIS_Msk;
242 UDP->UDP_GLB_STAT |= UDP_GLB_STAT_FADDEN_Msk;
245 UDP->UDP_FADDR = UDP_FADDR_FEN_Msk | UDP_FADDR_FADD(
dev_addr);
250 UDP->UDP_GLB_STAT |= UDP_GLB_STAT_CONFG_Msk;
267 TU_VERIFY(epnum < EP_COUNT);
270 TU_ASSERT((UDP->UDP_CSR[epnum] & UDP_CSR_EPEDS_Msk) == 0);
278 if (dir ==
TUSB_DIR_IN) UDP->UDP_IER |= (1 << epnum);
284 (void) rhport; (void) ep_addr;
308 if (epnum != 0) UDP->UDP_IER |= (1 << epnum);
315 csr_set(epnum, UDP_CSR_TXPKTRDY_Msk);
341 csr_set(epnum, UDP_CSR_FORCESTALL_Msk);
352 csr_clear(epnum, UDP_CSR_FORCESTALL_Msk);
355 UDP->UDP_RST_EP |= (1 << epnum);
356 UDP->UDP_RST_EP &= ~(1 << epnum);
364 uint32_t
const intr_mask = UDP->UDP_IMR;
365 uint32_t
const intr_status = UDP->UDP_ISR & intr_mask;
368 UDP->UDP_ICR = intr_status;
371 if (intr_status & UDP_ISR_ENDBUSRES_Msk)
391 if ( intr_status & TU_BIT(0) )
394 if ( UDP->UDP_CSR[0] & UDP_CSR_RXSETUP )
398 for(uint8_t i=0; i<
sizeof(setup); i++)
400 setup[i] = (uint8_t) UDP->UDP_FDR[0];
418 csr_clear(0, UDP_CSR_RXSETUP_Msk | UDP_CSR_TXPKTRDY_Msk | UDP_CSR_TXCOMP_Msk | UDP_CSR_RX_DATA_BK0 | UDP_CSR_RX_DATA_BK1 | UDP_CSR_STALLSENT_Msk | UDP_CSR_FORCESTALL_Msk);
422 for(uint8_t epnum = 0; epnum < EP_COUNT; epnum++)
424 if ( intr_status & TU_BIT(epnum) )
429 if (UDP->UDP_CSR[epnum] & UDP_CSR_TXCOMP_Msk)
450 csr_set(epnum, UDP_CSR_TXPKTRDY_Msk);
467 uint32_t
const banks_complete = UDP->UDP_CSR[epnum] & (UDP_CSR_RX_DATA_BK0_Msk | UDP_CSR_RX_DATA_BK1_Msk);
470 uint16_t
const xact_len = (uint16_t) ((UDP->UDP_CSR[epnum] & UDP_CSR_RXBYTECNT_Msk) >> UDP_CSR_RXBYTECNT_Pos);
489 if (epnum != 0) UDP->UDP_IDR |= (1 << epnum);
500 if (UDP->UDP_CSR[epnum] & UDP_CSR_STALLSENT_Msk)
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]
static void csr_clear(uint8_t epnum, uint32_t mask)
bool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t *ff, uint16_t total_bytes)
static void csr_set(uint8_t epnum, uint32_t mask)
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)
xfer_desc_t _dcd_xfer[EP_COUNT]
void xfer_begin(xfer_desc_t *xfer, uint8_t *buffer, uint16_t total_bytes)
void dcd_int_handler(uint8_t rhport)
uint16_t xfer_packet_len(xfer_desc_t *xfer)
void dcd_disconnect(uint8_t rhport)
void xfer_end(xfer_desc_t *xfer)
void dcd_edpt_close_all(uint8_t rhport)
static void xact_ep_write(uint8_t epnum, uint8_t *buffer, uint16_t xact_len)
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 void xact_ep_read(uint8_t epnum, uint8_t *buffer, uint16_t xact_len)
void dcd_connect(uint8_t rhport)
static void csr_write(uint8_t epnum, uint32_t value)
bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)
void xfer_epsize_set(xfer_desc_t *xfer, uint16_t epsize)
void xfer_packet_done(xfer_desc_t *xfer)
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.
volatile uint16_t actual_len
volatile uint16_t actual_len
static TU_ATTR_ALWAYS_INLINE uint16_t tu_min16(uint16_t x, uint16_t y)
uint16_t tu_fifo_write_n_const_addr_full_words(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_const_addr_full_words(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...
@ TUSB_REQ_SET_CONFIGURATION
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)
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