Skip to content

Commit bae50f7

Browse files
committed
usb: consolidate USB VID/PID definitions
These were scattered about and repeated or hard-coded in various places.
1 parent d7869fb commit bae50f7

File tree

5 files changed

+32
-19
lines changed

5 files changed

+32
-19
lines changed

pybricksdev/connections/ev3.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,7 @@
1010
import hid
1111

1212
from pybricksdev.tools import chunk
13-
14-
LEGO_VENDOR_ID = 0x0694
15-
EV3_PRODUCT_ID = 0x0005
16-
EV3_BOOTLOADER_PRODUCT_ID = 0x0006
13+
from pybricksdev.usb import EV3_BOOTLOADER_USB_PID, LEGO_USB_VID
1714

1815

1916
class MessageType(enum.IntEnum):
@@ -70,9 +67,7 @@ def open(self) -> None:
7067
"""
7168
Opens an HID connection to the EV3 bootloader.
7269
"""
73-
self._device.open(
74-
vendor_id=LEGO_VENDOR_ID, product_id=EV3_BOOTLOADER_PRODUCT_ID
75-
)
70+
self._device.open(vendor_id=LEGO_USB_VID, product_id=EV3_BOOTLOADER_USB_PID)
7671

7772
def close(self) -> None:
7873
"""

pybricksdev/connections/lego.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from pybricksdev.connections.pybricks import PybricksHub
1111
from pybricksdev.tools import chunk
12+
from pybricksdev.usb import LEGO_USB_VID
1213

1314
FILE_PACKET_SIZE = 1024
1415
FILE_TRANSFER_SCRIPT = f"""
@@ -77,7 +78,10 @@ async def connect(self, device=None):
7778
port = None
7879
devices = list_ports.comports()
7980
for dev in devices:
80-
if dev.product == "LEGO Technic Large Hub in FS Mode" or dev.vid == 0x0694:
81+
if (
82+
dev.product == "LEGO Technic Large Hub in FS Mode"
83+
or dev.vid == LEGO_USB_VID
84+
):
8185
port = dev.device
8286
break
8387

pybricksdev/dfu.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,23 @@
1616
from pybricksdev import resources
1717
from pybricksdev._vendored import dfu_create, dfu_upload
1818
from pybricksdev.ble.lwp3.bytecodes import HubKind
19+
from pybricksdev.usb import (
20+
LEGO_USB_VID,
21+
MINDSTORMS_INVENTOR_DFU_USB_PID,
22+
SPIKE_ESSENTIAL_DFU_USB_PID,
23+
SPIKE_PRIME_DFU_USB_PID,
24+
)
1925

2026
FIRMWARE_ADDRESS = 0x08008000
2127
FIRMWARE_SIZE = 1 * 1024 * 1024 - 32 * 1024 # 1MiB - 32KiB
22-
LEGO_VID = 0x0694
23-
SPIKE_PRIME_PID = 0x0008
24-
SPIKE_ESSENTIAL_PID = 0x000C
25-
MINDSTORMS_INVENTOR_PID = 0x0011
28+
2629

2730
ALL_PIDS = {
28-
MINDSTORMS_INVENTOR_PID: HubKind.TECHNIC_LARGE,
29-
SPIKE_ESSENTIAL_PID: HubKind.TECHNIC_SMALL,
30-
SPIKE_PRIME_PID: HubKind.TECHNIC_LARGE,
31+
MINDSTORMS_INVENTOR_DFU_USB_PID: HubKind.TECHNIC_LARGE,
32+
SPIKE_ESSENTIAL_DFU_USB_PID: HubKind.TECHNIC_SMALL,
33+
SPIKE_PRIME_DFU_USB_PID: HubKind.TECHNIC_LARGE,
3134
}
32-
ALL_DEVICES = [f"{LEGO_VID:04x}:{pid:04x}" for pid in ALL_PIDS.keys()]
35+
ALL_DEVICES = [f"{LEGO_USB_VID:04x}:{pid:04x}" for pid in ALL_PIDS.keys()]
3336

3437

3538
def _get_dfu_util() -> ContextManager[os.PathLike]:
@@ -165,7 +168,7 @@ def flash_dfu(firmware_bin: bytes, metadata: dict) -> None:
165168
try:
166169
# Determine correct product ID
167170

168-
devices = dfu_upload.get_dfu_devices(idVendor=LEGO_VID)
171+
devices = dfu_upload.get_dfu_devices(idVendor=LEGO_USB_VID)
169172
if not devices:
170173
print(
171174
"No DFU devices found.",
@@ -184,11 +187,11 @@ def flash_dfu(firmware_bin: bytes, metadata: dict) -> None:
184187
exit(1)
185188

186189
# Create dfu file
187-
device = "0x{0:04x}:0x{1:04x}".format(LEGO_VID, product_id)
190+
device = "0x{0:04x}:0x{1:04x}".format(LEGO_USB_VID, product_id)
188191
dfu_create.build(outfile, [[target]], device)
189192

190193
# Init dfu tool
191-
dfu_upload.__VID = LEGO_VID
194+
dfu_upload.__VID = LEGO_USB_VID
192195
dfu_upload.__PID = product_id
193196
dfu_upload.init()
194197
elements = dfu_upload.read_dfu_file(outfile)

pybricksdev/usb/__init__.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# SPDX-License-Identifier: MIT
2+
# Copyright (c) 2025 The Pybricks Authors
3+
4+
# Official LEGO USB identifiers
5+
LEGO_USB_VID = 0x0694
6+
EV3_USB_PID = 0x0005
7+
EV3_BOOTLOADER_USB_PID = 0x0006
8+
SPIKE_PRIME_DFU_USB_PID = 0x0008
9+
SPIKE_ESSENTIAL_DFU_USB_PID = 0x000C
10+
MINDSTORMS_INVENTOR_DFU_USB_PID = 0x0011

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ target-version = ['py38']
7878
[tool.isort]
7979
profile = "black"
8080
src_paths = ["demo", "pybricksdev", "tests"]
81+
known_third_party = ["usb"]
8182

8283
[tool.pytest.ini_options]
8384
asyncio_mode = "strict"

0 commit comments

Comments
 (0)