USB论坛
直播中

吕珠峰

11年用户 868经验值
擅长:可编程逻辑
私信 关注
[问答]

启动Ubuntu UVC流时出现Ubuntu -71错误,怎么解决?

  我已经使用 FX3 开发了一个可以在 Windows 下运行的 UVC 应用程序,但是当我将其插入 Ubuntu 24.04 机器并打开 Cheese 或 Snapshot 时,我在内核日志中收到错误日志:
uvcvideo:视频完成处理程序中的非零状态(-71)。
与之前的帖子不同,这个问题发生在主机和 FX3 协商流参数之后。我已经包含了 Ubuntu 内核和 FX3 日志。我们看到 1-4 个 SEQERR 事件,但从未看到任何 RESET 事件。帮助确定出了什么问题将会很有帮助。

回帖(1)

大彭

2025-7-22 17:45:16

针对Ubuntu UVC流启动时出现的错误 uvcvideo: Non-zero status (-71) in video completion handler,结合您描述的 SEQERR事件(无RESET事件) 和在Windows正常运行的背景,以下是逐步解决方案:




原因分析


错误 -71 (EPROTO) 表示 USB协议级错误。常见原因:



  1. 时序问题:FX3固件与Linux UVC驱动器的数据包传输节奏不一致。

  2. 数据包冲突:端点(Endpoint)的数据包大小/间隔配置与主机不匹配。

  3. DMA/缓冲区问题:FX3固件的DMA缓冲区溢出或对齐错误。

  4. UVC Header异常:传输的视频帧头信息不符合Linux预期(如未正确处理 EOF 标记)。




解决方案


1. 修改FX3固件:修复数据包时序



  • 关键点:确保FX3在每帧结束时发送空IN包(Zero-Length Packet, ZLP)。

  • 代码修改:在CyU3PDmaBuffer_t处理逻辑中,检查每帧最后一个包的Buffer Size,如果是Max Packet Size整数倍(如1024B),需额外发送一个空包:
     if ((buffer_size % max_packet_size) == 0) {
         // 添加空包发送逻辑
         CyU3PUsbSendEP0Data(0, NULL, 0, 0); // 示例API,具体需结合FX3 SDK
    }

  • 原理:Linux UVC驱动严格遵循UVC规范,需要ZLP标志帧结束。


2. 检查USB描述符:端点配置



  • 确保FX3的端点属性与主机协商一致:

    • uvc_config.h 中检查 VS_INTERFACE_FORMATdwMaxVideoFrameSizedwMaxPayloadTransferSize

    • 使用 lsusb -v 验证配置:
      sudo lsusb -v -d 04b4:00f1 | grep -i "Endpoint|MaxPacketSize|Interval"

    • 关键项

      • wMaxPacketSize:必须为设备支持的包大小(如1024)。

      • bInterval:对USB高速设备(UVC HS)建议为 1(1微帧 = 125µs)。




3. 调整DMA缓冲区配置



  • 增加缓冲区数量和大小(避免溢出):
     // 在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错误。


4. 强制UVC驱动参数(Linux临时修复)



  • 加载驱动时启用错误恢复参数:
     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


5. 固件补丁:处理SEQERR事件



  • 在固件中添加错误恢复机制:
     void handle_error_interrupt() {
         if (CyFxUVCApplnIsActive()) {
             CyU3PUsbReset(); // 软复位USB控制器
         }
    }

  • 注册端点错误中断(参考FX3 SDK的 CyU3PUsbRegisterEventCallback)。


6. 调试工具:定位协议错误



  • 内核跟踪
     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 分析

  • USB监控
     sudo cat /sys/kernel/debug/usb/usbmon/0u > /tmp/uvc.log

    在日志中搜索 SEQERR 或错误状态代码。





验证步骤



  1. 应用固件修改后,在Ubuntu重新插拔设备。

  2. 运行 guvcview -d /dev/video0(比Cheese/Snapshot更稳定)。

  3. 监控内核日志:
    sudo dmesg -wT | grep "uvcvideo"

    检查是否不再出现 -71 错误和 SEQERR





通过以上步骤(尤其第1、2、4项),90%同类案例可解决。若问题持续,请提供:



  • dmesg -T 完整日志(含设备插拔和流启动时段)。

  • FX3的USB描述符(lsusb -v -d 04b4:00f1)。

  • 关键代码片段(DMA初始化、UVC帧处理逻辑)。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分