30#if CFG_TUD_ENABLED && defined(TUP_USBIP_WCH_USBFS) && CFG_TUD_WCH_USBIP_USBFS
38#define EP_DMA(ep) ((&USBOTG_FS->UEP0_DMA)[ep])
39#define EP_TX_LEN(ep) ((&USBOTG_FS->UEP0_TX_LEN)[2 * ep])
40#define EP_TX_CTRL(ep) ((&USBOTG_FS->UEP0_TX_CTRL)[4 * ep])
41#define EP_RX_CTRL(ep) ((&USBOTG_FS->UEP0_RX_CTRL)[4 * ep])
66static void update_in(uint8_t rhport, uint8_t ep,
bool force) {
84 EP_TX_CTRL(0) = USBFS_EP_T_RES_ACK | (
data.ep0_tog ? USBFS_EP_T_TOG : 0);
86 }
else if (
data.isochronous[ep]) {
87 EP_TX_CTRL(ep) = (EP_TX_CTRL(ep) & ~(USBFS_EP_T_RES_MASK)) | USBFS_EP_T_RES_NYET;
89 EP_TX_CTRL(ep) = (EP_TX_CTRL(ep) & ~(USBFS_EP_T_RES_MASK)) | USBFS_EP_T_RES_ACK;
93 EP_TX_CTRL(ep) = (EP_TX_CTRL(ep) & ~(USBFS_EP_T_RES_MASK)) | USBFS_EP_T_RES_NAK;
101static void update_out(uint8_t rhport, uint8_t ep,
size_t rx_len) {
120 EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;
129 USBOTG_FS->BASE_CTRL = USBFS_CTRL_SYS_CTRL | USBFS_CTRL_INT_BUSY | USBFS_CTRL_DMA_EN;
130 USBOTG_FS->UDEV_CTRL = USBFS_UDEV_CTRL_PD_DIS | USBFS_UDEV_CTRL_PORT_EN;
131 USBOTG_FS->DEV_ADDR = 0x00;
133 USBOTG_FS->INT_FG = 0xFF;
134 USBOTG_FS->INT_EN = USBFS_INT_EN_BUS_RST | USBFS_INT_EN_TRANSFER | USBFS_INT_EN_SUSPEND;
137 EP_DMA(0) = (uint32_t) &
data.buffer[0][0];
139 EP_TX_CTRL(0) = USBFS_EP_T_RES_NAK;
140 EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;
143 USBOTG_FS->UEP4_1_MOD = 0xCC;
144 USBOTG_FS->UEP2_3_MOD = 0xCC;
145 USBOTG_FS->UEP5_6_MOD = 0xCC;
146 USBOTG_FS->UEP7_MOD = 0x0C;
148 for (uint8_t ep = 1; ep < EP_MAX; ep++) {
149 EP_DMA(ep) = (uint32_t) &
data.buffer[ep][0];
151 EP_TX_CTRL(ep) = USBFS_EP_T_AUTO_TOG | USBFS_EP_T_RES_NAK;
152 EP_RX_CTRL(ep) = USBFS_EP_R_AUTO_TOG | USBFS_EP_R_RES_NAK;
154 EP_DMA(3) = (uint32_t) &
data.ep3_buffer.out[0];
163 uint8_t status = USBOTG_FS->INT_FG;
164 if (status & USBFS_INT_FG_TRANSFER) {
165 uint8_t ep = USBFS_INT_ST_MASK_UIS_ENDP(USBOTG_FS->INT_ST);
166 uint8_t token = USBFS_INT_ST_MASK_UIS_TOKEN(USBOTG_FS->INT_ST);
170 uint16_t rx_len = USBOTG_FS->RX_LEN;
181 EP_TX_CTRL(0) = USBFS_EP_T_RES_NAK;
182 EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;
189 USBOTG_FS->INT_FG = USBFS_INT_FG_TRANSFER;
190 }
else if (status & USBFS_INT_FG_BUS_RST) {
197 USBOTG_FS->DEV_ADDR = 0x00;
198 EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;
200 USBOTG_FS->INT_FG = USBFS_INT_FG_BUS_RST;
201 }
else if (status & USBFS_INT_FG_SUSPEND) {
202 dcd_event_t event = {.rhport = rhport, .event_id = DCD_EVENT_SUSPEND};
204 USBOTG_FS->INT_FG = USBFS_INT_FG_SUSPEND;
210 NVIC_EnableIRQ(USBHD_IRQn);
215 NVIC_DisableIRQ(USBHD_IRQn);
230 USBOTG_FS->BASE_CTRL |= USBFS_CTRL_DEV_PUEN;
235 USBOTG_FS->BASE_CTRL &= ~USBFS_CTRL_DEV_PUEN;
252 EP_TX_CTRL(0) = USBFS_EP_T_RES_NAK;
253 EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;
260 TU_ASSERT(ep < EP_MAX);
267 if (
data.isochronous[ep]) {
268 EP_RX_CTRL(ep) = USBFS_EP_R_AUTO_TOG | USBFS_EP_R_RES_NYET;
270 EP_RX_CTRL(ep) = USBFS_EP_R_AUTO_TOG | USBFS_EP_R_RES_ACK;
274 EP_TX_CTRL(ep) = USBFS_EP_T_AUTO_TOG | USBFS_EP_T_RES_NAK;
316 EP_RX_CTRL(0) = USBFS_EP_R_RES_STALL;
319 EP_TX_CTRL(0) = USBFS_EP_T_RES_STALL;
323 EP_RX_CTRL(ep) = (EP_RX_CTRL(ep) & ~USBFS_EP_R_RES_MASK) | USBFS_EP_R_RES_STALL;
325 EP_TX_CTRL(ep) = (EP_TX_CTRL(ep) & ~USBFS_EP_T_RES_MASK) | USBFS_EP_T_RES_STALL;
336 EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;
340 EP_RX_CTRL(ep) = (EP_RX_CTRL(ep) & ~(USBFS_EP_R_RES_MASK | USBFS_EP_R_TOG)) | USBFS_EP_R_RES_ACK;
342 EP_TX_CTRL(ep) = (EP_TX_CTRL(ep) & ~(USBFS_EP_T_RES_MASK | USBFS_EP_T_TOG)) | USBFS_EP_T_RES_NAK;
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)
void dcd_event_handler(dcd_event_t const *event, bool in_isr)
struct TU_ATTR_ALIGNED(4)
static void update_out(uint8_t rhport, uint8_t ep, size_t rx_len)
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)
static void update_in(uint8_t rhport, uint8_t ep, bool force)
void dcd_edpt_close_all(uint8_t rhport)
void dcd_int_disable(uint8_t rhport)
void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
struct usb_xfer xfer[EP_MAX][2]
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_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const *request)
void dcd_set_address(uint8_t rhport, uint8_t dev_addr)
bool dcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init)
void dcd_int_enable(uint8_t rhport)
void dcd_remote_wakeup(uint8_t rhport)
void dcd_sof_enable(uint8_t rhport, bool en)
bool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const *desc_ep)
static void * memcpy(void *dst, const void *src, size_t n)
AUDIO Channel Cluster Descriptor (4.1)
struct TU_ATTR_PACKED::@16::TU_ATTR_PACKED bmRequestType_bit
uint8_t bmAttributes
See: audio_clock_source_attribute_t.
uint8_t bRequest
Request type audio_cs_req_t.
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)
CFG_TUH_MEM_ALIGN tusb_control_request_t request