From d633c69ea5a75b8aba4ab6a1a83a514dd8182e8e Mon Sep 17 00:00:00 2001 From: Edward Viaene Date: Tue, 13 Oct 2026 10:36:17 -0500 Subject: [PATCH 1/3] USB id 1209:EC10 alongside 1209:0001 (docs; detection is by VID) Co-Authored-By: Claude Opus 5.5 --- packages/embeddedci/CHANGELOG.md | 2 ++ packages/embeddedci/README.md | 6 ++++-- .../embeddedci/src/embeddedci/benchpod/transport/serial.py | 6 +++--- packages/embeddedci/tests/test_serial_autodetect.py | 3 ++- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/embeddedci/CHANGELOG.md b/packages/embeddedci/CHANGELOG.md index 0a7c1fb..9400537 100644 --- a/packages/embeddedci/CHANGELOG.md +++ b/packages/embeddedci/CHANGELOG.md @@ -2,6 +2,8 @@ ## 2.12.0 +- Docs: the pod's USB id from firmware 3.9.0 is the pid.codes `1209:EC10` (`1209:0001` on builds + made before EC10 was assigned); auto-detect goes by vendor id `0x1209`, so it finds either. - `BenchPod.usb_network(on=None)`: read the pod's USB network setting (firmware 3.9.0+), or turn the adapter off over the USB link (`False`). Ethernet, Wi-Fi and the cloud get `PodLockedError`; turning it back on is `benchpod usb-network on` on the USB console. diff --git a/packages/embeddedci/README.md b/packages/embeddedci/README.md index 06a0ef6..1033e4a 100644 --- a/packages/embeddedci/README.md +++ b/packages/embeddedci/README.md @@ -195,7 +195,8 @@ explicitly. The pytest plugin does **not** fall back to it (see [pytest plugin]( | `saved` | the default connection `benchpod-cli` saved (`benchpod set-connection`); errors when none is saved | **USB network (firmware 3.9.0 and later).** The STM32 pod's USB port is a composite device -(USB id `1209:0001`; older firmware uses `0483:5740`): the console plus a USB network adapter +(USB id `1209:EC10`, or `1209:0001` on builds made before EC10 was assigned; older firmware +uses `0483:5740`): the console plus a USB network adapter (CDC-NCM) that carries the same JSON API as the LAN. The link is a point-to-point `/30` in `10.237.0.0/16` (the pod is the first address, your computer the second, handed out by the pod's DHCP server). With connection `usb` the SDK first looks at this computer's own interfaces (Linux @@ -229,7 +230,8 @@ console `status`), never from its own version: | | Pod firmware before 3.9.0 | Pod firmware 3.9.0 and later | |---|---|---| | **This SDK (2.12.0+)** | As before: `usb` is the console (status, ping, LA voltage, target power); the rest needs the network or the cloud. Console auto-detect still finds `0483:5740` and `2E8A`. | `usb` is the full API over the USB network adapter when it is up. When USB networking is off (Wi-Fi configured) or down, it is the full API over the pod's Ethernet or Wi-Fi address from its console status, when this computer reaches it (logged as a warning; the pod's external LAN policy applies there; `transport.usb_lan_fallback` says why); else the console. | -| **An older SDK (2.11.x)** | Unchanged. | `usb` is the console: its auto-detect probes every USB serial port, so it finds a 3.9.0 pod under its new USB id `1209:0001` (tested). Status and ping work; LA voltage and target power, which 3.9.0 moved to the JSON API, fail with the pod's "moved to the network API ... update" line. A network address or `embeddedci:` works fully. | +| **An older SDK (2.11.x)** | Unchanged. | `usb` is the console: its auto-detect probes every USB serial port, so it finds a 3.9.0 pod under its new USB id `1209:EC10` or `1209:0001` (tested with 0001; it probes by +port, not by product id). Status and ping work; LA voltage and target power, which 3.9.0 moved to the JSON API, fail with the pod's "moved to the network API ... update" line. A network address or `embeddedci:` works fully. | **Several pods on USB.** Auto-detect reads each pod's name (its identity short id, `baea06` for `benchpod-baea06`) from the console's `identity` command. Connection `usb:` opens the pod diff --git a/packages/embeddedci/src/embeddedci/benchpod/transport/serial.py b/packages/embeddedci/src/embeddedci/benchpod/transport/serial.py index 75cad3d..26a7390 100644 --- a/packages/embeddedci/src/embeddedci/benchpod/transport/serial.py +++ b/packages/embeddedci/src/embeddedci/benchpod/transport/serial.py @@ -31,12 +31,12 @@ # the RP2350 pod), 0x0483 (STMicroelectronics, the STM32H563 pod up to firmware # 3.8, which uses ST's stock CDC VID/PID 0483:5740 so the host binds its in-box # driver) and 0x1209 (the STM32H563 pod from firmware 3.9.0: a composite device -# with the CDC-ACM console plus a CDC-NCM network adapter, for now under the -# pid.codes test VID/PID 1209:0001). +# with the CDC-ACM console plus a CDC-NCM network adapter: pid.codes 1209:EC10, or +# the pid.codes test id 1209:0001 on builds made before EC10 was assigned). # # None of these ids is exclusive to a bench pod (0x2E8A is shared with the # CMSIS-DAP probe's CDC, 0483:5740 with every ST Virtual COM Port on the bench -# and 1209:0001 is a shared test id), so they only ORDER the ports to probe. +# and 0x1209 is every pid.codes device), so they only ORDER the ports to probe. # Identification is by probing for BENCHPOD_MARKER, never by vendor id alone. POD_VIDS = (0x2E8A, 0x0483, 0x1209) RP_VID = 0x2E8A # deprecated alias, kept for callers that imported it diff --git a/packages/embeddedci/tests/test_serial_autodetect.py b/packages/embeddedci/tests/test_serial_autodetect.py index fdf30f4..c1a4917 100644 --- a/packages/embeddedci/tests/test_serial_autodetect.py +++ b/packages/embeddedci/tests/test_serial_autodetect.py @@ -94,7 +94,8 @@ def test_finds_stm32_pod_under_st_vendor_id(monkeypatch): def test_pid_codes_vendor_id_ranks_as_a_pod_port(monkeypatch): - # Firmware 3.9.0 enumerates as 1209:0001 (console + USB network adapter). It ranks with the + # Firmware 3.9.0 enumerates as 1209:EC10 (1209:0001 on test builds; console + USB network + # adapter). Any pid.codes product id (VID 0x1209) ranks with the # other pod vendor ids, ahead of an unknown port, but is still identified by probing. infos = [PortInfo("/dev/cu.aaa-other", vid=0x1234), PortInfo("/dev/cu.zzz-pod", vid=0x1209)] opened = install(monkeypatch, infos, {"/dev/cu.aaa-other": "not a pod\n> ", From 677934f20c7a34af1cadd234cfb1ea39ab4276c5 Mon Sep 17 00:00:00 2001 From: Edward Viaene Date: Tue, 13 Oct 2026 10:42:15 -0500 Subject: [PATCH 2/3] 3.9.0 keeps ST's USB id 0483:5740: docs and comments Co-Authored-By: Claude Opus 5.5 --- packages/embeddedci/CHANGELOG.md | 6 +++--- packages/embeddedci/README.md | 12 +++++++----- .../src/embeddedci/benchpod/transport/serial.py | 9 ++++----- packages/embeddedci/tests/test_serial_autodetect.py | 4 ++-- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/packages/embeddedci/CHANGELOG.md b/packages/embeddedci/CHANGELOG.md index 9400537..39933ba 100644 --- a/packages/embeddedci/CHANGELOG.md +++ b/packages/embeddedci/CHANGELOG.md @@ -2,8 +2,8 @@ ## 2.12.0 -- Docs: the pod's USB id from firmware 3.9.0 is the pid.codes `1209:EC10` (`1209:0001` on builds - made before EC10 was assigned); auto-detect goes by vendor id `0x1209`, so it finds either. +- Firmware 3.9.0 keeps ST's USB id `0483:5740` (pre-release builds used `1209:0001`); auto-detect + ranks both vendor ids. Docs: Windows computers with ST's VCP driver installed. - `BenchPod.usb_network(on=None)`: read the pod's USB network setting (firmware 3.9.0+), or turn the adapter off over the USB link (`False`). Ethernet, Wi-Fi and the cloud get `PodLockedError`; turning it back on is `benchpod usb-network on` on the USB console. @@ -42,7 +42,7 @@ pods raise `ConnectionConfigError` listing both, and the same pod seen on two ports (macOS `/dev/cu.*` and `/dev/tty.*`) counts once. The selected pod then upgrades to its USB network as with `usb`. `autodetect_port(name="")` takes the name. -- USB auto-detect ranks the new USB id `1209:0001` (firmware 3.9.0) with the older pod ids; a pod +- USB auto-detect ranks the pre-release 3.9.0 USB id `1209:0001` with the older pod ids; a pod is still identified by probing its console. - The console's text `status` parses the `usb` line into the JSON status's shape: `{"net": "on"|"off", "link": bool, "ip": ..., "host_ip": ...}`. diff --git a/packages/embeddedci/README.md b/packages/embeddedci/README.md index 1033e4a..6d4ca05 100644 --- a/packages/embeddedci/README.md +++ b/packages/embeddedci/README.md @@ -195,8 +195,7 @@ explicitly. The pytest plugin does **not** fall back to it (see [pytest plugin]( | `saved` | the default connection `benchpod-cli` saved (`benchpod set-connection`); errors when none is saved | **USB network (firmware 3.9.0 and later).** The STM32 pod's USB port is a composite device -(USB id `1209:EC10`, or `1209:0001` on builds made before EC10 was assigned; older firmware -uses `0483:5740`): the console plus a USB network adapter +(ST's USB id `0483:5740`, as on older firmware; pre-release 3.9.0 builds used `1209:0001`): the console plus a USB network adapter (CDC-NCM) that carries the same JSON API as the LAN. The link is a point-to-point `/30` in `10.237.0.0/16` (the pod is the first address, your computer the second, handed out by the pod's DHCP server). With connection `usb` the SDK first looks at this computer's own interfaces (Linux @@ -214,7 +213,11 @@ macOS under a locked screen); it logs which one it picked. An explicit device pa The USB network adapter works with the in-box drivers of macOS, Linux and Windows 11 (tested). Windows 10 (1903 or newer) is supported but not tested: if the adapter shows up without a driver, -update its driver in Device Manager and pick "UsbNcm Host Device". +update its driver in Device Manager and pick "UsbNcm Host Device". On a Windows computer with +ST's Virtual COM Port driver installed, that driver can claim the whole pod (it keeps ST's id +`0483:5740`), which then shows up as one COM port without the network adapter: uninstall the +driver for the pod in Device Manager (steps in the firmware's `docs/usb-serial-interface.md`, +"Windows with ST's VCP driver"), or use Ethernet. **Turning the adapter off.** The pod keeps a USB network setting, on by default and separate from its external LAN policy. `bp.usb_network()` reads it (`True` = on) over any connection; @@ -230,8 +233,7 @@ console `status`), never from its own version: | | Pod firmware before 3.9.0 | Pod firmware 3.9.0 and later | |---|---|---| | **This SDK (2.12.0+)** | As before: `usb` is the console (status, ping, LA voltage, target power); the rest needs the network or the cloud. Console auto-detect still finds `0483:5740` and `2E8A`. | `usb` is the full API over the USB network adapter when it is up. When USB networking is off (Wi-Fi configured) or down, it is the full API over the pod's Ethernet or Wi-Fi address from its console status, when this computer reaches it (logged as a warning; the pod's external LAN policy applies there; `transport.usb_lan_fallback` says why); else the console. | -| **An older SDK (2.11.x)** | Unchanged. | `usb` is the console: its auto-detect probes every USB serial port, so it finds a 3.9.0 pod under its new USB id `1209:EC10` or `1209:0001` (tested with 0001; it probes by -port, not by product id). Status and ping work; LA voltage and target power, which 3.9.0 moved to the JSON API, fail with the pod's "moved to the network API ... update" line. A network address or `embeddedci:` works fully. | +| **An older SDK (2.11.x)** | Unchanged. | `usb` is the console: its auto-detect probes every USB serial port, so it finds a 3.9.0 pod (same USB id `0483:5740`; tested). Status and ping work; LA voltage and target power, which 3.9.0 moved to the JSON API, fail with the pod's "moved to the network API ... update" line. A network address or `embeddedci:` works fully. | **Several pods on USB.** Auto-detect reads each pod's name (its identity short id, `baea06` for `benchpod-baea06`) from the console's `identity` command. Connection `usb:` opens the pod diff --git a/packages/embeddedci/src/embeddedci/benchpod/transport/serial.py b/packages/embeddedci/src/embeddedci/benchpod/transport/serial.py index 26a7390..dcadf86 100644 --- a/packages/embeddedci/src/embeddedci/benchpod/transport/serial.py +++ b/packages/embeddedci/src/embeddedci/benchpod/transport/serial.py @@ -28,11 +28,10 @@ from .base import RawLink, Transport # USB vendor ids a bench-pod console enumerates under: 0x2E8A (Raspberry Pi, -# the RP2350 pod), 0x0483 (STMicroelectronics, the STM32H563 pod up to firmware -# 3.8, which uses ST's stock CDC VID/PID 0483:5740 so the host binds its in-box -# driver) and 0x1209 (the STM32H563 pod from firmware 3.9.0: a composite device -# with the CDC-ACM console plus a CDC-NCM network adapter: pid.codes 1209:EC10, or -# the pid.codes test id 1209:0001 on builds made before EC10 was assigned). +# the RP2350 pod), 0x0483 (STMicroelectronics: the STM32H563 pod, which uses ST's +# stock CDC VID/PID 0483:5740 on every firmware, from 3.9.0 as a composite device +# with the CDC-ACM console plus a CDC-NCM network adapter) and 0x1209 (pre-release +# 3.9.0 builds, under the pid.codes test id 1209:0001). # # None of these ids is exclusive to a bench pod (0x2E8A is shared with the # CMSIS-DAP probe's CDC, 0483:5740 with every ST Virtual COM Port on the bench diff --git a/packages/embeddedci/tests/test_serial_autodetect.py b/packages/embeddedci/tests/test_serial_autodetect.py index c1a4917..90be1be 100644 --- a/packages/embeddedci/tests/test_serial_autodetect.py +++ b/packages/embeddedci/tests/test_serial_autodetect.py @@ -94,8 +94,8 @@ def test_finds_stm32_pod_under_st_vendor_id(monkeypatch): def test_pid_codes_vendor_id_ranks_as_a_pod_port(monkeypatch): - # Firmware 3.9.0 enumerates as 1209:EC10 (1209:0001 on test builds; console + USB network - # adapter). Any pid.codes product id (VID 0x1209) ranks with the + # Pre-release 3.9.0 builds enumerated as 1209:0001 (console + USB network adapter); any + # pid.codes product id (VID 0x1209) ranks with the # other pod vendor ids, ahead of an unknown port, but is still identified by probing. infos = [PortInfo("/dev/cu.aaa-other", vid=0x1234), PortInfo("/dev/cu.zzz-pod", vid=0x1209)] opened = install(monkeypatch, infos, {"/dev/cu.aaa-other": "not a pod\n> ", From f3742976cb44634f58868e5957798b18da10ecca Mon Sep 17 00:00:00 2001 From: Edward Viaene Date: Tue, 13 Oct 2026 10:49:21 -0500 Subject: [PATCH 3/3] Drop the ST VCP driver note Only Windows 10 and later are supported, where the in-box driver serves 0483:5740 and ST's separate VCP package (a Windows 7/8 driver) is not needed. Co-Authored-By: Claude Opus 5.5 --- packages/embeddedci/CHANGELOG.md | 2 +- packages/embeddedci/README.md | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/embeddedci/CHANGELOG.md b/packages/embeddedci/CHANGELOG.md index 39933ba..edf9afc 100644 --- a/packages/embeddedci/CHANGELOG.md +++ b/packages/embeddedci/CHANGELOG.md @@ -3,7 +3,7 @@ ## 2.12.0 - Firmware 3.9.0 keeps ST's USB id `0483:5740` (pre-release builds used `1209:0001`); auto-detect - ranks both vendor ids. Docs: Windows computers with ST's VCP driver installed. + ranks both vendor ids. - `BenchPod.usb_network(on=None)`: read the pod's USB network setting (firmware 3.9.0+), or turn the adapter off over the USB link (`False`). Ethernet, Wi-Fi and the cloud get `PodLockedError`; turning it back on is `benchpod usb-network on` on the USB console. diff --git a/packages/embeddedci/README.md b/packages/embeddedci/README.md index 6d4ca05..1218e7f 100644 --- a/packages/embeddedci/README.md +++ b/packages/embeddedci/README.md @@ -213,11 +213,7 @@ macOS under a locked screen); it logs which one it picked. An explicit device pa The USB network adapter works with the in-box drivers of macOS, Linux and Windows 11 (tested). Windows 10 (1903 or newer) is supported but not tested: if the adapter shows up without a driver, -update its driver in Device Manager and pick "UsbNcm Host Device". On a Windows computer with -ST's Virtual COM Port driver installed, that driver can claim the whole pod (it keeps ST's id -`0483:5740`), which then shows up as one COM port without the network adapter: uninstall the -driver for the pod in Device Manager (steps in the firmware's `docs/usb-serial-interface.md`, -"Windows with ST's VCP driver"), or use Ethernet. +update its driver in Device Manager and pick "UsbNcm Host Device". **Turning the adapter off.** The pod keeps a USB network setting, on by default and separate from its external LAN policy. `bp.usb_network()` reads it (`True` = on) over any connection;