VIF Q&A
Q1:VIF无法采集数据
排查方向:
-
vif参数配置是否正确。
-
采样模式是否匹配(上升沿采样,双沿采样等)。
-
AD端硬件是否正常,dump寄存器看是否有在正常工作。
-
量bt656是否有信号,AD端和芯片端是否有信号。
-
AD和芯片端接口都配成gpio模式,逐个试看是否有哪个脚不通。
Q2:MI VIF模块的调用流程
-
预览流程
初始化顺序, port 的调用不分先后:
MI_VIF_SetDevAttr MI_VIF_EnableDev MI_VIF_SetChnAttr //input参数 MI_VIF_SetChnPortAttr MI_VIF_EnableChnPort
去初始化顺序, port 的调用不分先后:
MI_VIF_DisableChnPort MI_VIF_DisableDev
-
切换流程
-
Device属性和input 参数发生变化, vif要port/dev 都销毁, 重新初始化设置。
-
如果只是port0/1 参数发生变化,需要先MI_VIF_DisableChnPort, 然后设置MI_VIF_SetChnPortAttr,MI_VIF_EnableChnPort。
-
Q3:标清(960H)相机,在TechPoint 2830输出异常
标清(960H)相机,在TechPoint 2830系列芯片上,采集的数据是1980x480,vif端需要将bEnH2T1PMode设置为TRUE,水平方向缩小一半进行采样。
bEnH2T1Pmode参数只有输入是YUV格式时才可以使用,非YUV格式使用会返回err。
Q4: VIF模块接收信号的接口修改为bt1120接口,请问是在哪里修改的?
通过MI_S32 MI_VIF_CreateDevGroup(MI_VIF_GROUP GroupId, MI_VIF_GroupAttr_t *pstGroupAttr)接口,修改MI_VIF_IntfMode_e eIntfMode参数;注意BT1120目前不能用4 multi mode。枚举定义:
typedef enum { E_MI_VIF_MODE_BT656 = 0, E_MI_VIF_MODE_DIGITAL_CAMERA, E_MI_VIF_MODE_BT1120_STANDARD, E_MI_VIF_MODE_BT1120_INTERLEAVED, E_MI_VIF_MODE_MIPI E_MI_VIF_MODE_NUM } MI_VIF_IntfMode_e;
Q5:vif出现卡住,一直刷以下log
[MI WRN ]: mi_sys_worker_thread_timeout_monitor[11686]: mod6 dev6 pass0 infer timeout for 10 seconds [MI WRN ]: mi_sys_worker_thread_timeout_monitor[11686]: mod6 dev2 pass0 infer timeout for 10 seconds [MI WRN ]: mi_sys_worker_thread_timeout_monitor[11686]: mod6 dev5 pass0 infer timeout for 10 seconds
卡住时开telnet执行 echo show_threads > /proc/mi_modules/mi_sys/mi_sys0 ,看到以下log:
[<bf78de7d>] (_mi_vif_Unmask [mi_vif]) from [<bf78ee67>] (_MI_VIF_EnqueueOutputTaskDev+0x6ba/0x874 [mi_vif]) [<bf78ee67>] (_MI_VIF_EnqueueOutputTaskDev [mi_vif]) from [<bf53d143>] (_MI_SYS_IMPL_TryProcessAsyncOutputTask+0x90e/0x1178 [mi_sys]) [<bf53d143>] (_MI_SYS_IMPL_TryProcessAsyncOutputTask [mi_sys]) from [<bf53e309>] (mi_sys_internal_main_worker_thread+0x600/0x2a88 [mi_sys]) [<bf53e309>] (mi_sys_internal_main_worker_thread [mi_sys]) from [<c002bab7>] (kthread+0xc3/0xd4)
主要原因是unmask fail,前端AD 没数据进来,unmask 会卡住1秒左右, 每秒都在尝试。初始化配置的时候没有数据进来会卡住,config 下完之后断流不会。
也没有完全占住cpu,sleep 的方式在loop。
Q6: vif模块是否可以调节采样时钟的相位?
VIF这边没有调整clk相位功能,一般都是调整AD端芯片的相位。
Q7:vif模块采集数据时,是否要严格匹配?
vif 端采集数据要严格匹配,前端AD输出分辨率是多少,vif端CapRect size的宽高要完全一样,否则会花屏。
Q8:某特殊的分辨率时,VIF 没办法接收资料,连Frame Start Interrupt 都没有被触发。
先确认下AD端 input width size 是多少,因为910Q/920G VIF BT656/BT1120 input width size必须align 4 对齐。
如果width size 不是4的倍数就会导致VIF判断错误,收不到完整的数据。
Q9:vif输入的是1080p60,但是看vif porc信息是只有30fps。
vif u32SrcFrmrate 设置不正确导致的,vif u32SrcFrmrate 是帧率控制的源头,这个值一定要设置正确,前端模拟相机进来的帧率是多少,这个值就要设置成多少。
Q10:vif信息看前端信号是否稳定。
cat /sys/class/mstar/vif0/vif_ints && sleep 5 && cat /sys/class/mstar/vif0/vif_ints
== VIF CH-0 == Interval(ns) : 16682000 VREF_FALLING : 24867 LINE_CNT_0 : 124323 LINE_CNT_1 : 0 TOTAL_PIX_CNT : 0
== VIF CH-0 == Interval(ns) : 16683000 VREF_FALLING : 25167 LINE_CNT_0 : 125824 LINE_CNT_1 : 0 TOTAL_PIX_CNT : 0
正常情况下2次VREF_FALLING的差值就是帧率,即25167 - 24867 = 300. 300帧 5s,即60 fps。并且正常情况下这个值应该保持稳定,不会大幅度跳变。
Q11:当vif dev 的参数bEnH2T1PMode 设置为TRUE 时,inputRect、CapRect 和 DestSize 的参数要怎样设置?
以1080P为例,inputRect 设置为1080P的分辨率(宽:1920、 高:1080)、CatRect及DestSize设置为1080N的分辨率(宽:960、高:1080)
MI_VIF_DevAttr_t stVifDevAttr; stVifDevAttr.stInputRect.u16Width = 1920; stVifDevAttr.stInputRect.u16Height = 1080; ST_VifPortAttr_t *pstVifPortAttr; pstVifPortAttr->stCapRect.u16Width = 960; pstVifPortAttr->stCapRect.u16Height = 1080; MI_VIF_OutputPortAttr_t stVifPortInfo; stVifPortInfo.stDestSize.u16Width = 960; stVifPortInfo.stDestSize.u16Height = 1080;
Q12:如何关闭fbc?
在应用起来之前,执行如下指令。
echo 0 > /sys/module/mi_vif/parameters/g_bFBCMode
Q13:910Q/920G能做到6个1080P30输入吗?
不能,因为VIF 接收BT656 的接收速度是148.5 Mhz DDR,一组BT656 最高的速度有限制,所以最多只能做到4个1080P30输入。
Q14:vif 能否支持yuv420格式的输入?
vif不支持yuv420格式的输入,只支持yuv422,因为vif输出不支持yuv420,vif又不能转格式,所以vif不支持yuv420输入。