29#if CFG_TUD_ENABLED && (CFG_TUSB_MCU == OPT_MCU_VALENTYUSB_EPTRI)
54uint8_t usb_log_offset;
61struct xfer_log xfer_log[64];
63uint8_t xfer_log_offset;
66struct xfer_log queue_log[64];
68uint8_t queue_log_offset;
77uint16_t
volatile rx_buffer_offset[16];
78uint8_t*
volatile rx_buffer[16];
79uint16_t
volatile rx_buffer_max[16];
81volatile uint8_t tx_ep;
82volatile bool tx_active;
83volatile uint16_t tx_buffer_offset[16];
84uint8_t*
volatile tx_buffer[16];
85volatile uint16_t tx_buffer_max[16];
86volatile uint8_t reset_count;
91uint8_t setup_packet_bfr[10];
98static bool advance_tx_ep(
void) {
100 uint8_t prev_tx_ep = tx_ep;
101 for (tx_ep = (tx_ep + 1) & 0xf; tx_ep != prev_tx_ep; tx_ep = ((tx_ep + 1) & 0xf)) {
102 if (tx_buffer[tx_ep])
105 if (!tx_buffer[tx_ep])
112 xfer_log[xfer_log_offset].ep_num = ep_num;
113 xfer_log[xfer_log_offset].size = sz;
115 if (xfer_log_offset >=
sizeof(xfer_log)/
sizeof(*xfer_log))
120 queue_log[queue_log_offset].ep_num = ep_num;
121 queue_log[queue_log_offset].size = sz;
123 if (queue_log_offset >=
sizeof(queue_log)/
sizeof(*queue_log))
124 queue_log_offset = 0;
131 for (added_bytes = 0; (added_bytes < EP_SIZE) && (tx_buffer_offset[tx_ep] < tx_buffer_max[tx_ep]); added_bytes++) {
133 usb_log[usb_log_offset].
data[added_bytes] = tx_buffer[tx_ep][tx_buffer_offset[tx_ep]];
135 usb_in_data_write(tx_buffer[tx_ep][tx_buffer_offset[tx_ep]++]);
147 usb_in_ctrl_write(tx_ep & 0xf);
153 uint8_t in_status = usb_in_status_read();
154 if (!(in_status & (1 << CSR_USB_IN_STATUS_IDLE_OFFSET)))
159 if (!tx_buffer[tx_ep]) {
167 if (tx_buffer_offset[tx_ep] >= tx_buffer_max[tx_ep]) {
169 last_tx_buffer = tx_buffer[tx_ep];
172 tx_buffer[tx_ep] = NULL;
173 uint16_t xferred_bytes = tx_buffer_max[tx_ep];
174 uint8_t xferred_ep = tx_ep;
176 if (!advance_tx_ep())
191 uint8_t out_status = usb_out_status_read();
194 if (!(out_status & (1 << CSR_USB_OUT_STATUS_HAVE_OFFSET)))
198 uint8_t rx_ep = (out_status >> CSR_USB_OUT_STATUS_EPNO_OFFSET) & 0xf;
204 if (rx_buffer[rx_ep] == NULL) {
211 uint32_t total_read = 0;
212 uint32_t current_offset = rx_buffer_offset[rx_ep];
214 uint8_t test_buffer[256];
215 memset(test_buffer, 0,
sizeof(test_buffer));
216 if (current_offset > rx_buffer_max[rx_ep])
223 while (usb_out_status_read() & (1 << CSR_USB_OUT_STATUS_HAVE_OFFSET)) {
224 uint8_t c = usb_out_data_read();
226 test_buffer[total_read] = c;
229 if (current_offset < rx_buffer_max[rx_ep]) {
233 if (rx_buffer[rx_ep] != (
volatile uint8_t *)0xffffffff)
234 rx_buffer[rx_ep][current_offset++] = c;
251 rx_buffer_offset[rx_ep] += (total_read - 2);
252 if (rx_buffer_offset[rx_ep] > rx_buffer_max[rx_ep])
253 rx_buffer_offset[rx_ep] = rx_buffer_max[rx_ep];
256 if ((rx_buffer_max[rx_ep] == rx_buffer_offset[rx_ep])
258 || ((total_read == 2) && ((rx_buffer_offset[rx_ep] & 63) == 0))
260 || (((rx_buffer_offset[rx_ep] & 63) != 0) && (total_read < 66))) {
262 if (rx_buffer[rx_ep] == NULL)
267 rx_buffer[rx_ep] = NULL;
268 uint16_t len = rx_buffer_offset[rx_ep];
273 uint16_t ep_en_mask = usb_out_enable_status_read();
275 for (i = 0; i < 16; i++) {
276 if ((!!(ep_en_mask & (1 << i))) ^ (!!(rx_buffer[i]))) {
277 uint8_t new_status = usb_out_status_read();
279 if ((new_status & 0x20) && ((new_status & 0xf) == i))
292 usb_out_ctrl_write((1 << CSR_USB_OUT_CTRL_ENABLE_OFFSET) | rx_ep);
296 usb_out_ev_pending_write(usb_out_ev_pending_read());
306 usb_setup_ev_enable_write(0);
307 usb_in_ev_enable_write(0);
308 usb_out_ev_enable_write(0);
310 usb_address_write(0);
313 usb_setup_ctrl_write(1 << CSR_USB_SETUP_CTRL_RESET_OFFSET);
314 usb_in_ctrl_write(1 << CSR_USB_IN_CTRL_RESET_OFFSET);
315 usb_out_ctrl_write(1 << CSR_USB_OUT_CTRL_RESET_OFFSET);
317 memset((
void *)(uintptr_t) rx_buffer, 0,
sizeof(rx_buffer));
318 memset((
void *)(uintptr_t) rx_buffer_max, 0,
sizeof(rx_buffer_max));
319 memset((
void *)(uintptr_t) rx_buffer_offset, 0,
sizeof(rx_buffer_offset));
321 memset((
void *)(uintptr_t) tx_buffer, 0,
sizeof(tx_buffer));
322 memset((
void *)(uintptr_t) tx_buffer_max, 0,
sizeof(tx_buffer_max));
323 memset((
void *)(uintptr_t) tx_buffer_offset, 0,
sizeof(tx_buffer_offset));
328 usb_setup_ev_pending_write(0xff);
329 usb_in_ev_pending_write(0xff);
330 usb_out_ev_pending_write(0xff);
331 usb_in_ev_enable_write(1);
332 usb_out_ev_enable_write(1);
333 usb_setup_ev_enable_write(3);
343 usb_pullup_out_write(0);
346 usb_setup_ev_pending_write(usb_setup_ev_pending_read());
347 usb_in_ev_pending_write(usb_in_ev_pending_read());
348 usb_out_ev_pending_write(usb_out_ev_pending_read());
349 usb_in_ev_enable_write(1);
350 usb_out_ev_enable_write(1);
351 usb_setup_ev_enable_write(3);
354 usb_pullup_out_write(1);
365 irq_setmask(irq_getmask() | (1 << USB_INTERRUPT));
371 irq_setmask(irq_getmask() & ~(1 << USB_INTERRUPT));
397 usb_pullup_out_write(1);
403 usb_pullup_out_write(0);
427 rx_buffer_offset[ep_num] = 0;
428 rx_buffer_max[ep_num] = 0;
429 rx_buffer[ep_num] = NULL;
433 tx_buffer_offset[ep_num] = 0;
434 tx_buffer_max[ep_num] = 0;
435 tx_buffer[ep_num] = NULL;
442 (void) rhport; (void) ep_addr;
458 if (rx_buffer[ep_addr])
460 usb_out_ctrl_write((1 << CSR_USB_OUT_CTRL_STALL_OFFSET) | (enable << CSR_USB_OUT_CTRL_ENABLE_OFFSET) |
tu_edpt_number(ep_addr));
463 usb_in_ctrl_write((1 << CSR_USB_IN_CTRL_STALL_OFFSET) |
tu_edpt_number(ep_addr));
471 if (rx_buffer[ep_addr])
473 usb_out_ctrl_write((0 << CSR_USB_OUT_CTRL_STALL_OFFSET) | (enable << CSR_USB_OUT_CTRL_ENABLE_OFFSET) |
tu_edpt_number(ep_addr));
483 TU_ASSERT(ep_num < 16);
488 buffer = (uint8_t *)0xffffffff;
491 TU_ASSERT(
buffer != NULL);
495 uint8_t previous_reset_count = reset_count;
497 while (tx_buffer[ep_num] != NULL)
505 if (previous_reset_count != reset_count)
508 TU_ASSERT(tx_buffer[ep_num] == NULL);
509 tx_buffer_offset[ep_num] = 0;
511 tx_buffer[ep_num] =
buffer;
526 while (rx_buffer[ep_num] != NULL)
529 TU_ASSERT(rx_buffer[ep_num] == NULL);
534 rx_buffer[ep_num] =
buffer;
535 rx_buffer_offset[ep_num] = 0;
539 usb_out_ctrl_write((1 << CSR_USB_OUT_CTRL_ENABLE_OFFSET) | ep_num);
541 uint16_t ep_en_mask = usb_out_enable_status_read();
543 for (i = 0; i < 16; i++) {
544 if ((!!(ep_en_mask & (1 << i))) ^ (!!(rx_buffer[i]))) {
545 if (rx_buffer[i] && usb_out_ev_pending_read() && (usb_out_status_read() & 0xf) == i)
565 if (!usb_out_ev_pending_read())
567 if (!usb_out_ev_enable_read())
576 if (!usb_in_ev_pending_read())
578 if (!usb_in_ev_enable_read())
581 usb_in_ev_pending_write(usb_in_ev_pending_read());
588 uint8_t setup_pending = usb_setup_ev_pending_read() & usb_setup_ev_enable_read();
589 if (!(setup_pending & 2))
592 usb_setup_ev_pending_write(2);
602 uint8_t setup_packet_bfr[10];
606 uint8_t setup_pending = usb_setup_ev_pending_read() & usb_setup_ev_enable_read();
607 if (!(setup_pending & 1))
614 uint32_t setup_length = 0;
617 if (!(usb_setup_status_read() & (1 << CSR_USB_SETUP_STATUS_HAVE_OFFSET)))
621 while (usb_setup_status_read() & (1 << CSR_USB_SETUP_STATUS_HAVE_OFFSET)) {
622 uint8_t c = usb_setup_data_read();
623 if (setup_length <
sizeof(setup_packet_bfr))
624 setup_packet_bfr[setup_length] = c;
630 if (setup_length == 10) {
639 usb_setup_ev_pending_write(1);
645 while ((next_ev = usb_next_ev_read())) {
647 case 1 << CSR_USB_NEXT_EV_IN_OFFSET:
650 case 1 << CSR_USB_NEXT_EV_OUT_OFFSET:
653 case 1 << CSR_USB_NEXT_EV_SETUP_OFFSET:
656 case 1 << CSR_USB_NEXT_EV_RESET_OFFSET:
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 handle_out(void)
static void handle_setup(void)
void xfer_log_append(uint8_t ep_num, uint16_t sz)
void dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)
void dcd_edpt_close(uint8_t rhport, uint8_t ep_addr)
void dcd_int_handler(uint8_t rhport)
void dcd_disconnect(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)
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 void process_tx(void)
static void handle_in(void)
void dcd_set_address(uint8_t rhport, uint8_t dev_addr)
static void tx_more_data(void)
static void handle_reset(void)
bool dcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init)
void fomu_error(uint32_t line)
static void process_rx(void)
void dcd_int_enable(uint8_t rhport)
void dcd_remote_wakeup(uint8_t rhport)
static void dcd_reset(void)
void dcd_sof_enable(uint8_t rhport, bool en)
void queue_log_append(uint8_t ep_num, uint16_t sz)
AUDIO Channel Cluster Descriptor (4.1)
uint8_t bmAttributes
See: audio_clock_source_attribute_t.
static TU_ATTR_ALWAYS_INLINE uint8_t tu_edpt_number(uint8_t addr)
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)