29#if CFG_TUD_ENABLED && defined(TUP_USBIP_CHIPIDEA_HS)
34#if CFG_TUSB_MCU == OPT_MCU_MIMXRT1XXX
51#if TU_CHECK_MCU(OPT_MCU_LPC18XX, OPT_MCU_LPC43XX)
54#elif TU_CHECK_MCU(OPT_MCU_MCXN9)
58 #error "Unsupported MCUs"
62 (void) addr; (void) data_size;
66 (void) addr; (void) data_size;
70 (void) addr; (void) data_size;
159 uint8_t reserved[12];
168#define QTD_NEXT_INVALID 0x01
186static inline uint8_t ci_ep_count(
ci_hs_regs_t const* dcd_reg)
188 return dcd_reg->DCCPARAMS & DCCPARAMS_DEN_MASK;
205 uint8_t
const ep_count = ci_ep_count(dcd_reg);
206 for( uint8_t i=1; i < ep_count; i++)
228 _dcd_data.qhd[0][0].zero_length_termination = _dcd_data.qhd[0][1].zero_length_termination = 1;
229 _dcd_data.qhd[0][0].max_packet_size = _dcd_data.qhd[0][1].max_packet_size = CFG_TUD_ENDPOINT0_SIZE;
230 _dcd_data.qhd[0][0].qtd_overlay.next = _dcd_data.qhd[0][1].qtd_overlay.next = QTD_NEXT_INVALID;
232 _dcd_data.qhd[0][0].int_on_setup = 1;
243 TU_ASSERT(ci_ep_count(dcd_reg) <= TUP_DCD_ENDPOINT_MAX);
250 uint32_t usbmode = dcd_reg->
USBMODE & ~USBMOD_CM_MASK;
256#if !TUD_OPT_HIGH_SPEED
266 uint32_t usbcmd = dcd_reg->
USBCMD;
277 CI_DCD_INT_ENABLE(rhport);
282 CI_DCD_INT_DISABLE(rhport);
309 dcd_reg->
USBCMD &= ~USBCMD_RUN_STOP;
334 p_qtd->
next = QTD_NEXT_INVALID;
344 for(uint8_t i=1; i<5; i++)
347 if ( bufend <= next_page )
break;
349 p_qtd->
buffer[i] = next_page;
368 dcd_reg->
ENDPTFLUSH = TU_BIT(epnum + (dir ? 16 : 0));
390 TU_ASSERT(epnum < ci_ep_count(dcd_reg));
393 dcd_qhd_t * p_qhd = &_dcd_data.qhd[epnum][dir];
415 dcd_reg->
ENDPTCTRL[epnum] = (dcd_reg->
ENDPTCTRL[epnum] & 0x0000FFFFu) | (epctrl << 16);
426 uint8_t
const ep_count = ci_ep_count(dcd_reg);
427 for (uint8_t epnum = 1; epnum < ep_count; epnum++)
429 _dcd_data.qhd[epnum][
TUSB_DIR_OUT].qtd_overlay.halted = 1;
430 _dcd_data.qhd[epnum][
TUSB_DIR_IN ].qtd_overlay.halted = 1;
432 dcd_reg->
ENDPTFLUSH = TU_BIT(epnum) | TU_BIT(epnum+16);
444 _dcd_data.qhd[epnum][dir].qtd_overlay.halted = 1;
447 uint32_t
const flush_mask = TU_BIT(epnum + (dir ? 16 : 0));
458 dcd_qhd_t* p_qhd = &_dcd_data.qhd[epnum][dir];
459 dcd_qtd_t* p_qtd = &_dcd_data.qtd[epnum][dir];
475 dcd_reg->
ENDPTPRIME = TU_BIT(epnum + (dir ? 16 : 0));
483 dcd_qhd_t* p_qhd = &_dcd_data.qhd[epnum][dir];
484 dcd_qtd_t* p_qtd = &_dcd_data.qtd[epnum][dir];
502 dcd_qhd_t * p_qhd = &_dcd_data.qhd[epnum][dir];
503 dcd_qtd_t * p_qtd = &_dcd_data.qtd[epnum][dir];
533 for(uint8_t i = 1, page = 0; i < 5; i++)
536 if (p_qtd->
buffer[i] == 0)
565 dcd_qhd_t * p_qhd = &_dcd_data.qhd[epnum][dir];
566 dcd_qtd_t * p_qtd = &_dcd_data.qtd[epnum][dir];
575 dcd_reg->
ENDPTFLUSH = TU_BIT(epnum + (dir ? 16 : 0));
599 uint32_t
const int_enable = dcd_reg->
USBINTR;
600 uint32_t
const int_status = dcd_reg->
USBSTS & int_enable;
601 dcd_reg->
USBSTS = int_status;
604 if (int_status == 0)
return;
667 for(uint8_t epnum = 0; epnum < TUP_DCD_ENDPOINT_MAX; epnum++)
686 const uint32_t frame = dcd_reg->
FRINDEX;
static TU_ATTR_ALWAYS_INLINE bool imxrt_dcache_invalidate(void const *addr, uint32_t data_size)
static TU_ATTR_ALWAYS_INLINE bool imxrt_dcache_clean(void const *addr, uint32_t data_size)
static TU_ATTR_ALWAYS_INLINE bool imxrt_dcache_clean_invalidate(void const *addr, uint32_t data_size)
static TU_ATTR_ALWAYS_INLINE ci_hs_regs_t * CI_HS_REG(uint8_t port)
@ PORTSC1_FORCE_FULL_SPEED
@ PORTSC1_CURRENT_CONNECT_STATUS
@ PORTSC1_FORCE_PORT_RESUME
@ USBCMD_INTR_THRESHOLD_MASK
@ OTGSC_OTG_TERMINATION
Must set to 1 when OTG go to device mode.
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)
bool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t *ff, uint16_t total_bytes)
CFG_TUD_MEM_SECTION TU_ATTR_ALIGNED(2048)
@ ENDPTCTRL_TOGGLE_INHIBIT
static void qhd_start_xfer(uint8_t rhport, uint8_t epnum, uint8_t dir)
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(uint8_t rhport)
follows LPC43xx User Manual 23.10.3
void dcd_int_handler(uint8_t rhport)
void dcd_disconnect(uint8_t rhport)
TU_VERIFY_STATIC(sizeof(dcd_qtd_t)==32, "size is not correct")
void dcd_edpt_close_all(uint8_t rhport)
void dcd_int_disable(uint8_t rhport)
void dcd_dcache_invalidate(void const *addr, uint32_t data_size)
bool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const *p_endpoint_desc)
void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
void dcd_dcache_clean(void const *addr, uint32_t data_size)
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_set_address(uint8_t rhport, uint8_t dev_addr)
void dcd_dcache_clean_invalidate(void const *addr, uint32_t data_size)
bool dcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init)
void dcd_int_enable(uint8_t rhport)
static void qtd_init(dcd_qtd_t *p_qtd, void *data_ptr, uint16_t total_bytes)
void dcd_remote_wakeup(uint8_t rhport)
void dcd_sof_enable(uint8_t rhport, bool en)
static void process_edpt_complete_isr(uint8_t rhport, uint8_t epnum, uint8_t dir)
AUDIO Channel Cluster Descriptor (4.1)
uint8_t bmAttributes
See: audio_clock_source_attribute_t.
volatile uint32_t PORTSC1
Port Status & Control.
volatile uint32_t USBINTR
Interrupt Enable Register.
volatile uint32_t OTGSC
On-The-Go Status & control.
volatile uint32_t ENDPTCTRL[8]
Endpoint Control 0 - 7.
volatile uint32_t ENDPTNAKEN
Endpoint NAK Enable.
volatile uint32_t FRINDEX
USB Frame Index.
volatile uint32_t USBSTS
USB Status Register.
volatile uint32_t ENDPTLISTADDR
Endpoint List Address.
volatile uint32_t ENDPTCOMPLETE
Endpoint Complete.
volatile uint32_t ENDPTNAK
Endpoint NAK.
volatile uint32_t ENDPTFLUSH
Endpoint Flush.
volatile uint32_t ENDPTSETUPSTAT
Endpoint Setup Status.
volatile uint32_t ENDPTPRIME
Endpoint Prime.
volatile uint32_t USBCMD
USB Command Register.
volatile uint32_t USBMODE
USB Device Mode.
volatile uint32_t DEVICEADDR
Device Address.
dcd_qhd_t qhd[TUP_DCD_ENDPOINT_MAX][2] TU_ATTR_ALIGNED(64)
dcd_qtd_t qtd[TUP_DCD_ENDPOINT_MAX][2] TU_ATTR_ALIGNED(32)
volatile dcd_qtd_t qtd_overlay
uint32_t max_packet_size
Endpoint's wMaxPacketSize.
uint32_t int_on_setup
Interrupt on setup This bit is used on control type endpoints to indicate if USBINT is set in respons...
uint32_t zero_length_termination
This bit is used for non-isochronous endpoints to indicate when a zero-length packet is received to t...
volatile tusb_control_request_t setup_request
volatile uint32_t qtd_addr
volatile uint32_t xact_err
volatile uint32_t total_bytes
uint32_t iso_mult_override
This field can be used for transmit ISOs to override the MULT field in the dQH. This field must be ze...
uint32_t buffer[5]
buffer1 has frame_n for TODO Isochronous
uint32_t next
Next link pointer This field contains the physical memory address of the next dTD to be processed.
volatile uint32_t buffer_err
void * ptr_lin
linear part start pointer
uint16_t len_lin
linear length in item size
void * ptr_wrap
wrapped part start pointer
uint16_t len_wrap
wrapped length in item size
static TU_ATTR_ALWAYS_INLINE uint32_t tu_align4k(uint32_t value)
static TU_ATTR_ALWAYS_INLINE bool tu_bit_test(uint32_t value, uint8_t pos)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_align(uint32_t value, uint32_t alignment)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_offset4k(uint32_t value)
void tu_fifo_get_write_info(tu_fifo_t *f, tu_fifo_buffer_info_t *info)
Get linear write info.
void tu_fifo_advance_write_pointer(tu_fifo_t *f, uint16_t n)
Advance write pointer - intended to be used in combination with DMA. It is possible to fill the FIFO ...
void tu_fifo_advance_read_pointer(tu_fifo_t *f, uint16_t n)
Advance read pointer - intended to be used in combination with DMA. It is possible to read from the F...
void tu_fifo_get_read_info(tu_fifo_t *f, tu_fifo_buffer_info_t *info)
Get read info.
static TU_ATTR_ALWAYS_INLINE uint16_t tu_fifo_depth(tu_fifo_t *f)
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)
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)