跳转至

MI VIF API


REVISION HISTORY

Revision No.
Description
Date
3.0
  • Initial release
  • 12/04/2020
    3.1
  • Added Muffin flow char
  • 07/16/2021
    3.2
  • Added procfs introduction
  • 08/25/2021
    3.3
  • Update MI_VIF_GroupIdMask_e E_MI_VIF_GROUPMASK_ID up to 7
  • Update char flow note info
  • 12/22/2021
    3.4
  • Add Mochi information
  • 02/17/2022
    3.5
  • Add Maruko information
  • 03/21/2022
    3.6
  • 1.概述:1.2 小节,补充各chip的Pipe数量;1.3 小节,增加Pipe关键字描述
  • 3.VIF 数据类型:3.12 小节,补充Field type 参数说明
  • 5.PROCFS介绍:5.1 小节,更新 cat 信息变更;5.2 小节,更新 echo 命令
  • 07/08/2022
    3.7
  • 1.概述:1.2.5 小节,新增Opera框图和信息
  • 2.API参考:2.9小节,补充Opera支持的CompressMode参数
  • 3.VIF 数据类型:3.6 小节,新增DCG HDR type参数
  • 5.PROCFS介绍:5.1 小节,更新 cat 信息变更;5.2 小节,更新 echo 命令
  • 10/27/2022
    3.8
  • 3.VIF 数据类型:3.6 小节,新增COMP和COMPVS HDR type参数
  • 01/11/2023
    3.9
  • 1.概述:1.2.6 小节,新增Souffle框图和信息
  • 2.API参考:2.9 小节,补充Souffle支持的CompressMode参数,新增2.16 小节,添加 MI_VIF_CustFunction的描述
  • 3.VIF 数据类型:3.10 小节,增加eHDRFusionTpye、u8HDRExposureMask、stMetaDataAttr属性描述;新增3.19 小节添加HDR融合模式描述,新增3.20小节添加HDR曝光类型描述;新增3.21 和 3.22 小节添加Metadata枚举和结构体的描述;新增3.23 小节添加VIF客制化命令描述;新增3.24 小节添加Putdata结构体描述
  • 03/14/2023
    3.10
  • 5.PROCFS介绍:5.1 小节,更新补充 cat 调试信息
  • 新增第6章节,MODPARAM 介绍
  • 04/17/2023
    3.11
  • 3.VIF 数据类型:3.23 小节添加 "SET IR STATUS" 客制化命令描述
  • 06/28/2023
    3.12
  • Add Iford information
  • 12/22/2023
    3.13
  • Add 2.3 小节,新增设置Group 的属性
  • 02/19/2024
    3.14
  • Added new structure description about AOV function
  • 06/07/2024
    3.15
  • Added bDevEnableFrameStartPts in sections 6.1 and 6.2
  • 04/03/2025
    3.16
  • 根据标准模板调整文档结构
  • 04/24/2025
    3.17
  • 回归主线,补充AiIsp功能相关结构体描述以及补充AOV相关接口的使用说明
  • 05/13/2025
    3.18
  • 补充multi sensor VIF相关的modparam.json配置文档字段说明
  • 08/18/2025

    1. 概述


    1.1. 模块说明

    MI_VIF是一个用于绑定和启用视频输入通道的设备驱动。它屏蔽了不同视频输入设备协议和硬件上的差异,使得上层应用程序可以不用关心不同sensor类型,只需要按照需求简单配置后就可以搭建起接收视频流的pipeline。

    关键词说明:

    • sensor pad

      sensor硬件接口位置

    • VIF Group

      VIF IP内部的硬件结构,负责处理对应sensor pad的视频流

    • VIF Device

      VIF Group内部的通道,可以将VIF Group的视频流按不同channel进行传输

    • Linear mode

      只占用单个VIF Device的模式

    • HDR mode

      与sensor的HDR对应,包含长短曝数据,会占用2个以上VIF Device

    • realtime

      VIF与后级硬件直连

    • framemode

      VIF数据先传到Dram再到后级模块


    1.2. 基本结构

    MI_VIF主要用来接收前端sensor传递过来的视频流,VIF硬件内部含有多个VIF group,每个group和sensor pad之间存在固定的对应关系(如图1-1)。VIF group支持的sensor接口类型是固定的,这就意味着一些特定的接口(如bt656/bt1120等)需要在指定的sensor pad和VIF group上使用。VIF group内部又含有多个device,用于分别接收sensor内的多路不同信号。

    VIF在不同的使用场景下可以将接收进来的数据通过output port送至不同的位置,以满足客户的需求。在framemode下VIF支持将bayer或yuv422格式的数据送到内存中,在和isp realtime绑定时则只支持bayer格式数据,和scl realtime绑定时则只能传输yuv422数据。

    图1‑1 VIF结构示意图

    基于MI_VIF提供的API开发应用程序的方式如图1-2。

    图1‑2 MI_VIF的使用方式


    1.3. 功能介绍

    MI_VIF支持以下功能:

    1. 接收获取不同接口类型的sensor输出

    2. 控制视频输出帧率

    3. 裁剪输出图像

    4. 对数据进行FBC压缩

    5. 对数据进行CRC校验

    6. 输出固定pattern图像


    1.4. 应用场景

    MI_VIF目前可应用于以下场景,都支持基于MI_VIF api提供的API接口进行开发

    1. Pure linux场景

    2. Pure rtos场景

    3. Dualos场景


    1.5. 芯片差异

    MI_VIF API接口在不同chip之间没有太大差异,不同芯片之间差异较大的是VIF底层group和dev的硬件个数,以及芯片支持sensor接口类型。

    当前文档请参考 #### 1.5.7. Iford


    1.5.1. Tiramisu

    Tiramisu硬件数和布局如下图:

    支持接口类型 使用sensor pad
    BT656 0、2
    MIPI 0、1、2、3

    Tiramisu 的output port有两个,它们各自的作用如下:

    PortId 输入Pixel 输出Pixel Crop scaling 输出形式
    0 按照sensor格式输入 1. 按照sensor格式输出;
    2. 将YUV422格式转成12bit bayer 格式输出。
    不支持 不支持 1. Dram 输出。
    2. 任意Device支持realtime 输出到MI_ISP,同一时间只能用一个。
    3. 任意Device支持YUV422格式realtime 输出到MI_SCL,同一时间只能用一个。
    1 只支持YUV422格式输入 只支持12bit bayer格式输出 支持 只支持scaling down, height 有做scaling down 时, width 最大等于960。 只支持Dram 输出。

    1.5.2. Muffin

    Muffin硬件数和布局如下图:

    支持接口类型 使用sensor pad
    BT656 0、1、2、3、4、5、6、7
    BT1120 0、1、4、5
    MIPI 0、1、2、3、4、5、6、7
    LVDS 0、2、4、6

    Muffin 的output port有一个,它们的作用如下:

    PortId 输入Pixel 输出Pixel Crop scaling 输出形式
    0 按照sensor格式输入 1. 按照sensor格式输出;
    2. 将YUV422格式转成12bit bayer 格式输出。
    不支持 不支持 1. Dram 输出。
    2. Device0-15 支持 realtime 输出到MI_ISP Dev0,同一时间只能用一个;Device16-31 支持 realtime 输出到MI_ISP Dev1,同一时间只能用一个。
    3. Device0-15 支持YUV422格式realtime 输出到MI_SCL Dev2,同一时间只能用一个;Device16-31 支持YUV422格式realtime 输出到MI_SCL Dev6,同一时间只能用一个。

    1.5.3. Mochi

    Mochi硬件数和布局如下图:

    支持接口类型 使用sensor pad
    BT656 0、1、2、3
    BT1120 0、1

    Muffin 的output port有一个,它的作用如下:

    PortId 输入Pixel 输出Pixel Crop scaling 输出形式
    0 只支持YUV422格式输入 只支持YUV422格式输出 不支持 不支持 1. Dram 输出。
    2. 任意Device支持yuv 格式 realtime 输出到MI_ISP Dev0,同一时间只能用一个。

    1.5.4. Maruko

    Maruko硬件数和布局如下图:

    支持接口类型 使用sensor pad
    BT656 1
    MIPI 0、2

    Maruko 的output port有一个,它的作用如下:

    PortId 输入Pixel 输出Pixel Crop scaling 输出形式
    0 按照sensor格式输入 按照sensor格式输出 不支持 不支持 1. Dram 输出。
    2. 任意Device支持realtime 输出到MI_ISP Dev0,同一时间只能用一个。
    3. 任意Device支持YUV422格式realtime 输出到MI_SCL Dev2,同一时间只能用一个。

    1.5.5. Opera

    Opera硬件数和布局如下图:

    支持接口类型 使用sensor pad
    BT656 0、1
    BT1120 0
    MIPI 0、1、2、3

    Opera 的output port有一个,它的作用如下:

    PortId 输入Pixel 输出Pixel Crop scaling 输出形式
    0 按照sensor格式输入 按照sensor格式输出 不支持 不支持 1. Dram 输出。
    2. 任意Device支持realtime 输出到MI_ISP Dev0,同一时间只能用一个。
    3. 任意Device支持YUV422格式realtime 输出到MI_SCL Dev2,同一时间只能用一个。

    1.5.6. Souffle

    Souffle框图硬件数和布局如下图:

    支持接口类型 使用sensor pad
    BT656 0、1
    BT1120 0
    MIPI 0、1、2、3

    Souffle 的output port有一个,它的作用如下

    PortId 输入Pixel 输出Pixel Crop scaling 输出形式
    0 按照sensor格式输入 按照sensor格式输出 不支持 不支持 1. Dram 输出。
    2. 任意Device支持realtime 输出到MI_ISP Dev0,同一时间只能用一个。
    3. 任意Device支持YUV422格式realtime 输出到MI_SCL Dev2,同一时间只能用一个。

    1.5.7. Iford

    Iford框图硬件数和布局如下图:

    支持接口类型 使用sensor pad
    MIPI 0、2

    Iford 的output port有一个,它的作用如下

    PortId 输入Pixel 输出Pixel Crop scaling 输出形式
    0 按照sensor格式输入 按照sensor格式输出 支持 不支持 1. Dram 输出。
    2. 任意Device支持realtime 输出到MI_ISP Dev0,同一时间只能用一个。
    3. 不支持YUV422格式realtime 输出到MI_SCL Dev2。

    1.5.8. Pcupid

    Pcupid硬件数和布局如下图:

    支持接口类型 使用sensor pad
    BT656 0
    parallel 0
    MIPI 0、2

    Pcupid 的output port有一个,它的作用如下:

    PortId 输入Pixel 输出Pixel Crop scaling 输出形式
    0 按照sensor格式输入 按照sensor格式输出 支持 不支持 1. Dram 输出。
    2. 任意Device支持realtime 输出到MI_ISP Dev0,同一时间只能用一个。

    1.5.9. Jaguar1

    Jaguar1框图硬件数和布局如下图:

    支持接口类型 使用sensor pad
    BT656 0、1
    BT1120 0
    MIPI 0、1、2、3

    Jaguar1 的output port有一个,它的作用如下

    PortId 输入Pixel 输出Pixel Crop scaling 输出形式
    0 按照sensor格式输入 按照sensor格式输出 不支持 不支持 1. Dram 输出。
    2. 任意Device支持realtime 输出到MI_ISP Dev0,同一时间只能用一个。
    3. 任意Device支持YUV422格式realtime 输出到MI_SCL Dev2,同一时间只能用一个。

    1.6. 工作原理

    VIF可以按与后级的绑定关系分为framemode和realtime bind。对于这两种mode,用户可以根据实际使用场景下的内存和带宽要求进行选择。framemode相较于realtime mode对于内存和带宽的要求更高,因此建议再内存和带宽紧张的条件下使用vif realtime mode。

    1.6.1 framemode

    在vif和后级按framemode 绑定时,VIF的每个device的outputport都会先将数据写到dram对应位置,后级模块(一般是isp)会到对应内存地址进行读取。

    vif-isp frame mode

    1.6.2 realtime

    vif也支持以硬件直连的方式将数据直接传输至后级模块,包含两种方式:一种是vif-isp realtime绑定,另外一种是vif-scl realtime绑定

    1.6.2.1 vif-isp realtime

    vif-isp realtime绑定时,如果时linear mode即非HDR mode时,vif数据不再经过dram,直接送到isp内部处理。如果时HDR mode,则长曝这路的数据还是会经过dram。该工作方式仅支持传输Bayer格式的图像

    vif-isp realtime mode

    1.6.2.2 vif-scl realtime

    vif-scl realtime绑定时,vif直接绕过isp模块不做图像信号处理,数据直传到scl模块。该工作方式仅支持传输YUV格式的图像。

    vif-scl realtime mode


    1.7. 开发流程

    1.7.1 编译配置

    1. 进入alkaid project根目录,make menuconfig

    2. 回车键进入Sdk Config子选项

    3. 回车键进入Interface Compile Config子选项

    4. 空格键选中vif子模块,并重新编译project

      编译完成将在sdk/interface/src/vif下生成 mi_vif.ko, 同时将mi_vif.h和mi_vif_datatype.h release到 project/release 目录, 在pure linux环境下会默认打包进入images,在dualos环境下默认不打包,需要手动编译并安装。


    1.7.2 接口调用

    MI_VIF接口调用流程

    MI_VIF的接口调用分为以下几步:

    1. 设置VIF Group接口类型、工作模式等参数,并创建指定VIF group

    2. 设置VIF Device窗口大小、像素格式等参数

    3. 使能对应VIF Device

    4. 设置VIF outputport窗口大小、像素格式、压缩模式等参数

    5. 使能对应VIF outputport

    6. 关闭VIF outputport

    7. 关闭VIF Device

    8. 销毁VIF Group

    9. 退出应用


    1.8. 实例介绍

    本实例展示了基于MI_VIF api进行开发的流程。

    #include <stdio.h>
    #include "mi_sys.h"
    #include "mi_vif.h"
    #include "mi_sensor.h"
    #include "mi_vif_datatype.h"
    #include <string.h>
    
    int main(int argc, char **argv)
    {
        MI_SNR_PADID eSnrPadId = 0;
        MI_VIF_GROUP GroupId = 0;
        MI_S32 s32Ret = 0;
        MI_VIF_DEV vifDev =0;
        MI_VIF_PORT vifPort = 0;
    
        MI_SYS_ChnPort_t stChnPort;
        MI_VIF_GroupAttr_t stGroupAttr;
        MI_VIF_DevAttr_t stVifDevAttr;
        MI_VIF_OutputPortAttr_t stVifPortInfo;
    
        memset(&stGroupAttr, 0x0, sizeof(MI_VIF_GroupAttr_t));
        stGroupAttr.eIntfMode = E_MI_VIF_MODE_MIPI;
    
        memset(&stVifDevAttr, 0x0, sizeof(MI_VIF_DevAttr_t));
        stVifDevAttr.stInputRect.u16X = 0;
        stVifDevAttr.stInputRect.u16Y = 0;
        stVifDevAttr.stInputRect.u16Width = 1920;
        stVifDevAttr.stInputRect.u16Height = 1080;
        stVifDevAttr.eInputPixel = (MI_SYS_PixelFormat_e)47;
    
        memset(&stVifPortInfo, 0, sizeof(MI_VIF_OutputPortAttr_t));
         stVifPortInfo.stCapRect.u16X = 0;
        stVifPortInfo.stCapRect.u16Y = 0;
        stVifPortInfo.stCapRect.u16Width =  1920;
        stVifPortInfo.stCapRect.u16Height = 1080;
        stVifPortInfo.stDestSize.u16Width = 1920;
        stVifPortInfo.stDestSize.u16Height = 1080;
        stVifPortInfo.ePixFormat = (MI_SYS_PixelFormat_e)47;
    
        memset(&stChnPort, 0x0, sizeof(MI_SYS_ChnPort_t));
        stChnPort.eModId=E_MI_MODULE_ID_VIF;
        stChnPort.u32DevId=vifDev;
        stChnPort.u32ChnId=0;
        stChnPort.u32PortId=vifPort;
    
        MI_SYS_Init(0);
    
        s32Ret = MI_SNR_Enable(eSnrPadId);
        if(s32Ret != MI_SUCCESS)
        {
            printf("enable sensor:%d failed\n", eSnrPadId);
            goto EXIT;
        }
    
        s32Ret = MI_VIF_CreateDevGroup(GroupId, &stGroupAttr);
        if(s32Ret != MI_SUCCESS)
        {
            printf("create group id:%d failed\n", GroupId);
            goto EXIT;
        }
        s32Ret = MI_VIF_SetDevAttr(vifDev, &stVifDevAttr);
        if(s32Ret != MI_SUCCESS)
        {
            printf("set vif dev:%d failed\n",vifDev);
            goto EXIT;
        }
    
        s32Ret = MI_VIF_EnableDev(vifDev);
        if(s32Ret != MI_SUCCESS)
        {
            printf("enable vif dev:%d failed\n",vifDev);
            goto EXIT;
        }
    
        s32Ret = MI_VIF_SetOutputPortAttr(vifDev, vifPort, &stVifPortInfo);
        if(s32Ret != MI_SUCCESS)
        {
            printf("set vif dev:%d port:%d failed\n",vifDev,vifPort);
            goto EXIT;
        }
    
        s32Ret = MI_VIF_EnableOutputPort(vifDev, vifPort);
        if(s32Ret != MI_SUCCESS)
        {
            printf("enable vif dev:%d port:%d  failed\n",vifDev,vifPort);
            goto EXIT;
        }
    
        s32Ret = MI_SYS_SetChnOutputPortDepth(0, &stChnPort, 1, 4);
        if(s32Ret != MI_SUCCESS)
        {
            printf("set vif port depth failed\n");
            goto EXIT;
        }
    
        s32Ret = MI_VIF_DisableOutputPort(vifDev, vifPort);
        if(s32Ret != MI_SUCCESS)
        {
            printf("disable vif dev:%d port:%d failed\n",vifDev,vifPort);
            goto EXIT;
        }
    
        s32Ret = MI_VIF_DisableDev(vifDev);
        if(s32Ret != MI_SUCCESS)
        {
            printf("disable vif dev:%d failed\n",vifDev);
            goto EXIT;
        }
        s32Ret = MI_VIF_DestroyDevGroup(GroupId);
        if(s32Ret != MI_SUCCESS)
        {
            printf("destroy vif group:%d failed\n",GroupId);
            goto EXIT;
        }
    
        s32Ret = MI_SNR_Disable(eSnrPadId);
        if(s32Ret != MI_SUCCESS)
        {
            printf("enable sensor:%d failed\n", eSnrPadId);
            goto EXIT;
        }
        MI_SYS_Exit(0);
    EXIT:
        return s32Ret;
    }
    

    2. API参考

    该功能模块提供以下API:

    API名 功能
    MI_VIF_CreateDevGroup 创建Device 对应的Group
    MI_VIF_DestroyDevGroup 销毁Group
    MI_VIF_SetDevGroupAttr 设置Group 的属性
    MI_VIF_GetDevGroupAttr 获取Group 的属性
    MI_VIF_SetDevAttr 设置设备属性
    MI_VIF_GetDevAttr 获取设备属性
    MI_VIF_EnableDev 启用设备
    MI_VIF_DisableDev 禁用设备
    MI_VIF_GetDevStatus 获取设备的状态
    MI_VIF_SetOutputPortAttr 设置output 端口属性
    MI_VIF_GetOutputPortAttr 获取output 端口属性
    MI_VIF_EnableOutputPort 启用output 端口Port
    MI_VIF_DisableOutputPort 禁用output 端口
    MI_VIF_Query 查询 VIF 通道的Port中断计数、平均帧率等信息
    MI_VIF_CallBackTask_Register kernel space下向 VIF 注册回调接口
    MI_VIF_CallBackTask_UnRegister kernel space下向 VIF 反注册回调接口
    MI_VIF_CustFunction 提供Vif客制化功能

    2.1. MI_VIF_CreateDevGroup

    • 功能

      创建Device 对应的Group

    • 语法

      MI_S32 MI_VIF_CreateDevGroup(MI_VIF_GROUP GroupId, MI_VIF_GroupAttr_t *pstGroupAttr)
      
    • 形参

      参数名称 描述 输入/输出
      GroupId Group ID 输入
      pstGroupAttr Group属性,静态属性。 输入
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_vif_datatype.h、mi_vif.h

      • 库文件:libmi_vif.a

    • 注意

      • MI VIF跟后端模块同时存在Realtime 和FrameMode连接时,例如ISP Bayer Realitme,SCL Dev2 YUV Realitme同时其他Dev有Frame mode连接,优先Create Realtime连接的DevGroup 并Bind后端模块。

      • 在Create DevGroup之前一定要确保 sensor 出流,即如果使用我们的MI sensor,需要确保MI_SNR_Enable,如果使用user sensor需要确保user自己的sensor已经完成初始化。

      • Ifackel有支持从VIF侧获取3A统计值的功能,如果VIF与ISP以FrameMode形式连接,Create DevGroup时需要为VIF侧的变量stMetaDataAttr.u32MetaDataTypeMask赋固定值(E_MI_VIF_METADATA_AE_STAT | E_MI_VIF_METADATA_AF_STAT)以开启VIF 3A统计值模块,Realtime时需要为变量stMetaDataAttr.u32MetaDataTypeMask赋值0以关闭VIF 3A统计值模块。

      • Ifackel有支持AI ISP功能,如果有开启AI ISP功能,Create DevGroup时需要为VIF侧的变量stGroupAttr.stAiIspAttr.stVifAiBnrAttr.eAiSourceType和stGroupAttr.stAiIspAttr.stVifAiHdrAttr.bAiHdrEn赋值。

      • 如果使用场景中预期会有AI和no-AI场景切换,建议初始化VIF时,先配置AI使能,即配置变量stGroupAttr.stAiIspAttr.stVifAiBnrAttr,比如设置ai bnr source type为linear mode, hdr fusion或hdr long-expo。先配置AI使能的目的是为了出流过程中AI和no_AI场景切换时,可以动态开关VIF侧的AI配置,不用销毁、重新初始化VIF。反之,如果初始化VIF时按照no-AI配置、出流过程中切换到AI场景时需要销毁、重新初始化VIF。

      • Group Id 包含Device Id
        0 Device0~3
        1 Device4~7
        2 Device8~11
        3 Device12~15
        4 Device16~19
        5 Device20~23
        6 Device24~27
        7 Device28~31
    • 举例

      #define ST_MAX_VIF_DEV_PERGROUP (4)
      #define ST_MAX_VIF_OUTPORT_NUM (2)
      

      MI_VIF 初始化流程:

      MI_S32 ST_VifModuleInit(MI_VIF_GROUP groupId)
      {
          MI_VIF_DEV vifDev =0;
          MI_VIF_PORT vifPort = 0;
          MI_SNR_PADID SnrPadId = 0;
          MI_U32 u32PlaneId = 0;
          MI_U16 vifDevIdPerGroup=0;
      
          MI_SNR_PADInfo_t  stPad0Info;
          MI_SNR_PlaneInfo_t stSnrPlane0Info;
          memset(&stPad0Info, 0x0, sizeof(MI_SNR_PADInfo_t));
          memset(&stSnrPlane0Info, 0x0, sizeof(MI_SNR_PlaneInfo_t));
      
          MI_VIF_GroupAttr_t stGroupAttr;
          memset(&stGroupAttr, 0x0, sizeof(MI_VIF_GroupAttr_t));
      
          STCHECKRESULT(MI_SNR_GetPadInfo(SnrPadId, &stPad0Info));
          STCHECKRESULT(MI_SNR_GetPlaneInfo(SnrPadId, u32PlaneId, &stSnrPlane0Info));
      
          stGroupAttr.eIntfMode = E_MI_VIF_MODE_MIPI;
          stGroupAttr.eWorkMode = E_MI_VIF_WORK_MODE_1MULTIPLEX;
          stGroupAttr.eHDRType = E_MI_VIF_HDR_TYPE_OFF;
          if(stGroupAttr.eIntfMode == E_MI_VIF_MODE_BT656)
              stGroupAttr.eClkEdge = (MI_VIF_ClkEdge_e)stPad0Info.unIntfAttr.stBt656Attr.eClkEdge;
          else
              stGroupAttr.eClkEdge = E_MI_VIF_CLK_EDGE_DOUBLE;
      
          stGroupAttr.stMetaDataAttr.u32MetaDataTypeMask       = E_MI_VIF_METADATA_AE_STAT | E_MI_VIF_METADATA_AF_STAT;
          stGroupAttr.stAiIspAttr.stVifAiBnrAttr.eAiSourceType = E_MI_VIF_AI_BNR_SOURCE_TYPE_LINEAR;
          stGroupAttr.stAiIspAttr.stVifAiHdrAttr.bAiHdrEn      = FALSE;
      
          STCHECKRESULT(MI_VIF_CreateDevGroup(groupId, &stGroupAttr));
      
          for(vifDevIdPerGroup=0; vifDevIdPerGroup< ST_MAX_VIF_DEV_PERGROUP; vifDevIdPerGroup++)
          {
              MI_VIF_DevAttr_t stVifDevAttr;
              memset(&stVifDevAttr, 0x0, sizeof(MI_VIF_DevAttr_t));
      
              vifDev = groupId*ST_MAX_VIF_DEV_PERGROUP+vifDevIdPerGroup;
              stVifDevAttr.stInputRect.u16X = stSnrPlane0Info.stCapRect.u16X;
              stVifDevAttr.stInputRect.u16Y = stSnrPlane0Info.stCapRect.u16Y;
              stVifDevAttr.stInputRect.u16Width = stSnrPlane0Info.stCapRect.u16Width;
              stVifDevAttr.stInputRect.u16Height = stSnrPlane0Info.stCapRect.u16Height;
              if(stSnrPlane0Info.eBayerId >= E_MI_SYS_PIXEL_BAYERID_MAX)
              {
                  stVifDevAttr.eInputPixel = stSnrPlane0Info.ePixel;
              }
              else
                  stVifDevAttr.eInputPixel = (MI_SYS_PixelFormat_e)RGB_BAYER_PIXEL(stSnrPlane0Info.ePixPrecision, stSnrPlane0Info.eBayerId);
      
              printf("setchnportattr (%d,%d,%d,%d) \n", stVifDevAttr.stInputRect.u16X, stVifDevAttr.stInputRect.u16Y, stVifDevAttr.stInputRect.u16Width, stVifDevAttr.stInputRect.u16Height);
              STCHECKRESULT(MI_VIF_SetDevAttr(vifDev, &stVifDevAttr));
              STCHECKRESULT(MI_VIF_EnableDev(vifDev));
      
              for(vifPort=0; vifPort< ST_MAX_VIF_OUTPORT_NUM; vifPort++)
              {
                  MI_VIF_OutputPortAttr_t stVifPortInfo;
                  memset(&stVifPortInfo, 0, sizeof(MI_VIF_OutputPortAttr_t));
      
                  stVifPortInfo.stCapRect.u16X = stSnrPlane0Info.stCapRect.u16X;
                  stVifPortInfo.stCapRect.u16Y = stSnrPlane0Info.stCapRect.u16Y;
                  stVifPortInfo.stCapRect.u16Width =  stSnrPlane0Info.stCapRect.u16Width;
                  stVifPortInfo.stCapRect.u16Height = stSnrPlane0Info.stCapRect.u16Height;
                  stVifPortInfo.stDestSize.u16Width = stSnrPlane0Info.stCapRect.u16Width;
                  stVifPortInfo.stDestSize.u16Height = stSnrPlane0Info.stCapRect.u16Height;
                  printf("sensor bayerid %d, bit mode %d \n", stSnrPlane0Info.eBayerId, stSnrPlane0Info.ePixPrecision);
                  if(stSnrPlane0Info.eBayerId >= E_MI_SYS_PIXEL_BAYERID_MAX)
                  {
                      stVifPortInfo.ePixFormat = stSnrPlane0Info.ePixel;
                  }
                  else
                      stVifPortInfo.ePixFormat = (MI_SYS_PixelFormat_e)RGB_BAYER_PIXEL(stSnrPlane0Info.ePixPrecision, stSnrPlane0Info.eBayerId);
                  stVifPortInfo.eFrameRate = E_MI_VIF_FRAMERATE_FULL;
      
                  STCHECKRESULT(MI_VIF_SetOutputPortAttr(vifDev, vifPort, &stVifPortInfo));
                  STCHECKRESULT(MI_VIF_EnableOutputPort(vifDev, vifPort));
              }
          }
          return MI_SUCCESS;
      }
      

      MI_VIF 去初始化流程:

      MI_S32 ST_VifModuleUnInit(MI_VIF_GROUP groupId)
      {
          MI_VIF_DEV vifDev = 0;
          MI_VIF_PORT vifPort=0;
          MI_U16 vifDevIdPerGroup=0;
          for(vifDevIdPerGroup=0; vifDevIdPerGroup< ST_MAX_VIF_DEV_PERGROUP; vifDevIdPerGroup++)
          {
              vifDev = groupId*ST_MAX_VIF_DEV_PERGROUP+vifDevIdPerGroup;
      
              for(vifPort=0; vifPort< ST_MAX_VIF_OUTPORT_NUM; vifPort++)
              {
                  STCHECKRESULT(MI_VIF_DisableOutputPort(vifDev, vifPort));
              }
              STCHECKRESULT(MI_VIF_DisableDev(vifDev));
          }
      
          STCHECKRESULT(MI_VIF_DestroyDevGroup(groupId));
      
          return MI_SUCCESS;
      }
      
    • 相关主题

      MI_VIF_DestroyDevGroup


    2.2. MI_VIF_DestroyDevGroup

    • 功能

      销毁设备对应的Group。

    • 语法

      MI_S32 MI_VIF_DestroyDevGroup(MI_VIF_GROUP GroupId)
      
    • 形参

      参数名称 描述 输入/输出
      GroupId Group ID 输入
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_vif_datatype.h、mi_vif.h

      • 库文件:libmi_vif.a

    • 注意

      需要先使用MI_VIF_DisableOutputPort 禁用掉device 上所有输出端口,再使用MI_VIF_DisableDev 禁用掉group 上所有device。

    • 举例

      请参见MI_VIF_CreateDevGroup的举例。

    • 相关主题

      MI_VIF_CreateDevGroup


    2.3. MI_VIF_SetDevGroupAttr

    • 功能

      设置Group 的属性

    • 语法

      MI_S32 MI_VIF_GetSevGroupAttr(MI_VIF_GROUP GroupId, MI_VIF_GroupAttr_t *pstGroupAttr)
      
    • 形参

      参数名称 描述 输入/输出
      GroupId Group ID 输入
      pstGroupAttr Group属性 输出
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_vif_datatype.h、mi_vif.h

      • 库文件:libmi_vif.a

    • 相关主题

      MI_VIF_GroupAttr_t

      MI_VIF_CreateDevGroup


    2.4. MI_VIF_GetDevGroupAttr

    • 功能

      获取Group 的属性。

    • 语法

      MI_S32 MI_VIF_GetDevGroupAttr(MI_VIF_GROUP GroupId, MI_VIF_GroupAttr_t *pstGroupAttr)
      
    • 形参

      参数名称 描述 输入/输出
      GroupId Group ID 输入
      pstGroupAttr Group属性 输出
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_vif_datatype.h、mi_vif.h

      • 库文件:libmi_vif.a

    • 相关主题

      MI_VIF_CreateDevGroup


    2.5. MI_VIF_SetDevAttr

    • 功能

      设置 VIF 设备属性。

    • 语法

      MI_S32 MI_VIF_SetDevAttr(MI_VIF_DEV DevId, MI_VIF_DevAttr_t *pstDevAttr)
      
    • 形参

      参数名称 描述 输入/输出
      DevId VIF 设备号。 输入
      pstDevAttr VIF 设备属性指针,静态属性。 输入
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_vif_datatype.h、mi_vif.h

      • 库文件:libmi_vif.a

    • 注意

      • 在调用前要保证 VIF 设备处于禁用状态。如果 VIF 设备已处于使能状态,可以使用MI_VIF_DisableDev 来禁用设备。

      • 参数 pstDevAttr 主要用来配置指定 VIF 设备的视频输入格式。

      • eInputPixel只支持YUV422_YUYV/YVYU/UYVY/VYUY 和 bayer格式,具体请参考芯片差异,根据chip规格设置。

    • 举例

      请参见MI_VIF_CreateDevGroup的举例。

    • 相关主题

      MI_VIF_GetDevAttr


    2.6. MI_VIF_GetDevAttr

    • 功能

      获取 VIF 设备属性。

    • 语法

      MI_S32 MI_VIF_GetDevAttr(MI_VIF_DEV DevId, MI_VIF_DevAttr_t *pstDevAttr)
      
    • 形参

      参数名称 描述 输入/输出
      DevId VIF 设备号。 输入
      pstDevAttr VIF 设备属性指针。 输出
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_vif_datatype.h、mi_vif.h

      • 库文件:libmi_vif.a

    • 相关主题

      MI_VIF_SetDevAttr


    2.7. MI_VIF_EnableDev

    • 功能

      启用 VIF 设备。

    • 语法

      MI_S32 MI_VIF_EnableDev(MI_VIF_DEV DevId);
      
    • 形参

      参数名称 描述 输入/输出
      DevId VIF 设备号。 输入
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_vif_datatype.h、mi_vif.h

      • 库文件:libmi_vif.a

    • 注意

      • 启用前必须已经设置设备属性,否则返回失败。

      • 可重复启用,不返回失败。

    • 举例

      请参见MI_VIF_CreateDevGroup的举例。

    • 相关主题

      MI_VIF_DisableDev


    2.8. MI_VIF_DisableDev

    • 功能

      禁用 VIF 设备。

    • 语法

      MI_S32 MI_VIF_DisableDev(MI_VIF_DEV DevId);
      
    • 形参

      参数名称 描述 输入/输出
      DevId VIF 设备号。 输入
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_vif_datatype.h、mi_vif.h

      • 库文件:libmi_vif.a

    • 注意

      • 必须先禁用所有设备上的输出端口后,才能禁用 VIF 设备。

      • 可重复禁用,不返回失败。

    • 举例

      请参见MI_VIF_CreateDevGroup的举例。

    • 相关主题

      MI_VIF_EnableDev


    2.9. MI_VIF_GetDevStatus

    • 功能

      获取设备的状态。

    • 语法

      MI_S32 MI_VIF_GetDevStatus(MI_VIF_DEV DevId, MI_VIF_DevStatus_t *pstVifDevStatus)
      
    • 形参

      参数名称 描述 输入/输出
      DevId VIF 设备号 输入
      pstVifDevStatus 设备状态 输出
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_vif_datatype.h、mi_vif.h

      • 库文件:libmi_vif.a


    2.10. MI_VIF_SetOutputPortAttr

    • 功能

      设置 VIF 输出端口属性。

    • 语法

      MI_S32 MI_VIF_SetOutputPortAttr(MI_VIF_DEV DevId, MI_VIF_PORT PortId, MI_VIF_OutputPortAttr_t *pstAttr);
      
    • 形参

      参数名称 描述 输入/输出
      DevId VIF 通道号。 输入
      PortId Port号 输入
      pstAttr VIF 通道Port属性指针。 输入
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_vif_datatype.h、mi_vif.h

      • 库文件:libmi_vif.a

    • 注意

      • 默认情况下,使用 MI_VIF_SetOutputPortAttr 接口的目的是设置端口属性,如CapSize、DestSize、FrameRate等等。

      • Port0不支持crop和scaling,所以cap和dest size 必须和MI_VIF_SetDevAttr时的input size 相等。

      • Tiramisu 系列芯片支持port1,port1输入只支持YUV格式,所以只有YUV sensor才可以使用port1,支持crop和scaling down,输出只支持12bit bayer格式。

      • Tiramisu 系列芯片支持port1,Port1 height 有做scaling down 时,输出width 最大等于960。

      • 目前不支持eFrameRate 设置,预留参数。

      • Tiramisu、Muffin、Opera、Souffle系列芯片:port0支持输出12bit bayer格式,可以送进MI_ISP 做3DNR。

      • Mochi芯片:支持输出YUV422格式,可以送进MI_ISP 做3DNR。

        芯片 Pixel 要求 支持压缩模式 注意
        Tiramisu Bayer 10/12bit E_MI_SYS_COMPRESS_MODE_TO_8BIT
        Muffin Bayer 10/12bit E_MI_SYS_COMPRESS_MODE_TO_8BIT
        Mochi YUV422 UYVY E_MI_SYS_COMPRESS_MODE_TO_6BIT
        E_MI_SYS_COMPRESS_MODE_SFBC0
        DI 模式不支持SFBC0压缩
        Maruko Bayer 10/12bit E_MI_SYS_COMPRESS_MODE_TO_8BIT
        Opera Bayer 10/12bit E_MI_SYS_COMPRESS_MODE_TO_8BIT
        Souffle Bayer 10/12bit E_MI_SYS_COMPRESS_MODE_TO_8BIT
        Iford Bayer 10/12bit E_MI_SYS_COMPRESS_MODE_TO_8BIT
    • 举例

      请参见MI_VIF_CreateDevGroup的举例。

    • 相关主题

      MI_VIF_GetOutputPortAttr


    2.11. MI_VIF_GetOutputPortAttr

    • 功能

      获取 VIF 输出端口属性。

    • 语法

      MI_S32 MI_VIF_GetOutputPortAttr(MI_VIF_DEV DevId, MI_VIF_PORT PortId, MI_VIF_OutputPortAttr_t *pstAttr)
      
    • 形参

      参数名称 描述 输入/输出
      DevId VIF 通道号。 输入
      PortId Port号。 输入
      pstAttr VIF 通道Port属性指针。 输出
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_vif_datatype.h、mi_vif.h

      • 库文件:libmi_vif.a

    • 相关主题

      MI_VIF_SetOutputPortAttr


    2.12. MI_VIF_EnableOutputPort

    • 功能

      启用 VIF输出端口。

    • 语法

      MI_S32 MI_VIF_EnableOutputPort(MI_VIF_DEV DevId, MI_VIF_PORT PortId)
      
    • 形参

      参数名称 描述 输入/输出
      DevId VIF 设备号 输入
      PortId Port号 输入
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_vif_datatype.h、mi_vif.h

      • 库文件:libmi_vif.a

    • 注意

      • 必须先设置通道属性,且通道所绑定的 VIF 设备必须使能。

      • 可重复启用 VIF 通道,不返回失败。

    • 举例

      请参见 MI_VIF_SetDevAttr 的举例。

    • 相关主题

      MI_VIF_DisableOutputPort


    2.13. MI_VIF_DisableOutputPort

    • 功能

      禁用 VIF 输出端口。

    • 语法

      MI_S32 MI_VIF_DisableOutputPort(MI_VIF_DEV DevId, MI_VIF_PORT PortId)
      
    • 形参

      参数名称 描述 输入/输出
      DevId VIF 通道号。 输入
      PortId Port号 输入
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_vif_datatype.h、mi_vif.h

      • 库文件:libmi_vif.a

    • 注意

      • 禁用 VIF 通道Port后,此 VIF 通道Port即停止采集视频输入数据,如果已经绑定后端,则后端不会再接收到视频图像。

      • 可重复禁用 VIF 通道Port,不返回失败。

    • 举例

      请参见MI_VIF_CreateDevGroup的举例。

    • 相关主题

      MI_VIF_EnableOutputPort


    2.14. MI_VIF_Query

    • 功能

      查询 VIF 通道的中断计数、平均帧率等信息。

    • 语法

      MI_S32 MI_VIF_Query(MI_VIF_DEV DevId, MI_VIF_PORT PortId, MI_VIF_DevPortStat_t *pstStat)
      
    • 形参

      参数名称 描述 输入/输出
      DevId VIF 通道号。 输入
      PortId Port口 输入
      pstStat 通道信息结构体指针。 输出
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_vif_datatype.h、mi_vif.h

      • 库文件:libmi_vif.a

    • 注意

      • 该接口可查询中断计数、通道使能状态、平均帧率、中断丢失数、获取 VB 失败次数、图像宽高等信息。

      • 通过该接口获取到的帧率是每 1 秒钟的平均帧率,即 VIF 会每隔一秒统计一次平均帧率,该值并不精确,会有些波动。

      • 用户可通过该接口查询中断丢失数,如果该数值一直在增加,说明 VIF 工作出现异常。

      • Tiramisu系列以后的芯片才支持该接口。


    2.15. MI_VIF_CallBackTask_Register

    • 描述

      向VIF注册回调接口。

    • 语法

      MI_S32 MI_VIF_CallBackTask_Register(MI_VIF_DEV DevId, MI_VIF_CallBackParam_t *pstCallBackParam);
      
    • 参数

      参数名称 描述 输入/输出
      DevId VIF Chn ID 输入
      pstCallBackParam 回调参数 输入
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_common.h、mi_vif.h

      • 库文件:libmi_vif.a

    • 注意

    • 举例

      MI_S32 _mi_vif_framestart1(MI_U64 u64Data)
      {
          DBG_ERR("DATA %llu \n", u64Data);
          return 0;
      }
      MI_S32 _mi_vif_framestart2(MI_U64 u64Data)
      {
          DBG_ERR("DATA %llu \n", u64Data);
          return 0;
      }
      
      static MS_S32 _mi_vif_testRegVifCallback(void)
      {
          MI_VIF_CallBackParam_t stCallBackParam1;
          MI_VIF_CallBackParam_t stCallBackParam2;
          MI_VIF_DEV u32DevId = 0;
          memset(&stCallBackParam1, 0x0, sizeof(MI_VIF_CallBackParam_t));
          memset(&stCallBackParam2, 0x0, sizeof(MI_VIF_CallBackParam_t));
          stCallBackParam1.eCallBackMode = E_MI_VIF_CALLBACK_ISR;
          stCallBackParam1.eIrqType = E_MI_VIF_IRQ_FRAMESTART;
          stCallBackParam1.pfnCallBackFunc = _mi_vif_framestart1;
          stCallBackParam1.u64Data = 11;
          MI_VIF_CallBackTask_Register(u32DevId,&stCallBackParam1);
          stCallBackParam2.eCallBackMode = E_MI_VIF_CALLBACK_ISR;
          stCallBackParam2.eIrqType = E_MI_VIF_IRQ_FRAMESTART;
          stCallBackParam2.pfnCallBackFunc = _mi_vif_framestart2;
          stCallBackParam2.u64Data = 22;
          MI_VIF_CallBackTask_Register(u32DevId,&stCallBackParam2);
          return 0;
      }
      static MS_S32 _mi_vif_testUnRegVifCallback(void)
      {
          MI_VIF_CallBackParam_t stCallBackParam1;
          MI_VIF_CallBackParam_t stCallBackParam2;
      
          MI_VIF_DEV u32DevId = 0;
          memset(&stCallBackParam1, 0x0, sizeof(MI_VIF_CallBackParam_t));
          memset(&stCallBackParam1, 0x0, sizeof(MI_VIF_CallBackParam_t));
          stCallBackParam1.eCallBackMode = E_MI_VIF_CALLBACK_ISR;
          stCallBackParam1.eIrqType = E_MI_VIF_IRQ_FRAMESTART;
          stCallBackParam1.pfnCallBackFunc = _mi_vif_framestart1;
          stCallBackParam1.u64Data = 33;
          MI_VIF_CallBackTask_UnRegister(u32DevId,&stCallBackParam1);
          stCallBackParam2.eCallBackMode = E_MI_VIF_CALLBACK_ISR;
          stCallBackParam2.eIrqType = E_MI_VIF_IRQ_FRAMESTART;
          stCallBackParam2.pfnCallBackFunc = _mi_vif_framestart2;
          stCallBackParam2.u64Data = 44;
          MI_VIF_CallBackTask_UnRegister(u32DevId,&stCallBackParam2);
          return 0;
      }
      
    • 相关主题

      MI_VIF_CallBackTask_UnRegister


    2.16. MI_VIF_CallBackTask_UnRegister

    • 描述

      向VIF反注册回调接口。

    • 语法

      MI_S32 MI_VIF_CallBackTask_UnRegister(MI_VIF_DEV DevId, MI_VIF_CallBackParam_t *pstCallBackParam);
      
    • 参数

      参数名称 描述 输入/输出
      DevId VIF Chn ID 输入
      pstCallBackParam 回调参数 输入
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_common.h、mi_vif.h

      • 库文件:libmi_vif.a

    • 注意

    • 举例

      MI_VIF_CallBackTask_Register举例

    • 相关主题

      MI_VIF_CallBackTask_Register


    2.17. MI_VIF_CustFunction

    • 描述

      提供VIF客制化功能。

    • 语法

      MI_S32 MI_VIF_CustFunction(MI_VIF_DEV DevId, MI_VIF_CustCmd_e eCmdId, MI_U32 u32DataSize, void *pCustData);
      
    • 参数

      参数名称 描述 输入/输出
      DevId VIF dev ID 输入
      eCmdId 客制化功能ID 输入
      u32DataSize 客制化功能数据大小 输入
      pCustData 客制化功能数据首地址 输入
    • 返回值

      • MI_SUCCESS(0):成功。

      • 非0:失败,详情参照错误码

    • 依赖

      • 头文件:mi_common.h、mi_vif.h

      • 库文件:libmi_vif.a

    3. VIF 数据类型


    MI_VIF中定义的数据类型:

    数据类型 说明
    MI_VIF_GROUP 定义设备群组Id
    MI_VIF_IntfMode_e 定义视频输入设备的接口模式
    MI_VIF_WorkMode_e 定义视频设备的复合工作模式
    MI_VIF_FrameRate_e 定义视频设备输出fps和输入fps的关系
    MI_VIF_ClkEdge_e 定义视频设备接收的时钟类型
    MI_VIF_HDRType_e 定义视频设备HDR 类型
    MI_VIF_MclkSource_e 定义给Sensor 输入驱动clock 类型
    MI_VIF_GroupIdMask_e 定义设备群组mask
    MI_VIF_SNRPad_e 定义 SensorPad Id
    MI_VIF_GroupAttr_t 定义设备群组属性
    MI_VIF_DevAttr_t 定义视频输入设备的属性。
    MI_VIF_OutputPortAttr_t 定义VIF 输出端口属性。
    MI_VIF_DevPortStat_t 定义VIF输出端口信息结构体
    MI_VIF_DevStatus_t 定义VIF设备当前状态
    MI_VIF_CALLBK_FUNC 定义回调函数类型
    MI_VIF_CallBackMode_e 定义回调模式
    MI_VIF_IrqType_e 定义硬件中断类型
    MI_VIF_CallBackParam_t 定义回调参数
    MI_VIF_HDRFusionType_e 定义VIF HDR 融合模式
    MI_VIF_HDRExposureType_e 定义VIF HDR 曝光类型
    MI_VIF_MetaDataType_e 定义VIF额外功能类型
    MI_VIF_MetaDataAttr_t 定义VIF额外功能参数结构体
    MI_VIF_CustCmd_e 定义VIF客制化命令
    MI_VIF_PutDataAttr_t 定义VIF输入数据结构体
    MI_VIF_FrameEndInfo_t 定义VIF在FrameEnd Callback中入参的结构体
    MI_VIF_SleepModeParams_t 定义VIF控制Sensor进出Sleep Mode的参数结构体
    MI_VIF_ShutterGainParams_t 定义VIF控制Sensor的AE参数的结构体
    MI_VIF_ForceFrameParams_t 定义VIF 强制sensor退出sleep mode的设置参数
    MI_VIF_AiIspAttr_t 定义AiIsp的属性配置
    MI_VIF_AiBnrAttr_t 定义AiBnr场景的属性配置
    MI_VIF_AiHdrAttr_t 定义AiHdr场景的属性配置
    MI_VIF_AiBnrSourceType_e 定义AI Bnr source类型配置

    注:本节已涵盖各重要的数据类型,部分未列出数据类型请参见 mi_vif_datatype.h


    3.1. MI_VIF_GROUP

    • 说明

      定义设备群组ID。

    • 定义

      typedef MI_U32 MI_VIF_GROUP;
      
    • 相关数据类型及接口

      MI_VIF_CreateDevGroup


    3.2. MI_VIF_IntfMode_e

    • 说明

      定义视频设备的接口模式。

    • 定义

          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_LVDS,
      
              E_MI_VIF_MODE_NUM
      
          } MI_VIF_IntfMode_e;
      
    • 成员

      成员名称 描述
      E_MI_VIF_MODE_BT656 输入数据的协议符合标准 BT.656 协议,端口数据输入模式为亮度色度复合模式,分量模式为单分量。
      E_MI_VIF_MODE_DIGITAL_CAMERA 输入数据的协议为 Digital camera 协议,端口数据输入模式为亮度色度复合模式,分量模式为单分量。
      E_MI_VIF_MODE_BT1120_STANDARD 输入数据的协议符合标准 BT.1120 协议 (BT.656+双分量),端口数据输入模式为亮度色度分离模式,分量模式为双分量。
      E_MI_VIF_MODE_BT1120_INTERLEAVED 输入数据的协议符合 BT.1120 interleave 模式,端口数据输入模式为亮度色度分离模式,分量模式为双分量。
      E_MI_VIF_MODE_MIPI 输入数据符合MIPI 协议
      E_MI_VIF_MODE_LVDS 输入数据符合LVDS 协议
    • 注意事项

      可以通过MI_SNR_GetPadInfo中的eIntfMode 获取当前接口模式。

    • 相关数据类型及接口

      MI_VIF_GroupAttr_t


    3.3. MI_VIF_WorkMode_e

    • 说明

      定义视频设备的复合工作模式。

    • 定义

      typedef enum
      
      {
      
          /* BT656 multiple ch mode */
      
          E_MI_VIF_WORK_MODE_1MULTIPLEX,
      
          E_MI_VIF_WORK_MODE_2MULTIPLEX,
      
          E_MI_VIF_WORK_MODE_4MULTIPLEX,
      

      ​ E_MI_VIF_WORK_MODE_MAX

      } MI_VIF_WorkMode_e;
      
    • 成员

      成员名称 描述
      E_MI_VIF_WORK_MODE_1MULTIPLEX 1 路复合工作模式。
      E_MI_VIF_WORK_MODE_2MULTIPLEX 2 路复合工作模式。
      E_MI_VIF_WORK_MODE_4MULTIPLEX 4 路复合工作模式。
    • 注意事项

      例如E_MI_VIF_WORK_MODE_4MULTIPLEX, 代表Group 对应的Sensor Pad中有4路混合视频信号, 如果SensorPad 中混合信号数量, 和Group 的复合工作模式不匹配,Group 会采集信号异常。

    • 相关数据类型及接口

      MI_VIF_GroupAttr_t


    3.4. MI_VIF_FrameRate_e

    • 说明

      定义视频设备输出fps和输入fps的关系。

    • 定义

      typedef enum
      
      {
      
          E_MI_VIF_FRAMERATE_FULL = 0,
      
          E_MI_VIF_FRAMERATE_HALF,
      
          E_MI_VIF_FRAMERATE_QUARTR,
      
          E_MI_VIF_FRAMERATE_OCTANT,
      
          E_MI_VIF_FRAMERATE_THREE_QUARTERS,
      
          E_MI_VIF_FRAMERATE_NUM,
      
      } MI_VIF_FrameRate_e;
      
    • 成员

      成员名称 描述
      E_MI_VIF_FRAMERATE_FULL 源和目标1:1输出。
      E_MI_VIF_FRAMERATE_HALF 源和目标2:1输出。
      E_MI_VIF_FRAMERATE_QUARTER 源和目标4:1输出。
      E_MI_VIF_FRAMERATE_OCTANT 源和目标8:1输出。
      E_MI_VIF_FRAMERATE_THREE_QUARTERS 源和目标4:3输出。
    • 注意事项

      该功能为预留功能,暂不支持,如果需要控制帧率输出,可以通过MI_SYS_BindChnPort2 来设置。

    • 相关数据类型及接口

      MI_VIF_OutputPortAttr_t


    3.5. MI_VIF_ClkEdge_e

    • 说明

      定义视频设备接收的时钟类型。

    • 定义

      typedef enum
      
      {
      
          E_MI_VIF_CLK_EDGE_SINGLE_UP = 0,
      
          E_MI_VIF_CLK_EDGE_SINGLE_DOWN,
      
          E_MI_VIF_CLK_EDGE_DOUBLE,
      
          E_MI_VIF_CLK_EDGE_NUM
      
      } MI_VIF_ClkEdge_e;
      
    • 成员

      成员名称 描述
      E_MI_VIF_CLK_EDGE_SINGLE_UP 时钟单沿模式,且 VIF 设备在上升沿采样。
      E_MI_VIF_CLK_EDGE_SINGLE_DOWN 时钟单沿模式,且 VIF 设备在下降沿采样。
      E_MI_VIF_CLK_EDGE_DOUBLE 前端送过来双沿数据时,VIF 进行双沿采样。
    • 注意事项

      无。

    • 相关数据类型及接口

      MI_VIF_GroupAttr_t


    3.6. MI_VIF_HDRType_e

    • 说明

      定义视频设备HDR 类型。

    • 定义

      typedef enum
      
      {
      
          E_MI_VIF_HDR_TYPE_OFF,
      
          E_MI_VIF_HDR_TYPE_VC,       //virtual channel mode HDR,vc0->long, vc1->short
      
          E_MI_VIF_HDR_TYPE_DOL,
      
          E_MI_VIF_HDR_TYPE_COMP,      //compressed HDR mode
      
          E_MI_VIF_HDR_TYPE_LI,        //Line interlace HDR
      
          E_MI_VIF_HDR_TYPE_COMPVS,
      
          E_MI_VIF_HDR_TYPE_DCG,       //Dual conversion gain HDR
      
          E_MI_VIF_HDR_TYPE_MAX
      
      } MI_VIF_HDRType_e;
      
    • 成员

      成员名称 描述
      E_MI_VIF_HDR_TYPE_OFF 不开HDR
      E_MI_VIF_HDR_TYPE_VC virtual channel mode HDR,vc0->long, vc1->short
      E_MI_VIF_HDR_TYPE_DOL Digital Overlap High Dynamic Range
      E_MI_VIF_HDR_TYPE_COMP, sensor融合长曝和短曝,isp控制两张frame的gain值
      E_MI_VIF_HDR_TYPE_LI Line interlace HDR
      E_MI_VIF_HDR_TYPE_COMPVS compressed HDR + Very short
      E_MI_VIF_HDR_TYPE_DCG Dual conversion gain HDR
    • 注意事项

      • hdr type和sensor相关,可以通过MI_SNR_GetPadInfo的eHDRMode获取当前sensor支持的HDR type。

      • 实现HDR功能需要MI_VIF 和MI_ISP 模块设置相同的HDR类型。

      • DCG HDR type 和 COMPVS HDR type暂不支持。

      • COMP HDR type opera系列芯片支持。

    • 相关数据类型及接口

      MI_VIF_GroupAttr_t


    3.7. MI_VIF_MclkSource_e

    • 说明

      设置Senor时钟驱动。

    • 定义

      typedef enum
      {
          E_MI_VIF_MCLK_12MHZ,
          E_MI_VIF_MCLK_18MHZ,
          E_MI_VIF_MCLK_27MHZ,
          E_MI_VIF_MCLK_36MHZ,
          E_MI_VIF_MCLK_54MHZ,
          E_MI_VIF_MCLK_108MHZ,
          E_MI_VIF_MCLK_MAX
      }MI_VIF_MclkSource_e;
      
    • 成员

      成员名称 描述
      E_MI_VIF_MCLK_12MHZ 12M clk 类型
      E_MI_VIF_MCLK_18MHZ 18M clk 类型
      E_MI_VIF_MCLK_27MHZ 27M clk 类型
      E_MI_VIF_MCLK_36MHZ 36M clk 类型
      E_MI_VIF_MCLK_54MHZ 54M clk 类型
      E_MI_VIF_MCLK_108MHZ 108M clk 类型
    • 注意事项

      • 有sensor driver的情况下, 优先从sensor driver中设置mclk。

      • 如果没有sensor driver 并且需要主控芯片输出mclk 才通过该参数设置。

    • 相关数据类型及接口

      MI_VIF_GroupAttr_t


    3.8. MI_VIF_GroupIdMask_e

    • 说明

      设备群组mask。

    • 定义

      typedef enum
      {
          E_MI_VIF_GROUPMASK_ID0  = 0x0001,
          E_MI_VIF_GROUPMASK_ID1  = 0x0002,
          E_MI_VIF_GROUPMASK_ID2  = 0x0004,
          E_MI_VIF_GROUPMASK_ID3  = 0x0008,
          E_MI_VIF_GROUPMASK_ID4  = 0x0010,
          E_MI_VIF_GROUPMASK_ID5  = 0x0020,
          E_MI_VIF_GROUPMASK_ID6  = 0x0040,
          E_MI_VIF_GROUPMASK_ID7  = 0x0080,
          E_MI_VIF_GROUPMASK_ID_MAX = 0xffff
      } MI_VIF_GroupIdMask_e;
      
    • 注意事项

      在多sensor 拼接场景中, 需要两个sensor 图像同步输出, 此时只需要创建一个group, 将这两个group id mask 在一起即可。

    • 相关数据类型及接口

      MI_VIF_GroupAttr_t


    3.9. MI_VIF_SNRPad_e

    • 说明

      定义SensorPad Id。

    • 定义

      typedef enum
      {
          E_MI_VIF_SNRPAD_ID_0 = 0,
          E_MI_VIF_SNRPAD_ID_1 = 1,
          E_MI_VIF_SNRPAD_ID_2 = 2,
          E_MI_VIF_SNRPAD_ID_3 = 3,
          E_MI_VIF_SNRPAD_ID_4 = 4,
          E_MI_VIF_SNRPAD_ID_5 = 5,
          E_MI_VIF_SNRPAD_ID_6 = 6,
          E_MI_VIF_SNRPAD_ID_7 = 7,
          E_MI_VIF_SNRPAD_ID_MAX,
          E_MI_VIF_SNRPAD_ID_NA = 0xFF,
      }MI_VIF_SNRPad_e;
      
    • 成员

      成员名称 描述
      E_MI_VIF_SNRPAD_ID_0 对应硬件设备Sensor0
      E_MI_VIF_SNRPAD_ID_1 对应硬件设备Sensor1
      E_MI_VIF_SNRPAD_ID_2 对应硬件设备Sensor2
      E_MI_VIF_SNRPAD_ID_3 对应硬件设备Sensor3
      E_MI_VIF_SNRPAD_ID_4 对应硬件设备Sensor4
      E_MI_VIF_SNRPAD_ID_5 对应硬件设备Sensor5
      E_MI_VIF_SNRPAD_ID_6 对应硬件设备Sensor6
      E_MI_VIF_SNRPAD_ID_7 对应硬件设备Sensor7
      E_MI_VIF_SNRPAD_ID_MAX 超过最大Sensor Num
      E_MI_VIF_SNRPAD_ID_NA 无效sensor id
    • 注意事项

      • 在默认情况下是VIF Group0 对应Sensor0,Group2 对应Sensor1,group6 对应Sensor5。

      • Tiramisu、Mochi 只有4个pad(0-3),Muffin 则有8个pad(0-7)。参考芯片差异

    • 相关数据类型及接口

      MI_VIF_GroupAttr_t

      MI_VIF_DevStatus_t


    3.10. MI_VIF_GroupAttr_t

    • 说明

      定义Group群组属性。

    • 定义

      typedef struct MI_VIF_GroupAttr_s
      {
          MI_VIF_IntfMode_e       eIntfMode;
          MI_VIF_WorkMode_e       eWorkMode;
          MI_VIF_HDRType_e        eHDRType;
          MI_VIF_HDRFusionType_e  eHDRFusionTpye;
          MI_U8                   u8HDRExposureMask;
          MI_VIF_ClkEdge_e        eClkEdge; //BT656
          MI_VIF_MclkSource_e     eMclk;
          MI_SYS_FrameScanMode_e  eScanMode;
          MI_U32                  u32GroupStitchMask;  //multi vif dev bitmask by MI_VIF_GroupIdMask_e
          MI_VIF_MetaDataAttr_t   stMetaDataAttr;
          MI_VIF_AiIspAttr_t      stAiIspAttr;
      } MI_VIF_GroupAttr_t;
      
    • 成员

      成员名称 描述
      eIntfMode 接口模式。
      eWorkMode 工作模式。
      eHDRType HDR类型
      eHDRFusionTpye HDR融合类型(2Frame 还是 3Frame)
      u8HDRExposureMask HDR曝光组合,由 MI_VIF_HDRExposureType_e bitmask 组成
      eClkEdge 时钟边沿模式(上升沿采样、下降沿采样、双沿采样)。
      eMclk 输出给sensor的时钟类型
      eScanMode 输入扫描模式 (逐行、隔行)
      u32GroupStitchMask 多个GroupId缝合输出, 由MI_VIF_GroupIdMask_e bitmask 组成。
      stMetaDataAttr 额外功能开关及属性(PDAF、档头不压缩、STA统计)。
      stAiIspAttr AiIsp属性配置。
    • 注意事项

      Tiramisu、Muffin系列芯片eScanMode只支持 E_MI_SYS_FRAME_SCAN_MODE_PROGRESSIVE。

      u8HDRExposureMask : 2Frame HDR 时下没有意义,内部会设定成长短曝。3Frame Hdr 时,可以通过该值设定4种组合,长短、长中、中短、长中短,目前只有 Souffle 支持。

    • 相关数据类型及接口

      MI_VIF_CreateDevGroup

      MI_VIF_DestroyDevGroup

      MI_VIF_SetDevGroupAttr

      MI_VIF_GetDevGroupAttr


    3.11. MI_VIF_DevAttr_t

    • 说明

      定义视频输入设备的属性。

    • 定义

      typedef struct MI_VIF_DevAttr_s
      {
          MI_SYS_PixelFormat_e   eInputPixel;
          MI_SYS_DataPrecision_e eDataPrecision;
          MI_SYS_WindowRect_t   stInputRect;
          MI_SYS_FieldType_e     eField;
          MI_BOOL               bEnH2T1PMode;
      } MI_VIF_DevAttr_t;
      
    • 成员

      成员名称 描述
      eInputPixel 设备输入像素格式。
      eDataPrecision 设备输入像素位宽。
      stInputRect 设备采集输入范围。
      eField 帧场选择,只用于隔行模式,建议捕获单场时选择捕获底场。逐行模式时,该项必须设置为 E_MI_SYS_FIELDTYPE_NONE。
      Value: 0 No Field / 1 Top Field / 2 Bottom Field / 3 Both Fields
      bEnH2T1PMode 使能采集水平方向缩小一半功能。
    • 注意事项

      • 如果设备是bayer格式, pixel format设置形式如下:

        stVifDevAttr.eInputPixel = (MI_SYS_PixelFormat_e)RGB_BAYER_PIXEL(stSnrPlane0Info.ePixPrecision, stSnrPlane0Info.eBayerId);

      • eDataPrecision 参数仅在DVP接口跑YUV sensor时使用。如:输入8 bit YUV时,需设置eDataPrecision为E_MI_SYS_DATA_PRECISION_8BPP,告知VIF当前输入的data pin数目为8。

      • bEnH2T1Pmode 参数只有输入是YUV格式时才可以使用,非YUV格式使用会返回err。

    • 相关数据类型及接口

      MI_VIF_SetDevAttr

      MI_VIF_GetDevAttr


    3.12. MI_VIF_OutputPortAttr_t

    • 说明

      定义 VIF输出端口属性。

    • 定义

      typedef struct MI_VIF_OutputPortAttr_s
      {
          MI_SYS_WindowRect_t     stCapRect;
          MI_SYS_WindowSize_t     stDestSize;
          MI_SYS_PixelFormat_e    ePixFormat;
          MI_VIF_FrameRate_e      eFrameRate;
          MI_SYS_CompressMode_e   eCompressMode;
      } MI_VIF_OutputPortAttr_t;
      
    • 成员

      成员名称 描述
      stCapRect 捕获区域起始坐标(相对于设备图像的大小)与宽高。
      stDestSize 目标图像大小。必须配置,且大小不应该超出外围 ADC 输出图像的大小范围,否则可能导致VIF 硬件工作异常。
      ePixFormat 像素存储格式支持,可支持YUV422 packet/bayer。
      eFrameRate 目标帧率和输入帧率的比值关系。如果不进行帧率控制,则该值设置为0。可以按照1:1,2:1,4:1,8:1,4:3等比例输出。该功能为预留功能,暂不支持,如果需要控制帧率输出,可以通过MI_SYS_BindChnPort2 来设置。
      eCompressMode 图像压缩模式,只有在vif与isp绑定模式为framemode才能打开,节省buffer,不设置默认值为0不压缩。
      Muffin可以设置成E_MI_SYS_COMPRESS_MODE_TO_8BIT,打开FBC。
      Mochi可以设置成E_MI_SYS_COMPRESS_MODE_TO_6BIT (for YUV FBC)或者E_MI_SYS_COMPRESS_MODE_SFBC0 (SFBC)。
    • 相关数据类型及接口

      MI_VIF_SetOutputPortAttr

      MI_VIF_GetOutputPortAttr


    3.13. MI_VIF_DevPortStat_t

    • 说明

      定义VIF 输出端口信息结构体。

    • 定义

      typedef struct MI_VIF_DevPortStat_s
      {
          MI_BOOL bEnable;
          MI_U32  u32IntCnt;
          MI_U32  u32FrameRate;
          MI_U32  u32LostInt;
          MI_U32  u32VbFail;
          MI_U32  u32PicWidth;
          MI_U32  u32PicHeight;
      } MI_VIF_DevPortStat_t;
      
    • 成员

      成员名称 描述
      bEnable 通道是否使能。
      u32IntCnt 中断计数。
      u32FrameRate 每 1 秒的平均帧率,该值不一定精确。
      u32LostInt 中断丢失计数。
      u32VbFail 获取 VB 失败计数。
      u32PicWidth 图像宽度。
      u32PicHeight 图像高度。
    • 注意事项

      • 结构体的中断计数,可用于无中断检测。

      • 该结构体的帧率是每 1 秒钟的平均帧率,即 VIF 会每隔一秒统计一次平均帧率, 该值并不精确。

      • 如果查询到该结构体的中断丢失计数一直在增加,说明 VIF 工作出现异常。

    • 相关数据类型及接口

      MI_VIF_Query


    3.14. MI_VIF_DevStatus_t

    • 说明

      VIF Dev当前状态

    • 定义

      typedef struct MI_VIF_VIFDevStatus_s
      {
          MI_VIF_GROUP  GroupId;
          MI_BOOL  bGroupCreated;
          MI_U32 bDevEn;
          MI_VIF_SNRPad_e eSensorPadID;
          MI_U32 u32PlaneID;
      } MI_VIF_DevStatus_t;
      
    • 成员

      成员名称 描述
      GroupId Device 所属Group number
      bGroupCreated Group 当前Create 状态
      bDevEn VIF Dev 当前使能状态
      eSensorPadID VIF Dev 绑定的SensorPad
      u32PlaneID VIF Dev 绑定的PlaneId
    • 相关数据类型及接口

      MI_VIF_GetDevStatus


    3.15. MI_VIF_CALLBK_FUNC

    • 说明

      定义回调函数类型

    • 定义

      typedef MI_S32 (*MI_VIF_CALLBK_FUNC)(MI_U64 u64Data);
      
    • 相关数据类型及接口

      MI_VIF_CallBackParam_t


    3.16. MI_VIF_CallBackMode_e

    • 说明

      定义回调模式。

    • 定义

      typedef enum
      {
          E_MI_VIF_CALLBACK_ISR,
          E_MI_VIF_CALLBACK_MAX,
      } MI_VIF_CallBackMode_e;
      
    • 成员

      成员名称 描述
      E_MI_VIF_CALLBACK_ISR 硬件中断模式回调
      E_MI_VIF_CALLBACK_MAX 回调模式最大值
    • 注意事项

      目前只支持ISR 回调模式。

    • 相关数据类型及接口

      MI_VIF_CallBackParam_t


    3.17. MI_VIF_IrqType_e

    • 说明

      定义硬件中断类型

    • 定义

      typedef enum
      {
          E_MI_VIF_IRQ_FRAMESTART,  //frame start irq
          E_MI_VIF_IRQ_FRAMEEND,  //frame end irq
          E_MI_VIF_IRQ_LINEHIT,  //frame line hit irq
          E_MI_VIF_IRQ_MAX,
      } MI_VIF_IrqType_e;
      
    • 成员

      成员名称 描述
      E_MI_VIF_IRQ_FRAMESTART VIF Feame start 中断类型
      E_MI_VIF_IRQ_FRAMEEND VIF Frame done 中断类型
      E_MI_VIF_IRQ_LINEHIT VIF LineCount Hit中断类型
    • 注意事项

      • E_MI_VIF_IRQ_FRAMESTART: 每一帧第一个pixel的信号

      • E_MI_VPE_IRQ_ISPFRAMEDONE:每一帧最后一个pixel的信号

      • E_MI_VIF_IRQ_LINEHIT:每一帧指定line到达时的信号

    • 相关数据类型及接口

      MI_VIF_CallBackParam_t


    3.18. MI_VIF_CallBackParam_t

    • 说明

      定义回调参数

    • 定义

      typedef struct MI_VIF_CallBackParam_s
      {
          MI_VIF_CallBackMode_e eCallBackMode;
          MI_VIF_IrqType_e  eIrqType;
          MI_VIF_CALLBK_FUNC  pfnCallBackFunc;
          MI_U64    u64Data;
      } MI_VIF_CallBackParam_t;
      
    • 成员

      成员名称 描述
      eCallBackMode Callback mode
      eIrqType Hardware interrupt type
      pfnCallBackFunc 回调函数
      u64Data 回调函数参数
    • 相关数据类型及接口

      MI_VIF_CallBackTask_Register

      MI_VIF_CallBackTask_UnRegister


    3.19. MI_VIF_HDRFusionType_e

    • 说明

      定义VIF HDR 融合模式

    • 定义

      typedef enum
      {
          E_MI_VIF_HDR_FUSION_TYPE_NONE,
          E_MI_VIF_HDR_FUSION_TYPE_2T1,
          E_MI_VIF_HDR_FUSION_TYPE_3T1,
          E_MI_VIF_HDR_FUSION_TYPE_MAX
      } MI_VIF_HDRFusionType_e;
      
    • 成员

      成员名称 描述
      E_MI_VIF_HDR_FUSION_TYPE_NONE 不代表任何融合模式
      E_MI_VIF_HDR_FUSION_TYPE_2T1 2Frame HDR 模式
      E_MI_VIF_HDR_FUSION_TYPE_3T1 3Frame HDR 模式
      E_MI_VIF_HDR_FUSION_TYPE_MAX HDR 融合模式 Enum Max 值
    • 注意事项

      • E_MI_VIF_HDR_FUSION_TYPE_2T1: 即普通的HDR长短曝两帧,开启HDR功能后,就算不设置也会内部设定的default值

      • E_MI_VIF_HDR_FUSION_TYPE_3T1: 3帧HDR 曝光融合,目前只有 Souffle 支持

    • 相关数据类型及接口

      MI_VIF_GroupAttr_t

      MI_VIF_CreateDevGroup


    3.20. MI_VIF_HDRExposureType_e

    • 说明

      定义VIF HDR 曝光类型

    • 定义

      typedef enum
      {
          E_MI_VIF_HDR_EXPOSURE_TYPE_NONE,
          E_MI_VIF_HDR_EXPOSURE_TYPE_SHORT   = 0x01,
          E_MI_VIF_HDR_EXPOSURE_TYPE_MEDIUM  = 0x02,
          E_MI_VIF_HDR_EXPOSURE_TYPE_LONG    = 0x04,
          E_MI_VIF_HDR_EXPOSURE_TYPE_MAX
      } MI_VIF_HDRExposureType_e;
      
    • 成员

      成员名称 描述
      E_MI_VIF_HDR_EXPOSURE_TYPE_NONE 不代表任何 HDR 曝光
      E_MI_VIF_HDR_EXPOSURE_TYPE_SHORT HDR 短曝
      E_MI_VIF_HDR_EXPOSURE_TYPE_MEDIUM HDR 中曝
      E_MI_VIF_HDR_EXPOSURE_TYPE_LONG HDR 长曝
      E_MI_VIF_HDR_EXPOSURE_TYPE_MAX HDR 曝光 Enum Max 值
    • 注意事项

      • 在 2Frame HDR 的时候,内部会强制设定成 0x1+ 0x4, 即长短曝

      • E_MI_VIF_HDR_EXPOSURE_TYPE_MEDIUM: 目前只有 Souffle 支持设置 HDR 中曝

    • 相关数据类型及接口

      MI_VIF_GroupAttr_t

      MI_VIF_CreateDevGroup


    3.21. MI_VIF_MetaDataType_e

    • 说明

      定义VIF额外功能类型

    • 定义

      typedef enum
      {
          E_MI_VIF_METADATA_NONE,
          E_MI_VIF_METADATA_PDAF       = 0x01,
          E_MI_VIF_METADATA_HEADER     = 0x02,
          E_MI_VIF_METADATA_AE_STAT    = 0x04,
          E_MI_VIF_METADATA_AWB_STAT   = 0x08,
          E_MI_VIF_METADATA_AF_STAT    = 0x10,
          E_MI_VIF_METADATA_HISTO_STAT = 0x20,
          E_MI_VIF_METADATA_MAX
      } MI_VIF_MetaDataType_e;
      
    • 成员

      成员名称 描述
      E_MI_VIF_METADATA_NONE 不代表任何功能
      E_MI_VIF_METADATA_PDAF PDAF功能
      E_MI_VIF_METADATA_HEADER 档头不压缩功能
      E_MI_VIF_METADATA_AE_STAT STA统计功能AE统计
      E_MI_VIF_METADATA_AWB_STAT STA统计功能AWB统计
      E_MI_VIF_METADATA_AF_STAT STA统计功能AF统计
      E_MI_VIF_METADATA_HISTO_STAT STA统计功能HISTO统计
      E_MI_VIF_METADATA_MAX MetaData枚举最大值
    • 相关数据类型及接口

      MI_VIF_MetaDataAttr_t


    3.22. MI_VIF_MetaDataAttr_t

    • 说明

      定义VIF额外功能属性结构体

    • 定义

      typedef struct MI_VIF_MetaDataAttr_s
      {
          MI_U32              u32MetaDataTypeMask;
          MI_SYS_WindowRect_t stCropRect; // For header usage only
      } MI_VIF_MetaDataAttr_t;
      
    • 成员

      成员名称 描述
      u32MetaDataTypeMask 额外功能开关Mask值
      stCropRect 档头不压缩功能的范围指定窗口
    • 相关数据类型及接口

      MI_VIF_GroupAttr_t

      MI_VIF_CreateDevGroup


    3.23. MI_VIF_CustCmd_e

    • 说明

      定义VIF客制化命令

    • 定义

      typedef enum
      {
          E_MI_VIF_CUSTCMD_PUTNUCDATA,
          E_MI_VIF_CUSTCMD_SETIRSTATUS,
          E_MI_VIF_CUSTCMD_FRAMEEND_NOTIFY,
          E_MI_VIF_CUSTCMD_SLEEPPARAM_SET,
          E_MI_VIF_CUSTCMD_SHUTTER_GAIN_SET,
          E_MI_VIF_CUSTCMD_FORCEFRAMEPARAM_SET,
          E_MI_VIF_CUSTCMD_MAX
      } MI_VIF_CustCmd_e;
      
    • 成员

      成员名称 描述 数据类型
      E_MI_VIF_CUSTCMD_PUTNUCDATA 设置NUC数据到VIF的客制化命令 MI_VIF_PutDataAttr_t
      E_MI_VIF_CUSTCMD_SETIRSTATUS 设置IR灯状态到VIF的客制化命令 MI_U8
      E_MI_VIF_CUSTCMD_FRAMEEND_NOTIFY 设置FrameEnd Callback的函数指针到VIF的客制化命令 void*
      E_MI_VIF_CUSTCMD_SLEEPPARAM_SET 设置控制Sensor进入sleep mode的相关参数到VIF的客制化命令 MI_VIF_SleepModeParams_t
      E_MI_VIF_CUSTCMD_SHUTTER_GAIN_SET 设置控制Sensor曝光参数VIF的客制化命令 MI_VIF_ShutterGainParams_t
      E_MI_VIF_CUSTCMD_FORCEFRAMEPARAM_SET 强制sensor立刻退出sleep mode的客制化命令 MI_VIF_ForceFrameParams_t
      E_MI_VIF_CUSTCMD_MAX 客制化命令最大值 NA
    • 注意事项

      • E_MI_VIF_CUSTCMD_PUTNUCDATA:只有前端输入为高德红外 sensor 时,才能使用该cmd,客户通过获取 sensor 输出的 AD 数据,进行NUC 算法校准,然后把NUC 校准数据通过这个指令下到VIF,VIF 在通过内部IP传输给sensor 进行调节。
      • E_MI_VIF_CUSTCMD_SETIRSTATUS:该 cmd 用于 windows hello 功能,客户通过该 cmd 把当前 IR 亮灭状态(ON:1, OFF:0) 设置给 VIF,VIF 内部在把该 IR flag 存放到对应的 frame buffer 信息中,客户即可在后级取出 buffer 后知道该 buffer 对应的 IR 灯状态。
      • E_MI_VIF_CUSTCMD_FRAMEEND_NOTIFY:AOV场景下用于注册Frame End的回调函数,VIF在Frame End中断中会调用被注册的函数。
      • E_MI_VIF_CUSTCMD_SLEEPPARAM_SET:AOV场景下用于设置VIF来控制Sensor在出流多少张Frame便进入Sleep mode的参数。
      • E_MI_VIF_CUSTCMD_SHUTTER_GAIN_SET:AOV场景下用于设置通过VIF来给Sensor下Shutter与Gain值的功能。
      • E_MI_VIF_CUSTCMD_FORCEFRAMEPARAM_SET: 该 cmd 使用前必须先调用E_MI_VIF_CUSTCMD_SLEEPPARAM_SET CMD 来启用sleep mode。
    • 相关数据类型及接口

      MI_VIF_CustFunction


    3.24. MI_VIF_PutDataAttr_t

    • 说明

      定义VIF输入数据结构体

    • 定义

      typedef struct MI_VIF_PutDataAttr_s
      {
          MI_U32 u32Stride;
          MI_U32 u32Buffsize;
          MI_PHY phyAddr;
      } MI_VIF_PutDataAttr_t;
      
    • 成员

      成员名称 描述
      u32Stride 输入数据一行的byte数
      u32Buffsize 输入数据的大小
      phyAddr 输入数据的物理地址
    • 相关数据类型及接口

      MI_VIF_CustFunction


    3.25. MI_VIF_FrameEndInfo_t

    • 说明

      通过Cusfuntion注册的FrameEnd Callback中每个FrameEnd中断都会将该结构体作为入参传入

    • 定义

      typedef struct MI_VIF_FrameEndInfo_s
      {
          MI_BOOL bDoneFlag;
          MI_U32  u32FrameCnt;
          MI_VIF_DEV vifDevId;
      } MI_VIF_FrameEndInfo_t;
      
    • 成员

      成员名称 描述
      bDoneFlag 是否最后一张Frame
      u32FrameCnt FrameEnd的计数值
      vifDevId frame done的device id
    • 相关数据类型及接口

      MI_VIF_CustFunction

    • 用法及示例代码

      该CMD的用法如图所示

      1. 在user app内申明函数指针的地址
      2. 在user driver内通过ioctl将driver内的frameDone_Callback函数与上一步传入的地址绑定
      3. 在user app内调用MI_VIF_CustFunction
      4. 在VIF内部会自动在frame done时调用user driver中绑定的函数

      下面是使用该CMD的简单示例代码

      //user driver
      static int Misc_Control_FrameDone_CallBack(MI_VIF_FrameEndInfo_t *pstVifFrameEndInfo)
      {
          printk("Here to get updated info from vif when frameDone\n");
          printk("vifDevId: %d doneFlag:%d frameCnt:%d\n", pstVifFrameEndInfo->vifDevId,
              pstVifFrameEndInfo->bDoneFlag, pstVifFrameEndInfo->u32FrameCnt);
      }
      
      static long misc_control_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
      {
          int ret = 0;
          switch (cmd)
          {
              case IOCTL_MISC_CONTROL_INIT:
              {
                  unsigned long fun_ptr_addr = 0;
                  if (copy_from_user(&fun_ptr_addr, (int __user *)arg, sizeof(fun_ptr_addr)))
                  {
                      return -EFAULT;
                  }
                  //bind user app callback func addr with specific func in user driver
      
                  fun_ptr_addr = Misc_Control_FrameDone_CallBack;
      
                  if (copy_to_user((int __user *)arg, &stCallback_Param, sizeof(Misc_Callback_Param_t)))
                  {
                      return -EFAULT;
                  }
      
                  else
                  {
                      return -EFAULT;
                  }
              }
          }
          return 0;
      }
      
      //user app
      void main()
      {
          unsigned long fun_ptr_addr ;
          ioctl(dev_fd, IOCTL_MISC_CONTROL_INIT, &fun_ptr_addr);
          MI_VIF_CustFunction(vifDevId, (MI_VIF_CustCmd_e)E_MI_VIF_CUSTCMD_FRAMEEND_NOTIFY, sizeof(unsigned long),
                                  &callback_param.fun_ptr_addr);
      }
      

      更多细节与用法可参考sdk/verify/sample_code/internal/aov/light_misc_control_api.h


    3.26. MI_VIF_SleepModeParams_t

    • 说明

      定义VIF控制Sensor进出Sleep Mode的参数结构体

    • 定义

      typedef struct MI_VIF_SleepModeParams_s
      {
          MI_BOOL bSleepEnable;
          MI_U32  u32FrameCntBeforeSleep;
      } MI_VIF_SleepModeParams_t;
      
    • 成员

      成员名称 描述
      bSleepEnable 是否开启VIF控制Sensor进入Sleep
      u32FrameCntBeforeSleep 多少张Frame之后VIF控制Sensor进入Sleep mode
    • 相关数据类型及接口

      MI_VIF_CustFunction

    • 用法及示例代码

      void *aov_thread(void* args)
      {
          MI_VIF_SleepModeParams_t stSleepParam;
      
          while(!bExit)
          {
              if(status == wakeup)
                  stSleepParam.bSleepEnable = TRUE;
                  stSleepParam.u32FrameCntBeforeSleep = 1;
                  MI_VIF_CustFunction(u32VifDevId, E_MI_VIF_CUSTCMD_SLEEPPARAM_SET, sizeof(MI_VIF_SleepModeParams_t), &stSleepParam);
      
                  //wait frame done
                  ......
      
                  //enter suspend
                  system("echo mem >/sys/power/state");
      
          }
      
          // Disable sleep mode
          stSleepParam.bSleepEnable = FALSE;
          MI_VIF_CustFunction(u32VifDevId, E_MI_VIF_CUSTCMD_SLEEPPARAM_SET, sizeof(ST_Common_SNRSleepParam_t), &stSleepParam);
      }
      
      int main()
      {
          pthread_t pthread;
      
          //init and run the pipeline
          pipeline_init_and_run();
      
          pthread_create(&pthread, NULL, aov_thread, NULL);
          pthread_join(&pthread, NULL);
      
      }
      

      更多细节与用法可参考sdk/verify/sample_code/source/iford/aov/aov_demo/st_sample_aov.c


    3.27. MI_VIF_ShutterGainParams_t

    • 说明

      定义VIF控制Sensor的AE参数的结构体

    • 定义

      typedef struct MI_VIF_ShutterGainParams_s
      {
          MI_U32 u32ShutterTimeUs;
          MI_U32 u32AeGain;
      } MI_VIF_ShutterGainParams_t;
      
    • 成员

      成员名称 描述
      u32ShutterTimeUs 设置给Sensor的Shutter值 , 单位: us
      u32AeGain 设置给Sensor的Gain值 , 单位: 1024
    • 相关数据类型及接口

      MI_VIF_CustFunction

    • 用法及示例代码

      MI_VIF_ShutterGainParams_t stSnrParam;
      MI_U32 u32Gain = 1;
      stSnrParam.u32ShutterTimeUs = 1000;
      stSnrParam.u32AeGain        = u32Gain x 1024;
      MI_VIF_CustFunction(0, E_MI_VIF_CUSTCMD_SHUTTER_GAIN_SET, sizeof(MI_VIF_ShutterGainParams_t), &stSnrParam);
      

      更多细节与用法可参考sdk/verify/sample_code/internal/aov/st_common_aov.c


    3.28. MI_VIF_ForceFrameParams_t

    • 说明

      定义VIF 强制sensor退出sleep mode的设置参数

    • 定义

      typedef struct MI_VIF_ForceFrameParams_s
      {
          MI_U32  u32ForceFrameCnt;
          MI_U32  u32DropCnt;
      } MI_VIF_ForceFrameParams_t;
      
    • 成员

      成员名称 描述
      u32ForceFrameCnt sensor进入sleep mode前的帧数
      u32DropCnt vif 丢弃的帧数
    • 用法及示例代码

      void Do_fastAe()
      {
          // configure sensor to enable sleep mode & consecutive frames cnt (to 2)
          MI_VIF_SleepModeParams_t stVifSleepParam;
          stVifSleepParam.bSleepEnable           = TRUE;
          stVifSleepParam.u32FrameCntBeforeSleep = 2;
          MI_VIF_CustFunction(u32VifDevId, E_MI_VIF_CUSTCMD_SLEEPPARAM_SET, sizeof(MI_VIF_SleepModeParams_t),
                              &stVifSleepParam);
      
          // wait sensor enter sleep mode
          // config to small pic (switch on fast ae)
          ......
      
          MI_VIF_ForceFrameParams_t stVifSleepDisableParam;
          stVifSleepDisableParam.u32ForceFrameCnt = 4;
          stVifSleepDisableParam.u32DropCnt       = 3;
          MI_VIF_CustFunction(u32VifDevId, E_MI_VIF_CUSTCMD_FORCEFRAMEPARAM_SET, sizeof(MI_VIF_ForceFrameParams_t),
                              &stVifSleepDisableParam);
      
          //wait sensor stream out done
          //configure sensor to enable sleep mode & consecutive frames cnt (to 1)
          ......
      
      }
      

      具体细节与用法可参考sdk/verify/sample_code/internal/fast_ae/fast_ae.c


    3.29. MI_VIF_AiIspAttr_t

    • 说明

      定义AiIsp属性配置

    • 定义

      typedef struct MI_VIF_AiIspAttr_s {
          MI_VIF_AiBnrAttr_t stVifAiBnrAttr;
          MI_VIF_AiHdrAttr_t stVifAiHdrAttr;
      } MI_VIF_AiIspAttr_t;
      
    • 成员

      成员名称 描述
      stVifAiBnrAttr 设置给VIF驱动的AIBnr属性
      stVifAiHdrAttr 设置给VIF驱动的AIHdr属性
    • 相关数据类型及接口

      MI_VIF_GroupAttr_t


    3.30. MI_VIF_AiBnrAttr_t

    • 说明

      定义AiBnr场景的属性配置

    • 定义

      typedef struct MI_VIF_AiBnrAttr_s {
          MI_VIF_AiBnrSourceType_e eAiSourceType;
      } MI_VIF_AiBnrAttr_t;
      
    • 成员

      成员名称 描述
      eAiSourceType 定义AI BNR场景类型
    • 相关数据类型及接口

      MI_VIF_AiIspAttr_t


    3.31. MI_VIF_AiHdrAttr_t

    • 说明

      定义AiHdr场景的属性配置

    • 定义

      typedef struct MI_VIF_AiHdrAttr_s {
          MI_BOOL bAiHdrEn;
      } MI_VIF_AiHdrAttr_t;
      
    • 成员

      成员名称 描述
      bAiHdrEn 使能/去使能AiHdr功能
    • 相关数据类型及接口

      MI_VIF_AiIspAttr_t


    3.32. MI_VIF_AiBnrSourceType_e

    • 说明

      定义VIF支持的AI BNR场景类型

    • 定义

      typedef enum
      {
          E_MI_VIF_AI_BNR_SOURCE_TYPE_NONE,
          E_MI_VIF_AI_BNR_SOURCE_TYPE_LINEAR,
          E_MI_VIF_AI_BNR_SOURCE_TYPE_HDR_FUSION,
          E_MI_VIF_AI_BNR_SOURCE_TYPE_HDR_LONG,
          E_MI_VIF_AI_BNR_SOURCE_TYPE_MAX
      } MI_VIF_AiBnrSourceType_e;
      
    • 成员

      成员名称 描述
      E_MI_VIF_AI_BNR_SOURCE_TYPE_LINEAR 设置AI ISP场景类型为linear mode下开启AI处理
      E_MI_VIF_AI_BNR_SOURCE_TYPE_HDR_FUSION 设置AI ISP场景类型为HDR融合后再做AI处理
      E_MI_VIF_AI_BNR_SOURCE_TYPE_HDR_LONG 设置AI ISP场景类型为对长曝帧做AI处理
    • 相关数据类型及接口

      MI_VIF_AiBnrAttr_t


    4. 错误码


    VIF API 错误码如下表所示。

    表 4‑1:VIF API 错误码

    错误代码 宏定义 描述
    0xA0062001 MI_ERR_VIF_INVALID_DEVID 视频输入设备号无效
    0xA0062002 MI_ERR_VIF_INVALID_CHNID 视频输入通道号无效
    0xA0062003 MI_ERR_VIF_INVALID_PARA 视频输入参数设置无效
    0xA0062006 MI_ERR_VIF_INVALID_NULL_PTR 输入参数空指针错误
    0xA0062007 MI_ERR_VIF_FAILED_NOTCONFIG 视频设备或通道属性未配置
    0xA0062008 MI_ERR_VIF_NOT_SUPPORT 操作不支持
    0xA0062009 MI_ERR_VIF_NOT_PERM 操作不允许
    0xA006200C MI_ERR_VIF_NOMEM 分配内存失败
    0xA006200E MI_ERR_VIF_BUF_EMPTY 视频输入缓存为空
    0xA006200F MI_ERR_VIF_BUF_FULL 视频输入缓存为满
    0xA0062010 MI_ERR_VIF_SYS_NOTREADY 视频输入系统未初始化
    0xA0062012 MI_ERR_VIF_BUSY 视频输入系统忙
    0xA0062080 MI_ERR_VIF_INVALID_PORTID 视频输入端口无效
    0xA0062081 MI_ERR_VIF_FAILED_DEVNOTENABLE 视频输入设备未启用
    0xA0062082 MI_ERR_VIF_FAILED_DEVNOTDISABLE 视频输入设备未禁用
    0xA0062083 MI_ERR_VIF_FAILED_PORTNOTENABLE 视频输入通道未启用
    0xA0062084 MI_ERR_VIF_FAILED_PORTNOTDISABLE 视频输入通道未禁用
    0xA0062085 MI_ERR_VIF_CFG_TIMEOUT 视频配置属性超时
    0xA0062086 MI_ERR_VIF_NORM_UNMATCH 视频ADC VIU不匹配
    0xA0062087 MI_ERR_VIF_INVALID_WAYID 视频通路号无效
    0xA0062088 MI_ERR_VIF_INVALID_PHYCHNID 视频物理通道号无效
    0xA0062089 MI_ERR_VIF_FAILED_NOTBIND 视频通道未绑定
    0xA006208A MI_ERR_VIF_FAILED_BINDED 视频通道已绑定

    5. PROCFS介绍


    5.1. cat

    • 调试信息

      / # cat /proc/mi_modules/mi_vif/mi_vif0
      
      ----------------------------------dump Group Attr--------------------------------------------------
      groupId  Intf       Work  Clkedge   Hdr  HdrFusion  ExposureMask    NUC  MetaDataType       MetaCrop
      0  MIPI 1MULTIPLEX        2   OFF       NONE             0    0             0(0,0,   0,   0)
      
      ----------------------------------dump Dev Attr--------------------------------------------------
      Dev  FsCnt  ActiveTime         incrop       infmt  capsel    rstcnt  NucRdmaDone
      0    745        32ms(0,0,3840,2160)    RG_10BPP       0( 0, 0, 0)            0
      Dev  AsyncCnt  EnqCnt  BarCnt  CheckCnt  DequCnt  DropCnt  NucEnqCnt  Mask
      0      1438     709     708      2130      706        0          0     0
      
      -------------------------------------dump pipe attr-----------------------------------------------
      PipeId  PortId  DevId  Hdn           crop       Dest  Pixel  wkmode  Compress
      12       0      0    0(0,0,3840,2160)(3840x2160)     45       1         0
      
      -------------------------------------dump outport attr-----------------------------------------------
      Dev  Port  wFsNum  wLCNum  wDoneNum  Dvcnt  Oscnt  LostFrame
      0     0     711       0       706      0      0          3
      
      Dev  Port       Cap_size  Dest_size       Fmt  Rate  CRC  Atom       MetaInfo  OutCount  Addr0Cnt  FailCount  EnqFailCount  Fps
      0     0(0,0,3840,2160)(3840,2160)  RG_10BPP     0    0     2  c0000000005a3       706         1          1             0    30.04
      
      Dev  Port   Recv_size    Out_size SubOut_size  FifoDepth  WInactive
      0     0 (3856,2180) ( 300,2160) (   0,   0)          1          0
      
    • 调试信息分析

      记录当前VIF group、device、port的使用状况以及对应的属性,可以动态地获取到这些信息,方便调试和测试。

    • 参数说明

      参数 描述
      Group Attr GroupId Group号
      input 输入id号
      Intf 输入数据的协议,请参考MI_VIF_IntfMode_e
      Work 工作模式,请参考MI_VIF_WorkMode_e
      Clkedge 时钟边沿触发模式,请参考MI_VIF_ClkEdge_e
      Hdr Hdr类型,请参考MI_VIF_HDRType_e
      HdrFusion Hdr 融合类型,请参考MI_VIF_HDRFusionType_e
      ExposureMask Hdr 曝光组合,请参考MI_VIF_HDRExposureType_e
      NUC 目前是否为 NUC Sensor,走NUC 流程
      MetaDataType vif 格外功能打开情况,请参考MI_VIF_MetaDataType_e
      MetaDataCrop 档头不压缩功能的范围指定窗口,请参考MI_VIF_MetaDataAttr_t
      Dev Attr Dev Dev号
      chn channel id号,实际使用的device id
      FsCnt Frame start 中断数量
      FsInt 两个Frame start 的时间间隔(us)
      Active 有效数据传输时间
      FdCnt Frame done 中断数量
      incrop Input Corp Size,请参考MI_VIF_DevAttr_t stInputRect
      infmt 输入数据格式,请参考MI_VIF_DevAttr_t eInputPixel
      capsel Field type选择,请参考MI_VIF_DevAttr_t Field
      rstcnt 分别对应(Fifo, Wdma, Fifo_Wdma) Reset 的次数
      NucRdmaDone Nuc rdma done的次数
      AsyncCnt/EnqCnt/ BarCnt/CheckCnt/ DequCnt MI 内部线程Callback接口执行次数
      DropCnt 统计的丢帧数量
      NucEnqCnt 应用层塞给mi vif 的nuc buffer 次数,亦为buffer塞到 nuc rdma 的次数
      channel Attr Dev Dev id号
      PipeId Pipe号
      Port Port号
      Chn channel id号,实际使用的device id
      Output Output id号,表示内部输出pipe的id
      Hdn H2T1PMode使能,请参考MI_VIF_DevAttr_t bEnH2T1PMode
      crop 设置输出裁剪区域 (DI Mode下Height减半)
      Dest 设置输出大小(DI Mode下Height减半)
      Pixel 设置输出pixel格式,由MI pixel转换得到
      wkmode Pipe工作模式,0: Realtime,1: FrameMode
      Compress 压缩模式,请参考MI_VIF_OutputPortAttr_t eCompressMode
      OutPort Attr Dev Device id
      Port Port id
      Output Output id号,表示内部输出pipe的id
      FsNum Wdma Frame start 中断次数
      FsInt Wdma Frame start间隔时间(us)
      LCNum Wdma Line Count hit 中断次数
      DoneNum Wdma Done 中断次数
      DvCnt Double vsync 发生次数
      OsCnt Oversize 发生次数
      LostFrame Wdma Frame start 中断丢失次数
      TaskId Wdma 当前所有buffer的customer id
      BufAddr Wdma 当前所有buffer的地址
      Cap_size Port Crop Size,请参考MI_VIF_OutputPortAttr_t stCapRect
      Dest_size 输出size,请参考MI_VIF_OutputPortAttr_t stDestSize
      Fmt Output pixel format,请参考MI_VIF_OutputPortAttr_t ePixFormat
      Rate Frame rate type,请参考MI_VIF_OutputPortAttr_t eFrameRate
      CRC CRC校验开关状态
      Atom 底层拿住buffer 数量
      MetaInfo Frame id
      OutCount 输出frame count,done的张数
      Addr0Cnt Frame地址0的次数,即skip frame的数量
      FailCount 获取outputbuffer失败次数
      EnqFailCount Enqueue时塞output buffer到wdma失败的次数
      Fps Frame per second
      Recv_size Vif 硬件收到size
      Out_size port0 wdma配置output size
      SubOut_size port1 wdma 配置output size
      FifoDepth Wdma Fifo 的buffer数量
      WdmaInactive Wdma 是否处于活跃状态,0: 活跃,1: 停止



    5.2. echo

    # echo help >/proc/mi_modules/mi_vif/mi_vif0
    
         dump           [devid portid /path cnt DumpDrop];
    
         initatom       [devid InitAtom];
    
         erasebuffer    [devid portid bEraseBuffer];
    
         devmask        [devid bMask];
    
         enport         [devid portid bEn];
    
         cfgport        [devid portid crop(x,y,width,height) dest(width,height) pixel];
    
         resethw        [devid eResetType(0:FIFO 1:wdma 2:AFIFO_WDMA_GROUP 3:FIFO_WDMA_DEV)];
    
         fpsth      [devid portid FpsTh FpsFloatTh];
    
         ptsth      [devid portid ptsmax ptsmin];
    
         fifofull   [devid cnt];
    
         crc        [devid enable];
    
         patgen     [grouid w h fps fmt chn fieldEn hdren En];
    
         datagen        [grouid En];
    
         forcedeque     [devid portid curwrite validcnt wdmainactive], curwrite !=0, will use validcnt/wdmainactive param;
    
         debuglv        [devid level] buffer debug(0x1), check_loop(0x2), check_isr(0x4), check_flow(0x8), check_latency(0x80);
    
         changebuf      [devid portid changecnt (bdump, mode) ];once(0), once_vfs_pps(1), constant(2), constant_vfs_pps(3)
    

    echo help 查看可用命令

    功能
    Dump frame 到指定路径
    命令 echo dump [devid portid path cnt dumpdrop] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 devid: device id
    portid: port id
    path: 路径存放
    cnt: 可选参数,设置要dump的张数,不设置默认为1
    dumpdrop: 可选参数,设置为1只dump需要drop的frame,默认为0
    举例 echo dump 0 0 /tmp > /proc/mi_modules/mi_vif/mi_vif0
    echo dump 0 0 /tmp 2 1 > /proc/mi_modules/mi_vif/mi_vif0
    功能
    设置vif的atom 数量
    命令 echo initatom [devid portid InitAtom] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 devid: device id
    portid: port id
    InitAtom: Driver 最大持有buffer 数量
    举例 echo initatom 0 0 2 > /proc/mi_modules/mi_vif/mi_vif0
    功能
    擦除vif缓存
    命令 echo erasebuffer [devid portid bEraseBuffer] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 devid: device id
    portid: port id
    EraseBuffer: 使能擦除缓存
    举例 echo erasebuffer 0 0 1 > /proc/mi_modules/mi_vif/mi_vif0
    功能
    设置Dev Mask
    命令 echo devmask [devid bMask] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 devid: device id
    bmask: 使能mask
    举例 echo devmask 0 1 > /proc/mi_modules/mi_vif/mi_vif0
    功能
    使能output port
    命令 echo enport [devid portid bEn] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 devid: device id
    portid: port id
    bEn: 使能vif port
    举例 echo enport 0 0 1 > /proc/mi_modules/mi_vif/mi_vif0
    功能
    设置output port 属性
    命令 echo cfgport [ devid portid crop(x,y,width,height) dest(width,height) pixel compress] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 devid: device id
    portid: port id
    crop(x,y,width,height): output port crop的位置
    dest(width,height): output size
    Pixel: 输出pixel format
    compress: 压缩模式
    举例 echo cfgport 0 0 0 0 1280 720 1280 720 14 5 > /proc/mi_modules/mi_vif/mi_vif0
    功能
    Reset vif
    命令 echo resethw [devid eResetType] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 devid: device id
    eResetType: 需要reset的位置。0:FIFO;1:wdma;2:AFIFO_WDMA_GROUP;3:FIFO_WDMA_DEV
    举例 echo resethw 0 3 > /proc/mi_modules/mi_vif/mi_vif0
    功能
    设置fps阀值,当运行时fps小于设置的阀值,就会打印出warning
    命令 echo fpsth [devid portid FpsTh FpsFloatTh] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 devid: device id
    portid: port id
    FpsTh: fps整数位阀值
    FpsFloatTh: fps小数点位阀值
    举例 echo enport 0 0 29 98 > /proc/mi_modules/mi_vif/mi_vif0
    功能
    设置pts间隔阀值,当出现某个pts大于max或者小于min阀值,打印warning
    命令 echo ptsth [devid portid ptsmin ptsmax] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 devid: device id
    portid: port id
    ptsmin: pts 间隔最小阀值(us)
    ptsmax: pts 间隔最大阀值(us)
    举例 echo ptsth 0 0 25000 40000 > /proc/mi_modules/mi_vif/mi_vif0
    功能
    触发fifo full reset流程
    命令 echo fifofull [devid bNeedReset] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 devid: device id
    bNeedReset: 设置 1 走fifo full reset流程
    举例 echo fifofull 0 1 > /proc/mi_modules/mi_vif/mi_vif0
    功能
    使能crc 校验功能
    命令 echo crc [devid portid enable] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 devid: device id
    portid: port id
    enable: 设置 1 使能CRC校验
    举例 echo crc 0 0 1 > /proc/mi_modules/mi_vif/mi_vif0
    功能
    设置MI VIF debug level
    命令 echo debuglv [devid debuglevel] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 devid: device id
    debuglevel: MI VIF debug level, 默认为0,不打开
    0x0001 CHECK_BUFF
    0x0002 CHECK_LOOP
    0x0004 CHECK_ISR
    0x0008 CHECK_FLOW
    0x0080 CHECK_LATENCY
    举例 echo debuglv 0 3 > /proc/mi_modules/mi_vif/mi_vif0
    功能
    打开VIF pattern gen
    命令 echo patgen [group width height fps pixel multi bFieldEn bHdrEn Enable] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 Group: group ID
    Width: pattern 宽度
    Height: pattern 高度
    Fps: 输出帧率设置
    Pixel: pattern pixel 格式
    Multi: 可以设置1chn/2chn/4chn,同BT656多路概念
    bFieldEn: 使能DI 模式
    Enable: 使能pattern
    举例 echo patgen 0 1280 720 25 14 4 0 1 1 > /proc/mi_modules/mi_vif/mi_vif0
    功能
    打开VIF data gen
    命令 echo datagen [group Enable] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 group: group ID
    Enable: 使能data gen
    举例 echo datagen 0 1 > /proc/mi_modules/mi_vif/mi_vif0
    功能
    配置参数强制deque buffer,在卡buffer的时候debug使用
    命令 echo forcedeque [devid portid CurrentWriteAddr ValidCnt WdmaInactive] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 devid: device id
    Portid: port id
    CurrentWriteAddr: wdma 当前正在写的地址
    ValidCnt: wdma fifo 内还有的buffer数量
    WdmaInactive: wdma状态,0: 活跃,1: 停止
    举例 echo forcedeque 0 0 0 0 1 > /proc/mi_modules/mi_vif/mi_vif0
    功能
    随机修改vif 输出buffer
    命令 echo changebuf [devid portid cnt bdump mode] > /proc/mi_modules/mi_vif/mi_vif0
    参数说明 devid: device id
    portid: port id
    Cnt: 需要修改的buffer数量
    bdump: 可选参数,修改的buffer是否需要dump出来,默认0不dump
    Mode: 可选参数,buffer修改的模式,默认为mode 0
    0: 随机修改整张buffer,修改数量为用户设置cnt
    1: 压缩模式7(SFBC0)专用,只随机修改PPS位置,修改数量为用户设置cnt
    2: 随机修改整张buffer,修改vif输出的每一张buffer,不参考cnt
    3: 压缩模式7(SFBC0)专用,50%概率修改PPS,50%非PPS,修改vif输出的每一张buffer,不参考cnt
    举例 echo changebuf 0 0 3 > /proc/mi_modules/mi_vif/mi_vif0
    echo changebuf 0 0 3 1 2 > /proc/mi_modules/mi_vif/mi_vif0

    5.3. cat debug_hal

    5.3.1. vif_ints

    • 调试信息

      #cat /proc/mi_modules/mi_vif/debug_hal/vif0/vif_ints
      
      == VIF3 INTS @:218128070 ==
      == VIF CH-0 ==
      CH State:                       : WORKING
      Interval(us)                    : 33336
      FramePeriod(us)                 : 33334
      VREF_FALLING                    : 3737 @:218108268
      LINE_CNT_0                      : 3736 @:218106814
      LINE_CNT_1                      : 3737 @:218108269
      TOTAL_PIX_CNT                   : 3736 @:218106939
      
      == VIF WDMA-0(0) p0 aff0 ==
      WDMA State:                     : WORKING
      FrameStart                      : 0 @:0
      LINE_CNT                        : 0 @:0
      FrameDone                       : 0 @:0
      
      == VIF FIFO-0 ==
      Aff State:                      : WORKING
      AFF Count:                      : 0 @:0
      
      == VIF FIFO-1 ==
      Aff State:                      : READY
      AFF Count:                      : 0 @:0
      
      == VIF FIFO-2 ==
      Aff State:                      : READY
      AFF Count:                      : 0 @:0
      
      == VIF FIFO-3 ==
      Aff State:                      : READY
      AFF Count:                      : 0 @:0
      
    • 调试信息分析

      记录帧周期、当前VIF Channel/Wdma/Aff的使用状况以及统计相关的中断次数。

    • 参数说明

      参数 描述
      VIF CH CH State CH当前状态
      Interval(ns) 帧间隔时间
      VREF_FALLING VSYNC 中断数量,并显示最近一次发生中断时间戳
      LINE_CNT_0 Total line count hit 0 中断数量,并显示最近一次发生中断时间戳
      LINE_CNT_1 Total line count hit 1 中断数量,并显示最近一次发生中断时间戳
      TOTAL_PIX_CNT Total pixel count hit 中断数量,并显示最近一次发生中断时间戳
      VIF WDMA WDMA State Wdma当前状态
      FrameStart Frame start 中断数量,并显示最近一次发生中断时间戳
      LINE_CNT Line count hit 中断数量,并显示最近一次发生中断时间戳
      FrameDone Frame done 中断数量,并显示最近一次发生中断时间戳
      VIF FIFO Aff State Afifo当前状态
      AFF Count Fifo full 中断数量,并显示最近一次发生中断时间戳

    5.3.2. vif_info

    • 调试信息

      /  # cat /proc/mi_modules/mi_vif/debug_hal/vif0/vif_info
      == VIF0 INFO @:10772957883 ==
      == VIF CH=0 ==
      CH State:: WORKING
      [vg:0 link:FRAME_WDMA]--[chn:0]--[afifo:0]--[pipe:0(0)]--[wdma:0(0)]--[end]
      CH_EN: 1
      SRC: MIPI0
      INPUT_FMT: RGB
      PIX_FMT: 10 bits
      CROP_EN: 1
      CROP_START_X: 0 - 3839
      CROP_START_Y: 0 - 2159
      PIXEL_CNT: 3840
      LINE_CNT: 2160
      TOTAL_PIXEL_CNT: 3864
      TOTAL_LINE_CNT: 2192
      
    • 调试信息分析

      记录从暂存器获得的VIF基本设定。

    • 参数说明

      参数 描述
      CH State CH当前状态
      vg Group号
      link 连结模式:
      E_VIF_LINK_PATH_TYPE_FRAME_WDMA
      E_VIF_LINK_PATH_TYPE_REAL_ISP
      E_VIF_LINK_PATH_TYPE_REAL_SCL
      CH_EN 当前VIF channel号使能
      SRC VIF来源选择
      INPUT_FMT 数据格式
      PIX_FMT 输出位宽
      CROP_EN 裁剪使能
      CROP_START_X 读取裁剪水平数据
      CROP_START_Y 读取裁剪垂直数据
      PIXEL_CNT VIF 裁剪像素数
      LINE_CNT VIF 裁剪行数
      TOTAL_PIXEL_CNT VIF 总像素数
      TOTAL_LINE_CNT VIF 总行数

    6. MODPARAM.json介绍


    6.1. json文件内容示例

    {
        "E_MI_MODULE_ID_SYS" :
        {
            "cmdQBufSize" : 400
        },
        "E_MI_MODULE_ID_VIF" :
        {
            "u32threadPriority" : 98,
            "u32DevDebugLevel":  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
            "bDevEnableFrameStartPts" : [false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false],
            "u32PatGen" : [0,0,0,0,0,0,0,0,0],
            "vif_clk" : 288000000,
            "u8MulSnrRtVifGroupCnt" : 3,
            "u8MulSnrRtVifGroupPhyMap" : [ 0, 0, 1],
            "VifGroupSensorSelect" : [
                {
                    "gpio" : [ {"no" : 55, "pol" : 0} ]
                },
                {
                    "gpio" : [ {"no" : 55, "pol" : 1} ]
                },
                {
                    "na" : [ ]
                }
            ]
        }
    }
    

    MI_VIF的启动参数在/config目录下中的modparam.json文件管理,"E_MI_MODULE_ID_VIF" 节点相关的参数会在VIF初始化阶段加载。 modparam.json 只需填写需要用到的参数,没写的参数内部会有默认值。

    "u32PatGen":[vif_grouid, pattern_gen_width, pattern_gen_height, patgen_gen_fps, pixfmt, pattern_gen_chn_num(1-multi/2-multi/4-multi), fieldEn(0:progressive format, 1;interlace format), hdr_mode_en, pattern_gen_en]。


    6.2. VIF常用参数以及参数解析

    参数名 默认值 支持平台 是否支持客户配置 作用
    u32threadPriority 98 All Chip N 配置mi vif线程优先级
    u32DevDebugLevel 0 All Chip Y 配置mi vif 调试日志的级别
    bDevEnableFrameStartPts false Ifackel and later chips Y 配置mi vif各个dev是否记录并传递FrameStartPts,数组下标对应dev id
    u32PatGen 0,0,0,0,0,0,0,0 Mochi/Maruko/Opera/Souffle/Iford/Ifackel N 配置vif group pattern gen 属性
    vif_clk 288000000 Ifado/Iford/Pcupid/Souffle/Iford/Ifackel Y 配置vif后端时钟(来自ISP)
    VifGroupSensorSelect NULL Ifado/Ifackel Y 描述虚拟Group之间切换的结构,数组索引代表虚拟的VIF Group ID,对应的Json结构代表切换到该虚拟的VIF Group所需的设定。 子节点'gpio'描述切换到一个虚拟Group的GPIO设定,no为gpio编号,pol为gpio极性,没有切换需求则使用na字段代替
    u8MulSnrRtVifGroupCnt 0 Ifado/Ifackel Y 虚拟的VIF Group的数量
    u8MulSnrRtVifGroupPhyMap NULL Ifado/Ifackel Y 虚拟的VIF Group ID与物理Group ID的映射关系设定,数组索引代表虚拟的VIF Group ID,对应的值代表映射的物理Group

    6.3. 参数用法举例

    6.3.1. u32DevDebugLevel

    该参数是控制MI_VIF每个device debug等级,不同debug等级之间可以按位或使用,各个等级的含义如下。

    debug等级 含义
    0x0001 打开MI_VIF内部buffer检查相关log
    0x0002 打开MI_VIF内部buffer传递相关log
    0x0004 打开MI_VIF内部中断相关log
    0x0008 打开MI_VIF内部主要流程相关log
    0x0080 打开MI_VIF延迟检查相关log
    • "u32DevDebugLevel":0, 表示关闭所有MI_VIF debug log。

    • "u32DevDebugLevel":9, 表示打开buffer检查和buffer传递相关的MI_VIF log。

    • "u32DevDebugLevel":143, 表示打开所有MI_VIF debug log。

    6.3.2. vif_clk

    该参数是配置vif后端时钟(来自ISP)。

    • "vif_clk":288000000, 表示配置isp clk为288M。

    6.3.3. bUseReset

    该参数是控制 VIF发生fifo full是否要做reset的开关。

    • "bUseReset":0, 表示关闭 fifo full reset。

    • "bUseReset":1, 表示开启 fifo full reset。

    6.3.4. bCrcEnable

    该参数是控制 VIF 是否对数据做CRC校验的开关。

    • "bCrcEnable":0, 表示关闭 VIF CRC校验。

    • "bCrcEnable":1, 表示开启 VIF CRC校验。

    6.3.5. u8CompressMode

    该参数是控制 VIF 是否做FBC的开关, VIF FBC仅支持将每pixel 12bit压缩至8bit。

    • "u8CompressMode":0, 表示不启用 VIF FBC。

    • "u8CompressMode":4, 表示开启 VIF FBC。