CLI reference
benchpod is the command-line tool for driving a pod by hand. It talks to the device over its TCP/JSON API (port 8080) or its USB serial console — GPIO, signal generation, measurement, capture, Wi-Fi config, and SWD flashing. For automated tests, use the pytest library instead; the CLI is for interactive bring-up and one-off operations.
Install
On macOS and Linux, install from the Homebrew tap:
brew install --cask embeddedci-com/tap/benchpod benchpod --version
brew upgrade --cask benchpod picks up later releases. The macOS binary isn't Apple-notarized, so the cask strips the quarantine flag on install — otherwise Gatekeeper would block the unsigned binary.
Pre-built binaries for macOS, Linux and Windows (amd64 + arm64) are also attached to every GitHub release. On Windows, download the …_Windows_x86_64.zip archive and extract benchpod.exe.
# Or grab the latest binary and put it on your PATH. # The releases/latest/download URL always points at the newest release. # macOS (Apple Silicon) example: curl -fsSL -o benchpod.tar.gz \ https://github.com/embeddedci-com/benchpod-cli/releases/latest/download/benchpod_Darwin_arm64.tar.gz tar -xzf benchpod.tar.gz benchpod sudo mv benchpod /usr/local/bin/
If you fetch the archive with a browser (rather than curl/Homebrew), clear the quarantine flag once with xattr -d com.apple.quarantine ./benchpod, or run it from the terminal. Flashing also needs OpenOCD — see Flashing below.
Connection
The global --connection flag is the single place that says where and how to reach the pod; the transport is inferred from its value.
--connection value | Transport |
|---|---|
192.168.1.5[:8080] | TCP/JSON API (an address ⇒ Wi-Fi/network) |
/dev/tty…, COM3 | USB serial console, explicit device path |
serial | USB serial console, auto-detected by USB VID |
| (omitted) | the default saved by benchpod set-connection |
Every flag is also settable via a BENCHPOD_* environment variable (e.g. BENCHPOD_CONNECTION=serial), with precedence flag > env > saved default.
Commands
# Save a default connection so later commands can omit --connection: benchpod set-connection 192.168.1.5 benchpod set-connection serial # Reachability / state: benchpod ping benchpod status
# Digital IO and signals: benchpod set-gpio PIN STATE benchpod step-gpio benchpod generate ... # DAC waveform benchpod measure ... # ADC read benchpod capture ... # scope capture benchpod stream ... # continuous capture benchpod test ... # Wi-Fi (always over the USB serial console): benchpod set-wifi benchpod show-wifi benchpod clear-wifi # Firmware: benchpod flash ... # SWD via OpenOCD's CMSIS-DAP backend benchpod bootsel # serial console only # Cloud auth (optional): benchpod login [--server-url https://www.embeddedci.com] benchpod register ...
Run benchpod <command> -h for the flags of any subcommand.
Flashing (CMSIS-DAP)
flash always drives host-side OpenOCD — the pod holds no flash intelligence and OpenOCD's exit code is the verdict. The pod runs a CMSIS-DAP processor locally and OpenOCD's cmsis-dap TCP backend ships whole DAP transfers, so a flash is one round-trip per DAP command instead of thousands of per-bit round-trips — fast even over the network. It works over TCP and serial, and needs a recent OpenOCD with the cmsis_dap_tcp backend (post-0.12.0; e.g. brew install --HEAD open-ocd). The CLI checks for the backend up front and fails with clear advice if it's missing.
Cloud auth
Direct firmware commands are unauthenticated and send no tokens — they assume a trusted local network.benchpod login (device-login flow) and benchpod register authenticate with embeddedci-server for cloud features such as driving a named device or registering a new pod. See Security & trusted repos for the model.
benchpod register --connection <pod-ip>— claim a pod into your org, then name it on the BenchPod page.benchpod login— authenticate the CLI for cloud operations.