summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2026-06-29 21:48:07 +0800
committersakumisu <[email protected]>2026-06-30 09:55:03 +0800
commit995785d8c2e6374f1345c77fed0939d69f9e37b6 (patch)
tree177e9d5655ae0e947c014c4c012ffbebceb17cb3
parentb3e822b049429f2b7f2e26bbd5cc491a6d65ea63 (diff)
update(port/dwc2): add limit for transfer size
Signed-off-by: sakumisu <[email protected]>
-rw-r--r--port/dwc2/usb_dc_dwc2.c11
-rw-r--r--port/dwc2/usb_hc_dwc2.c1
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;