本文目标:在 Arduino Uno Q(ARM64)上从零编译 PulseView,解决 USB 权限问题,并用 Sipeed SLogic Combo 8 逻辑分析仪完成实际信号采集测试。
适用同学:需要在 ARM64 Linux 设备上使用逻辑分析仪进行信号采集和协议分析的开发者。
在嵌入式开发中,逻辑分析仪是不可或缺的调试工具。无论是分析数字信号的时序、排查通信协议的异常,还是验证引脚电平的变化,一台逻辑分析仪都能帮你快速定位问题,省去大量盲猜和反复烧录调试的时间。
我手头有一款 Sipeed SLogic Combo 8,体积小巧、功能齐全,最高支持 80MHz 采样率和 8 通道同时采集,对于日常的信号分析和协议解码已经完全够用。既然现在玩 Arduino Uno Q,自然就想把这套逻辑分析环境也迁移到上面,方便随时进行硬件调试和信号捕获。
下面记录一下在 Arduino Uno Q(ARM64)上从零编译 Sipeed 定制版 PulseView、解决 USB 权限问题,以及完成实际信号采集的完整过程。
一、Sipeed SLogic Combo 8 简介
1.1 多合一调试工具
Sipeed SLogic Combo 8 是一款基于 Sipeed M0s Dock 开发的多合一调试工具,集成了四种常用功能:
功能 | 说明 |
逻辑分析仪 | 8 通道,最高 80MHz 采样率,Stream 模式 |
CKLink 调试器 | 支持 RISC-V 芯片调试,JTAG 时钟 16MHz |
DAP-Link 调试器 | ARM 芯片调试 |
USB 转串口 | USB2UART 功能 |
通过板载按键可在四种功能之间切换。本文主要使用其逻辑分析仪功能。
【图片 37a】Sipeed SLogic Combo 8 正面:

【图片 37b】Sipeed SLogic Combo 8 背面:

1.2 逻辑分析仪参数
参数 | 规格 |
通道数 | 8 |
最高采样率 | 80MHz |
传输带宽 | 320Mb/s(Linux)/ 160Mb/s(Windows) |
典型配置 | Linux: 80M@4CH / 40M@8CH |
信号输入范围 | 0 ~ 3.6V |
高电平门限 | VIH > 2.0V |
低电平门限 | VIL < 0.8V |
接口 | USB-C |
1.3 为什么需要自己编译 PulseView?
Sipeed 为其 SLogic 系列逻辑分析仪提供了定制版的 PulseView,集成了 sipeed/libsigrok(slogic-dev 分支)的专用驱动。但 Sipeed 目前只发布了 Windows x86_64 和 Linux x86_64 的预编译包,没有 ARM64(aarch64)版本。
而 Arduino Uno Q 是 ARM64 架构,因此我们必须从 Sipeed 的源码自行编译。
【图片 38】Sipeed 定制版 PulseView 下载页面(仅有 x86_64 版本):

二、从源码编译 PulseView
2.1 编译环境
项目 | 详情 |
编译机器 | my-uno-q.local |
架构 | aarch64 (ARM64) |
操作系统 | Debian 13 (Trixie) |
Qt 版本 | 6.8.2 |
2.2 安装编译依赖
sudo apt update sudo apt install -y build-essential cmake git pkg-config \ libglib2.0-dev libglibmm-2.4-dev \ libboost-dev libboost-filesystem-dev libboost-serialization-dev \ libboost-system-dev qt6-base-dev qt6-svg-dev qt6-tools-dev \ qt6-tools-dev-tools libusb-1.0-0-dev libzip-dev python3-dev \ python3-numpy swig autoconf automake libtool doxygen wget file
2.3 编译 libserialport
cd /tmp git clone --depth 1 git://sigrok.org/libserialport cd libserialport && ./autogen.sh && ./configure --prefix=/usr make -j4 && sudo make install
2.4 编译 libsigrok(Sipeed fork)
这是关键步骤,必须使用 Sipeed 的 fork 才能支持 SLogic Combo 8:
cd /tmp # 如果直连 GitHub 失败,使用代理 git config --global http.proxy http://192.168.1.15:7890 git clone --depth 1 -b slogic-dev https://github.com/sipeed/libsigrok.git git config --global --unset http.proxy cd libsigrok && ./autogen.sh ./configure --prefix=/usr --disable-java --disable-python make -j4 && sudo make install
2.5 编译 libsigrokdecode
cd /tmp git clone --depth 1 git://sigrok.org/libsigrokdecode cd libsigrokdecode && ./autogen.sh && ./configure --prefix=/usr make -j4 && sudo make install
2.6 编译 PulseView
cd /tmp git clone --depth 1 https://github.com/sipeed/pulseview.git cd pulseview && mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DENABLE_DECODE=ON make -j1
编译注意事项:
make -j1 使用单线程编译,避免 Uno Q 的 3.6GB 内存因并行编译而耗尽(OOM)
如果 GitHub clone 失败,使用代理 http://192.168.1.15:7890/
编译时间约 30-60 分钟
编译过程:make -j1 单线程编译约需 30-60 分钟,视 Uno Q 负载情况而定。
2.7 打包为 AppImage
编译完成后,将 PulseView 和所有依赖库打包为 AppImage,实现免安装直接运行:
# 1. 创建 AppDir 目录结构
mkdir -p ~/pulseview-build/AppDir/usr/bin ~/pulseview-build/AppDir/usr/lib
# 2. 复制主程序
cp /tmp/pulseview/build/pulseview ~/pulseview-build/AppDir/usr/bin/
# 3. 复制库文件
cp /usr/lib/libsigrok.so* ~/pulseview-build/AppDir/usr/lib/
cp /usr/lib/libsigrokdecode.so* ~/pulseview-build/AppDir/usr/lib/
cp /usr/lib/libserialport.so* ~/pulseview-build/AppDir/usr/lib/
cp -r /usr/lib/aarch64-linux-gnu/qt6/plugins ~/pulseview-build/AppDir/usr/lib/
# 4. 复制 Qt 依赖库
for lib in $(ldd /tmp/pulseview/build/pulseview | grep "=> /" | awk '{print $3}' | sort -u); do
cp "$lib" ~/pulseview-build/AppDir/usr/lib/ 2>/dev/null || true
done
# 5. 下载 appimagetool
wget -O ~/pulseview-build/appimagetool-aarch64.AppImage \
"https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-aarch64.AppImage"
chmod +x ~/pulseview-build/appimagetool-aarch64.AppImage
# 6. 创建 AppRun 启动脚本
cat > ~/pulseview-build/AppDir/AppRun << 'EOF'
#!/bin/bash
SELF=$(readlink -f "$0")
HERE=${SELF%/*}
export LD_LIBRARY_PATH="${HERE}/usr/lib:${LD_LIBRARY_PATH}"
export QT_PLUGIN_PATH="${HERE}/usr/lib/plugins:${QT_PLUGIN_PATH}"
export QT_QPA_PLATFORM_PLUGIN_PATH="${HERE}/usr/lib/plugins"
exec "${HERE}/usr/bin/pulseview" "$@"
EOF
chmod +x ~/pulseview-build/AppDir/AppRun
# 7. 创建 .desktop 文件
cat > ~/pulseview-build/AppDir/pulseview.desktop << 'EOF'
[Desktop Entry]
Name=PulseView (Sipeed)
Comment=Logic Analyzer GUI
Exec=pulseview
Icon=pulseview
Type=Application
Categories=Development;Electronics;
EOF
# 8. 打包
~/pulseview-build/appimagetool-aarch64.AppImage \
~/pulseview-build/AppDir \
~/PulseView-sipeed-aarch64.AppImage打包完成后,AppImage 文件约 70MB,可直接运行:
~/PulseView-sipeed-aarch64.AppImage --version
验证 sipeed-slogic-analyzer 驱动已启用:
Supported hardware drivers: ... sipeed-slogic-analyzer Sipeed SLogic Analyzer
【图片 40】验证 sipeed-slogic-analyzer 驱动已启用:

三、USB 权限问题与解决
3.1 问题现象
编译完成、启动 PulseView 后,连接 Sipeed SLogic Combo 8,点击"扫描设备"时弹出错误:
sr: usb: Failed to open device: LIBUSB_ERROR_ACCESS.
但 lsusb 可以正常识别设备:
$ lsusb | grep SIPEED Bus 001 Device 007: ID 359f:0300 SIPEED USB TO LA
【图片 41】lsusb 识别设备:

3.2 根本原因
PulseView 通过 libusb 库直接访问 USB 设备。USB 设备插入后由 udev 系统创建对应的设备节点(如 /dev/bus/usb/001/008),默认权限为 root:root 660,只有 root 能读写。而 PulseView 以普通用户(arduino)运行,因此收到 LIBUSB_ERROR_ACCESS(访问被拒绝)。
3.3 创建 udev 规则
【图片 42】udev 规则文件:

为 Sipeed SLogic 设备创建专用规则:
sudo tee /etc/udev/rules.d/50-sipeed-slogic.rules << 'EOF'
# Sipeed SLogic Combo 8 (Logic Analyzer)
SUBSYSTEM=="usb", ATTR{idVendor}=="359f", ATTR{idProduct}=="0300", MODE="0666", GROUP="plugdev"
# Sipeed 其他设备(预留)
SUBSYSTEM=="usb", ATTR{idVendor}=="359f", MODE="0666", GROUP="plugdev"
EOF重新加载规则:
sudo udevadm control --reload-rules sudo udevadm trigger
将用户加入 plugdev 组:
sudo usermod -a -G plugdev $USER
注意:修改用户组后需要重新登录(或重启)才能生效。
3.4 验证权限修复
【图片 43】groups 命令输出,确认包含 plugdev:

$ groups arduino adm dialout sudo audio video plugdev users netdev ...
【图片 44】USB 设备权限已变为 666:

$ ls -la /dev/bus/usb/001/008 crw-rw-rw- 1 root plugdev 189, 6 ... /dev/bus/usb/001/008
【图片 45】PulseView 成功识别 Sipeed SLogic Combo 8:

四、实际测试:捕获 Arduino Uno Q 的 D6 引脚信号
4.1 测试目的
验证 PulseView + SLogic Combo 8 的逻辑分析功能。直接在 Arduino Uno Q 的 D6 引脚输出与板载 LED 同步的高低电平信号,用逻辑分析仪捕获并观察波形。
4.2 接线
逻辑分析仪 | Arduino Uno Q |
CH0 | D6 |
GND | GND |
将逻辑分析仪的 CH0 探针接到 Uno Q 的 D6 引脚,GND 接到 Uno Q 的 GND。
【图片 46】逻辑分析仪连接 Uno Q 实物图:

4.3 Arduino 测试代码
在 Arduino App Lab 中编译上传修改后的Blink LED代码,同时控制板载 LED 和 D6 引脚,两者状态同步:
// Blink LED + D6 信号输出
// 板载 LED 和 D6 引脚同步闪烁,D6 连接到逻辑分析仪 CH0
#define LED_PIN LED_BUILTIN
#define TEST_PIN 6
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(TEST_PIN, OUTPUT);
}
void loop() {
// 同时点亮 LED 和输出高电平到 D6
digitalWrite(LED_PIN, HIGH);
digitalWrite(TEST_PIN, HIGH);
delay(1000);
// 同时熄灭 LED 和输出低电平到 D6
digitalWrite(LED_PIN, LOW);
digitalWrite(TEST_PIN, LOW);
delay(1000);
}【图片 47】Arduino App Lab 上传 Blink + D6 测试代码:

4.4 PulseView 采集配置
~/PulseView-sipeed-aarch64.AppImage
步骤:
点击工具栏"扫描设备"按钮(Ctrl+Shift+S)
选择 "Sipeed SLogic Combo 8"
启用通道 0(CH0),设置采样率为 1MHz
点击"运行"开始采集
4.5 观察采集结果
采集到的波形应与 LED 闪烁同步:
高电平持续约 1s(LED 亮)
低电平持续约 1s(LED 灭)
周期约 2s
【图片 48a】PulseView 选择设备并配置采集参数:

【图片 48b】PulseView 采集到的 D6 引脚方波信号及分析:

可以看到波形与板载 LED 的亮灭完全同步,证明了逻辑分析仪捕获的信号准确反映了 D6 引脚的电平变化。
4.6 Blink频率调整
另外,我们也可以调整python部分的脚本,修改blink的频率:
【图片 49】Arduino App Lab 修改python脚本:

4.7 信号测量
PulseView 提供了丰富的测量功能:
光标测量:放置两个光标,精确测量时间差。可以验证高/低电平持续时间是否约为 1s
频率测量:自动计算信号频率。预期约 0.5Hz(周期 2s)
占空比测量:计算高电平/低电平占比。预期约 50%
协议解码:如有串口/I2C/SPI 信号,可加载对应解码器
五、扩展:其他常见 USB 调试设备的 udev 规则
如果你还使用其他 USB 调试器/分析仪,可以把规则添加到同一个文件中:
# J-Link 调试器
SUBSYSTEM=="usb", ATTR{idVendor}=="1366", MODE="0666", GROUP="plugdev"
# FT2232/FT232 (常见 USB 转串口/JTAG)
SUBSYSTEM=="usb", ATTR{idVendor}=="0403", MODE="0666", GROUP="plugdev"
# CMSIS-DAP / DAPLink
SUBSYSTEM=="usb", ATTR{idVendor}=="0d28", MODE="0666", GROUP="plugdev"
# ESP32 USB-Serial
SUBSYSTEM=="usb", ATTR{idVendor}=="10c4", MODE="0666", GROUP="plugdev"
添加后重新加载规则:
sudo udevadm control --reload-rules
sudo udevadm trigger六、总结
步骤 | 内容 | 状态 |
硬件介绍 | Sipeed SLogic Combo 8 多合一调试工具 | ✅ |
编译 PulseView | 从源码编译 Sipeed 定制版并打包 AppImage | ✅ |
解决 USB 权限 | udev 规则 + plugdev 组配置 | ✅ |
验证设备识别 | PulseView 正常识别逻辑分析仪 | ✅ |
实际信号测试 | 捕获 Uno Q D6 引脚 Blink 方波 | ✅ |
扩展规则 | 其他 USB 调试设备 udev 规则 | ✅ |
完成全部配置后,我的 Arduino Uno Q 已经具备了完整的逻辑分析能力,可以配合 Sipeed SLogic Combo 8 进行信号采集和协议分析。
我要赚赏金
