在前面三篇中,我们学习了如何选定适用于 CX3 的Image sensor/ISP 、如何构建 UVC 工程模板,以及一些调试 CX3 UVC 应用的基本方法。

在本篇笔记中,我们将会对前述的调试的笔记进行回顾和补充。为方便说明和理解,我们会按照第二篇学习笔记,采用 CX3 配置向导生成工程模板,在 Denebola 板上进行演示。如未另外说明,本笔记涉及到的 函数名、变量名、文件名等对应于附件工程。

 

  • 关于配置工具中参数的说明

首先我们熟悉下 CX3 配置工具的界面、参数的含义以及如何进行正确配置。

BaiduShurufa_2019-6-12_16-2-47.png

 

 

 

 

BaiduShurufa_2019-6-12_16-7-31.png

 

用户可以参考如上两幅截图,了解配置工具界面以及涉及到的参数说明。其中,sensor 部分的参数需要和 sensor 的技术人员确认准确。配置工具会根据用户输入的参数,判断输入的 CX3 端的 PLL 参数是否与之匹配。如果不匹配,则会出现警告,用户需要根据警告信息修正对应的参数,直到工具没有报错为止。

用户可以看到,很多参数都是 具有 范围的,即 最小值 和最大值,并不是唯一值。也就是说,对于某个分辨率的配置,可行的参数并不是唯一的一组,一般会有不同的几组。

 

  • 关于固件调试的方法

前面我们提到过,在调试 CX3 固件时,需要首先确保 CX3 摄像头在连接到主机端后,能够正确枚举为一个 UVC 设备。默认的情况下,在系统上电后,会执行CyCx3UvcAppInit()函数。此函数会初始化 必要的硬件模块、注册设备描述信息、配置端点、DMA 以及初始化 MIPI CSI 接口。需要保证CyCx3UvcAppInit 成功执行并返回。

用户可以用 BUS HOUND、USBlyzer,UART terminal等软件工具或者 硬件的 USB 协议分析仪抓取 USB通信判断函数执行过程和结果。此时,在设备管理器里,用户应当能看到名为 CX3-UVC 的设备。如果没有显示或者有黄色感叹号,一般是因为主机不能正确获取描述符或者回复的描述符不正确,需要着重进行检查。

BaiduShurufa_2019-6-12_14-49-23.png

 

当用户在主机端用 看图软件(MPC-HC、E-cam viewer 或者Amcap 等软件)打开相机并选择分辨率后,固件会运行到 CyCx3UvcAppHandleSetCurReq() 函数 执行CyCx3UvcAppImageSensorSetVideoResolution() 函数。这个函数的输入参数是 frame index, 这个数值其实是对应到描述符文件 cycx3_uvcdscr.c 里定义的 frame 的index。

BaiduShurufa_2019-6-12_15-7-3.png

此处的固件只配置了一个 分辨率,所以index 为1。如果用户手动添加新的分辨率,请注意index 的值需要是正确的。

 

回到CyCx3UvcAppImageSensorSetVideoResolution() 函数,这个函数根据选择的 分辨率 的序号对 MIPI CSI 接口和 sensor 进行配置,此处需要确保 这两处的配置正确。

对于 MIPI CSI 接口,用户可以调用 CyU3PMipicsiQueryIntfParams() 函数读回配置参数,检查是否和固件里配置的一致。

对于 sensor 或者 ISP,可以调用 I2C 读函数 读回写出的所有寄存器,与写出的参数进行比较,确保所有的寄存器都已正确配置。

 

配置完成后,sensor 或者 ISP 则会输出信号,使用示波器对信号进行检查(详见第三篇笔记),确保CX3 端信号解析正确。

 

另外,可以使用 UART 接口提供 debug 信息。附件工程定义了 宏 PRINT_FRAME_INFO, 用户可以查看

 

#ifdef PRINT_FRAME_INFO
...
...
#endif

 

部分的代码已获知细节。特别的,附件固件在 主线程中循环打印 frame相关信息。

/*For video streaming application of higher FPS refrain from using this debug print or try to reduce the print information*/
CyU3PDebugPrint(4,"\n\rProd = %d Cons = %d  Prtl_Sz = %d Frm_Cnt = %d Frm_Sz = %d B", TxCountflag, RxCountflag, PartialBufSize, FrameCount, ((TxCountflag*CX3_UVC_DATA_BUF_SIZE)+PartialBufSize));
Printflag = 0;


if (fpsflag == 1)
{
fps = 30000/(time1 -time0); //FPS calculate using time difference for 30 frames
CyU3PDebugPrint(4,"\n\rTimeDiff = %d ms FPS = %d", (time1 -time0), fps);
fpsflag = 0;




}

 

 

此处需要检查打印的 Prod 是否等于 Cons 的数量,Partial 包的大小为每一帧最后一个包的大小,这个值需要稳定不变(在分辨率没有切换时),FrameCount需要连续,没有丢帧。((TxCountflag*CX3_UVC_DATA_BUF_SIZE)+PartialBufSize)是计算的每一帧的大小,这个值需要与设定的分辨率大小一致。

 

注意,不要在 DMACallBack 函数里调用任何的UART 打印函数。

 

  • 其他相关的KBA 或者 论坛帖子

CX3 视频时间参数解析 – KBA226779 (ZH)

How to configure the MIPI Receiver in CX3 ?

How to configure CX3 MIPI receiver configuration for streaming RAW10 4096x3072 @ 10 fps ?

Streaming RAW10 Format Input Data to 16/24-bit Output Format in CX3 MIPI CSI-2 - KBA224387

Invalid Sequence Error in Multi-Channel Commit Buffer - KBA218830

CX3, i2c , 2-bytes address, 2-bytes data