usb-core spawn.rs:
- class_driver_for_usb_class() extended to cover all Red Bear class drivers:
Audio(0x01)→redbear-usbaudiod, CDC ACM(0x02/0x02)→redbear-acmd,
CDC ECM(0x02/0x06)→redbear-ecmd, HID(0x03)→usbhidd,
Mass Storage(0x08)→usbscsid, Hub(0x09)→usbhubd,
Vendor(0xFF)→redbear-ftdi
- Subclass-aware matching (Audio Control vs Streaming, CDC ACM vs ECM)
- is_trusted_usb_driver() whitelist extended with all 7 driver binaries
- Test suite updated with new assertions (11/11 pass)
redbear-usb-hotplugd:
- DRIVER_MAP extended to 11 entries with subclass-aware matching
- Recursive port scanning: scan_ports_recursive() traverses child
hub port directories (handles port1.port2.port3 paths)
- extract_port_id() parses full port paths to extract controller
name and port string for child hub ports
- Protocol-aware extra arg: Storage passes protocol byte (0x50/0x62),
all other classes pass interface number
- Skips CDC Data interfaces (0x0A) and hub interfaces (0x09) when
reading descriptors — matches Linux's interface matching logic
- Improved disconnect detection via descriptor accessibility heuristic
- Cleaner structure: find_driver(), scan_controllers(), scan_ports(),
try_read_descriptors(), main loop with connect/disconnect tracking
All 7 Red Bear USB class drivers now auto-spawning on device connect:
usbhidd, usbscsid, usbhubd, redbear-acmd, redbear-ecmd,
redbear-usbaudiod, redbear-ftdi
usb-core: scheme.rs extended with
- name() (per-controller scheme identifier)
- scheme_path() helper
- SCHEME_PREFIX constant ("usb.")
- UsbError::Unsupported variant
uhcid: 459 LoC -> 463 LoC
- Added controller name field derived from device path
- Free function control_transfer() -> UhciController::do_control_transfer() method
- impl UsbHostController for UhciController
- port_status maps to USB trait PortStatus (with high_speed=false)
- control_transfer handles SetupPacket by serializing 8-byte buffer
- bulk_transfer / interrupt_transfer return Err(Unsupported) — see P4/P5
- set_address returns true (no UHCI controller command)
- Class driver spawn now uses per-controller scheme name
ohcid: 280 LoC -> 304 LoC
- Same pattern as UHCI
- control_transfer method on OhciController
- impl UsbHostController for OhciController
- Linux 7.1 ohci-q.c PIPE_CONTROL pattern preserved
- Per-controller scheme name in spawn
Both drivers cross-reference Linux 7.1 source for register
definitions (xhci-ext-caps.h, ohci.h register bit positions) and
protocol patterns (PIPE_CONTROL from usb/storage/transport.c).
Cross-compile clean: usb-core, uhcid, ohcid, ehcid all build.
Two of three P1-A sub-tasks done (UHCI + OHCI on the trait).
Remaining: xhcid thin-trait adapter (deferred — xhcid scheme.rs is
2,839 LoC and operates under its own well-tested scheme protocol).
Reference: USB-IMPLEMENTATION-PLAN.md v3 §P1-A
P0-B1 spawn infrastructure from USB-IMPLEMENTATION-PLAN.md v2.
Add two new public functions to usb-core::spawn:
class_driver_for_usb_class(class, subclass, protocol) -> Option<&str>
Maps USB class codes to driver binary paths:
0x03 -> /usr/bin/usbhidd (HID)
0x08 -> /usr/bin/usbscsid (Mass Storage)
0x09 -> /usr/bin/usbhubd (Hub)
spawn_class_driver_for_port(...args...)
Spawns the correct class daemon with the right argv layout:
- HID/Hub: <scheme> <port> <interface_num>
- Storage: <scheme> <port> <protocol_byte>
The existing spawn_usb_driver is preserved for backward compatibility.
Both new functions have no_std stubs so the crate still compiles without
the std feature.
Next: wire the spawn call into ehcid after device enumeration (P0-B1
call site) + add xhcid-compatible scheme paths (descriptors/request/
endpoints/attach) to ehcid's scheme handler so the spawned daemons can
open XhciClientHandle successfully.
Add guard-recipes.sh with four modes:
- --verify: check all local/recipes have correct symlinks into recipes/
- --fix: repair broken symlinks (run before builds)
- --save-all: snapshot all recipe.toml into local/recipes/
- --restore: recreate all symlinks from local/recipes/ (run after sync-upstream)
Wired into apply-patches.sh (post-patch) and sync-upstream.sh (post-sync).
This prevents the build system from deleting recipe files during
cargo cook, make distclean, or upstream source refresh.