@@ -70,9 +70,6 @@ int usb_dc_init(uint8_t busid)
70
70
USBHS_DEVICE -> INT_EN = 0 ;
71
71
USBHS_DEVICE -> INT_EN = USBHS_SETUP_ACT_EN | USBHS_TRANSFER_EN | USBHS_DETECT_EN ;
72
72
73
- /* ALL endpoint enable */
74
- USBHS_DEVICE -> ENDP_CONFIG = 0xffffffff ;
75
-
76
73
USBHS_DEVICE -> ENDP_TYPE = 0x00 ;
77
74
USBHS_DEVICE -> BUF_MODE = 0x00 ;
78
75
@@ -113,12 +110,22 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep)
113
110
g_ch32_usbhs_udc .out_ep [ep_idx ].ep_mps = USB_GET_MAXPACKETSIZE (ep -> wMaxPacketSize );
114
111
g_ch32_usbhs_udc .out_ep [ep_idx ].ep_type = USB_GET_ENDPOINT_TYPE (ep -> bmAttributes );
115
112
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
+ }
116
118
USBHS_DEVICE -> ENDP_CONFIG |= (1 << (ep_idx + 16 ));
117
119
USB_SET_RX_CTRL (ep_idx , USBHS_EP_R_RES_NAK | USBHS_EP_R_TOG_0 | USBHS_EP_R_AUTOTOG );
118
120
} else {
119
121
g_ch32_usbhs_udc .in_ep [ep_idx ].ep_mps = USB_GET_MAXPACKETSIZE (ep -> wMaxPacketSize );
120
122
g_ch32_usbhs_udc .in_ep [ep_idx ].ep_type = USB_GET_ENDPOINT_TYPE (ep -> bmAttributes );
121
123
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
+ }
122
129
USBHS_DEVICE -> ENDP_CONFIG |= (1 << (ep_idx ));
123
130
USB_SET_TX_CTRL (ep_idx , USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0 | USBHS_EP_T_AUTOTOG );
124
131
}
@@ -128,6 +135,12 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep)
128
135
129
136
int usbd_ep_close (uint8_t busid , const uint8_t ep )
130
137
{
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
+ }
131
144
return 0 ;
132
145
}
133
146
@@ -166,6 +179,13 @@ int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep)
166
179
167
180
int usbd_ep_is_stalled (uint8_t busid , const uint8_t ep , uint8_t * stalled )
168
181
{
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
+ }
169
189
return 0 ;
170
190
}
171
191
@@ -243,7 +263,11 @@ int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t
243
263
return 0 ;
244
264
} else {
245
265
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
+ }
247
271
}
248
272
249
273
return 0 ;
@@ -385,4 +409,4 @@ void USBHS_IRQHandler(void)
385
409
{
386
410
extern void USBD_IRQHandler (uint8_t busid );
387
411
USBD_IRQHandler (0 );
388
- }
412
+ }
0 commit comments