在 Linux SBC 上使用 espctl 进行逻辑分析
将 ESP32-S3 变身为协议级逻辑分析仪,直接在 Linux SBC 上运行 PulseView 或 sigrok-cli,
并通过 18 款 AI 编码助手驱动构建和采集——一切只需一个 espctl 二进制文件,体积不足
15 MB,无运行时依赖,可在 x86_64、ARM64、ARMv7 和 RISC-V Linux 上原样运行。
为何选择 Linux SBC 作为调试主机
Raspberry Pi 4、OrangePi 5 或任何运行主流 Linux 发行版的 RISC-V 开发板,一旦摆脱“必须花 200 美元以上买台桌面机“的固有观念,就是一台称职的逻辑分析工作站:
- PulseView 和 sigrok-cli 在各大发行版中均有打包的 ARM64 和 ARMv7 构建
(Debian/Ubuntu/Raspbian 上
apt install pulseview sigrok-cli即可)。 - ESP32-S3 分析仪与 SBC 主机之间的 USB 连接对采集延迟几乎无影响——SUMP 样本上传受 SRAM 大小限制,而非 USB 带宽。
espctl是一个静态链接的单一二进制文件。复制过去,chmod +x,即可使用。 SBC 上无需 pip、npm、Rust 工具链或 ESP-IDF。
espctl 在 Linux SBC 上安装——一行命令搞定
# ARM64 / RISC-V / x86_64 — 同一条命令
curl https://esphome.cloud/espctl/install.sh | sh
安装程序自动检测架构,下载对应二进制,并放入 ~/.local/bin。在全新的
Raspberry Pi OS Lite 上,整个过程不超过 10 秒。
验证:
espctl version
# espctl 1.x.x linux/arm64
espctl 通过 HTTPS 连接远程构建农场——SBC 只需出站 443 端口,其余一概不需要。 构建工具链(ESP-IDF、arm-none-eabi-gcc、Rust 交叉编译)完全运行在农场端。
第一步 — 向固件添加 sigrok 组件
在 esphome.cloud 向导中,打开您的 ESP32-S3 项目并添加 Sigrok 逻辑分析仪组件。 也可直接在项目配置中添加:
{
"target": "esp32s3",
"components": ["sigrok"]
}
固件硬性参数(编译时固定):
| 参数 | 值 |
|---|---|
| 通道数 | 8(固定) |
| 默认采样率 | 1 MHz |
| 最大采样率 | 10 MHz |
| 采集缓冲深度 | 约 32 K 样本 |
| 触发模式 | 立即触发、模式匹配(可选边沿检测) |
采样率运行时可调(PulseView / sigrok-cli 通过 SUMP 协议下发请求采样率); 通道数和缓冲深度是编译时固定的,运行时无法改。目前没有 PSRAM 扩展 路径、没有 16 通道模式、也没有预触发比例配置字段。
该组件目前只在 ESP32-S3 上验证过;采集核心利用 S3 的并行 GPIO 采样 能力(单 CPU 周期读 8 个 GPIO)。C3/C6 在硬件上能跑低通道数低速 SUMP 设备,但 sigrok 固件本身没有移植到这些目标。完整硬件能力对比见 PulseView 与 Sigrok 固件。
第二步 — 从 SBC 构建并烧录
# 远程构建——SBC 上无需本地 ESP-IDF
espctl build . --target esp32s3
# 通过 USB 烧录
espctl flash build/flash_bundle.tar.gz
热缓存下构建时间通常不超过 30 秒。SBC 仅充当协调者,所有编译均在远程农场完成。 构建期间 SBC 的 RAM 使用量低于 50 MB。
第三步 — 连接 PulseView 或 sigrok-cli
将烧录好的 ESP32-S3 插入 SBC 的 USB 口,它会显示为 /dev/ttyACM0(或类似设备名)。
验证设备识别:
sigrok-cli --driver=ols:conn=/dev/ttyACM0 --scan
# Found: ESP32-S3 sigrok, 8 channels, max 10 MHz
启动 PulseView:
pulseview &
在 PulseView 中:文件 → 连接设备 → OLS → /dev/ttyACM0 → 扫描。设备将以 配置的通道数和采样率上限显示。
使用 sigrok-cli 进行无界面采集(无需显示器):
# 以 1 MHz 采集 100 K 样本,保存为 sigrok 会话文件
sigrok-cli \
--driver=ols:conn=/dev/ttyACM0 \
--config samplerate=1MHz \
--samples 100000 \
--output-format srzip \
--output-file capture.sr
# 采集后立即解码 I2C
sigrok-cli \
--driver=ols:conn=/dev/ttyACM0 \
--config samplerate=4MHz \
--samples 50000 \
--protocol-decoder i2c:scl=0:sda=1 \
--protocol-decoder-annotation i2c:address-read,address-write,data-read,data-write
在没有显示器的 SBC 上,无界面 sigrok-cli 尤为实用——将输出重定向到文件,
通过 ssh 远程进入 SBC 检查采集结果。
触发模式
触发是运行时配置(通过 SUMP 协议从 PulseView / sigrok-cli 发给固件), 不是构建期的 JSON 字段。固件实现两种模式:
| 模式 | 说明 |
|---|---|
| 立即 | arm 后立即开始;没有预触发 |
| 模式匹配 | 当 (样本 & mask) == value 时触发;若打开边沿检测,只在状态转入该值时触发(即用模式匹配模拟边沿触发) |
预触发 / 后触发样本数也通过 SUMP 协议运行时下发 —— 主机端告诉固件 “采集完成后还要再多收 N 个样本”,余下的缓冲容量留给预触发。它不是 配置文件字段。
sigrok-cli 和 PulseView 把上面两条折射成 UI 上的 “Trigger when this pattern matches” 开关 + “Detect edges” 选项 + 数字滑块,与底层的 对应关系由 OLS/SUMP 驱动负责。
协议解码器
PulseView 和 sigrok-cli 通过 libsigrokdecode 提供 131 个协议解码器。 以下六个已与 ESP32-S3 sigrok 组件进行端到端验证:
| 协议 | 典型用途 | PulseView 中的解码器名称 |
|---|---|---|
| I2C | 传感器总线(BME280、SHT4x、MPU-6050) | i2c |
| UART | 串口调试输出、GPS NMEA、AT 命令 | uart |
| SPI | Flash、显示屏、DAC | spi |
| 1-Wire | DS18B20 温度传感器 | onewire |
| WS2812 | RGB LED 灯带 | ws2812 |
| IR (NEC) | 遥控器、红外接收器 | ir_nec |
其余 125 个解码器(CAN、LIN、I2S、PWM、JTAG、SMBus 等)只要协议在通道数和 采样率限制内均可使用。
SBC 上的 AI 助手集成
espctl 内置 MCP 服务器。在 SBC 上启动后,将任意受支持的 AI 编码助手指向它——
助手即可通过云端提供的同款 42 个 MCP 工具触发构建、读取日志、下载固件,并与
sigrok 组件交互。
# 在 SBC 上启动 MCP 服务器
espctl mcp serve
获取安装代码片段
每款受支持的助手均可通过 install:// MCP 资源获取开箱即用的配置片段。
在任意 MCP 会话中获取:
resources/read install://<agent-slug>
例如,install://claude-code 返回可直接粘贴到 .claude/settings.json 的
JSON 块,无需手动编写配置。
支持的助手(18 款,均含安装片段)
| 助手 | 片段地址 | 备注 |
|---|---|---|
| Claude Code | install://claude-code | |
| Cursor | install://cursor | |
| Claude Desktop | install://claude-desktop | |
| Codex CLI | install://codex | |
| OpenCode | install://opencode | |
| DeepSeek-TUI | install://deepseek-tui | |
| Oh My Pi | install://oh-my-pi | |
| AstrBot | install://astrbot | |
| nanobot | install://nanobot | |
| Reasonix | install://reasonix | |
| Langcli | install://langcli | |
| Kilo Code | install://kilo-code | |
| WorkBuddy | install://workbuddy | |
| Deep Code | install://deep-code | |
| Hermes | install://hermes | |
| Crush | install://crush | |
| GitHub Copilot | install://github-copilot | VS Code 扩展 |
| OpenClaw | install://openclaw |
另有两款助手(GitHub Copilot CLI、Pi)提供替代连接方式的文档,请参阅各自的客户端页面。
示例:在 Raspberry Pi 4 上使用 Claude Code
// ~/.claude/settings.json
{
"mcpServers": {
"esp-idf": {
"command": "espctl",
"args": ["mcp", "serve"]
}
}
}
配置完成后,运行在 Pi 上的 Claude Code 可以:
- 调用
build在修改 sigrok 通道配置后编译新固件 - 调用
logs.tail流式获取构建输出 - 调用
flash.run将新固件烧录到已连接的 ESP32-S3 - 如将
sigrok-cli输出管道到 MCPartifacts接口,还可读取采集结果
SBC 硬件上的资源占用
espctl 专为最小实用 SBC 设计,可舒适运行:
| 操作 | SBC RAM 占用 | CPU 使用率(峰值) | 磁盘 |
|---|---|---|---|
espctl mcp serve(空闲) | < 20 MB | < 1% | 0 |
espctl build .(仅协调者) | < 50 MB | < 5% | ~30 MB 临时 |
espctl flash | < 30 MB | < 10% | 0 |
espctl monitor | < 20 MB | < 2% | 0 |
构建工具链从不在 SBC 上运行——所有编译均在远程农场完成。
Raspberry Pi Zero 2 W(512 MB RAM)可在运行 espctl mcp serve 的同时
执行 sigrok-cli 采集,不会触发内存压力。
已测试的 SBC 硬件:
| 开发板 | 架构 | RAM | 支持情况 |
|---|---|---|---|
| Raspberry Pi 4 / 5 | ARM64 | 2–8 GB | 完整工作流 |
| Raspberry Pi Zero 2 W | ARM64 | 512 MB | 完整工作流 |
| OrangePi 5 | ARM64 | 4–16 GB | 完整工作流 |
| BeagleBone Black | ARMv7 | 512 MB | 构建 + 烧录 + MCP |
| Milk-V Duo S | RISC-V | 512 MB | 构建 + 烧录 + MCP |
| 通用 ARMv7(任意) | ARMv7 | ≥ 256 MB | 构建 + 烧录 |
推荐 SBC 调试配置
┌──────────────────────────┐
│ Linux SBC(如 Pi 4) │
│ │
│ espctl mcp serve ──────┼──── Claude Code / Cursor / 任意 MCP 助手
│ PulseView / sigrok-cli │
│ │
│ USB 口 1 ──────────────┼──── ESP32-S3(sigrok 分析仪)
│ USB 口 2 ──────────────┼──── ESP32-S3 / STM32(被测设备)
└──────────────────────────┘
一块 ESP32-S3 充当逻辑分析仪,另一块 ESP32-S3(或 STM32,或任意目标)作为被测设备。
SBC 居中,通过 espctl 管理构建,通过 sigrok-cli / PulseView 完成采集。
参见
- PulseView 与 Sigrok 固件 — sigrok 固件参考页,含完整命令参考(本工作流页的硬件能力以该页为准 ——
dedic_gpio8 通道、10–80 MSa/s、SRAM 32–200 KB)。 - MCP 客户端 — Claude Code — Claude Code MCP 详细配置。
- 构建生命周期 — 远程构建农场工作原理。
- 固件与烧录 — Flash bundle 格式及
espctl flash选项。