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

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

 

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