29#if CFG_TUD_ENABLED && CFG_TUSB_MCU == OPT_MCU_DA1469X
46#ifndef TU_DA1469X_FIFO_READ_THRESHOLD
58#define TU_DA1469X_FIFO_READ_THRESHOLD 4
64#define NFSR_NODE_RESET 0
65#define NFSR_NODE_RESUME 1
66#define NFSR_NODE_OPERATIONAL 2
67#define NFSR_NODE_SUSPEND 3
72#define NFSR_NODE_WAKING (0x10 | (NFSR_NODE_RESUME))
73#define NFSR_NODE_WAKING2 (0x20 | (NFSR_NODE_RESUME))
81 __IOM uint32_t epc_in;
82 __IOM uint32_t USB_EPC0_REG;
83 __IOM uint32_t USB_EPC1_REG;
84 __IOM uint32_t USB_EPC3_REG;
85 __IOM uint32_t USB_EPC5_REG;
90 __IOM uint32_t USB_TXD0_REG;
91 __IOM uint32_t USB_TXD1_REG;
92 __IOM uint32_t USB_TXD2_REG;
93 __IOM uint32_t USB_TXD3_REG;
98 __IOM uint32_t USB_TXS0_REG;
99 __IOM uint32_t USB_TXS1_REG;
100 __IOM uint32_t USB_TXS2_REG;
101 __IOM uint32_t USB_TXS3_REG;
106 __IOM uint32_t USB_TXC0_REG;
107 __IOM uint32_t USB_TXC1_REG;
108 __IOM uint32_t USB_TXC2_REG;
109 __IOM uint32_t USB_TXC3_REG;
113 __IOM uint32_t epc_out;
114 __IOM uint32_t USB_EP0_NAK_REG;
115 __IOM uint32_t USB_EPC2_REG;
116 __IOM uint32_t USB_EPC4_REG;
117 __IOM uint32_t USB_EPC6_REG;
122 __IOM uint32_t USB_RXD0_REG;
123 __IOM uint32_t USB_RXD1_REG;
124 __IOM uint32_t USB_RXD2_REG;
125 __IOM uint32_t USB_RXD3_REG;
130 __IOM uint32_t USB_RXS0_REG;
131 __IOM uint32_t USB_RXS1_REG;
132 __IOM uint32_t USB_RXS2_REG;
133 __IOM uint32_t USB_RXS3_REG;
138 __IOM uint32_t USB_RXC0_REG;
139 __IOM uint32_t USB_RXC1_REG;
140 __IOM uint32_t USB_RXC2_REG;
141 __IOM uint32_t USB_RXC3_REG;
145#define EP_REGS(first_ep_reg) (EPx_REGS*)(&USB->first_ep_reg)
148#ifndef TU_DA146XX_DMA_RX_CHANNEL
149#define TU_DA146XX_DMA_RX_CHANNEL 6
151#define DA146XX_DMA_USB_MUX (0x6 << (TU_DA146XX_DMA_RX_CHANNEL * 2))
152#define DA146XX_DMA_USB_MUX_MASK (0xF << (TU_DA146XX_DMA_RX_CHANNEL * 2))
162 __IM uint32_t RESERVED[2];
165#define DMA_CHANNEL_REGS(n) ((da146xx_dma_channel_t *)(DMA) + n)
166#define RX_DMA_REGS DMA_CHANNEL_REGS(TU_DA146XX_DMA_RX_CHANNEL)
167#define TX_DMA_REGS DMA_CHANNEL_REGS((TU_DA146XX_DMA_RX_CHANNEL) + 1)
169#define RX_DMA_START ((1 << DMA_DMA0_CTRL_REG_DMA_ON_Pos) |\
170 (0 << DMA_DMA0_CTRL_REG_BW_Pos) | \
171 (1 << DMA_DMA0_CTRL_REG_DREQ_MODE_Pos) | \
172 (1 << DMA_DMA0_CTRL_REG_BINC_Pos) | \
173 (0 << DMA_DMA0_CTRL_REG_AINC_Pos) | \
174 (0 << DMA_DMA0_CTRL_REG_CIRCULAR_Pos) | \
175 (2 << DMA_DMA0_CTRL_REG_DMA_PRIO_Pos) | \
176 (0 << DMA_DMA0_CTRL_REG_DMA_IDLE_Pos) | \
177 (0 << DMA_DMA0_CTRL_REG_DMA_INIT_Pos) | \
178 (0 << DMA_DMA0_CTRL_REG_REQ_SENSE_Pos) | \
179 (0 << DMA_DMA0_CTRL_REG_BURST_MODE_Pos) | \
180 (0 << DMA_DMA0_CTRL_REG_BUS_ERROR_DETECT_Pos))
182#define TX_DMA_START ((1 << DMA_DMA0_CTRL_REG_DMA_ON_Pos) |\
183 (0 << DMA_DMA0_CTRL_REG_BW_Pos) | \
184 (1 << DMA_DMA0_CTRL_REG_DREQ_MODE_Pos) | \
185 (0 << DMA_DMA0_CTRL_REG_BINC_Pos) | \
186 (1 << DMA_DMA0_CTRL_REG_AINC_Pos) | \
187 (0 << DMA_DMA0_CTRL_REG_CIRCULAR_Pos) | \
188 (2 << DMA_DMA0_CTRL_REG_DMA_PRIO_Pos) | \
189 (0 << DMA_DMA0_CTRL_REG_DMA_IDLE_Pos) | \
190 (0 << DMA_DMA0_CTRL_REG_DMA_INIT_Pos) | \
191 (1 << DMA_DMA0_CTRL_REG_REQ_SENSE_Pos) | \
192 (0 << DMA_DMA0_CTRL_REG_BURST_MODE_Pos) | \
193 (0 << DMA_DMA0_CTRL_REG_BUS_ERROR_DETECT_Pos))
197#define GET_BIT(val, field) (val & field ## _Msk) >> field ## _Pos
198#define REG_GET_BIT(reg, field) (USB->reg & USB_ ## reg ## _ ## field ## _Msk)
199#define REG_SET_BIT(reg, field) USB->reg |= USB_ ## reg ## _ ## field ## _Msk
200#define REG_CLR_BIT(reg, field) USB->reg &= ~USB_ ## reg ## _ ## field ## _Msk
201#define REG_SET_VAL(reg, field, val) USB->reg = (USB->reg & ~USB_ ## reg ## _ ## field ## _Msk) | (val << USB_ ## reg ## _ ## field ## _Pos)
204 EP_REGS(USB_EPC0_REG),
205 EP_REGS(USB_EPC1_REG),
206 EP_REGS(USB_EPC3_REG),
207 EP_REGS(USB_EPC5_REG),
240 .vbus_present =
false,
241 .init_called =
false,
245#define XFER_EPNUM(xfer) ((xfer - &_dcd.xfer_status[0][0]) >> 1)
247#define XFER_REGS(xfer) ep_regs[XFER_EPNUM(xfer)]
249#define EPNUM_REGS(epnum) ep_regs[epnum]
257 .bEndpointAddress = 0x00,
259 .wMaxPacketSize = CFG_TUD_ENDPOINT0_SIZE,
268 .bEndpointAddress = 0x80,
270 .wMaxPacketSize = CFG_TUD_ENDPOINT0_SIZE,
274#define XFER_CTL_BASE(_ep, _dir) &_dcd.xfer_status[_ep][_dir]
282 USB->USB_NFSR_REG = val & 3;
294 if (left_to_send >
xfer->max_packet_size -
xfer->last_packet_size)
296 left_to_send =
xfer->max_packet_size -
xfer->last_packet_size;
301 while ((regs->txs & USB_USB_TXS1_REG_USB_TCOUNT_Msk) > 0 && left_to_send > 0)
304 xfer->last_packet_size++;
309 if (left_to_send > 0)
313 regs->txc |= (3 << USB_USB_TXC1_REG_USB_TFWL_Pos);
314 USB->USB_FWMSK_REG |= 1 << (epnum - 1 + USB_USB_FWMSK_REG_USB_M_TXWARN31_Pos);
318 regs->txc &= ~USB_USB_TXC1_REG_USB_TFWL_Msk;
319 USB->USB_FWMSK_REG &= ~(1 << (epnum - 1 + USB_USB_FWMSK_REG_USB_M_TXWARN31_Pos));
321 regs->txc |= USB_USB_TXC1_REG_USB_LAST_Msk;
329 if (
_dcd.dma_ep[dir] == 0)
331 _dcd.dma_ep[dir] = epnum;
333 USB->USB_DMA_CTRL_REG = (USB->USB_DMA_CTRL_REG & ~USB_USB_DMA_CTRL_REG_USB_DMA_RX_Msk) |
334 ((epnum - 1) << USB_USB_DMA_CTRL_REG_USB_DMA_RX_Pos);
336 USB->USB_DMA_CTRL_REG = (USB->USB_DMA_CTRL_REG & ~USB_USB_DMA_CTRL_REG_USB_DMA_TX_Msk) |
337 ((epnum - 1) << USB_USB_DMA_CTRL_REG_USB_DMA_TX_Pos);
338 USB->USB_DMA_CTRL_REG |= USB_USB_DMA_CTRL_REG_USB_DMA_EN_Msk;
340 return _dcd.dma_ep[dir] == epnum;
346 RX_DMA_REGS->DMAx_A_START_REG = (uint32_t)src;
347 RX_DMA_REGS->DMAx_B_START_REG = (uint32_t)dst;
349 RX_DMA_REGS->DMAx_INT_REG = size - 1;
350 RX_DMA_REGS->DMAx_LEN_REG = size - 1;
351 RX_DMA_REGS->DMAx_CTRL_REG = RX_DMA_START;
358 uint16_t size =
tu_min16(remaining,
xfer->max_packet_size);
361 xfer->last_packet_size = 0;
362 if (
xfer->max_packet_size > FIFO_SIZE && remaining > FIFO_SIZE)
373 regs->rxc |= USB_USB_RXC1_REG_USB_RFWL_Msk;
374 USB->USB_FWMSK_REG |= 1 << (epnum - 1 + USB_USB_FWMSK_REG_USB_M_RXWARN31_Pos);
380 regs->rxc &= ~USB_USB_RXC1_REG_USB_RFWL_Msk;
381 USB->USB_FWMSK_REG &= ~(1 << (epnum - 1 + USB_USB_FWMSK_REG_USB_M_RXWARN31_Pos));
383 regs->rxc |= USB_USB_RXC1_REG_USB_RX_EN_Msk;
389 TX_DMA_REGS->DMAx_A_START_REG = (uint32_t)src;
390 TX_DMA_REGS->DMAx_B_START_REG = (uint32_t)dst;
392 TX_DMA_REGS->DMAx_INT_REG = size;
393 TX_DMA_REGS->DMAx_LEN_REG = size - 1;
394 TX_DMA_REGS->DMAx_CTRL_REG = TX_DMA_START;
401 uint16_t size =
tu_min16(remaining,
xfer->max_packet_size);
404 xfer->last_packet_size = 0;
406 regs->txc = USB_USB_TXC1_REG_USB_FLUSH_Msk;
407 regs->txc = USB_USB_TXC1_REG_USB_IGN_ISOMSK_Msk;
408 if (
xfer->data1) regs->txc |= USB_USB_TXC1_REG_USB_TOGGLE_TX_Msk;
414 regs->txc |= USB_USB_TXC1_REG_USB_LAST_Msk;
420 regs->txc |= USB_USB_TXC1_REG_USB_TX_EN_Msk;
427 uint16_t receive_this_time = bytes_in_fifo;
429 if (remaining < bytes_in_fifo) receive_this_time = remaining;
433 for (
int i = 0; i < receive_this_time; ++i) buf[i] = regs->rxd;
435 xfer->last_packet_size += receive_this_time;
437 return bytes_in_fifo - receive_this_time;
443 uint32_t rxs0 = USB->USB_RXS0_REG;
447 fifo_bytes = GET_BIT(rxs0, USB_USB_RXS0_REG_USB_RCOUNT);
448 if (rxs0 & USB_USB_RXS0_REG_USB_SETUP_Msk)
452 for (
int i = 0; i < fifo_bytes; ++i)
_setup_packet[i] = USB->USB_RXD0_REG;
458 REG_SET_BIT(USB_TXC0_REG, USB_TOGGLE_TX0);
459 REG_CLR_BIT(USB_EPC0_REG, USB_STALL);
464 if (GET_BIT(rxs0, USB_USB_RXS0_REG_USB_TOGGLE_RX0) !=
xfer->data1)
467 REG_SET_BIT(USB_RXC0_REG, USB_FLUSH);
468 xfer->last_packet_size = 0;
473 if (rxs0 & USB_USB_RXS0_REG_USB_RX_LAST_Msk)
475 xfer->transferred +=
xfer->last_packet_size;
485 REG_SET_BIT(USB_RXC0_REG, USB_RX_EN);
487 xfer->last_packet_size = 0;
499 txs0 = regs->USB_TXS0_REG;
501 if (GET_BIT(txs0, USB_USB_TXS0_REG_USB_TX_DONE))
504 if (GET_BIT(txs0, USB_USB_TXS0_REG_USB_ACK_STAT))
506 xfer->transferred +=
xfer->last_packet_size;
507 xfer->last_packet_size = 0;
509 REG_SET_VAL(USB_TXC0_REG, USB_TOGGLE_TX0,
xfer->data1);
519 xfer->last_packet_size = 0;
537 if (GET_BIT(rxs, USB_USB_RXS1_REG_USB_RX_ERR))
539 regs->rxc |= USB_USB_RXC1_REG_USB_FLUSH_Msk;
540 xfer->last_packet_size = 0;
544 RX_DMA_REGS->DMAx_CTRL_REG &= ~DMA_DMA0_CTRL_REG_DMA_ON_Msk;
546 RX_DMA_REGS->DMAx_CTRL_REG |= DMA_DMA0_CTRL_REG_DMA_ON_Msk;
555 RX_DMA_REGS->DMAx_CTRL_REG &= ~DMA_DMA0_CTRL_REG_DMA_ON_Msk;
556 xfer->last_packet_size = RX_DMA_REGS->DMAx_IDX_REG;
559 if (
xfer->last_packet_size == RX_DMA_REGS->DMAx_LEN_REG)
xfer->last_packet_size++;
563 fifo_bytes = GET_BIT(rxs, USB_USB_RXS1_REG_USB_RXCOUNT);
569 if (GET_BIT(rxs, USB_USB_RXS1_REG_USB_RX_LAST))
571 if (!
xfer->iso && GET_BIT(rxs, USB_USB_RXS1_REG_USB_TOGGLE_RX) !=
xfer->data1)
574 regs->rxc |= USB_USB_RXC1_REG_USB_FLUSH_Msk;
579 xfer->transferred +=
xfer->last_packet_size;
585 regs->rxc |= USB_USB_RXC1_REG_USB_FLUSH_Msk;
597 xfer->last_packet_size = 0;
600 }
while (fifo_bytes > TU_DA1469X_FIFO_READ_THRESHOLD);
605 if (USB->USB_RXEV_REG & 1)
607 if (USB->USB_RXEV_REG & 2)
609 if (USB->USB_RXEV_REG & 4)
621 if (GET_BIT(txs, USB_USB_TXS1_REG_USB_TX_DONE))
626 TX_DMA_REGS->DMAx_CTRL_REG &= ~DMA_DMA1_CTRL_REG_DMA_ON_Msk;
627 xfer->last_packet_size = TX_DMA_REGS->DMAx_IDX_REG + 1;
631 if (GET_BIT(txs, USB_USB_TXS1_REG_USB_ACK_STAT))
634 xfer->transferred +=
xfer->last_packet_size;
635 xfer->last_packet_size = 0;
644 else if (regs->epc_in & USB_USB_EPC1_REG_USB_STALL_Msk)
652 if (txs & USB_USB_TXS1_REG_USB_TX_URUN_Msk)
654 TU_LOG1(
"EP %d FIFO underrun\r\n", epnum);
662 if (USB->USB_TXEV_REG & 1)
664 if (USB->USB_TXEV_REG & 2)
666 if (USB->USB_TXEV_REG & 4)
672 if (
_dcd.nfsr == NFSR_NODE_RESET)
674 if (GET_BIT(alt_ev, USB_USB_ALTEV_REG_USB_RESET))
682 alt_ev = (alt_ev & ~USB_USB_ALTEV_REG_USB_RESET_Msk) | USB->USB_ALTEV_REG;
684 if (GET_BIT(alt_ev, USB_USB_ALTEV_REG_USB_RESET) == 0)
686 USB->USB_ALTMSK_REG = USB_USB_ALTMSK_REG_USB_M_RESET_Msk |
687 USB_USB_ALTEV_REG_USB_SD3_Msk;
700 USB->USB_NFSR_REG = 0;
701 USB->USB_FAR_REG = 0x80;
702 USB->USB_ALTMSK_REG = 0;
703 USB->USB_NFSR_REG = NFSR_NODE_RESET;
704 USB->USB_TXMSK_REG = 0;
705 USB->USB_RXMSK_REG = 0;
709 USB->USB_DMA_CTRL_REG = 0;
711 USB->USB_MAMSK_REG = USB_USB_MAMSK_REG_USB_M_INTR_Msk |
712 USB_USB_MAMSK_REG_USB_M_FRAME_Msk |
713 USB_USB_MAMSK_REG_USB_M_WARN_Msk |
714 USB_USB_MAMSK_REG_USB_M_ALT_Msk;
715 USB->USB_ALTMSK_REG = USB_USB_ALTMSK_REG_USB_M_RESUME_Msk;
716 alt_ev = USB->USB_ALTEV_REG;
722 uint32_t alt_ev = USB->USB_ALTEV_REG;
725 if (GET_BIT(alt_ev, USB_USB_ALTEV_REG_USB_RESET) &&
_dcd.nfsr != NFSR_NODE_RESET)
729 else if (GET_BIT(alt_ev, USB_USB_ALTEV_REG_USB_RESUME))
731 if (USB->USB_NFSR_REG == NFSR_NODE_SUSPEND)
734 USB->USB_ALTMSK_REG = USB_USB_ALTMSK_REG_USB_M_RESET_Msk |
735 USB_USB_ALTMSK_REG_USB_M_SD3_Msk;
737 for (
int epnum = 1; epnum <= 3; ++epnum)
748 else if (GET_BIT(alt_ev, USB_USB_ALTEV_REG_USB_SD3))
751 USB->USB_ALTMSK_REG = USB_USB_ALTMSK_REG_USB_M_RESET_Msk |
752 USB_USB_ALTMSK_REG_USB_M_RESUME_Msk;
764 uint32_t fifo_warning = USB->USB_FWEV_REG;
766 if (fifo_warning & 0x01)
768 if (fifo_warning & 0x02)
770 if (fifo_warning & 0x04)
772 if (fifo_warning & 0x10)
774 if (fifo_warning & 0x20)
776 if (fifo_warning & 0x40)
782 uint32_t ep0_nak = USB->USB_EP0_NAK_REG;
784 if (REG_GET_BIT(USB_EPC0_REG, USB_STALL))
786 if (GET_BIT(ep0_nak, USB_USB_EP0_NAK_REG_USB_EP0_INNAK))
790 REG_CLR_BIT(USB_RXC0_REG, USB_RX_EN);
791 REG_SET_BIT(USB_TXC0_REG, USB_TX_EN);
793 if (GET_BIT(ep0_nak, USB_USB_EP0_NAK_REG_USB_EP0_OUTNAK))
795 REG_SET_BIT(USB_RXC0_REG, USB_RX_EN);
800 REG_CLR_BIT(USB_MAMSK_REG, USB_M_EP0_NAK);
811 _dcd.init_called =
true;
812 if (
_dcd.vbus_present) {
823 NVIC_EnableIRQ(USB_IRQn);
830 NVIC_DisableIRQ(USB_IRQn);
838 USB->USB_EPC0_REG = USB_USB_EPC0_REG_USB_DEF_Msk;
839 USB->USB_FAR_REG = (
dev_addr & USB_USB_FAR_REG_USB_AD_Msk) | USB_USB_FAR_REG_USB_AD_EN_Msk;
846 if (
_dcd.nfsr == NFSR_NODE_SUSPEND)
850 USB->USB_MAMSK_REG |= USB_USB_MAMSK_REG_USB_M_FRAME_Msk;
858 if (GET_BIT(USB->USB_MCTRL_REG, USB_USB_MCTRL_REG_USB_NAT) == 0)
860 USB->USB_MCTRL_REG = USB_USB_MCTRL_REG_USBEN_Msk;
861 USB->USB_NFSR_REG = 0;
862 USB->USB_FAR_REG = 0x80;
863 USB->USB_TXMSK_REG = 0;
864 USB->USB_RXMSK_REG = 0;
866 USB->USB_MAMSK_REG = USB_USB_MAMSK_REG_USB_M_INTR_Msk |
867 USB_USB_MAMSK_REG_USB_M_ALT_Msk |
868 USB_USB_MAMSK_REG_USB_M_WARN_Msk;
869 USB->USB_ALTMSK_REG = USB_USB_ALTMSK_REG_USB_M_RESET_Msk |
870 USB_USB_ALTEV_REG_USB_SD3_Msk;
872 USB->USB_MCTRL_REG = USB_USB_MCTRL_REG_USBEN_Msk | USB_USB_MCTRL_REG_USB_NAT_Msk;
875 DMA->DMA_REQ_MUX_REG = (DMA->DMA_REQ_MUX_REG & ~DA146XX_DMA_USB_MUX_MASK) | DA146XX_DMA_USB_MUX;
883 REG_CLR_BIT(USB_MCTRL_REG, USB_NAT);
896 return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0;
901 if (present && !
_dcd.vbus_present)
903 _dcd.vbus_present =
true;
906 if (
_dcd.init_called)
911 else if (!present &&
_dcd.vbus_present)
913 _dcd.vbus_present =
false;
914 USB->USB_MCTRL_REG = 0;
931 uint8_t iso_mask = 0;
933 TU_ASSERT(epnum < EP_MAX);
942 iso_mask = USB_USB_EPC1_REG_USB_ISO_Msk;
948 USB->USB_MAMSK_REG |= USB_USB_MAMSK_REG_USB_M_EP0_RX_Msk |
949 USB_USB_MAMSK_REG_USB_M_EP0_TX_Msk;
955 regs->epc_out = epnum | USB_USB_EPC1_REG_USB_EP_EN_Msk | iso_mask;
956 USB->USB_RXMSK_REG |= 0x11 << (epnum - 1);
957 REG_SET_BIT(USB_MAMSK_REG, USB_M_RX_EV);
961 regs->epc_in = epnum | USB_USB_EPC1_REG_USB_EP_EN_Msk | iso_mask;
962 USB->USB_TXMSK_REG |= 0x11 << (epnum - 1);
963 REG_SET_BIT(USB_MAMSK_REG, USB_M_TX_EV);
974 for (
int epnum = 1; epnum < EP_MAX; ++epnum)
990 TU_ASSERT(epnum < EP_MAX,);
994 USB->USB_MAMSK_REG &= ~(USB_USB_MAMSK_REG_USB_M_EP0_RX_Msk |
995 USB_USB_MAMSK_REG_USB_M_EP0_TX_Msk);
1001 regs->rxc = USB_USB_RXC1_REG_USB_FLUSH_Msk;
1003 USB->USB_RXMSK_REG &= ~(0x11 << (epnum - 1));
1007 RX_DMA_REGS->DMAx_CTRL_REG &= ~DMA_DMA0_CTRL_REG_DMA_ON_Msk;
1013 regs->txc = USB_USB_TXC1_REG_USB_FLUSH_Msk;
1015 USB->USB_TXMSK_REG &= ~(0x11 << (epnum - 1));
1019 TX_DMA_REGS->DMAx_CTRL_REG &= ~DMA_DMA1_CTRL_REG_DMA_ON_Msk;
1037 xfer->last_packet_size = 0;
1038 xfer->transferred = 0;
1060 EPx_REGS *regs = EPNUM_REGS(epnum);
1066 REG_SET_BIT(USB_EPC0_REG, USB_STALL);
1069 regs->USB_RXC0_REG = USB_USB_RXC0_REG_USB_RX_EN_Msk;
1073 if (regs->USB_RXC0_REG & USB_USB_RXC0_REG_USB_RX_EN_Msk)
1077 REG_SET_BIT(USB_MAMSK_REG, USB_M_EP0_NAK);
1081 regs->USB_TXC0_REG |= USB_USB_TXC0_REG_USB_TX_EN_Msk;
1089 regs->epc_out |= USB_USB_EPC1_REG_USB_STALL_Msk;
1090 regs->rxc |= USB_USB_RXC1_REG_USB_RX_EN_Msk;
1094 regs->epc_in |= USB_USB_EPC1_REG_USB_STALL_Msk;
1095 regs->txc |= USB_USB_TXC1_REG_USB_TX_EN_Msk | USB_USB_TXC1_REG_USB_LAST_Msk;
1108 EPx_REGS *regs = EPNUM_REGS(epnum);
1116 regs->epc_out &= ~USB_USB_EPC1_REG_USB_STALL_Msk;
1120 regs->epc_in &= ~USB_USB_EPC1_REG_USB_STALL_Msk;
1124 REG_CLR_BIT(USB_MAMSK_REG, USB_M_EP0_NAK);
1134 uint32_t int_status = USB->USB_MAEV_REG & USB->USB_MAMSK_REG;
1138 if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_WARN))
1143 if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_CH_EV))
1146 (void)USB->USB_CHARGER_STAT_REG;
1149 if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_EP0_NAK))
1154 if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_EP0_RX))
1159 if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_EP0_TX))
1164 if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_RX_EV))
1169 if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_NAK))
1171 (void)USB->USB_NAKEV_REG;
1174 if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_FRAME))
1176 if (
_dcd.nfsr == NFSR_NODE_RESET)
1184 else if (
_dcd.nfsr == NFSR_NODE_WAKING)
1187 _dcd.nfsr = NFSR_NODE_WAKING2;
1189 else if (
_dcd.nfsr == NFSR_NODE_WAKING2)
1192 _dcd.nfsr = NFSR_NODE_RESUME;
1194 else if (
_dcd.nfsr == NFSR_NODE_RESUME)
1205 USB->USB_MAMSK_REG &= ~USB_USB_MAMSK_REG_USB_M_FRAME_Msk;
1210 if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_TX_EV))
1215 if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_ALT))
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 handle_rx_ev(void)
static void handle_epx_rx_ev(uint8_t ep)
static bool try_allocate_dma(uint8_t epnum, uint8_t dir)
static void start_tx_dma(void *src, volatile void *dst, uint16_t size)
static void handle_epx_tx_ev(xfer_ctl_t *xfer)
static uint16_t read_rx_fifo(xfer_ctl_t *xfer, uint16_t bytes_in_fifo)
static void handle_epx_tx_warn_ev(uint8_t ep)
static void handle_alt_ev(void)
static void handle_ep0_rx(void)
void dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)
void dcd_edpt_close(uint8_t rhport, uint8_t ep_addr)
static EPx_REGS *const ep_regs[EP_MAX]
static void fill_tx_fifo(xfer_ctl_t *xfer)
void dcd_int_handler(uint8_t rhport)
static void handle_bus_reset(void)
static uint32_t check_reset_end(uint32_t alt_ev)
void dcd_disconnect(uint8_t rhport)
static void handle_tx_ev(void)
static void handle_ep0_nak(void)
xfer_ctl_t xfer_status[EP_MAX][2]
void dcd_edpt_close_all(uint8_t rhport)
static TU_ATTR_ALWAYS_INLINE bool is_in_isr(void)
void tusb_vbus_changed(bool present)
static TU_ATTR_ALIGNED(4)
void dcd_int_disable(uint8_t rhport)
static void start_rx_dma(volatile void *src, void *dst, uint16_t size)
static void start_rx_packet(xfer_ctl_t *xfer)
static const tusb_desc_endpoint_t ep0IN_desc
void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
static void start_tx_packet(xfer_ctl_t *xfer)
void dcd_connect(uint8_t rhport)
bool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const *desc_edpt)
bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)
static const tusb_desc_endpoint_t ep0OUT_desc
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 set_nfsr(uint8_t val)
static void handle_fifo_warning(void)
void dcd_int_enable(uint8_t rhport)
void dcd_remote_wakeup(uint8_t rhport)
void dcd_sof_enable(uint8_t rhport, bool en)
static void handle_ep0_tx(void)
xfer_td_t xfer[EP_CBI_COUNT+1][2]
AUDIO Channel Cluster Descriptor (4.1)
uint8_t bmAttributes
See: audio_clock_source_attribute_t.
uint8_t bLength
Size of this descriptor in bytes: 9.
__IOM uint32_t DMAx_CTRL_REG
__IOM uint32_t DMAx_LEN_REG
__IOM uint32_t DMAx_INT_REG
__IOM uint32_t DMAx_A_START_REG
__IOM uint32_t DMAx_B_START_REG
__IOM uint32_t DMAx_IDX_REG
uint16_t last_packet_size
static TU_ATTR_ALWAYS_INLINE uint16_t tu_min16(uint16_t x, uint16_t y)
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)
struct TU_ATTR_PACKED tusb_desc_endpoint_t
USB Endpoint Descriptor.
static TU_ATTR_ALWAYS_INLINE uint8_t tu_edpt_addr(uint8_t num, uint8_t dir)