UVC 故障排查指南 - KBA226722 (ZH)

Version 2

    Version: **

     

    问题: 我如何调试 FX3 UVC 应用的固件?

    回答:

    这篇KBA是一份调试 UVC 应用的初步参考。此处假设 FX3 在数据载荷中加入 UVC 头,参考的固件代码是 AN75779

     

    1. 在描述符文件(cyfxuvcdscr.c)的 /* Class specific Uncompressed VS format descriptor */部分中:

      • 确保像素的深度是正确的。
      • 检验UVC 驱动支持此部分所定义的UVC 驱动不支持格式。如果 GUID 设置为格式,那么UVC 驱动就会丢弃 FX3 发送的数据,则用户无法从标准的视频软件中看到视频)。

     

    2. 在描述符文件(cyfxuvcdscr.c))的 /* Class specific Uncompressed VS frame descriptor */部分中,确保如下内容正确:

      • 帧宽度和高度(和视频流相关)
      • 帧率
      • 视频每帧的最大字节数

    :在某些设计中,有可能连接到 GPIF 的数据总线宽度不是 8/16/24/32 bit。例如,sensor 的数据总线可能是 10 bit(当 sensor 支持输出 RAW10 格式时)。如果这 10 bit 数据线连接到 GPIF 并且 GPIF 的位宽设置为 16 bit 时,则每个时钟系统采样 16 bit。如果其他 6 bit 被下拉,则 FX3 会在这些线上采样到 逻辑0。如果被上拉,则 FX3 会在这些线上采样到逻辑1. 所以,每个时钟系统采样 2 byte 而不是 10 bit。这个时候,主机端的软件需要对每个像素中多余的 bit 进行处理。

     

    3. 确保在 probe control structureglProbeCtrl 中定义的最大帧尺寸是等于或者大于实际每一帧的字节数。另外,确保 probe control structure 中定义的最大数据尺寸大于实际传输中的数据尺寸(通常为DMA buffer的大小)

     

    4. 确保 DMA buffer 的大小满足:每一帧总的大小不是(DMA buffer 的大小-16)整倍数。在 DMA buffer 的配置中,用户需要为 UVC 头保留 12 byte 的空间,为 UVC 尾保留 4 byte的空间,因此图像数据算为 DMA buffer 大小 – 16 byte。在 DMA 回调函数中,一个非满包代表一帧的结束,同时固件会在对应的数据头中插入“Frame end marker”。

     

    5. 计算每一帧图像所需要的满 DMA buffer的数量:

    每一帧总的 byte 数: S=(以像素计的图像宽度)*(以像素计的图像高度)*(像素深度)

    每一帧的满 DMA buffer 数量:F=小于(S/(DMA buffer 大小 -16))的最大整数。

    非满 DMA buffer 的字节数: P= DMA buffer 大小*S/(DMA buffer 大小 -16 ))的小数部分。

      注: DMA callback 函数中收到非满包时,非满包大小(P)与 dmaBuffer.count 相等。

     

    用户可以在固件中追踪 F P(如上所述),检查它们是否为预期值。

     

    计算示例

    在上述提到的 AN75779 固件中的High speed 配置中,FX3 传输 每像素2 byte 640*480 分辨率的视频。此时,

     

    S = 640*480*2 =614400 bytes

    F = 小于(614400/(16384-16))的最大整数,为37.

    P = DMA buffer 大小 * S/(DMA buffer 大小-16)=8784 bytes

     

    6. 在 DMA callback 函数里不要写任何 DebugPrint(CyU3PDebugPrint()) 函数。相反的,使用标志变量并在for(;;) 循环中跟踪它们。

     

    7. 如果在 Fx3 传输视频流时,用户从 UART 终端得到 Error in CyU3PDmaMultiChannelCommitBuffer: code 71”的消息,按照Invalid Sequence Error in Multi-Channel Commit Buffer - KBA218830 (ZH) 中的步骤操作。

     

    8. 测量 帧有效(FV)和 行有效(LV)引脚 并且确保脉冲宽度为预期值。也就是说:

     

    LV 的高有效时间 = (每行像素数)*(每像素byte数)/PCLK 频率

    FV 的高有效时间 = LV 高有效时间+ LV 消隐时间)*(行数)

     

    9. 确保senor 端提供的PCLK 频率低于 100 MHz

     

    10. 确保 GPIF 线 端接 22   的电阻。并且确保 GPIF 走线长度匹配在 500 mils 以内。

     

    11. 抓取 USB 协议包并检查:

     

      • 在满DMA buffer数据包中的 UVC 头中,第二个是否在连续的帧之间按照 0x8C 0x8D 的顺序 轮换。在非满包的对应的最后一个数据包的头中,第二个是否在连续的帧之间按照 0x8E 0x8F 的顺序轮换。

     

    考虑上述的例子:

        • 对于帧 K, 37 个数据包的第 byte 0x8C,最后一个数据包的第 0x8E
        • 对于帧 K+1, 37 个数据包的第 byte 0x8D,最后一个数据包的第 0x8F

     

      • 总的满包数量和 非满包数量为预期值。