diff options
| author | sakumisu <[email protected]> | 2026-06-29 21:48:07 +0800 |
|---|---|---|
| committer | sakumisu <[email protected]> | 2026-06-30 09:55:03 +0800 |
| commit | 995785d8c2e6374f1345c77fed0939d69f9e37b6 (patch) | |
| tree | 177e9d5655ae0e947c014c4c012ffbebceb17cb3 | |
| parent | b3e822b049429f2b7f2e26bbd5cc491a6d65ea63 (diff) | |
update(port/dwc2): add limit for transfer size
Signed-off-by: sakumisu <[email protected]>
| -rw-r--r-- | port/dwc2/usb_dc_dwc2.c | 11 | ||||
| -rw-r--r-- | port/dwc2/usb_hc_dwc2.c | 1 |
2 files changed, 12 insertions, 0 deletions
diff --git a/port/dwc2/usb_dc_dwc2.c b/port/dwc2/usb_dc_dwc2.c index 92479c8d..24fcb926 100644 --- a/port/dwc2/usb_dc_dwc2.c +++ b/port/dwc2/usb_dc_dwc2.c @@ -918,6 +918,11 @@ int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, ui } else { pktcnt = (uint16_t)((data_len + g_dwc2_udc[busid].in_ep[ep_idx].ep_mps - 1U) / g_dwc2_udc[busid].in_ep[ep_idx].ep_mps); + if (pktcnt > 0x3FF) { + pktcnt = 0x3FF; // pktcnt 10bits + } + + data_len = MIN(0x3FF * g_dwc2_udc[busid].in_ep[ep_idx].ep_mps, data_len); USB_OTG_INEP(ep_idx)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (pktcnt << 19)); USB_OTG_INEP(ep_idx)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & data_len); } @@ -995,6 +1000,12 @@ int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t } else { pktcnt = (uint16_t)((data_len + g_dwc2_udc[busid].out_ep[ep_idx].ep_mps - 1U) / g_dwc2_udc[busid].out_ep[ep_idx].ep_mps); + if (pktcnt > 0x3FF) { + pktcnt = 0x3FF; // pktcnt 10bits + } + + data_len = pktcnt * g_dwc2_udc[busid].out_ep[ep_idx].ep_mps; + USB_OTG_OUTEP(ep_idx)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (pktcnt << 19)); USB_OTG_OUTEP(ep_idx)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & data_len); } diff --git a/port/dwc2/usb_hc_dwc2.c b/port/dwc2/usb_hc_dwc2.c index 946dfd46..11616c76 100644 --- a/port/dwc2/usb_hc_dwc2.c +++ b/port/dwc2/usb_hc_dwc2.c @@ -520,6 +520,7 @@ static uint16_t dwc2_calculate_packet_num(uint32_t input_size, uint8_t ep_addr, if (ep_addr & 0x80) { input_size = num_packets * ep_mps; } else { + input_size = MIN(0x3FF * ep_mps, input_size); } *output_size = input_size; |
