Skip to content

Conversation

@HiFiPhile
Copy link
Collaborator

This pull request improves how control transfer buffers are managed for both the Audio and DFU device classes. The main enhancement is to allow the use of the endpoint 0 buffer for control transfers when it is large enough, falling back to a dedicated buffer only when necessary.

Copilot AI review requested due to automatic review settings November 20, 2025 23:52
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR optimizes control transfer buffer management in TinyUSB by allowing device classes to use the EP0 buffer directly when it's large enough, avoiding unnecessary dedicated buffer allocations and memory copies. This improves memory efficiency on resource-constrained devices while maintaining the same functional behavior.

Key Changes

  • Added usbd_control_get_buffer() API to expose the EP0 buffer to device class implementations
  • Optimized control transfer path to skip unnecessary memory copies when the buffer is already the EP0 buffer
  • Updated Audio and DFU device classes to conditionally use EP0 buffer instead of always allocating dedicated buffers

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

File Description
src/device/usbd_control.c Added function to expose EP0 buffer and optimized copy operations to skip when buffer pointer matches EP0 buffer
src/device/usbd.h Added declaration for usbd_control_get_buffer() function
src/class/dfu/dfu_device.c Conditionally allocates transfer buffer only when larger than EP0, otherwise uses EP0 buffer directly via helper function
src/class/audio/audio_device.c Conditionally allocates control buffer only when larger than EP0, uses EP0 buffer otherwise, and removes length cropping code that relied on dedicated buffer always existing

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@sonarqubecloud
Copy link

sonarqubecloud bot commented Dec 2, 2025

Signed-off-by: HiFiPhile <admin@hifiphile.com>
Signed-off-by: HiFiPhile <admin@hifiphile.com>
Signed-off-by: HiFiPhile <admin@hifiphile.com>
Signed-off-by: HiFiPhile <admin@hifiphile.com>
@github-actions
Copy link

github-actions bot commented Dec 14, 2025

Size Difference Report

Because TinyUSB code size varies by port and configuration, the metrics below represent the averaged totals across all example builds.

Note: If there is no change, only one value is shown.

Changes >1% in size

file .text .rodata .data .bss size % diff
audio_device.c 2855 ➙ 2852 (-3) 0 1248 ➙ 1246 (-2) 1679 ➙ 1617 (-62) 4529 ➙ 4464 (-65) -1.4%
dfu_device.c 744 28 712 184 ➙ 138 (-46) 929 ➙ 882 (-47) -5.1%
usbd_control.c 524 ➙ 534 (+10) 0 474 ➙ 482 (+8) 78 601 ➙ 611 (+10) +1.7%
TOTAL 4123 ➙ 4130 (+7) 28 2434 ➙ 2440 (+6) 1941 ➙ 1833 (-108) 6059 ➙ 5957 (-102) -1.7%

Changes <1% in size

file .text .rodata .data .bss size % diff
hid_device.c 1120 44 997 115 1235 ➙ 1234 (-1) -0.1%
TOTAL 1120 44 997 115 1235 ➙ 1234 (-1) -0.1%
No changes
file .text .rodata .data .bss size % diff
cdc_device.c 1331 16 20 670 2000 +0.0%
cdc_host.c 6596 487 15 1539 8357 +0.0%
dcd_ch32_usbfs.c 1472 0 0 2444 3916 +0.0%
dcd_ch32_usbhs.c 1648 0 0 448 2096 +0.0%
dcd_ci_fs.c 1925 0 0 1290 3215 +0.0%
dcd_ci_hs.c 1762 0 0 1280 2530 +0.0%
dcd_da146xx.c 3067 0 0 144 3211 +0.0%
dcd_dwc2.c 4160 25 0 263 4447 +0.0%
dcd_eptri.c 2270 0 0 259 2529 +0.0%
dcd_khci.c 1953 0 0 1290 3243 +0.0%
dcd_lpc17_40.c 1470 0 0 648 1794 +0.0%
dcd_lpc_ip3511.c 1463 0 0 264 1639 +0.0%
dcd_mm32f327x_otg.c 1478 0 0 1290 2768 +0.0%
dcd_msp430x5xx.c 1796 0 0 176 1972 +0.0%
dcd_musb.c 2079 0 0 160 2239 +0.0%
dcd_nrf5x.c 2919 0 0 292 3211 +0.0%
dcd_nuc120.c 1093 0 0 78 1171 +0.0%
dcd_nuc121.c 1167 0 0 101 1268 +0.0%
dcd_nuc505.c 0 0 1529 157 1686 +0.0%
dcd_rp2040.c 736 20 580 1029 2365 +0.0%
dcd_rusb2.c 2917 0 0 156 3073 +0.0%
dcd_samd.c 1032 0 0 266 1298 +0.0%
dcd_samg.c 1319 0 0 72 1391 +0.0%
dcd_stm32_fsdev.c 2556 0 0 291 2847 +0.0%
dfu_rt_device.c 157 0 134 0 156 +0.0%
dwc2_common.c 594 29 0 0 610 +0.0%
ecm_rndis_device.c 1037 0 1 2272 3310 +0.0%
ehci.c 2761 0 0 5970 7537 +0.0%
fsdev_common.c 180 0 0 0 180 +0.0%
hcd_ch32_usbfs.c 2484 0 0 498 2982 +0.0%
hcd_ci_hs.c 190 0 0 0 190 +0.0%
hcd_dwc2.c 4893 30 0 512 5434 +0.0%
hcd_khci.c 2442 0 0 449 2891 +0.0%
hcd_musb.c 3073 0 0 157 3230 +0.0%
hcd_pio_usb.c 262 0 240 0 502 +0.0%
hcd_rp2040.c 936 73 420 512 1941 +0.0%
hcd_rusb2.c 2923 0 0 245 3168 +0.0%
hcd_samd.c 2220 0 0 324 2544 +0.0%
hcd_stm32_fsdev.c 3282 0 1 420 3703 +0.0%
hid_host.c 1206 0 0 1250 2456 +0.0%
hub.c 1235 8 8 29 1268 +0.0%
midi_device.c 1129 0 991 596 1723 +0.0%
midi_host.c 1353 7 7 3740 5097 +0.0%
msc_device.c 2506 108 2274 538 3044 +0.0%
msc_host.c 1589 0 0 394 1984 +0.0%
mtp_device.c 1622 22 1385 578 2208 +0.0%
ncm_device.c 1517 28 1408 5824 7354 +0.0%
ohci.c 1942 0 0 2414 4356 +0.0%
rp2040_usb.c 124 70 574 4 772 +0.0%
rusb2_common.c 160 0 16 0 176 +0.0%
tusb.c 418 0 359 3 420 +0.0%
tusb_fifo.c 844 0 477 0 839 +0.0%
typec_stm32.c 820 8 2 12 842 +0.0%
usbc.c 420 2 20 166 608 +0.0%
usbd.c 3179 57 90 276 3519 +0.0%
usbh.c 4374 60 63 954 5415 +0.0%
usbtmc_device.c 2178 24 70 294 2504 +0.0%
vendor_device.c 636 0 538 470 1105 +0.0%
video_device.c 4402 6 1851 471 4865 +0.0%
TOTAL 107297 1080 13073 43979 153199 +0.0%

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants