@@ -110,7 +110,7 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep)
110
110
g_ch32_usbhs_udc .out_ep [ep_idx ].ep_mps = USB_GET_MAXPACKETSIZE (ep -> wMaxPacketSize );
111
111
g_ch32_usbhs_udc .out_ep [ep_idx ].ep_type = USB_GET_ENDPOINT_TYPE (ep -> bmAttributes );
112
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 ) {
113
+ if (g_ch32_usbhs_udc .out_ep [ep_idx ].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS ) {
114
114
USBHS_DEVICE -> ENDP_TYPE |= (1 << (ep_idx + 16 ));
115
115
} else {
116
116
USBHS_DEVICE -> ENDP_TYPE &= ~(1 << (ep_idx + 16 ));
@@ -122,11 +122,11 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep)
122
122
g_ch32_usbhs_udc .in_ep [ep_idx ].ep_type = USB_GET_ENDPOINT_TYPE (ep -> bmAttributes );
123
123
g_ch32_usbhs_udc .in_ep [ep_idx ].ep_enable = true;
124
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
- USB_SET_TX_CTRL (ep_idx , USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0 );
125
+ USBHS_DEVICE -> ENDP_TYPE |= (1 << (ep_idx ));
126
+ USB_SET_TX_CTRL (ep_idx , USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0 );
127
127
} else {
128
- USBHS_DEVICE -> ENDP_TYPE &= ~(1 << (ep_idx ));
129
- USB_SET_TX_CTRL (ep_idx , USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0 | USBHS_EP_T_AUTOTOG );
128
+ USBHS_DEVICE -> ENDP_TYPE &= ~(1 << (ep_idx ));
129
+ USB_SET_TX_CTRL (ep_idx , USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0 | USBHS_EP_T_AUTOTOG );
130
130
}
131
131
USBHS_DEVICE -> ENDP_CONFIG |= (1 << (ep_idx ));
132
132
}
@@ -141,7 +141,7 @@ int usbd_ep_close(uint8_t busid, const uint8_t ep)
141
141
USBHS_DEVICE -> ENDP_CONFIG &= ~(1 << (ep_idx + 16 ));
142
142
} else {
143
143
USBHS_DEVICE -> ENDP_CONFIG &= ~(1 << (ep_idx ));
144
- }
144
+ }
145
145
return 0 ;
146
146
}
147
147
@@ -230,7 +230,11 @@ int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, ui
230
230
tmp = USB_GET_TX_CTRL (ep_idx );
231
231
tmp &= ~(USBHS_EP_T_RES_MASK | USBHS_EP_T_TOG_MASK );
232
232
tmp |= USBHS_EP_T_RES_ACK ;
233
- tmp |= (epx_tx_data_toggle [ep_idx - 1 ] ? USBHS_EP_T_TOG_1 : USBHS_EP_T_TOG_0 );
233
+ if (g_ch32_usbhs_udc .in_ep [ep_idx ].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS ) {
234
+ tmp |= USBHS_EP_T_TOG_0 ;
235
+ } else {
236
+ tmp |= (epx_tx_data_toggle [ep_idx - 1 ] ? USBHS_EP_T_TOG_1 : USBHS_EP_T_TOG_0 );
237
+ }
234
238
USB_SET_TX_CTRL (ep_idx , tmp );
235
239
}
236
240
return 0 ;
@@ -264,10 +268,10 @@ int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t
264
268
return 0 ;
265
269
} else {
266
270
USB_SET_RX_DMA (ep_idx , (uint32_t )data );
267
- if (g_ch32_usbhs_udc .out_ep [ep_idx ].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS ) {
271
+ if (g_ch32_usbhs_udc .out_ep [ep_idx ].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS ) {
268
272
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 );
269
- } else {
270
- USB_SET_RX_CTRL (ep_idx , (USB_GET_RX_CTRL (ep_idx ) & ~USBHS_EP_R_RES_MASK ) | USBHS_EP_R_RES_ACK );
273
+ } else {
274
+ USB_SET_RX_CTRL (ep_idx , (USB_GET_RX_CTRL (ep_idx ) & ~USBHS_EP_R_RES_MASK ) | USBHS_EP_R_RES_ACK );
271
275
}
272
276
}
273
277
@@ -285,7 +289,10 @@ void USBD_IRQHandler(uint8_t busid)
285
289
ep_idx = (USBHS_DEVICE -> INT_ST ) & MASK_UIS_ENDP ;
286
290
token = (((USBHS_DEVICE -> INT_ST ) & MASK_UIS_TOKEN ) >> 4 ) & 0x03 ;
287
291
292
+ USBHS_DEVICE -> INT_FG = USBHS_TRANSFER_FLAG ;
293
+
288
294
if (token == PID_IN ) {
295
+ USB_SET_TX_CTRL (ep_idx , (USB_GET_TX_CTRL (ep_idx ) & ~(USBHS_EP_T_RES_MASK | USBHS_EP_T_TOG_MASK )) | USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0 );
289
296
if (ep_idx == 0x00 ) {
290
297
if (g_ch32_usbhs_udc .in_ep [ep_idx ].xfer_len >= g_ch32_usbhs_udc .in_ep [ep_idx ].ep_mps ) {
291
298
g_ch32_usbhs_udc .in_ep [ep_idx ].xfer_len -= g_ch32_usbhs_udc .in_ep [ep_idx ].ep_mps ;
@@ -317,8 +324,6 @@ void USBD_IRQHandler(uint8_t busid)
317
324
ep0_tx_data_toggle = true;
318
325
}
319
326
} else {
320
- USB_SET_TX_CTRL (ep_idx , (USB_GET_TX_CTRL (ep_idx ) & ~(USBHS_EP_T_RES_MASK | USBHS_EP_T_TOG_MASK )) | USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0 );
321
-
322
327
if (g_ch32_usbhs_udc .in_ep [ep_idx ].xfer_len > g_ch32_usbhs_udc .in_ep [ep_idx ].ep_mps ) {
323
328
g_ch32_usbhs_udc .in_ep [ep_idx ].xfer_buf += g_ch32_usbhs_udc .in_ep [ep_idx ].ep_mps ;
324
329
g_ch32_usbhs_udc .in_ep [ep_idx ].xfer_len -= g_ch32_usbhs_udc .in_ep [ep_idx ].ep_mps ;
@@ -332,7 +337,13 @@ void USBD_IRQHandler(uint8_t busid)
332
337
uint32_t tmp = USB_GET_TX_CTRL (ep_idx );
333
338
tmp &= ~(USBHS_EP_T_RES_MASK | USBHS_EP_T_TOG_MASK );
334
339
tmp |= USBHS_EP_T_RES_ACK ;
335
- tmp |= (epx_tx_data_toggle [ep_idx - 1 ] ? USBHS_EP_T_TOG_1 : USBHS_EP_T_TOG_0 );
340
+
341
+ if (g_ch32_usbhs_udc .in_ep [ep_idx ].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS ) {
342
+ tmp |= USBHS_EP_T_TOG_0 ;
343
+ } else {
344
+ tmp |= (epx_tx_data_toggle [ep_idx - 1 ] ? USBHS_EP_T_TOG_1 : USBHS_EP_T_TOG_0 );
345
+ }
346
+
336
347
USB_SET_TX_CTRL (ep_idx , tmp );
337
348
} else {
338
349
g_ch32_usbhs_udc .in_ep [ep_idx ].actual_xfer_len += g_ch32_usbhs_udc .in_ep [ep_idx ].xfer_len ;
@@ -342,6 +353,7 @@ void USBD_IRQHandler(uint8_t busid)
342
353
}
343
354
}
344
355
} else if (token == PID_OUT ) {
356
+ USB_SET_RX_CTRL (ep_idx , (USB_GET_RX_CTRL (ep_idx ) & ~USBHS_EP_R_RES_MASK ) | USBHS_EP_R_RES_NAK );
345
357
if (ep_idx == 0x00 ) {
346
358
read_count = USBHS_DEVICE -> RX_LEN ;
347
359
@@ -361,7 +373,6 @@ void USBD_IRQHandler(uint8_t busid)
361
373
}
362
374
} else {
363
375
if (USBHS_DEVICE -> INT_ST & USBHS_DEV_UIS_TOG_OK ) {
364
- USB_SET_RX_CTRL (ep_idx , (USB_GET_RX_CTRL (ep_idx ) & ~USBHS_EP_R_RES_MASK ) | USBHS_EP_R_RES_NAK );
365
376
read_count = USBHS_DEVICE -> RX_LEN ;
366
377
367
378
g_ch32_usbhs_udc .out_ep [ep_idx ].xfer_buf += read_count ;
@@ -377,11 +388,16 @@ void USBD_IRQHandler(uint8_t busid)
377
388
}
378
389
}
379
390
}
380
- USBHS_DEVICE -> INT_FG = USBHS_TRANSFER_FLAG ;
381
- } else if ( intflag & USBHS_SETUP_FLAG ) {
382
- usbd_event_ep0_setup_complete_handler ( 0 , ( uint8_t * ) & g_ch32_usbhs_udc . setup );
391
+ }
392
+
393
+ if ( intflag & USBHS_SETUP_FLAG ) {
383
394
USBHS_DEVICE -> INT_FG = USBHS_SETUP_FLAG ;
384
- } else if (intflag & USBHS_DETECT_FLAG ) {
395
+ usbd_event_ep0_setup_complete_handler (0 , (uint8_t * )& g_ch32_usbhs_udc .setup );
396
+ }
397
+
398
+ if (intflag & USBHS_DETECT_FLAG ) {
399
+ USBHS_DEVICE -> INT_FG = USBHS_DETECT_FLAG ;
400
+
385
401
USBHS_DEVICE -> ENDP_CONFIG = USBHS_EP0_T_EN | USBHS_EP0_R_EN ;
386
402
387
403
USBHS_DEVICE -> UEP0_TX_LEN = 0 ;
@@ -401,7 +417,6 @@ void USBD_IRQHandler(uint8_t busid)
401
417
usbd_event_reset_handler (0 );
402
418
USBHS_DEVICE -> UEP0_DMA = (uint32_t )& g_ch32_usbhs_udc .setup ;
403
419
USBHS_DEVICE -> UEP0_RX_CTRL = USBHS_EP_R_RES_ACK ;
404
- USBHS_DEVICE -> INT_FG = USBHS_DETECT_FLAG ;
405
420
}
406
421
}
407
422
0 commit comments