38#if CFG_TUD_ENABLED && (CFG_TUSB_MCU == OPT_MCU_NUC120)
41#include "NUC100Series.h"
44#define PERIPH_SETUP_BUF_BASE 0
45#define PERIPH_SETUP_BUF_LEN 8
46#define PERIPH_EP0_BUF_BASE (PERIPH_SETUP_BUF_BASE + PERIPH_SETUP_BUF_LEN)
47#define PERIPH_EP0_BUF_LEN CFG_TUD_ENDPOINT0_SIZE
48#define PERIPH_EP1_BUF_BASE (PERIPH_EP0_BUF_BASE + PERIPH_EP0_BUF_LEN)
49#define PERIPH_EP1_BUF_LEN CFG_TUD_ENDPOINT0_SIZE
50#define PERIPH_EP2_BUF_BASE (PERIPH_EP1_BUF_BASE + PERIPH_EP1_BUF_LEN)
53#define USBD_BUF_SIZE 512
94 USBD->DRVSE0 &= ~USBD_DRVSE0_DRVSE0_Msk;
99 USBD->DRVSE0 |= USBD_DRVSE0_DRVSE0_Msk;
102static inline void usb_memcpy(uint8_t *dest, uint8_t *src, uint16_t size)
104 while(size--) *dest++ = *src++;
109 USBD->EP[
PERIPH_EP0].CFG |= USBD_CFG_DSQ_SYNC_Msk;
116 uint8_t ep_addr = ep->CFG & USBD_CFG_EP_NUM_Msk;
117 if ( USBD_CFG_EPMODE_IN == (ep->CFG & USBD_CFG_STATE_Msk) )
123static USBD_EP_T *
ep_entry(uint8_t ep_addr,
bool add)
133 if (0 == (ep->CFG & USBD_CFG_STATE_Msk))
return ep;
139 if (candidate_ep_addr == ep_addr)
return ep;
149 uint16_t bytes_now =
tu_min16(
xfer->in_remaining_bytes,
xfer->max_packet_size);
160 usb_memcpy((uint8_t *)(USBD_BUF_BASE + ep->BUFSEG),
xfer->data_ptr, bytes_now);
163 ep->MXPLD = bytes_now;
169 USBD->STBUFSEG = PERIPH_SETUP_BUF_BASE;
173 USBD->EP[ep_index].CFG = 0;
174 USBD->EP[ep_index].CFGP = 0;
179 USBD->EP[
PERIPH_EP0].CFG = USBD_CFG_CSTALL_Msk | USBD_CFG_EPMODE_IN;
180 USBD->EP[
PERIPH_EP0].BUFSEG = PERIPH_EP0_BUF_BASE;
183 USBD->EP[
PERIPH_EP1].CFG = USBD_CFG_CSTALL_Msk | USBD_CFG_EPMODE_OUT;
184 USBD->EP[
PERIPH_EP1].BUFSEG = PERIPH_EP1_BUF_BASE;
198static const uint32_t
enabled_irqs = USBD_INTSTS_FLDET_STS_Msk | USBD_INTSTS_BUS_STS_Msk | USBD_INTSTS_SETUP_Msk | USBD_INTSTS_USB_STS_Msk;
225 NVIC_EnableIRQ(USBD_IRQn);
231 NVIC_DisableIRQ(USBD_IRQn);
244 USBD->ATTR = USBD_ATTR_RWAKEUP_Msk;
267 cfg |= (
TUSB_DIR_IN == dir) ? USBD_CFG_EPMODE_IN : USBD_CFG_EPMODE_OUT;
269 cfg |= USBD_CFG_TYPE_ISO;
273 xfer->max_packet_size = size;
290 USBD_EP_T *ep =
ep_entry(ep_addr,
false);
308 xfer->out_bytes_so_far = 0;
309 ep->MXPLD =
xfer->max_packet_size;
326 xfer->data_ptr = NULL;
337 xfer->out_bytes_so_far = 0;
338 ep->MXPLD =
xfer->max_packet_size;
349 ep->CFGP |= USBD_CFGP_SSTALL_Msk;
356 ep->CFG |= USBD_CFG_CSTALL_Msk;
363 uint32_t status = USBD->INTSTS;
364 uint32_t
state = USBD->ATTR & 0xf;
366 if(status & USBD_INTSTS_FLDET_STS_Msk)
368 if(USBD->FLDET & USBD_FLDET_FLDET_Msk)
371 USBD->ATTR |= USBD_ATTR_USB_EN_Msk | USBD_ATTR_PHY_EN_Msk;
376 USBD->ATTR &= ~USBD_ATTR_USB_EN_Msk;
380 if(status & USBD_INTSTS_BUS_STS_Msk)
382 if(
state & USBD_STATE_USBRST)
385 USBD->ATTR |= USBD_ATTR_USB_EN_Msk | USBD_ATTR_PHY_EN_Msk;
391 if(
state & USBD_STATE_SUSPEND)
394 USBD->ATTR &= ~USBD_ATTR_PHY_EN_Msk;
398 if(
state & USBD_STATE_RESUME)
401 USBD->ATTR |= USBD_ATTR_USB_EN_Msk | USBD_ATTR_PHY_EN_Msk;
406 if(status & USBD_INTSTS_SETUP_Msk)
409 USBD->EP[
PERIPH_EP0].CFGP |= USBD_CFGP_CLRRDY_Msk;
410 USBD->EP[
PERIPH_EP1].CFGP |= USBD_CFGP_CLRRDY_Msk;
416 if(status & USBD_INTSTS_USB_STS_Msk)
418 if (status & (1UL << USBD_INTSTS_EPEVT_Pos))
423 uint16_t
const available_bytes = USBD->EP[
PERIPH_EP0].MXPLD;
441 uint16_t
const available_bytes = ep->MXPLD;
457 usb_memcpy(
xfer->data_ptr, (uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), available_bytes);
458 xfer->data_ptr += available_bytes;
461 xfer->out_bytes_so_far += available_bytes;
467 ep->MXPLD =
xfer->max_packet_size;
472 xfer->in_remaining_bytes -= available_bytes;
474 xfer->data_ptr += available_bytes;
477 if (
xfer->in_remaining_bytes)
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 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)
static const uint32_t enabled_irqs
static uint32_t bufseg_addr
static volatile uint8_t assigned_address
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)
uint8_t bmAttributes
See: audio_clock_source_attribute_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)