29#if CFG_TUD_ENABLED && \
30 (CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX)
39#define DCD_ENDPOINT_MAX 32
47 uint16_t atle_mode : 2;
48 uint16_t next_valid : 1;
51 uint16_t max_packet_size : 11;
53 volatile uint16_t buflen;
59 volatile uint16_t retired : 1;
60 volatile uint16_t status : 4;
61 volatile uint16_t iso_last_packet_valid : 1;
62 volatile uint16_t atle_lsb_extracted : 1;
63 volatile uint16_t atle_msb_extracted : 1;
64 volatile uint16_t atle_mess_len_position : 6;
67 volatile uint16_t present_count;
103 LPC_USB->DevIntClr = (DEV_INT_COMMAND_CODE_EMPTY_MASK | DEV_INT_COMMAND_DATA_FULL_MASK);
104 LPC_USB->CmdCode = (phase << 8) | (code_data << 16);
106 uint32_t
const wait_flag = (phase ==
SIE_CMDPHASE_READ) ? DEV_INT_COMMAND_DATA_FULL_MASK : DEV_INT_COMMAND_CODE_EMPTY_MASK;
107 while ((LPC_USB->DevIntSt & wait_flag) == 0) {}
109 LPC_USB->DevIntClr = wait_flag;
126 return (uint8_t) LPC_USB->CmdData;
140 LPC_USB->ReEp |= TU_BIT(ep_id);
141 LPC_USB->EpInd = ep_id;
142 LPC_USB->MaxPSize = max_packet_size;
144 while ((LPC_USB->DevIntSt & DEV_INT_ENDPOINT_REALIZED_MASK) == 0) {}
145 LPC_USB->DevIntClr = DEV_INT_ENDPOINT_REALIZED_MASK;
155 LPC_USB->EpIntClr = 0xFFFFFFFF;
156 LPC_USB->DevIntClr = 0xFFFFFFFF;
157 LPC_USB->EpIntEn = 0x03UL;
158 LPC_USB->EpIntPri = 0x03UL;
161 LPC_USB->EpDMADis = 0xFFFFFFFF;
162 LPC_USB->DMARClr = 0xFFFFFFFF;
163 LPC_USB->EoTIntClr = 0xFFFFFFFF;
164 LPC_USB->NDDRIntClr = 0xFFFFFFFF;
165 LPC_USB->SysErrIntClr = 0xFFFFFFFF;
181 LPC_USB->DevIntEn = (DEV_INT_DEVICE_STATUS_MASK | DEV_INT_ENDPOINT_FAST_MASK | DEV_INT_ENDPOINT_SLOW_MASK | DEV_INT_ERROR_MASK);
182 LPC_USB->UDCAH = (uint32_t)
_dcd.udca;
188 NVIC_ClearPendingIRQ(USB_IRQn);
196 NVIC_EnableIRQ(USB_IRQn);
202 NVIC_DisableIRQ(USB_IRQn);
246 return (bytes + 3) / 4;
251 uint32_t
const * buf32 = (uint32_t
const *)
buffer;
254 LPC_USB->TxPLen = (uint32_t) len;
256 for (uint8_t count = 0; count <
byte2dword(len); count++)
258 LPC_USB->TxData = *buf32;
275 uint32_t *buf32 = (uint32_t*)
buffer;
277 for (uint8_t count=0; count <
byte2dword(len); count++)
279 *buf32 = LPC_USB->RxData;
308 TU_ASSERT((epnum % 3) == 1);
312 TU_ASSERT((epnum % 3) == 2 || (epnum == 15));
316 TU_ASSERT((epnum % 3) == 0 && (epnum != 0) && (epnum != 15));
332 dd->max_packet_size = ep_size;
341 (void) rhport; (void) ep_addr;
379 _dcd.control.in_bytes = len;
383 if (
_dcd.control.out_received )
386 _dcd.control.out_received =
false;
387 _dcd.control.out_buffer = NULL;
388 _dcd.control.out_bytes = 0;
395 _dcd.control.out_bytes = len;
416 uint16_t
const ep_size = dd->max_packet_size;
417 uint8_t is_iso = dd->isochronous;
420 dd->isochronous = is_iso;
421 dd->max_packet_size = ep_size;
422 dd->buffer = (uint32_t)
buffer;
425 _dcd.udca[ep_id] = dd;
430 LPC_USB->EpIntEn &= ~TU_BIT(ep_id);
431 LPC_USB->EpDMAEn = TU_BIT(ep_id);
434 LPC_USB->DMARSet = TU_BIT(ep_id);
438 LPC_USB->EpDMAEn = TU_BIT(ep_id);
453 if ( ep_int_status & TU_BIT(0) )
457 LPC_USB->EpIntClr = TU_BIT(0);
461 uint8_t setup_packet[8];
466 else if (
_dcd.control.out_buffer )
471 _dcd.control.out_buffer = NULL;
472 _dcd.control.out_bytes = 0;
478 _dcd.control.out_received =
true;
483 if ( ep_int_status & TU_BIT(1) )
485 LPC_USB->EpIntClr = TU_BIT(1);
524 uint8_t
const ep_addr = (ep_id / 2) | ((ep_id & 0x01) ?
TUSB_DIR_IN_MASK : 0);
532 uint32_t
const dev_int_status = LPC_USB->DevIntSt & LPC_USB->DevIntEn;
533 LPC_USB->DevIntClr = dev_int_status;
536 if (dev_int_status & DEV_INT_DEVICE_STATUS_MASK)
542 uint32_t
const ep_int_status = LPC_USB->EpIntSt & LPC_USB->EpIntEn;
545 if (dev_int_status & DEV_INT_ENDPOINT_FAST_MASK)
553 if (dev_int_status & DEV_INT_ENDPOINT_SLOW_MASK)
555 for ( uint8_t ep_id = 3; ep_id < DCD_ENDPOINT_MAX; ep_id += 2 )
559 LPC_USB->EpIntClr = TU_BIT(ep_id);
562 LPC_USB->EpIntEn &= ~TU_BIT(ep_id);
572 uint32_t
const dma_int_status = LPC_USB->DMAIntSt & LPC_USB->DMAIntEn;
575 uint32_t
const eot = LPC_USB->EoTIntSt;
576 LPC_USB->EoTIntClr = eot;
578 for ( uint8_t ep_id = 2; ep_id < DCD_ENDPOINT_MAX; ep_id++ )
585 LPC_USB->EpIntEn |= TU_BIT(ep_id);
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 void bus_event_isr(uint8_t rhport)
static void sie_write(uint8_t cmd_code, uint8_t data_len, uint8_t data)
static bool control_xact(uint8_t rhport, uint8_t dir, uint8_t *buffer, uint8_t len)
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)
void dcd_int_handler(uint8_t rhport)
void dcd_disconnect(uint8_t rhport)
static uint8_t control_ep_read(void *buffer, uint8_t len)
static void set_ep_size(uint8_t ep_id, uint16_t max_packet_size)
static uint8_t byte2dword(uint8_t bytes)
TU_VERIFY_STATIC(sizeof(dma_desc_t)==16, "size is not correct")
void dcd_edpt_close_all(uint8_t rhport)
static void control_ep_write(void const *buffer, uint8_t len)
void dcd_int_disable(uint8_t rhport)
bool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const *p_endpoint_desc)
static void dd_complete_isr(uint8_t rhport, uint8_t ep_id)
void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
static uint8_t sie_read(uint8_t cmd_code)
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 uint8_t ep_addr2idx(uint8_t ep_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)
static void control_xfer_isr(uint8_t rhport, uint32_t ep_int_status)
struct TU_ATTR_ALIGNED(4)
void dcd_int_enable(uint8_t rhport)
void dcd_remote_wakeup(uint8_t rhport)
void dcd_sof_enable(uint8_t rhport, bool en)
@ USBRXPLEN_PACKET_READY_MASK
@ USBRXPLEN_PACKET_LENGTH_MASK
@ DMA_INT_END_OF_XFER_MASK
@ SIE_DEV_STATUS_SUSPEND_MASK
@ SIE_DEV_STATUS_CONNECT_STATUS_MASK
@ SIE_DEV_STATUS_CONNECT_CHANGE_MASK
@ SIE_DEV_STATUS_RESET_MASK
@ SIE_DEV_STATUS_SUSPEND_CHANGE_MASK
@ SIE_SET_ENDPOINT_STALLED_MASK
@ SIE_SET_ENDPOINT_CONDITION_STALLED_MASK
@ SIE_CMDCODE_ENDPOINT_SELECT
@ SIE_CMDCODE_BUFFER_CLEAR
@ SIE_CMDCODE_READ_ERROR_STATUS
@ SIE_CMDCODE_ENDPOINT_SET_STATUS
@ SIE_CMDCODE_SET_ADDRESS
@ SIE_CMDCODE_DEVICE_STATUS
@ SIE_CMDCODE_BUFFER_VALIDATE
@ SIE_CMDCODE_CONFIGURE_DEVICE
@ USBCTRL_READ_ENABLE_MASK
@ USBCTRL_WRITE_ENABLE_MASK
@ SIE_SELECT_ENDPOINT_SETUP_RECEIVED_MASK
CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN tu_static uint8_t received[CFG_TUD_NET_PACKET_PREFIX_LEN+CFG_TUD_NET_MTU+CFG_TUD_NET_PACKET_PREFIX_LEN]
AUDIO Channel Cluster Descriptor (4.1)
uint8_t bmAttributes
See: audio_clock_source_attribute_t.
volatile bool out_received
static TU_ATTR_ALWAYS_INLINE uint8_t tu_min8(uint8_t x, uint8_t y)
static TU_ATTR_ALWAYS_INLINE bool tu_bit_test(uint32_t value, uint8_t pos)
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)