This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.
Consider using release 0.1.3 instead.
Reason given by maintainers: README links fixed in 0.1.1
pyusbxpress
Cross-platform Python client for Silicon Labs USBXpress devices (C8051F32x / C8051F34x / C8051F38x) — without the vendor driver.
Silicon Labs' USBXpress host driver (SiUSBXp.sys / SiUSBXp.dll) is
Windows-only and version-fragile, and the wire protocol between the host
driver and the device firmware library is not publicly documented. This
project documents that protocol and provides a small Python client that
talks to USBXpress devices directly over libusb/WinUSB, so the same code
runs on Windows, Linux and macOS.
Disclaimer — this is an unofficial project based on interoperability research. It is not affiliated with or endorsed by Silicon Labs. It contains no Silicon Labs code or binaries; the protocol description was derived from black-box observation and analysis of the behaviour of the device firmware library. "USBXpress" and "Silicon Labs" are trademarks of Silicon Labs, used here only to describe compatibility.
Status
Alpha (v0.1.0). Verified on Windows 10/11 with a C8051F380 target (see
docs/DEVICES.md); Linux/macOS are supported by design (libusb backend) and
reports are welcome.
Install
pip install pyusbxpress
or from a checkout:
pip install -e .
The libusb backend needs a USB driver that lets user space claim the device:
| Platform | Requirement |
|---|---|
| Windows | Bind the device to WinUSB (e.g. with Zadig) — or keep the SiLabs driver and use --backend siusbxp |
| Linux | A udev rule so the device is accessible without root — see docs/LINUX.md |
| macOS | Usually nothing: vendor-specific devices are not claimed by a kernel driver, libusb can use them directly |
Quick start
usbxpress list # list matching devices
usbxpress info # USB info + optional command exchange
usbxpress info --send "01" # send one 64-byte packet, print the answer
usbxpress monitor # print every packet the device sends
usbxpress write --hex "01 55" # send a single packet
As a library:
from usbxpress import UsbXpressDevice
with UsbXpressDevice() as dev: # VID 10C4 / PID EA61 by default
reply = dev.command(b"\x01") # send one packet, wait for a
print(reply.hex(" ")) # packet that starts with 0x01
UsbXpressDevice is deliberately thin: one 64-byte packet per call, plus a
command() helper that skips unsolicited packets (some firmwares emit
periodic heartbeats). The meaning of the packets is up to your device
firmware — see examples/ for a minimal ping and for a complete bootloader
flashing example.
How it works (short version)
USBXpress is a vendor-specific USB device (interface class 0xFF) with
two bulk endpoints (64-byte packets) and a small set of vendor control
requests. The data path stays disabled until the host sends the
DEVICE_OPEN control request — this handshake is the piece that the public
documentation does not describe, and the reason "enumeration works but no
data ever arrives" is a common complaint.
| Direction | Transport |
|---|---|
| host → device | bulk OUT endpoint, 64-byte packets |
| device → host | bulk IN endpoint, 64-byte packets |
| enable/disable data path | vendor control bmRequestType=0x40, bRequest=0x02 with wValue=0x0002 (open) / 0x0004 (close) |
| flush device buffers | same request with wValue=0x0001 |
Full details, including the device-side event bits and the recommended host sequence, are in docs/PROTOCOL.md. The method used to derive the protocol is described in docs/INTERNALS.md.
Backends
| Backend | Platforms | Driver needed | Notes |
|---|---|---|---|
libusb (default) |
Windows, Linux, macOS | WinUSB on Windows; udev rule on Linux | Uses pyusb + libusb-package; no vendor software |
siusbxp |
Windows only | SiLabs USBXpress driver | Uses SiUSBXp.dll through ctypes; the driver performs the open/close handshake itself |
--backend auto (the default) uses libusb when a WinUSB-bound device is
present, and falls back to the SiLabs driver on Windows when it is not.
CLI reference
usbxpress [-h] [--version] {list,info,monitor,write} ...
common options:
--vid HEX vendor ID (default 10c4)
--pid HEX product ID (default ea61)
--index N device index when several are attached
--serial S select by serial string
--backend auto | libusb | siusbxp
--dll PATH SiUSBXp.dll location (siusbxp backend only)
--timeout SEC per-transfer timeout (default 1.0)
list show matching devices and the backend that can see them
info open the device, print USB info; --send HEX performs one exchange
monitor print incoming packets with timestamps; --send HEX [--interval S] repeats a packet
write send one packet: --hex "01 55" | --text "hello" | --file image.bin
Documentation
| File | Contents |
|---|---|
docs/PROTOCOL.md |
The USBXpress wire protocol (requests, endpoints, events, host sequence) |
docs/INTERNALS.md |
How the protocol was derived (reproducible method) |
docs/LINUX.md |
udev rules, permissions, WSL2/usbipd testing recipe |
docs/DEVICES.md |
Devices verified so far, and how to report a new one |
Examples
| File | Contents |
|---|---|
examples/ping.py |
Minimal command/response exchange |
examples/flash_demo.py |
Complete example: flash an Intel HEX image through a bootloader that implements the reference command set (query/erase/write/read/go + validity record) |
Tests
python -m unittest discover -s tests -v
The tests cover the protocol helpers and the packet/response logic with a fake backend; no hardware is required.
License
MIT — see LICENSE.
Metadata
Release files for pyusbxpress 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyusbxpress-0.1.0.tar.gz | 18.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyusbxpress-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 37.1 kB
Release files / pyusbxpress-0.1.0.tar.gz
| Download URL | pyusbxpress-0.1.0.tar.gz |
|---|---|
| Size | 18.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3cb0578f1d8453c80a37a06c4f6f19f93c9b2c9ac713c85616f835ccabe80aca
|
|
BLAKE2b-256 checksum How to use checksums |
7000d6349e6d18d17d6d883ec9785733045aa33c26b0addd98acc215ca93fdba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|
Release files / pyusbxpress-0.1.0-py3-none-any.whl
| Download URL | pyusbxpress-0.1.0-py3-none-any.whl |
|---|---|
| Size | 18.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
10445ca7c235102836ebe5da14bf6ca7c77d8ca42c2193605b29ed8333ff3e20
|
|
BLAKE2b-256 checksum How to use checksums |
a8b6d2e9ac5b1d319513018b82f4d49dbbe7992d6e13894c13c81f378d2185b5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|