针对Ubuntu UVC流启动时出现的错误 uvcvideo: Non-zero status (-71) in video completion handler,结合您描述的 SEQERR事件(无RESET事件) 和在Windows正常运行的背景,以下是逐步解决方案:
错误 -71 (EPROTO) 表示 USB协议级错误。常见原因:
EOF 标记)。CyU3PDmaBuffer_t处理逻辑中,检查每帧最后一个包的Buffer Size,如果是Max Packet Size整数倍(如1024B),需额外发送一个空包: if ((buffer_size % max_packet_size) == 0) {
// 添加空包发送逻辑
CyU3PUsbSendEP0Data(0, NULL, 0, 0); // 示例API,具体需结合FX3 SDK
}uvc_config.h 中检查 VS_INTERFACE_FORMAT 的 dwMaxVideoFrameSize 和 dwMaxPayloadTransferSize。lsusb -v 验证配置:sudo lsusb -v -d 04b4:00f1 | grep -i "Endpoint|MaxPacketSize|Interval"wMaxPacketSize:必须为设备支持的包大小(如1024)。bInterval:对USB高速设备(UVC HS)建议为 1(1微帧 = 125µs)。 // 在DMA通道初始化代码中
CyU3PDmaChannelConfig_t dmaConfig;
dmaConfig.size = 1024; // 包大小
dmaConfig.count = 24; // 缓冲区数量建议16以上
dmaConfig.validSckCount = 0; // 0为自动
CyU3PDmaChannelCreate(&dmaHandle, CY_U3P_DMA_TYPE_AUTO, &dmaConfig);dmesg中检查是否有buffer overrun或-ENOSPC错误。 sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=0x80 # 启用UVC_QUIRK_IGNORE_EMPTY_TS备选参数:
quirks=4:跳过无效UVC Header(UVC_QUIRK_FIX_BANDWIDTH)。quirks=7:组合修复(推荐测试)。/etc/modprobe.d/uvcvideo.conf添加: options uvcvideo quirks=7 void handle_error_interrupt() {
if (CyFxUVCApplnIsActive()) {
CyU3PUsbReset(); // 软复位USB控制器
}
}CyU3PUsbRegisterEventCallback)。 echo "func:uvc_status_complete" | sudo tee /sys/kernel/debug/tracing/set_ftrace_filter
sudo trace-cmd record -e uvcvideo -p function_graph
# 重现问题后,Ctrl+C停止,用 trace-cmd report 分析 sudo cat /sys/kernel/debug/usb/usbmon/0u > /tmp/uvc.log在日志中搜索 SEQERR 或错误状态代码。
guvcview -d /dev/video0(比Cheese/Snapshot更稳定)。sudo dmesg -wT | grep "uvcvideo"检查是否不再出现 -71 错误和 SEQERR。
通过以上步骤(尤其第1、2、4项),90%同类案例可解决。若问题持续,请提供:
dmesg -T 完整日志(含设备插拔和流启动时段)。lsusb -v -d 04b4:00f1)。
举报
更多回帖