Skip to content

Commit 9d06a94

Browse files
authored
fix:(port/ch32/usb_dc_usbhs.c) Add isochronous out transfer support and fix endpoint config bug (#310)
* fix:(port/ch32/usb_dc_usbhs.c) Add isochronous out transfer support and fix endpoint config bug
1 parent c659bdc commit 9d06a94

File tree

1 file changed

+29
-5
lines changed

1 file changed

+29
-5
lines changed

port/ch32/usb_dc_usbhs.c

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,6 @@ int usb_dc_init(uint8_t busid)
7070
USBHS_DEVICE->INT_EN = 0;
7171
USBHS_DEVICE->INT_EN = USBHS_SETUP_ACT_EN | USBHS_TRANSFER_EN | USBHS_DETECT_EN;
7272

73-
/* ALL endpoint enable */
74-
USBHS_DEVICE->ENDP_CONFIG = 0xffffffff;
75-
7673
USBHS_DEVICE->ENDP_TYPE = 0x00;
7774
USBHS_DEVICE->BUF_MODE = 0x00;
7875

@@ -113,12 +110,22 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep)
113110
g_ch32_usbhs_udc.out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize);
114111
g_ch32_usbhs_udc.out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes);
115112
g_ch32_usbhs_udc.out_ep[ep_idx].ep_enable = true;
113+
if(g_ch32_usbhs_udc.out_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS) {
114+
USBHS_DEVICE->ENDP_TYPE |= (1 << (ep_idx + 16));
115+
} else {
116+
USBHS_DEVICE->ENDP_TYPE &= ~(1 << (ep_idx + 16));
117+
}
116118
USBHS_DEVICE->ENDP_CONFIG |= (1 << (ep_idx + 16));
117119
USB_SET_RX_CTRL(ep_idx, USBHS_EP_R_RES_NAK | USBHS_EP_R_TOG_0 | USBHS_EP_R_AUTOTOG);
118120
} else {
119121
g_ch32_usbhs_udc.in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize);
120122
g_ch32_usbhs_udc.in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes);
121123
g_ch32_usbhs_udc.in_ep[ep_idx].ep_enable = true;
124+
if (g_ch32_usbhs_udc.in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS) {
125+
USBHS_DEVICE->ENDP_TYPE |= (1 << (ep_idx));
126+
} else {
127+
USBHS_DEVICE->ENDP_TYPE &= ~(1 << (ep_idx));
128+
}
122129
USBHS_DEVICE->ENDP_CONFIG |= (1 << (ep_idx));
123130
USB_SET_TX_CTRL(ep_idx, USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0 | USBHS_EP_T_AUTOTOG);
124131
}
@@ -128,6 +135,12 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep)
128135

129136
int usbd_ep_close(uint8_t busid, const uint8_t ep)
130137
{
138+
uint8_t ep_idx = USB_EP_GET_IDX(ep);
139+
if (USB_EP_DIR_IS_OUT(ep)) {
140+
USBHS_DEVICE->ENDP_CONFIG &= ~(1 << (ep_idx + 16));
141+
} else {
142+
USBHS_DEVICE->ENDP_CONFIG &= ~(1 << (ep_idx));
143+
}
131144
return 0;
132145
}
133146

@@ -166,6 +179,13 @@ int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep)
166179

167180
int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled)
168181
{
182+
uint8_t ep_idx = USB_EP_GET_IDX(ep);
183+
184+
if (USB_EP_DIR_IS_OUT(ep)) {
185+
*stalled = USB_GET_RX_CTRL(ep_idx) & USBHS_EP_R_RES_STALL ? 1 : 0;
186+
} else {
187+
*stalled = USB_GET_TX_CTRL(ep_idx) & USBHS_EP_T_RES_STALL ? 1 : 0;
188+
}
169189
return 0;
170190
}
171191

@@ -243,7 +263,11 @@ int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t
243263
return 0;
244264
} else {
245265
USB_SET_RX_DMA(ep_idx, (uint32_t)data);
246-
USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~USBHS_EP_R_RES_MASK) | USBHS_EP_R_RES_ACK);
266+
if(g_ch32_usbhs_udc.out_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS ) {
267+
USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~(USBHS_EP_R_RES_MASK | USBHS_EP_R_TOG_MASK)) | USBHS_EP_R_RES_ACK | USBHS_EP_R_TOG_0);
268+
} else {
269+
USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~USBHS_EP_R_RES_MASK) | USBHS_EP_R_RES_ACK );
270+
}
247271
}
248272

249273
return 0;
@@ -385,4 +409,4 @@ void USBHS_IRQHandler(void)
385409
{
386410
extern void USBD_IRQHandler(uint8_t busid);
387411
USBD_IRQHandler(0);
388-
}
412+
}

0 commit comments

Comments
 (0)