38#if CFG_TUD_ENABLED && ( (CFG_TUSB_MCU == OPT_MCU_NUC121) || (CFG_TUSB_MCU == OPT_MCU_NUC126) )
50#define PERIPH_SETUP_BUF_BASE 0
51#define PERIPH_SETUP_BUF_LEN 8
52#define PERIPH_EP0_BUF_BASE (PERIPH_SETUP_BUF_BASE + PERIPH_SETUP_BUF_LEN)
53#define PERIPH_EP0_BUF_LEN CFG_TUD_ENDPOINT0_SIZE
54#define PERIPH_EP1_BUF_BASE (PERIPH_EP0_BUF_BASE + PERIPH_EP0_BUF_LEN)
55#define PERIPH_EP1_BUF_LEN CFG_TUD_ENDPOINT0_SIZE
56#define PERIPH_EP2_BUF_BASE (PERIPH_EP1_BUF_BASE + PERIPH_EP1_BUF_LEN)
59#define USBD_BUF_SIZE ((CFG_TUSB_MCU == OPT_MCU_NUC121) ? 768 : 512)
99 USBD->SE0 &= ~USBD_SE0_SE0_Msk;
104 USBD->SE0 |= USBD_SE0_SE0_Msk;
107static inline void usb_memcpy(uint8_t *dest, uint8_t *src, uint16_t size)
109 while(size--) *dest++ = *src++;
114 USBD->EP[
PERIPH_EP0].CFG |= USBD_CFG_DSQSYNC_Msk;
121 uint8_t ep_addr = ep->CFG & USBD_CFG_EPNUM_Msk;
122 if ( USBD_CFG_EPMODE_IN == (ep->CFG & USBD_CFG_STATE_Msk) )
128static USBD_EP_T *
ep_entry(uint8_t ep_addr,
bool add)
138 if (0 == (ep->CFG & USBD_CFG_STATE_Msk))
return ep;
144 if (candidate_ep_addr == ep_addr)
return ep;
154 uint16_t bytes_now =
tu_min16(
xfer->in_remaining_bytes,
xfer->max_packet_size);
165 usb_memcpy((uint8_t *)(USBD_BUF_BASE + ep->BUFSEG),
xfer->data_ptr, bytes_now);
168 ep->MXPLD = bytes_now;
174 USBD->STBUFSEG = PERIPH_SETUP_BUF_BASE;
178 USBD->EP[ep_index].CFG = 0;
179 USBD->EP[ep_index].CFGP = 0;
184 USBD->EP[
PERIPH_EP0].CFG = USBD_CFG_CSTALL_Msk | USBD_CFG_EPMODE_IN;
185 USBD->EP[
PERIPH_EP0].BUFSEG = PERIPH_EP0_BUF_BASE;
188 USBD->EP[
PERIPH_EP1].CFG = USBD_CFG_CSTALL_Msk | USBD_CFG_EPMODE_OUT;
189 USBD->EP[
PERIPH_EP1].BUFSEG = PERIPH_EP1_BUF_BASE;
204 ENABLED_IRQS = USBD_INTSTS_VBDETIF_Msk | USBD_INTSTS_BUSIF_Msk | USBD_INTSTS_SETUP_Msk |
205 USBD_INTSTS_USBIF_Msk | (USE_SOF ? USBD_INTSTS_SOFIF_Msk : 0)
217 USBD->ATTR = 0x7D0 | USBD_LPMACK;
237 NVIC_EnableIRQ(USBD_IRQn);
243 NVIC_DisableIRQ(USBD_IRQn);
260 while(count--) __NOP();
267 USBD->ATTR |= USBD_ATTR_PHYEN_Msk;
268 USBD->ATTR |= USBD_ATTR_RWAKEUP_Msk;
272 USBD->ATTR &=~USBD_ATTR_RWAKEUP_Msk;
295 cfg |= (
TUSB_DIR_IN == dir) ? USBD_CFG_EPMODE_IN : USBD_CFG_EPMODE_OUT;
297 cfg |= USBD_CFG_TYPE_ISO;
301 xfer->max_packet_size = size;
318 USBD_EP_T *ep =
ep_entry(ep_addr,
false);
336 xfer->out_bytes_so_far = 0;
337 ep->MXPLD =
xfer->max_packet_size;
354 xfer->data_ptr = NULL;
365 xfer->out_bytes_so_far = 0;
366 ep->MXPLD =
xfer->max_packet_size;
377 ep->CFGP |= USBD_CFGP_SSTALL_Msk;
384 ep->CFG = (ep->CFG & ~USBD_CFG_DSQSYNC_Msk) | USBD_CFG_CSTALL_Msk;
392 uint32_t status = USBD->INTSTS & (
ENABLED_IRQS | 0xffffff00);
395 uint32_t
state = USBD->ATTR & 0x300f;
397 uint32_t
state = USBD->ATTR & 0xf;
400 if(status & USBD_INTSTS_VBDETIF_Msk)
402 if(USBD->VBUSDET & USBD_VBUSDET_VBUSDET_Msk)
405 USBD->ATTR |= USBD_ATTR_USBEN_Msk | USBD_ATTR_PHYEN_Msk;
410 USBD->ATTR &= ~USBD_ATTR_USBEN_Msk;
414 if(status & USBD_INTSTS_BUSIF_Msk)
416 if(
state & USBD_ATTR_USBRST_Msk)
419 USBD->ATTR |= USBD_ATTR_USBEN_Msk | USBD_ATTR_PHYEN_Msk;
426 if(
state & USBD_ATTR_SUSPEND_Msk)
429 USBD->ATTR &= ~USBD_ATTR_PHYEN_Msk;
433 if(
state & USBD_ATTR_RESUME_Msk)
436 USBD->ATTR |= USBD_ATTR_USBEN_Msk | USBD_ATTR_PHYEN_Msk;
441 if(status & USBD_INTSTS_SETUP_Msk)
444 USBD->EP[
PERIPH_EP0].CFGP |= USBD_CFGP_CLRRDY_Msk;
445 USBD->EP[
PERIPH_EP1].CFGP |= USBD_CFGP_CLRRDY_Msk;
451 if(status & USBD_INTSTS_USBIF_Msk)
453 if (status & USBD_INTSTS_EPEVT0_Msk)
455 uint16_t
const available_bytes = USBD->EP[
PERIPH_EP0].MXPLD;
473 uint16_t
const available_bytes = ep->MXPLD;
489 usb_memcpy(
xfer->data_ptr, (uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), available_bytes);
490 xfer->data_ptr += available_bytes;
493 xfer->out_bytes_so_far += available_bytes;
499 ep->MXPLD =
xfer->max_packet_size;
504 xfer->in_remaining_bytes -= available_bytes;
505 xfer->data_ptr += available_bytes;
508 if (
xfer->in_remaining_bytes)
517 if(status & USBD_INTSTS_SOFIF_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 USBD_EP_T * ep_entry(uint8_t ep_addr, bool add)
bool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t *ff, uint16_t total_bytes)
static struct xfer_ctl_t xfer_table[PERIPH_MAX_EP]
void dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)
static void usb_detach(void)
static void bus_reset(void)
static void usb_control_send_zlp(void)
void dcd_int_handler(uint8_t rhport)
static void dcd_in_xfer(struct xfer_ctl_t *xfer, USBD_EP_T *ep)
void dcd_disconnect(uint8_t rhport)
static void remote_wakeup_delay(void)
static void usb_memcpy(uint8_t *dest, uint8_t *src, uint16_t size)
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 *p_endpoint_desc)
static void usb_attach(void)
void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
static uint8_t decode_ep_addr(USBD_EP_T *ep)
void dcd_connect(uint8_t rhport)
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)
static uint32_t bufseg_addr
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)
static bool active_ep0_xfer
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.
uint16_t out_bytes_so_far
uint16_t in_remaining_bytes
static TU_ATTR_ALWAYS_INLINE uint16_t tu_min16(uint16_t x, uint16_t y)
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...
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)
CFG_TUH_MEM_ALIGN tusb_control_request_t request