From e8959fa3b705655e987fd6625c0f4079738c752c Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Sat, 1 Aug 2026 18:30:18 -0500 Subject: [PATCH] support current eGPU USB ID --- selfdrive/modeld/usbgpu_link.py | 4 ++-- system/hardware/tests/test_usb.py | 12 ++++++++++++ system/hardware/usb.py | 3 ++- tinygrad_repo/tinygrad/runtime/ops_amd.py | 2 +- tinygrad_repo/tinygrad/runtime/support/usb.py | 4 ++-- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/selfdrive/modeld/usbgpu_link.py b/selfdrive/modeld/usbgpu_link.py index c7ab4996b..7517ef305 100644 --- a/selfdrive/modeld/usbgpu_link.py +++ b/selfdrive/modeld/usbgpu_link.py @@ -2,7 +2,7 @@ import time from pathlib import Path from openpilot.common.swaglog import cloudlog -from openpilot.system.hardware.usb import CHESTNUT_PRODUCT_ID, CHESTNUT_VENDOR_ID, controller, read_int, usb_devices +from openpilot.system.hardware.usb import CHESTNUT_PRODUCT_ID, CHESTNUT_VENDOR_IDS, controller, read_int, usb_devices STABLE_SECONDS = 2.0 STABLE_THRESHOLD = 5.0 @@ -10,7 +10,7 @@ STABLE_THRESHOLD = 5.0 def _chestnut_portli() -> Path | None: for device in usb_devices(): - if read_int(device / "idVendor", 16) != CHESTNUT_VENDOR_ID or \ + if read_int(device / "idVendor", 16) not in CHESTNUT_VENDOR_IDS or \ read_int(device / "idProduct", 16) != CHESTNUT_PRODUCT_ID: continue usb_controller = controller(device) diff --git a/system/hardware/tests/test_usb.py b/system/hardware/tests/test_usb.py index b3f8bbee3..2e3072005 100644 --- a/system/hardware/tests/test_usb.py +++ b/system/hardware/tests/test_usb.py @@ -11,6 +11,18 @@ def test_chestnut_present(tmp_path, monkeypatch): assert usb.chestnut_present() +def test_chestnut_present_with_comma_vendor_id(tmp_path, monkeypatch): + monkeypatch.setattr(usb, "USB_DEVICES_PATH", tmp_path) + device = tmp_path / "1-1" + device.mkdir() + (device / "idVendor").write_text("3801\n") + (device / "idProduct").write_text("0001\n") + + assert usb.read_int(device / "idVendor", 16) in usb.CHESTNUT_VENDOR_IDS + assert usb.usb_devices() == [device] + assert usb.chestnut_present() + + def test_chestnut_absent_for_other_usb_device(tmp_path, monkeypatch): monkeypatch.setattr(usb, "USB_DEVICES_PATH", tmp_path) device = tmp_path / "1-1" diff --git a/system/hardware/usb.py b/system/hardware/usb.py index 7ca43e1fa..0c847b91c 100644 --- a/system/hardware/usb.py +++ b/system/hardware/usb.py @@ -1,6 +1,7 @@ from pathlib import Path CHESTNUT_VENDOR_ID = 0xADD1 +CHESTNUT_VENDOR_IDS = (CHESTNUT_VENDOR_ID, 0x3801) CHESTNUT_PRODUCT_ID = 0x0001 USB_DEVICES_PATH = Path("/sys/bus/usb/devices") @@ -22,7 +23,7 @@ def usb_devices() -> list[Path]: def chestnut_present() -> bool: return any( - read_int(device / "idVendor", 16) == CHESTNUT_VENDOR_ID and + read_int(device / "idVendor", 16) in CHESTNUT_VENDOR_IDS and read_int(device / "idProduct", 16) == CHESTNUT_PRODUCT_ID for device in usb_devices() ) diff --git a/tinygrad_repo/tinygrad/runtime/ops_amd.py b/tinygrad_repo/tinygrad/runtime/ops_amd.py index 775214cb3..e8e3cd69f 100644 --- a/tinygrad_repo/tinygrad/runtime/ops_amd.py +++ b/tinygrad_repo/tinygrad/runtime/ops_amd.py @@ -914,7 +914,7 @@ class USBIface(PCIIface): def __init__(self, dev, dev_id): # pylint: disable=super-init-not-called deadline, visible = time.monotonic() + 5.0, [] while dev_id >= len(visible) and time.monotonic() < deadline: - visible = hcq_filter_visible_devices(USB3.list_devices(0xADD1, 0x0001), "AMD") + visible = hcq_filter_visible_devices(USB3.list_devices(0xADD1, 0x0001) + USB3.list_devices(0x3801, 0x0001), "AMD") if dev_id >= len(visible): time.sleep(0.1) if dev_id >= len(visible): raise RuntimeError(f"AMD:{dev_id} does not exist ({pluralize('device', len(visible))} available)") diff --git a/tinygrad_repo/tinygrad/runtime/support/usb.py b/tinygrad_repo/tinygrad/runtime/support/usb.py index 54562b7a5..77dcfb1a7 100644 --- a/tinygrad_repo/tinygrad/runtime/support/usb.py +++ b/tinygrad_repo/tinygrad/runtime/support/usb.py @@ -212,7 +212,7 @@ class ScsiWriteOp: data:bytes; lba:int=0 # noqa: E702 class CustomASM24Controller: def __init__(self, usb:USB3|None=None): if not usb: - devs = USB3.list_devices(0xADD1, 0x0001) + devs = USB3.list_devices(0xADD1, 0x0001) + USB3.list_devices(0x3801, 0x0001) assert len(devs), "no ASM24 controller found" self.usb = USB3(devs[0][0], 0x81, 0x83, 0x02, 0x04, use_bot=True) else: self.usb = usb @@ -333,7 +333,7 @@ class CustomASM24Controller: class ASM24Controller: def __init__(self, usb:USB3|None=None): if not usb: - devs = USB3.list_devices(0xADD1, 0x0001) + devs = USB3.list_devices(0xADD1, 0x0001) + USB3.list_devices(0x3801, 0x0001) assert len(devs), "no ASM24 controller found" self.usb = USB3(devs[0][0], 0x81, 0x83, 0x02, 0x04, use_bot=bool(getenv("USE_BOT", 0))) else: self.usb = usb