Commit Graph

4 Commits

Author SHA1 Message Date
vasilito 0046efb009 sync in-house crate versions to 0.3.0 and bump kernel/relibc/syscall submodules 2026-07-08 18:34:22 +03:00
vasilito f79954e2bc USB: comprehensive hotplug with Linux 7.1 port event state machine
Cross-referenced with Linux 7.1 drivers/usb/core/hub.c:
- hub_port_debounce() (line 4698): 25ms-step debounce algorithm
  with 100ms stable threshold, 2000ms timeout per USB 2.0 §7.1.7.3
- hub_port_connect_change() (line 5055): connect/disconnect dispatch
- hub_irq() / port_event(): interrupt-driven change detection

PortState enum (replaces ad-hoc bool tracking):
  Disconnected → DebouncingConnect → Connected → Active → Disconnected

Debounce: stable_start timestamp, 4x 25ms checks for 100ms
stable window.  Connection drop during debounce → reset.
Timeout after 2000ms → warn + remove.

Phase-based main loop:
  Phase 1: scan controllers/ports → detect new connections
  Phase 2: debounce + state transitions per port
    - DebouncingConnect: check stability against stable_start
    - Connected: read descriptors → find_driver → spawn
    - Active: check driver exit (try_wait) + disconnect detection
  Phase 3: cleanup (remove disconnected, time out stale debounces)

Driver re-enumeration on crash: Active → Connected transition
on driver exit re-triggers descriptor read + spawn.

read_port_connected() uses XhciClientHandle open success as
connectivity check (lighter than full descriptor read).
2026-07-07 16:04:28 +03:00
vasilito 0d494d8e89 USB: comprehensive hotplug — extended driver map, recursive port scanning
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
2026-07-07 16:00:24 +03:00
vasilito 777a2c71d3 USB: redbear-usb-hotplugd — auto-spawn class drivers on device connect
Cross-referenced with Linux 7.1 drivers/usb/core/hub.c port event
handling and drivers/usb/core/driver.c device-driver binding.

New daemon (216 lines) that watches USB controllers for device
attachment/detachment and auto-spawns the appropriate class driver.

Architecture:
- Polls /scheme/usb/ every 1000ms for controller directories
- For each controller, enumerates root hub ports
- Reads device descriptors (class/subclass/protocol) via XhciClientHandle
- Maps class to driver binary: HID(0x03)→usbhidd, Storage(0x08)→usbscsid,
  Hub(0x09)→usbhubd
- Spawns driver with <scheme> <port> <protocol> arguments
- Tracks spawned Child processes in HashMap<port_path, TrackedDevice>
- Detects disconnection (descriptor read fails) → kills driver + removes
  from tracking
- Detects driver exit (try_wait) → removes from tracking
- Skips hub interfaces (usbhubd handles its own children)

Config:
- Added to redbear-mini.toml (inherited by redbear-full)
- Auto-started via 02_usb_hotplug.service (oneshot_async, after base.target
  and pcid-spawner)

Driver map supports: HID (0x03), Mass Storage (0x08 with BOT protocol),
Hub (0x09). Additional class drivers extendable via DRIVER_MAP constant.
2026-07-07 15:33:42 +03:00