Skip to content

Make driver init() function optional#3565

Merged
HiFiPhile merged 3 commits intohathach:masterfrom
Precidata:driver-init
Mar 22, 2026
Merged

Make driver init() function optional#3565
HiFiPhile merged 3 commits intohathach:masterfrom
Precidata:driver-init

Conversation

@ceedriic
Copy link
Copy Markdown
Contributor

Make init() class driver optional, like deinit()
In my driver, I don't need any of them.

Copy link
Copy Markdown
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 makes the host class-driver init() callback optional (similar to how deinit() is already treated), allowing application-provided host drivers to omit an init routine when it isn’t needed.

Changes:

  • Guard host driver initialization so driver->init() is called only when non-NULL.
  • Update architecture documentation to list init() as an optional class driver function.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

File Description
src/host/usbh.c Skips calling class driver init() when the callback pointer is NULL.
docs/reference/architecture.rst Moves init() from “Required” to “Optional” in the class driver interface description.

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

if (driver != NULL) {
if (driver != NULL && driver->init) {
TU_LOG_USBH("%s init\r\n", driver->name);
driver->init();
Copy link

Copilot AI Mar 22, 2026

Choose a reason for hiding this comment

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

driver->init() returns bool (see usbh_class_driver_t), but its return value is ignored. Several built-in class init functions can return false on internal TU_ASSERT failures, so tuh_rhport_init() may still succeed even though a class driver failed to initialize. Consider asserting/propagating the init result (e.g., fail tuh_rhport_init() if any present init() returns false).

Suggested change
driver->init();
bool inited = driver->init();
TU_ASSERT(inited);
if (!inited) {
return false;
}

Copilot uses AI. Check for mistakes.
Comment on lines 196 to +198

**Optional Functions**:
- ``init()``: Initialize class driver
Copy link

Copilot AI Mar 22, 2026

Choose a reason for hiding this comment

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

This section still references device-side behavior ("See usbd.c"), where init() is required (the stack asserts driver->init). Moving init() to Optional Functions here makes the documentation inaccurate unless the device-side requirement is also relaxed, or the doc is clarified/split for host vs device class driver interfaces.

Suggested change
**Optional Functions**:
- ``init()``: Initialize class driver
- ``init()``: Initialize class driver
**Optional Functions**:

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@copilot make device side init() optional

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Let's see if I'm a good copilot...

@github-actions
Copy link
Copy Markdown

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

No entries.

Changes <1% in size

file .text .rodata .data .bss size % diff
usbh.c 4649 ➙ 4653 (+4) 55 99 961 5731 ➙ 5734 (+3) +0.1%
TOTAL 4649 ➙ 4653 (+4) 55 99 961 5731 ➙ 5734 (+3) +0.1%
No changes
file .text .rodata .data .bss size % diff
audio_device.c 2897 0 1260 1627 4518 +0.0%
cdc_device.c 1252 16 1106 684 1935 +0.0%
cdc_host.c 6617 487 15 1498 8327 +0.0%
dcd_ch32_usbfs.c 1473 0 0 2444 3917 +0.0%
dcd_ch32_usbhs.c 1469 0 0 448 1917 +0.0%
dcd_ci_fs.c 1925 0 0 1290 3215 +0.0%
dcd_ci_hs.c 1759 0 0 1344 2538 +0.0%
dcd_da146xx.c 3067 0 0 144 3211 +0.0%
dcd_dwc2.c 4176 25 0 265 4465 +0.0%
dcd_eptri.c 2271 0 0 259 2530 +0.0%
dcd_ft9xx.c 3276 0 0 172 3448 +0.0%
dcd_khci.c 1953 0 0 1290 3243 +0.0%
dcd_lpc17_40.c 1474 0 0 648 1798 +0.0%
dcd_lpc_ip3511.c 1463 0 0 264 1683 +0.0%
dcd_mm32f327x_otg.c 1478 0 0 1290 2768 +0.0%
dcd_msp430x5xx.c 1798 0 0 176 1974 +0.0%
dcd_musb.c 2445 0 0 160 2605 +0.0%
dcd_nrf5x.c 2918 0 0 292 3210 +0.0%
dcd_nuc120.c 1094 0 0 78 1172 +0.0%
dcd_nuc121.c 1168 0 0 101 1269 +0.0%
dcd_nuc505.c 0 0 1531 157 1688 +0.0%
dcd_rp2040.c 836 20 604 655 2115 +0.0%
dcd_rusb2.c 2919 0 0 156 3075 +0.0%
dcd_samd.c 1034 0 0 266 1300 +0.0%
dcd_samg.c 1320 0 0 72 1392 +0.0%
dcd_stm32_fsdev.c 2558 0 0 291 2849 +0.0%
dfu_device.c 777 28 712 140 916 +0.0%
dfu_rt_device.c 157 0 134 0 157 +0.0%
dwc2_common.c 602 30 0 0 618 +0.0%
ecm_rndis_device.c 1037 0 1 2858 3896 +0.0%
ehci.c 2763 0 0 6043 7597 +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 184 0 0 0 184 +0.0%
hcd_dwc2.c 4994 33 1 513 5540 +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 976 73 416 384 1849 +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 3287 0 1 420 3708 +0.0%
hid_device.c 1125 44 997 119 1244 +0.0%
hid_host.c 1240 0 0 1251 2491 +0.0%
hub.c 1384 8 8 30 1418 +0.0%
midi_device.c 1151 0 1007 623 1772 +0.0%
midi_host.c 1341 7 7 3635 4979 +0.0%
msc_device.c 2525 108 2286 547 3071 +0.0%
msc_host.c 1587 0 0 394 1982 +0.0%
mtp_device.c 1696 22 735 588 2292 +0.0%
ncm_device.c 1538 28 718 5843 7395 +0.0%
ohci.c 1940 0 0 2414 4353 +0.0%
printer_device.c 830 0 706 566 1394 +0.0%
rp2040_usb.c 120 75 669 4 868 +0.0%
rusb2_common.c 160 0 16 0 176 +0.0%
tusb.c 451 0 383 3 453 +0.0%
tusb_fifo.c 841 0 480 0 836 +0.0%
typec_stm32.c 820 8 2 12 842 +0.0%
usbc.c 420 2 20 166 608 +0.0%
usbd.c 3225 ➙ 3224 (-1) 57 88 275 3564 +0.0%
usbd_control.c 538 0 484 79 616 +0.0%
usbtmc_device.c 2196 24 68 316 2544 +0.0%
vendor_device.c 641 0 534 565 1204 +0.0%
video_device.c 4443 5 1235 479 4914 +0.0%
TOTAL 113213 ➙ 113212 (-1) 1100 16464 46011 161140 +0.0%

@HiFiPhile
Copy link
Copy Markdown
Collaborator

Thank you

@HiFiPhile HiFiPhile merged commit 4349474 into hathach:master Mar 22, 2026
292 checks passed
@hathach
Copy link
Copy Markdown
Owner

hathach commented Mar 23, 2026

late response, deinit() is optional (since it may be never called) but init() is mandatory. just have an do nothing init() if you don't use them.

@ceedriic
Copy link
Copy Markdown
Contributor Author

late response, deinit() is optional (since it may be never called) but init() is mandatory.

I got that part, my patch was just a small proposal to change that and make it non-mandatory, to simplify people's life.

just have an do nothing init() if you don't use them.

Yes

@hathach
Copy link
Copy Markdown
Owner

hathach commented Mar 25, 2026

I would not mind merging this, but it increases the code size (extra compare statement) for the default (no-app driver), which is 90% the case of usage.

@ceedriic
Copy link
Copy Markdown
Contributor Author

Ok, not a problem, it was just a suggestion. I've no problem if you don't like it.

That said, I do not really understand how the communication works in this project :)

@ceedriic ceedriic deleted the driver-init branch March 30, 2026 06:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants