37#if CFG_TUD_ENABLED && defined(TUP_USBIP_IP3511)
43#if TU_CHECK_MCU(OPT_MCU_LPC11UXX, OPT_MCU_LPC13XX, OPT_MCU_LPC15XX)
46 #pragma GCC diagnostic push
47 #pragma GCC diagnostic ignored "-Wunused-parameter"
48 #pragma GCC diagnostic ignored "-Wstrict-prototypes"
54 #pragma GCC diagnostic pop
59 #include "fsl_device_registers.h"
60 #define INCLUDE_FSL_DEVICE_REGISTERS
81 uint8_t RESERVED_0[8];
178#define MAX_EP_PAIRS 6
209 const bool is_highspeed;
210 const IRQn_Type irqnum;
211 const uint8_t ep_pairs;
214#ifdef INCLUDE_FSL_DEVICE_REGISTERS
217 { .regs = (
dcd_registers_t*) USB0_BASE , .is_highspeed =
false, .irqnum = USB0_IRQn, .ep_pairs = FSL_FEATURE_USB_EP_NUM },
218 #if defined(FSL_FEATURE_SOC_USBHSD_COUNT) && FSL_FEATURE_SOC_USBHSD_COUNT
219 { .regs = (
dcd_registers_t*) USBHSD_BASE, .is_highspeed =
true, .irqnum = USB1_IRQn, .ep_pairs = FSL_FEATURE_USBHSD_EP_NUM }
226 { .regs = (
dcd_registers_t*) LPC_USB0_BASE, .is_highspeed =
false, .irqnum = USB0_IRQn, .ep_pairs = 5 },
231#if defined(FSL_FEATURE_SOC_USBHSD_COUNT) && FSL_FEATURE_SOC_USBHSD_COUNT
232 #define IP3511_HAS_HIGHSPEED
240 uint32_t addr = (uint32_t)
buffer;
241 TU_ASSERT( (addr & 0x3f) == 0, 0 );
242 return ( (addr >> 6) & 0xFFFFUL ) ;
245TU_ATTR_ALWAYS_INLINE
static inline uint8_t
ep_addr2id(uint8_t ep_addr) {
254 return (ep_cs[0].cmd_sts.
type == 0) && (ep_cs[0].
cmd_sts.rf_tv == 0);
258 return _dcd.ep[ep_id];
272 _dcd.ep[0][1].buffer_hs.offset = buf_offset;
274 _dcd.ep[0][1].buffer_fs.offset = buf_offset;
281 tu_memclr(&
_dcd.ep[ep_id],
sizeof(
_dcd.ep[ep_id]));
286 for (uint8_t ep_id = 0; ep_id < 2*
_dcd_controller[rhport].ep_pairs; ++ep_id)
327 dcd_reg->
DEVCMDSTAT &= ~DEVCMDSTAT_DEVICE_ADDR_MASK;
345 dcd_reg->
DEVCMDSTAT &= ~DEVCMDSTAT_DEVICE_CONNECT_MASK;
365 _dcd.ep[ep_id][0].cmd_sts.stall = 1;
374 _dcd.ep[ep_id][0].cmd_sts.stall = 0;
375 _dcd.ep[ep_id][0].cmd_sts.toggle_reset = 1;
376 _dcd.ep[ep_id][0].cmd_sts.rf_tv = 0;
386 TU_ASSERT( ep_cs[0].cmd_sts.
disable && ep_cs[1].
cmd_sts.disable );
412 dcd_reg->
INTEN |= TU_BIT(ep_id);
419 for (uint8_t ep_id = 0; ep_id < 2*
_dcd_controller[rhport].ep_pairs; ++ep_id)
421 _dcd.ep[ep_id][0].cmd_sts.active =
_dcd.ep[ep_id][0].cmd_sts.active = 0;
422 _dcd.ep[ep_id][0].cmd_sts.disable =
_dcd.ep[ep_id][1].cmd_sts.disable = 1;
431 _dcd.ep[ep_id][0].cmd_sts.active =
_dcd.ep[ep_id][0].cmd_sts.active = 0;
432 _dcd.ep[ep_id][0].cmd_sts.disable =
_dcd.ep[ep_id][1].cmd_sts.disable = 1;
443 #if TU_CHECK_MCU(OPT_MCU_LPC54)
448 if ( (ep_id > 1) && (ep_id & 0x01) == 0 &&
ep_is_bulk(ep_cs) ) {
449 if ( nbytes & 0x03 ) {
463 _dcd.dma[ep_id].nbytes = nbytes;
473 buffer = (uint8_t *) (uint32_t) dummy;
493 for(uint8_t ep_id = 0; ep_id < 2*MAX_EP_PAIRS; ep_id++)
495 _dcd.ep[ep_id][0].cmd_sts.disable =
_dcd.ep[ep_id][1].cmd_sts.disable = 1;
502 dcd_reg->
EPSKIP = 0xFFFFFFFF;
512 for(uint8_t ep_id = 0; ep_id < max_ep; ep_id++ ) {
529 #if TU_CHECK_MCU(OPT_MCU_LPC54)
532 if ( (ep_id > 1) && (ep_id & 0x01) == 1 &&
ep_is_bulk(ep_cs) ) {
551 uint8_t
const ep_addr =
tu_edpt_addr(ep_id / 2, ep_id & 0x01);
564 uint32_t
const cmd_stat = dcd_reg->
DEVCMDSTAT;
566 uint32_t int_status = dcd_reg->
INTSTAT & dcd_reg->
INTEN;
569 if (int_status == 0)
return;
616 _dcd.ep[0][0].cmd_sts.active =
_dcd.ep[1][0].cmd_sts.active = 0;
617 _dcd.ep[0][0].cmd_sts.stall =
_dcd.ep[1][0].cmd_sts.stall = 0;
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)
static TU_ATTR_ALWAYS_INLINE bool rhport_is_highspeed(uint8_t rhport)
@ DEVCMDSTAT_SUSPEND_CHANGE_MASK
@ DEVCMDSTAT_DEVICE_SUSPEND_MASK
@ DEVCMDSTAT_DEVICE_ADDR_MASK
@ DEVCMDSTAT_DEVICE_ENABLE_MASK
@ DEVCMDSTAT_DEVICE_CONNECT_MASK
@ DEVCMDSTAT_VBUS_DEBOUNCED_MASK
@ DEVCMDSTAT_RESET_CHANGE_MASK
@ DEVCMDSTAT_CONNECT_CHANGE_MASK
@ DEVCMDSTAT_SETUP_RECEIVED_MASK
static void edpt_reset_all(uint8_t rhport)
static TU_ATTR_ALWAYS_INLINE uint16_t get_buf_offset(void const *buffer)
static TU_ATTR_ALWAYS_INLINE ep_cmd_sts_t * get_ep_cs(uint8_t ep_id)
TU_VERIFY_STATIC(sizeof(ep_cmd_sts_t)==4, "size is not correct")
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)
void dcd_int_handler(uint8_t rhport)
void dcd_disconnect(uint8_t rhport)
static void edpt_reset(uint8_t rhport, uint8_t ep_id)
static void prepare_setup_packet(uint8_t rhport)
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)
void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
static void prepare_ep_xfer(uint8_t rhport, uint8_t ep_id, uint16_t buf_offset, uint16_t total_bytes)
void dcd_connect(uint8_t rhport)
CFG_TUD_MEM_SECTION TU_ATTR_ALIGNED(256)
bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)
TU_ATTR_ALWAYS_INLINE static TU_ATTR_UNUSED bool ep_is_bulk(ep_cmd_sts_t *ep_cs)
static const dcd_controller_t _dcd_controller[]
void dcd_set_address(uint8_t rhport, uint8_t dev_addr)
static void process_xfer_isr(uint8_t rhport, uint32_t int_status)
static TU_ATTR_ALWAYS_INLINE bool ep_is_iso(ep_cmd_sts_t *ep_cs, bool is_highspeed)
bool dcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init)
static TU_ATTR_ALWAYS_INLINE uint8_t ep_addr2id(uint8_t ep_addr)
union TU_ATTR_PACKED ep_cmd_sts_t
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)
volatile struct TU_ATTR_PACKED::@419 cmd_sts
uint8_t bmAttributes
See: audio_clock_source_attribute_t.
volatile struct TU_ATTR_PACKED::@418 buffer_hs
volatile struct TU_ATTR_PACKED::@417 buffer_fs
USBHS hardware registers.
__IO uint32_t DATABUFSTART
__IO uint32_t EPLISTSTART
static TU_ATTR_ALWAYS_INLINE uint32_t tu_bit_clear(uint32_t value, uint8_t pos)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_min16(uint16_t x, uint16_t y)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_align4(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)
tusb_speed_t
defined base on EHCI specs value for Endpoint Speed
static TU_ATTR_ALWAYS_INLINE uint8_t tu_edpt_addr(uint8_t num, uint8_t dir)