From 5e1bdc12bd298a9751da4285b7e93c68b1314332 Mon Sep 17 00:00:00 2001 From: salmonik Date: Tue, 4 Aug 2026 03:06:06 +0200 Subject: v0.5.10: USB HID mouse via polled xHCI (rsnix/src/usb.rs) Polled xHCI driver (mouse-only): controller bring-up, port reset, enable-slot -> address-device -> config-descriptor walk -> HID boot mouse IN endpoint, one outstanding IN TRB drained on poll. Cursor task polls usb first, PS/2 second. New 'usb'/'usb rescan' shell cmds. Verified in QEMU (q35 + OVMF + qemu-xhci + usb-mouse): movement and all three buttons tracked exactly; heap stays clean. Fixes en route: MaxPorts=HCSPARAMS1[31:24]; operational regs CRCR=0x18 DCBAAP=0x30 CONFIG=0x38; pass input-context ptr in Address-Device; Input Control Context DW0=Drop DW1=Add; HID walker bInterfaceClass at +5; async discovery from cursor task. --- shell/src/lib.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'shell/src') diff --git a/shell/src/lib.rs b/shell/src/lib.rs index 0f5ac4b..c9b7cdd 100644 --- a/shell/src/lib.rs +++ b/shell/src/lib.rs @@ -721,6 +721,7 @@ write `{} TIL `", "stress" => cmd_stress(&parsed), "date" => cmd_date(&parsed), "pci" => cmd_pci(&parsed), + "usb" => cmd_usb(&parsed), "rescan" => cmd_rescan(&parsed), "mouse" => cmd_mouse(&parsed), "cursor" => cmd_cursor(&parsed), @@ -2217,6 +2218,24 @@ fn cmd_pci(p: &Parsed) { pipe.end(); } +fn cmd_usb(p: &Parsed) { + // `usb rescan` clears the failed-port mask so discovery retries. + if p.args.first().is_some_and(|w| w == "rescan") { + rsnix::usb::rescan(); + let mut pipe = Pipeline::new(&p.filters, &p.output); + let _ = pipe.line("usb: rescanning ports"); + pipe.end(); + return; + } + let mut pipe = Pipeline::new(&p.filters, &p.output); + for l in rsnix::usb::diagnose().lines() { + if !pipe.line(l) { + break; + } + } + pipe.end(); +} + fn cmd_poweroff() -> ! { term_println("shutting down..."); rsnix::power::poweroff() -- cgit v1.2.3