VIF Q&A

Q1:VIF采集不到数据

可以从以下几个方向排查:

  1. vif参数配置是否正确。

  2. 采样模式是否匹配(上升沿采样,双沿采样等)。

  3. AD端硬件是否正常,dump寄存器看是否在正常工作。

  4. 量bt656是不是有讯号出来,AD端和芯片端是否都有信号出来。

  5. AD和芯片端接口都配成gpio模式,一个个试看是否有哪个脚不通。

Q2:MI VIF模块的调用流程

  1. 预览流程

    初始化顺序, port 的调用不分先后:

    MI_VIF_SetDevAttr
    MI_VIF_EnableDev
    MI_VIF_SetChnAttr //input参数
    MI_VIF_SetChnPortAttr
    MI_VIF_EnableChnPort
    

    去初始化顺序, port 的调用不分先后:

    MI_VIF_DisableChnPort
    MI_VIF_DisableDev
    
  2. 切换流程

    1)Device属性和input 参数发生变化, vif要port/dev 都销毁, 重新初始化设置。

    2)如果只是port0/1 参数发生变化,需要先MI_VIF_DisableChnPort,然后设置MI_VIF_SetChnPortAttr,MI_VIF_EnableChnPort。

Q3: 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;

Q4: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)

mod6代表VIF模块,主要原因还是unmask fail,前端AD没数据进来,unmask 会卡住1秒左右, 每秒都在尝试。初始化配置的时候没有数据进来会卡住,config下完之后断流不会。 这种情况不会完全占住cpu,是以sleep 的方式在loop,主要原因还是没数据进来。

Q5: vif模块是否可以调节采样时钟的相位?

VIF这边没有调整clk相位功能,一般都是调整AD端芯片的相位。

Q6:vif模块采集数据时,宽高是否要严格匹配?

vif 端采集数据要严格匹配,前端AD输出分辨率是多少,vif端CapRect size的宽高要完全一样,否则会花屏。

Q7:vif输入的是1080p60,但是看vif porc信息是只有30fps。

vif u32SrcFrmrate 设置不正确导致的,vif u32SrcFrmrate 是帧率控制的源头,这个值一定要设置正确,前端模拟相机进来的帧率是多少,这个值就要设置成多少。

Q8: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。并且正常情况下这个值应该保持稳定,不会大幅度跳变。

Q9:当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;