VBUS switch
Between computer and device, up to 20 V and 5 A, both directions, off at power-up.
Why Power-cycle the device from a script, and nothing reaches it until you ask.
B153 · Donguru
Donguru sits between your computer and a device with a USB-C port. A USB 2.0 hub, an STM32G0B1 microcontroller and a set of switches give software full control over the device's power, its USB data lines and its sideband pins. Flashing, logging and power cycling become one cable and a script.
Coming Q1–Q2 2027 on CrowdSupply
draft Copy not yet read by Marketing and PM. Specifications from the datasheet, Preview 0.2, 24 Oct 2026; the PDF is coming.

01Why
A device with a USB-C port usually reaches the bench through several boxes: a cable for USB, an adapter and jumper wires for the serial console, a debug probe, a switchable supply and a meter. Each one is another cable to plug and another thing a test script can't control. Donguru puts all of it in one dongle on the device's own USB-C port, and every part of it answers to software.
It is for everyone who works where code meets hardware: hardware, firmware and software engineers bringing up, debugging, testing and flashing devices with a USB-C port. It fits on a desk, in an automated test bench and on a production line, where the product's own connector becomes its test port.
02Features
Between computer and device, up to 20 V and 5 A, both directions, off at power-up.
Why Power-cycle the device from a script, and nothing reaches it until you ask.
VBUS voltage, current both ways, power, charge and energy totals.
Why See what the device draws while it boots, and log it beside its console.
Voltage, current and power limits that cut VBUS on their own. A cut stays latched until the mode is written again.
Why A script that hangs, or a PD charger that renegotiates to 20 V, can't leave a 5 V device on a voltage it didn't ask for. Design target, to be tested on rev B.
Connect or cut the device's D+/D− without unplugging.
Why The device disappears from the computer and re-enumerates on reconnect, without touching power.
CMSIS-DAP v2 on the plug's SBU pins. Works with probe-rs, OpenOCD and pyOCD.
Why A device with SWD on its sideband pins is flashed and debugged through the same cable that powers it.
UART, I2C, SWD, FDCAN, GPIO and ADC on the plug's SBU pins, at 1.8 or 3.3 V, with switchable pull-ups. UART, I2C and SWD swap their lines for either cable orientation.
Why The orientation is a setting, so a flipped cable is one command instead of re-plugging. Automatic TX/RX flip: tbd
Switchable pull-ups on the plug's CC lines, as a USB-C debug accessory.
Why The device opens its debug path (SWD, a UART) onto the SBU pins with a few comparators or ADC pins. No PD controller needed.
The device under test and the on-board MCU on one cable. Plus adds USB on the header and on the plug's SBU pins.
Why The device's own USB keeps its 480 Mbit/s, and the dongle's control traffic takes little of it.
4 protected GPIO with UART, I2C, SPI, FDCAN and ADC, 3.3 V out, switched VBUS and an isolated relay.
Why The relay presses a reset button, a boot strap or a power key on the device.
A PD controller on each port, each a source or a sink. The PD stack in the firmware is planned for v1.0.
Why A small PD test tool: watch a contract, ask for another voltage, see the meter follow.
Every enable has a pull-down. Plug VBUS, the header's VBUS_SW and the relay are off at power-up, after a reset and while the MCU is halted.
Why The hardware holds the safe state, not the firmware.
Rust library, Python wheel, the dg CLI and the IOWeaver GUI over the same API.
Why Every tool sees the same functions and the same checks, and always matches the firmware.
03Block diagram
The computer talks to the STM32G0B1 through port 1 of the hub. The MCU switches plug VBUS, cuts or connects the device's USB data, drives the sideband pins through a level translator and reads the power meter. Every enable has a pull-down: with the MCU in reset or halted, everything that could reach the device is off.
VBUS passes through a bidirectional load switch with a current shunt, so the computer can power the device or the device can feed the computer. Donguru itself runs from whichever side has VBUS (a diode OR into a 4.5 to 40 V buck converter), so it keeps working while plug VBUS is off, and a self-powered device can keep it alive.
Two assembly variants on the same board. Main covers bench work on one device; Plus adds two more USB ports. The firmware is the same and tells the variant at boot.
| Feature | Main | Plus |
|---|---|---|
| USB 2.0 hub | 2 ports | 4 ports |
| USB to the device (D+/D−), switchable | ✓ | ✓ |
| USB on the 2.54 mm header | — | ✓ |
| USB to the device over SBU, switchable with SBU I/O | — | ✓ |
| VBUS switch, meter, PD on both ports, SBU and header IO, relay, SWD probe | ✓ | ✓ |
04Specifications
Electrical characteristics from the datasheet (Preview 0.2, 24 Oct 2026), preliminary: targets for rev B, nothing measured yet. Where a value is open (tbd), the note gives the limit of the part that sets it; the board's own limit can only be lower. The PDF datasheet is coming.
Stress beyond these may damage the board. They are not operating conditions. The over-voltage values are design targets, to be tested on rev B, including 20 V applied without any PD negotiation (a lab supply, a broken charger), not only after a contract Donguru negotiated itself.
| Parameter | Min | Typ | Max | Unit | Notes |
|---|---|---|---|---|---|
| VBUS, either port | −0.3 | 24 | V | load switch over-voltage cut-off; TVS 22 V standoff; to be tested | |
| VBUS current through the switch | 5 | A | tbd, set by the current limit | ||
| Plug SBU, CC (short to VBUS) | −0.3 | 20 | V | CC/SBU over-voltage protection, part for rev B tbd; to be tested | |
| Plug A2, B2 | −0.3 | 3.6 | V | MCU pins, ESD only | |
| J101 pins 1-4, IO7-IO10 | −0.5 | 5.6 | V | 255 Ω, 5.6 V clamp, 12 V TVS; transients tbd | |
| J101 pins 11, 12, relay | tbd | V | photo-MOS, isolated | ||
| Storage temperature | −40 | 85 | °C | tbd | |
| ESD, external pins | tbd | kV |
| Parameter | Min | Typ | Max | Unit | Notes |
|---|---|---|---|---|---|
| Computer VBUS | 4.5 | 5.0 | 20 | V | above 5.5 V only on request |
| Supply current, Donguru itself | tbd | mA | |||
| SBU level | 1.8 or 3.3 | V | selectable | ||
| Load on J101 pin 5, 3.3 V out | tbd | mA | buck: 600 mA for the whole board | ||
| Operating temperature | 0 | 50 | °C | tbd |
| Parameter | Min | Typ | Max | Unit | Notes |
|---|---|---|---|---|---|
| Voltage | 20 | V | over-voltage cut-off 24 V | ||
| Current, device to computer | 5.5 | A | hardware limit, latch-off; tbd | ||
| Current, computer to device | 5 | A | no hardware limit, short-circuit protected; firmware Auto mode | ||
| On resistance | tbd | mΩ | plus 5 mΩ shunt | ||
| Guard reaction (firmware) | 15 | ms | one ADC update | ||
| Power cycle off time | 0 | 60 | s |
| Parameter | Min | Typ | Max | Unit | Notes |
|---|---|---|---|---|---|
| Current range | −6.6 | 6.6 | A | positive towards the device | |
| Current resolution | 3.2 | mA | 12-bit ADC before oversampling | ||
| Current accuracy after calibration | tbd | % | |||
| Voltage range, computer VBUS | 0 | 23.6 | V | divider ÷7.17 | |
| Voltage resolution | 5.8 | mV | |||
| Voltage accuracy | tbd | % | |||
| Plug VBUS voltage | not measured |
| Parameter | Min | Typ | Max | Unit | Notes |
|---|---|---|---|---|---|
| Level | 1.8 or 3.3 | V | selectable; adjustable range for rev B tbd | ||
| Input high, low | tbd | V | level translator | ||
| Pull-ups | 3.3 | kΩ | to the SBU level, switched | ||
| Path resistance | 5 | Ω | protection; Plus: +6 Ω USB switch | ||
| USB over SBU, Plus | 480 | Mbit/s | hub port 4 |
| Parameter | Min | Typ | Max | Unit | Notes |
|---|---|---|---|---|---|
| Protocol | CMSIS-DAP v2 (bulk), 512-byte packets | ||||
| SWD clock | 3 | MHz | bit-banged; up to 4 MHz SPI-driven, experimental | ||
| Target level | 3.3 | V | 1.8 V targets with rev B tbd |
| Parameter | Min | Typ | Max | Unit | Notes |
|---|---|---|---|---|---|
| Level | 3.3 | V | MCU pins | ||
| Series resistance | 255 | Ω | plus the driver | ||
| Output current, pin shorted | 13 | mA | 3.3 V / 255 Ω | ||
| ADC inputs | 3 | IO7, IO9, IO10; 12 bit, 0-3.3 V | |||
| Relay contact current | tbd | mA | photo-MOS | ||
| Relay contact voltage | tbd | V |
| Parameter | Min | Typ | Max | Unit | Notes |
|---|---|---|---|---|---|
| Ports | 2 | plug SBU (USART3, swapped USART1); J101 IO7 TX, IO8 RX (USART5) | |||
| Baud rate | 4 | 8 M | Bd | 64 MHz / k above 4 MBd: 5.818 M for 6 M asked; set rate is reported | |
| Data bits | 7 | 8 | parity none, even, odd; 1 or 2 stop bits | ||
| Flow control | none (no RTS / CTS pins) | ||||
| TX / RX swap | SBU: follows the cable orientation setting | ||||
| Receive buffer | 8 | KiB | DMA ring, plus 32 chunks of 512 B | ||
| USB serial port (CDC-ACM) | the SBU UART, for terminal programs; planned |
| Parameter | Min | Typ | Max | Unit | Notes |
|---|---|---|---|---|---|
| Ports | 2 | plug SBU (I2C1, SCL / SDA follow the orientation); J101 IO7 SCL, IO8 SDA (I2C3) | |||
| Clock | tbd | 1000 | kHz | standard, fast, fast-mode plus | |
| Level | 1.8 or 3.3 | V | SBU: selectable; J101: 3.3 V | ||
| Pull-ups, SBU | 3.3 | kΩ | to the SBU level, switched | ||
| Pull-ups, J101 | ≈40 | kΩ | MCU's own only; add external ones above 100 kHz | ||
| Addresses | 7 and 10 bit | ||||
| Bus capacitance | tbd | pF |
| Parameter | Min | Typ | Max | Unit | Notes |
|---|---|---|---|---|---|
| Port | 1 | J101: IO7 SCK, IO8 MISO, IO9 MOSI, IO10 CS (SPI1, CS in software) | |||
| Clock, master | tbd | MHz | MCU SPI: up to 32 MHz (64 MHz / 2); 255 Ω and clamps set the limit | ||
| Clock, slave | tbd | MHz | |||
| Modes | 0-3, MSB or LSB first | ||||
| Word size | 4 | 16 | bit |
| Parameter | Min | Typ | Max | Unit | Notes |
|---|---|---|---|---|---|
| Channels | 5 | J101 IO7, IO9, IO10; plug SBU1, SBU2 (MCU side of the translator) | |||
| Input range | 0 | 3.3 | V | ||
| Resolution | 12 | bit | ≈0.8 mV per step before oversampling | ||
| Effective resolution | tbd | bit | |||
| Sample rate, all channels together | tbd | kS/s | MCU ADC: 2.5 MS/s, shared with the power meter | ||
| Accuracy after calibration | tbd | mV | |||
| Source resistance | tbd | kΩ | J101 adds 255 Ω in series |
| Parameter | Min | Typ | Max | Unit | Notes |
|---|---|---|---|---|---|
| GPIO | 8 | J101 IO7-IO10, plug SBU1, SBU2, A2, B2 | |||
| Input high, VIH | 0.7 × VIO | V | MCU pins; SBU through the translator tbd | ||
| Input low, VIL | 0.3 × VIO | V | |||
| Toggle rate from the host | tbd | 1/s | one request per change | ||
| Edge timestamps, inputs | tbd | µs | resolution | ||
| PWM outputs | 3 | J101 IO7 (TIM14); plug SBU1, SBU2 (TIM2) | |||
| PWM resolution | 16 | bit | 64 MHz timer clock | ||
| PWM frequency | tbd | tbd | Hz |
| Parameter | Min | Typ | Max | Unit | Notes |
|---|---|---|---|---|---|
| Ports | 3 | plug SBU (FDCAN1, one orientation); plug A2, B2 and J101 IO7 TX, IO10 RX (FDCAN2) | |||
| Bit rate, arbitration | 1 | Mbit/s | CAN FD | ||
| Bit rate, data phase | tbd | Mbit/s | MCU FDCAN: up to 8 Mbit/s | ||
| Transceiver | none on board: logic-level TX / RX to an external transceiver |
| Parameter | Min | Typ | Max | Unit | Notes |
|---|---|---|---|---|---|
| Controllers | 2 | UCPD1 on the computer port, UCPD2 on the plug | |||
| Power roles | source or sink on each port | ||||
| Messages | PD 3.0 incl. VDM; firmware stack planned for v1.0 | ||||
| Debug-accessory pull-ups | tbd | kΩ | both plug CC lines, switched |
| Parameter | Min | Typ | Max | Unit | Notes |
|---|---|---|---|---|---|
| Speed, external ports | 480 | Mbit/s | USB 2.0 Hi-Speed: 1 port on Main, 3 on Plus | ||
| Speed, the MCU | 12 | Mbit/s | USB Full Speed, hub port 1 | ||
| Connectors | USB-C receptacle (computer), USB-C plug (device) |
Every enable and select line has a pull-down, so while the MCU is in reset, halted by a debugger, or without power, the board falls back to the same safe state.
| Part | State |
|---|---|
| Plug VBUS | off |
| Header VBUS_SW | off |
| Relay | open |
| Device USB data | connected to the hub |
| SBU | to the MCU side, level translator off, pull-ups off, low level selected |
| J101 IO, plug A2/B2 | MCU pins as inputs; with Donguru unpowered a pin driven high reaches its 3.3 V rail through the MCU's clamp diodes and series resistors |
USB-C plugs go in either way round, and the device's CC pins can't tell which: a device has the same 5.1 kΩ pull-down on both. The orientation is a setting instead. FDCAN has a TX pin on SBU2 only, so it works in one orientation.
| Mode | Cable one way | Flipped |
|---|---|---|
| UART | SBU1 TX, SBU2 RX | SBU2 TX, SBU1 RX |
| I2C | SBU1 SCL, SBU2 SDA | SBU1 SDA, SBU2 SCL |
| FDCAN (to a transceiver) | SBU1 RX, SBU2 TX | — (no FDCAN pins for it) |
| SWD host | SBU1 SWCLK, SBU2 SWDIO | SBU1 SWDIO, SBU2 SWCLK |
| GPIO, ADC | both lines | both lines |
05Pinout


| Pin | Signal | Function |
|---|---|---|
| 1 | IO7 | PB3, ADC on PB1; I2C3 SCL, USART5 TX, FDCAN2 TX |
| 2 | IO8 | PB4; I2C3 SDA, USART5 RX |
| 3 | IO9 | PA2, ADC; USART2 TX, SPI1 MOSI |
| 4 | IO10 | PB12, ADC; FDCAN2 RX |
| 5 | 3.3 V out | board 3.3 V |
| 6 | GND | |
| 7 | GND | |
| 8 | USB D+ | hub port 3, Plus |
| 9 | USB D− | hub port 3, Plus |
| 10 | VBUS_SW | computer's VBUS, switched: 5 V, or up to 20 V after PD |
| 11 | RL1 | isolated photo-MOS contact |
| 12 | RL2 |
VBUS_SW (pin 10) is the computer's own VBUS through a switch, off at power-up: 5 V normally, up to 20 V after a PD renegotiation. Turning it on always shows the present voltage, and above 5.5 V needs an explicit confirmation. Relay (pins 11, 12): an isolated photo-MOS contact for a reset button, a boot strap or a power key on the device.
| Pin | Use |
|---|---|
| VBUS | switched, measured, both directions |
| D+/D− (A6/A7) | hub port 2 through the data switch |
| CC, VCONN (A5, B5) | UCPD2: PD; pull-ups for debug-accessory mode |
| SBU1, SBU2 (A8, B8) | UART, I2C, SWD, FDCAN, GPIO, ADC; USB on Plus |
| A2, B2 | GPIO, FDCAN2 |
| Pin | Use |
|---|---|
| VBUS | powers Donguru and the device |
| D+/D− | hub upstream, USB 2.0 Hi-Speed |
| CC1, CC2 | UCPD1: PD, sink or source |
| SBU1, SBU2 | Donguru's own SWD: one Donguru can flash another |
A push button and a slide switch share one ADC input; the firmware decodes presses and their length, and the button can be given an action (power cycle, data reconnect). Holding the button at power-up starts the STM32 USB bootloader for a firmware update without a probe. A red and a green LED show state, and can blink to identify one dongle among several.
Board and enclosure dimensions tbd. A STEP model comes with them.
06Software
The firmware serves a typed WireWeaver API over USB, with a CMSIS-DAP interface for debug tools beside it. The Rust library is generated from the API, and the CLI, the Python wheel and the IOWeaver GUI are built on the library, so every tool sees the same functions and the same checks. A mock Donguru in the library runs test scripts without hardware.
dg device list # every Donguru on USB: serial, path, label, API version
dg info # firmware, board, variant, last reset
dg power status # plug VBUS, header VBUS_SW and the meter in one read
dg power on --trip 1.5A # VBUS to the device, cut above 1.5 A
dg power cycle --off 500ms # off, wait, back on through the same checks
dg power watch --on-change # voltage, current, power as they change
dg power totals # charge and energy since the last reset, mAh / mWh
dg usb disconnect # cut the device's USB data; connect brings it back
dg header relay on # close the isolated relay contact
dg swd memtest --chip STM32G0B1CEUx # check the SWD link at each speed
dg device log --follow # the firmware's log, decoded on the PC
use donguru_core::{Dongle, vbus};
#[tokio::main]
async fn main() -> donguru_core::Result<()> {
let dg = Dongle::open(None).await?; // the one on USB, or as in donguru.toml
dg.plug().set_vbus_mode(vbus::auto(5.5, 1.5)).await?; // cut above 5.5 V or 1.5 A
let r = dg.meter().reading().await?;
println!("{} V, {} A", r.vbus_in, r.current);
Ok(())
}
from donguru import Donguru
dg = Donguru.connect() # first on USB; or Donguru.connect(serial="B153B-042")
dg.plug.vbus_on(max_voltage=5.5, trip_current=1.5)
r = dg.meter.reading()
print(f"{r.vbus_in:.2f} V {r.current * 1000:.0f} mA")
dg.plug.vbus_cycle(off=0.5) # power cycle the device
dg.usb.disconnect(); dg.usb.connect() # make it re-enumerate
dg CLI--format json or jsonl on every command for scripts, and exit codes that tell a refused request from a missing dongle. Completion for bash, zsh and fish. Planned for v1.0: dg uart, dg i2c, dg gpio.
probe-rs uses the probe directly: probe-rs run --chip STM32G0B1CEUx firmware.elf with Donguru plugged in. OpenOCD and pyOCD find it like any other CMSIS-DAP probe.
The GUI for Donguru and rePort: power, the meter, the switches and every bus on one screen, on the desktop or in the browser. Zero setup: Donguru brings up its own small network over USB with a start page, so any browser reaches it with nothing to install.
07Use cases
Bring-up of a device with a USB-C port: its USB, its console and its power on one cable, with the current it draws on the meter.
Flash and debug over SWD on the sideband pins with probe-rs, OpenOCD or pyOCD, and read the UART on the same cable.
Power cycling, current logging and USB re-enumeration from a script, with limits that hold even when the script doesn't.
Test and program the product through its own USB-C connector. One Donguru can flash another through the receptacle's SBU pins.
08FAQ
Both have the VBUS switch, the meter, PD on both ports, SBU and header IO, the relay and the SWD probe. Plus has a 4-port hub instead of 2 ports, and adds USB on the 2.54 mm header and USB to the device over the plug's SBU pins. See Main and Plus.
Not with the default mode. ForceOn keeps plug VBUS on only while the computer's VBUS stays at or below the limit, 5.5 V unless asked for more. The firmware checks the limits about every 15 ms: fast enough for a renegotiation, not a fuse. A short circuit is caught by the load switch itself. This is a design target, to be tested on rev B.
Every enable has a pull-down. Plug VBUS, the header's VBUS_SW and the relay are off; the device's USB data stays connected to the hub. See At reset, halted or unpowered.
Yes. Donguru is a CMSIS-DAP v2 probe on the plug's SBU pins, so probe-rs, OpenOCD and pyOCD find it on USB like any other probe. The SWD clock goes up to 3 MHz bit-banged, and up to 4 MHz SPI-driven as an experiment.
The orientation is a setting, so a flipped cable is one command rather than re-plugging. UART, I2C and SWD swap their lines; FDCAN on SBU works in one orientation only.
No. In debug-accessory mode Donguru pulls both CC pins of the device up. A device recognises that with a few comparators or ADC pins and switches its SWD or UART onto the SBU pins. Devices with a PD controller can be asked the same over PD, with a vendor message.
That is planned: the SBU UART as a standard USB serial port (CDC-ACM), which terminal programs open as /dev/ttyACM0 or COM3 with no Donguru software at all.
No. It runs from whichever side has VBUS, so it keeps working while plug VBUS is off, and a self-powered device can keep it alive.
The baud rate goes up to 8 MBd, with 7 or 8 data bits and no flow control. Receiving runs sustained at 2 MBd (200 kB/s) with any data, without compression, measured on rev A. Above about 2 MBd the firmware compresses what it receives with LZ4 for hosts that support it, so the sustained rate depends on the data; those rates are tbd.
Yes. The library carries a mock Donguru that follows the same rules as the firmware, for Rust tests today and for Python (Donguru.mock()) with the wheel.
Holding the button at power-up starts the STM32 USB bootloader, for a firmware update without a probe.
Donguru is coming in Q1–Q2 2027 on CrowdSupply. The price is not set yet. Get notified and we tell you when the campaign opens.
09Launch
Donguru launches on CrowdSupply, coming Q1–Q2 2027. Until the campaign page is up, write to hello@vhrd.tech and we let you know.
Datasheet
The PDF datasheet is coming. Until then, this page carries its tables: specifications and pinout, from Preview 0.2, 24 Oct 2026.
Ordering
| Part number | Product | Contents |
|---|---|---|
| VHRD-B153 | Donguru Main | Dongle, quick-start card |
| VHRD-B153-PLUS | Donguru Plus | Dongle, quick-start card |