Skip to content

Commit f1c4f17

Browse files
committed
fix(port/ch32): clear intflag first, set nak before handling ep in
Signed-off-by: sakumisu <[email protected]>
1 parent b4fb10e commit f1c4f17

File tree

2 files changed

+43
-25
lines changed

2 files changed

+43
-25
lines changed

port/ch32/usb_dc_usbfs.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -266,13 +266,17 @@ void USBD_IRQHandler(uint8_t busid)
266266
if (intflag & USBFS_UIF_TRANSFER) {
267267
token = USBFS_DEVICE->INT_ST & USBFS_UIS_TOKEN_MASK;
268268
ep_idx = USBFS_DEVICE->INT_ST & USBFS_UIS_ENDP_MASK;
269+
270+
USBFS_DEVICE->INT_FG = USBFS_UIF_TRANSFER;
271+
269272
switch (token) {
270273
case USBFS_UIS_TOKEN_SETUP:
271274
USB_SET_RX_CTRL(ep_idx, USBFS_UEP_R_RES_NAK);
272275
usbd_event_ep0_setup_complete_handler(0, (uint8_t *)&g_ch32_usbfs_udc.setup);
273276
break;
274277

275278
case USBFS_UIS_TOKEN_IN:
279+
USB_SET_TX_CTRL(ep_idx, (USB_GET_TX_CTRL(ep_idx) & ~USBFS_UEP_T_RES_MASK) | USBFS_UEP_T_RES_NAK);
276280
if (ep_idx == 0x00) {
277281
if (g_ch32_usbfs_udc.in_ep[ep_idx].xfer_len >= g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps) {
278282
g_ch32_usbfs_udc.in_ep[ep_idx].xfer_len -= g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps;
@@ -304,8 +308,6 @@ void USBD_IRQHandler(uint8_t busid)
304308
ep0_tx_data_toggle = true;
305309
}
306310
} else {
307-
USB_SET_TX_CTRL(ep_idx, (USB_GET_TX_CTRL(ep_idx) & ~USBFS_UEP_T_RES_MASK) | USBFS_UEP_T_RES_NAK);
308-
309311
if (g_ch32_usbfs_udc.in_ep[ep_idx].xfer_len > g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps) {
310312
g_ch32_usbfs_udc.in_ep[ep_idx].xfer_buf += g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps;
311313
g_ch32_usbfs_udc.in_ep[ep_idx].xfer_len -= g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps;
@@ -370,9 +372,10 @@ void USBD_IRQHandler(uint8_t busid)
370372
default:
371373
break;
372374
}
375+
}
376+
if (intflag & USBFS_UIF_BUS_RST) {
377+
USBFS_DEVICE->INT_FG |= USBFS_UIF_BUS_RST;
373378

374-
USBFS_DEVICE->INT_FG = USBFS_UIF_TRANSFER;
375-
} else if (intflag & USBFS_UIF_BUS_RST) {
376379
USBFS_DEVICE->UEP0_TX_LEN = 0;
377380
USBFS_DEVICE->UEP0_TX_CTRL = USBFS_UEP_T_RES_NAK;
378381
USBFS_DEVICE->UEP0_RX_CTRL = USBFS_UEP_R_RES_NAK;
@@ -390,9 +393,9 @@ void USBD_IRQHandler(uint8_t busid)
390393
usbd_event_reset_handler(0);
391394
USB_SET_DMA(ep_idx, (uint32_t)&g_ch32_usbfs_udc.setup);
392395
USB_SET_RX_CTRL(ep_idx, USBFS_UEP_R_RES_ACK);
396+
}
393397

394-
USBFS_DEVICE->INT_FG |= USBFS_UIF_BUS_RST;
395-
} else if (intflag & USBFS_UIF_SUSPEND) {
398+
if (intflag & USBFS_UIF_SUSPEND) {
396399
if (USBFS_DEVICE->MIS_ST & USBFS_UMS_SUSPEND) {
397400
} else {
398401
}

port/ch32/usb_dc_usbhs.c

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep)
110110
g_ch32_usbhs_udc.out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize);
111111
g_ch32_usbhs_udc.out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes);
112112
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) {
114114
USBHS_DEVICE->ENDP_TYPE |= (1 << (ep_idx + 16));
115115
} else {
116116
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)
122122
g_ch32_usbhs_udc.in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes);
123123
g_ch32_usbhs_udc.in_ep[ep_idx].ep_enable = true;
124124
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);
127127
} 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);
130130
}
131131
USBHS_DEVICE->ENDP_CONFIG |= (1 << (ep_idx));
132132
}
@@ -141,7 +141,7 @@ int usbd_ep_close(uint8_t busid, const uint8_t ep)
141141
USBHS_DEVICE->ENDP_CONFIG &= ~(1 << (ep_idx + 16));
142142
} else {
143143
USBHS_DEVICE->ENDP_CONFIG &= ~(1 << (ep_idx));
144-
}
144+
}
145145
return 0;
146146
}
147147

@@ -230,7 +230,11 @@ int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, ui
230230
tmp = USB_GET_TX_CTRL(ep_idx);
231231
tmp &= ~(USBHS_EP_T_RES_MASK | USBHS_EP_T_TOG_MASK);
232232
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+
}
234238
USB_SET_TX_CTRL(ep_idx, tmp);
235239
}
236240
return 0;
@@ -264,10 +268,10 @@ int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t
264268
return 0;
265269
} else {
266270
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) {
268272
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);
271275
}
272276
}
273277

@@ -285,7 +289,10 @@ void USBD_IRQHandler(uint8_t busid)
285289
ep_idx = (USBHS_DEVICE->INT_ST) & MASK_UIS_ENDP;
286290
token = (((USBHS_DEVICE->INT_ST) & MASK_UIS_TOKEN) >> 4) & 0x03;
287291

292+
USBHS_DEVICE->INT_FG = USBHS_TRANSFER_FLAG;
293+
288294
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);
289296
if (ep_idx == 0x00) {
290297
if (g_ch32_usbhs_udc.in_ep[ep_idx].xfer_len >= g_ch32_usbhs_udc.in_ep[ep_idx].ep_mps) {
291298
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)
317324
ep0_tx_data_toggle = true;
318325
}
319326
} 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-
322327
if (g_ch32_usbhs_udc.in_ep[ep_idx].xfer_len > g_ch32_usbhs_udc.in_ep[ep_idx].ep_mps) {
323328
g_ch32_usbhs_udc.in_ep[ep_idx].xfer_buf += g_ch32_usbhs_udc.in_ep[ep_idx].ep_mps;
324329
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)
332337
uint32_t tmp = USB_GET_TX_CTRL(ep_idx);
333338
tmp &= ~(USBHS_EP_T_RES_MASK | USBHS_EP_T_TOG_MASK);
334339
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+
336347
USB_SET_TX_CTRL(ep_idx, tmp);
337348
} else {
338349
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)
342353
}
343354
}
344355
} 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);
345357
if (ep_idx == 0x00) {
346358
read_count = USBHS_DEVICE->RX_LEN;
347359

@@ -361,7 +373,6 @@ void USBD_IRQHandler(uint8_t busid)
361373
}
362374
} else {
363375
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);
365376
read_count = USBHS_DEVICE->RX_LEN;
366377

367378
g_ch32_usbhs_udc.out_ep[ep_idx].xfer_buf += read_count;
@@ -377,11 +388,16 @@ void USBD_IRQHandler(uint8_t busid)
377388
}
378389
}
379390
}
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) {
383394
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+
385401
USBHS_DEVICE->ENDP_CONFIG = USBHS_EP0_T_EN | USBHS_EP0_R_EN;
386402

387403
USBHS_DEVICE->UEP0_TX_LEN = 0;
@@ -401,7 +417,6 @@ void USBD_IRQHandler(uint8_t busid)
401417
usbd_event_reset_handler(0);
402418
USBHS_DEVICE->UEP0_DMA = (uint32_t)&g_ch32_usbhs_udc.setup;
403419
USBHS_DEVICE->UEP0_RX_CTRL = USBHS_EP_R_RES_ACK;
404-
USBHS_DEVICE->INT_FG = USBHS_DETECT_FLAG;
405420
}
406421
}
407422

0 commit comments

Comments
 (0)