MI SYS API

Version 2.26


1. 概述


1.1. 模块说明

MI_SYS 是整个 MI 系统的基础模块,它给其他MI 模块的运行提供了基础。

图1-1 MI_SYS 系统框架图

如图1-1所示,MI_SYS主要功能概述如下:

  • 实现MI系统初始化、MMA内存缓冲池管理。

  • 提供各模块注册设备节点,proc 系统的建立的通用接口。

  • 提供各模块建立绑定关系的接口,管理各模块之间数据流动。

  • 提供各模块申请MMA连续物理内存的接口,管理内存分配,映射虚拟地址,内存回收。

  • 提供各模块建立工作线程的接口,管理各模块线程的创建,运行,销毁。

MI_SYS模块对应的ko文件为mi_sys.ko,库文件为libmi_sys.so、libmi_sys.a,头文件为mi_sys.h、mi_sys_datatype.h。具体功能请查阅API接口说明。


1.2. 文档格式约束

正体:用于文档正文内容的书写,其中代码段的书写需要用等宽字体。

正体 + 加粗:用于文档正文中重要内容的书写。

斜体:用于文档中Tips部分的书写。

斜体 + 加粗:用于文档中Tips部分重要内容的书写。


1.3. 关键字说明

ID: Identity document 的缩写,表示唯一编码。

MI: SStar SDK Middle Interface的缩写,本文中,如果出现“MI_SYS”类似的结构表示的是MI的SYS模块,如果是单纯的“MI”,泛指整个SDK。

Hex: 十六进制。

Kernl Mode: 指的是工作在Kernel环境下的代码,代码具有直接操作硬件的控制权限,比如ko中的函数和线程等。

User Mode: 指的是工作在User环境下的,比如客户的应用程序,系统调用等。

APP: Application的缩写,此处主要指调用MI API的应用程序。

API: Application Programming Interface,应用程序接口。

NVR: 全称Network Video Recorder,即网络视频录像机。

IPC: 全称IP Camera,即网络摄像机。

HW: 全称hardware,即硬件。

Dev: 全称Device,本文中表示MI模块设备,1.4.1有详细解释。

Chn: 全称Chanel,本文中表示MI模块设备的某个通道,1.4.1有详细解释。

Port: 本文中表示MI模块设备通道中的某个端口,1.4.1有详细解释。

补充说明:

  • 如无单独说明,本文中MI_SYS 和SYS,MI_DISP和DISP是相同意思,其余模块名称类似。

  • 本文中出现的所有模块名称可以在MI_ModuleId_e中查阅其功能描述。


1.4. 流程框图

1.4.1. Dev/Chn/Port的关系

一个典型的MI 模块都会有Dev/chn/Port三级结构如图1-2。

Dev

一个MI 模块会有一个或多个Dev,一般来说不同的Dev表示该模块设备需要调用不同的HW资源,或者工作在不同的工作模式。比如说,VENC 在编码H264/H265时和编码Jpeg时,需要调用不同的HW资源,这个时候Dev有要分开了。

Chn

一个Dev 会有一个或多个Chn,Chn是通道的意思,一般来说不同的Chn表示该通道虽然和同Dev下的其他Chn共享HW资源,但是数据来源或者工作模式是不一样的。比如码流来源不同,Chn一般也不一样。

Port

一个Chn 会有一个或多个Port,Port是端口的意思,由InputPort和OutputPort组成。一般来说不同的Port表示该通道虽然和同Dev同Chn下的其他Port共享HW资源和数据来源,但是需要设置的参数是不一样的,比如分辨率不同,Port一般也不一样。

一般来说,Port才是客户操作MI模块的最小独立单位,因为它明确了所有的信息:HW资源、数据来源、参数属性

每个Port都由InputPort和OutputPort组成,InputPort是数据流入的端口,OutputPort是数据流出的端口。但需要注意的是,一个Port并不是总是必须有InputPort和OutputPort的,这样取决于该模块的行为。比如Disp这样的模块就只需要InputPort,无需OutputPort,它直接把结果显示到了Panel上。Vdec这样的模块,数据来源可以是用户调用Vdec接口直接送入,不经过InputPort,这样他就没有OutputPort了。

图 1-2 MI 模块的三级结构

Tips:

  1. Chn和Port的界限并不是总是能区分清楚,如果某模块API文档的解释和上文的解释有差异,调用该模块请以它的API文档为准。

  2. 一个Port的InputPort/OutpuPort通常只有一个或零个,但某些特殊的模块例外。比如Vpe模块,它有一个InputPort和多个OutputPort。这表示Vpe共享一个同一个数据原,但是又必须要有不同规格的输出格式。

1.4.2. 一个典型的NVR数据流

图1-3是一个典型的NVR数据流模型。流动过程如下:

  1. 建立Vdec->Divp->Disp的绑定关系;

  2. 用户写入一段码流到Vdec的InputPort;

  3. Vdec解码,写入解码后的数据到Vdec OutpuPort申请的内存,送入下一级;

  4. Divp 接收数据,送到Divp HW进行处理,写入Divp OutputPort,送入下一级;

  5. Disp 将接收到的数据显示出来。

图 1-3 一个典型的NVR数据流模型

Tips:

该数据流是原来的做法,现在的Vdec模块已经提供单独的接口给客户,可以把数据直接写到Vdec的私有内存上,不需要通过啊SYS的接口做多余的拷贝。也就是说,Vdec已经不需要InputPort了。

1.4.3. 一个典型的IPC数据流

图1-4是一个典型的IPC数据流模型,流动过程如下:

  1. 建立Vif->Vpe->Venc的绑定关系;

  2. Sensor 将数据送入vif处理;

  3. Vif 将处理后的数据写入Output Port申请的内存,送入下一级;

  4. Vpe接收数据,分别送入Pass0(ISP/SCL0)、Pass1(LDC)、Pass2(SCL1)进行处理,将处理的数据写入Output Port申请的内存,送入下一级;

  5. Venc接收数据,送入编码器进行编码处理,将编码后的数据写入RingPool内存区;

  6. 用户调用Venc的接口取流,送入用户业务层App。

图 1-4 一个典型的IPC数据流模型

Tips:

Vpe内部的3个Pass之间的数据流动实际比图中要复杂一些。但这都MI内部的处理逻辑,使用API时无需过度关注。


1.5. insmod参数说明

使用insmod mi_sys.ko 后面可以带的参数使用情况如下表所示。

表 1 1:insmod mi_sys.ko可加参数列表

参数 含义 取值
bEnableMmuPool 是否使能MMU 1:enable mmu
0:disable mmu
Ex:
bEnableMmuPool=1,表示使能mmu
bEnableMmuPool=0,表示禁止mmu
logBufSize 缓存log的内存长度 默认为4KByte,单位:Byte
Ex:
logBufSize=4096,表示设置4096Byte,即4KByte
cmdQBufSize cmdq 内存大小 由产品规格决定,单位:KByte
Ex:
cmdQBufSize=256,表示设置256KByte

2. API 参考


2.1. API描述格式说明

本手册使用 9个参考域描述 API 的相关信息,它们作用如 表所表示。

标签 功能
功能 简要描述API的主要功能。
语法 列出调用API应包括的头文件以及API的原型声明。
参数 列出API的参数、参数说明及参数属性。
返回值 列出API所有可能的返回值及其含义。
依赖 列出API包含的头文件和API编译时要链接的库文件。
注意 列出使用API时应注意的事项。
举例 列出使用API的实例。
相关主题 调用上下文中有关联的接口。

2.2. 功能模块API列表

如前文所述,我们可以粗略的把MI_SYS的API分为三大类:系统功能类、数据流类、内存管理类。

API名 功能
系统功能类
MI_SYS_Init 初始化MI_SYS系统
MI_SYS_Exit 析构MI_SYS系统
MI_SYS_GetVersion 获取MI 的系统版本号
MI_SYS_GetCurPts 获取MI系统当前时间戳
MI_SYS_InitPtsBase 初始化MI系统基准时间戳
MI_SYS_SyncPts 同步MI系统时间戳
MI_SYS_SetReg 设置寄存器的值,调试用
MI_SYS_GetReg 获取寄存器的值,调试用
MI_SYS_ReadUuid 获取Chip的Unique ID
MI_SYS_EnableChnOutputPortLowLatency 打开或者关闭通道output端口的低延迟输出功能
MI_SYS_InitDev 初始化sys设备
MI_SYS_DeInitDev 反初始化sys设备
MI_SYS_SetGlobalFlag 设置全局标志位的值
数据流类
MI_SYS_BindChnPort 数据源输出端口到接收者输入端口的绑定
MI_SYS_BindChnPort2 数据源输出端口到接收者输入端口的绑定,需要指定工作模式
MI_SYS_UnBind_ChnPort 数据源输出端口到接收者输入端口的去绑定
MI_SYS_GetBindbyDest 查询数据接收者输入端口的对应的源输出端口
MI_SYS_ChnInputPortGetBuf 获取通道inputPort的buf
MI_SYS_ChnInputPortPutBuf 将通道inputPort的buf加到待处理队列
MI_SYS_ChnOutputPortGetBuf 获取通道outputPort的buf
MI_SYS_ChnOutputPortPutBuf 释放通道outputPort的buf
MI_SYS_ChnInputPortGetBufPa 分配通道input端口对应的buf object,仅提供MIU物理地址
MI_SYS_ChnInputPortPutBufPa 把通道input端口对应的buf object加到待处理队列,与MI_SYS_ChnInputPortGetBufPa成对使用
MI_SYS_ChnOutputPortGetBufPa 分配通道output端口对应的buf object,仅提供MIU物理地址
MI_SYS_ChnOutputPortPutBufPa 释放通道output端口对应的buf object,与MI_SYS_ChnOutputPortGetBufPa成对使用
MI_SYS_SetChnOutputPortDepth 设置通道OutputPort的深度
MI_SYS_ChnPortInjectBuf 向模块通道inputPort注入outputPort Buf数据
MI_SYS_GetFd 获取当前通道等待事件的文件描述符
MI_SYS_CloseFd 关闭当前通道的文件描述符
MI_SYS_DupBuf 复制一个buf object
内存管理类
MI_SYS_SetChnMMAConf 设置模块设备通道输出端口默认分配内存的MMA池名称
MI_SYS_GetChnMMAConf 获取模块设备通道输出端口默认分配内存的MMA池名称
MI_SYS_ConfDevPubPools 配置并初始化模块公共缓冲池
MI_SYS_ReleaseDevPubPools 释放模块公共缓冲池
MI_SYS_ConfGloPubPools 配置并初始化MI全系统默认VB缓存池
MI_SYS_ReleaseGloPubPools 释放MI全系统默认VB缓存池
MI_SYS_MMA_Alloc 应用程序从MMA内存管理池申请物理连续内存
MI_SYS_MMA_Free 在用户态释放MMA内存管理池中分配到的内存
MI_SYS_Mmap 映射物理内存到CPU虚拟地址
MI_SYS_FlushInvCache Flush cache CPU虚拟地址
MI_SYS_Munmap 取消物理内存到虚拟地址的映射
MI_SYS_MemsetPa 通过DMA硬件模块,填充整块物理内存
MI_SYS_MemcpyPa 通过DMA硬件模块,把源内存数据拷贝到目标内存上
MI_SYS_BufFillPa 通过DMA硬件模块,填充部分物理内存
MI_SYS_BufBlitPa 通过DMA硬件模块,把源内存数据上的部分区域拷贝到目标内存上的部分区域
MI_SYS_ConfigPrivateMMAPool 为模快配置私有MMA Heap
MI_SYS_PrivateDevChnHeapAlloc 从模块通道私有MMA Pool 申请内存
MI_SYS_PrivateDevChnHeapFree 从模块通道私有MMA pool 释放内存
MI_SYS_Va2Pa 将MI内存块的CPU虚拟地址转成内存物理地址

2.3. 系统功能类API


2.3.1. MI_SYS_Init

  • 功能

    MI_SYS初始化,MI_SYS 模块为系统内其它MI模组提供基础支援,需要早于系统内其它MI模组初始化,否则其它stream类型的模组初始化时会失败。

  • 语法

    MI_S32 MI_SYS_Init(void);
    
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • MI_SYS_Init需要早于其他MI模组的Init函数调用。

    • 可以在同一进程或多进程中重复调用MI_SYS_Init,但必须和MI_SYS_Exit成对使用,否则会报错。

    • 系统在内核启动参数内,需要配置好MMA 内存堆的配置参数。

  • 举例

    系统Init调用Sample

    MI_S32 ST_Sys_Init(void)
    {
        MI_SYS_Version_t stVersion;
        MI_U64 u64Pts = 0;
    
        STCHECKRESULT(MI_SYS_Init());
    
        memset(&stVersion, 0x0, sizeof(MI_SYS_Version_t));
        STCHECKRESULT(MI_SYS_GetVersion(&stVersion));
        ST_INFO("u8Version:%s\n", stVersion.u8Version);
    
        STCHECKRESULT(MI_SYS_GetCurPts(&u64Pts));
        ST_INFO("u64Pts:0x%llx\n", u64Pts);
    
        u64Pts = 0xF1237890F1237890;
        STCHECKRESULT(MI_SYS_InitPtsBase(u64Pts));
    
        u64Pts = 0xE1237890E1237890;
        STCHECKRESULT(MI_SYS_SyncPts(u64Pts));
    
        return MI_SUCCESS;
    }
    
    MI_S32 ST_Sys_Exit(void)
    {
        STCHECKRESULT(MI_SYS_Exit());
    
        return MI_SUCCESS;
    }
    

Tips:

本示例适用于: MI_SYS_Init / MI_SYS_Exit / MI_SYS_GetVersion / MI_SYS_GetCurPts / MI_SYS_InitPtsBase / MI_SYS_SyncPts / MI_SYS_ReadUuid .


2.3.2. MI_SYS_Exit

  • 功能

    MI_SYS初始化,调用MI_SYS_Exit之前,需要确保系统内所有其他模组都已经完成去初始化,所有VBPOOL都已经销毁,否则MI_SYS_Exit会返回失败。

  • 语法

    MI_S32 MI_SYS_Exit (void);
    
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • MI_SYS_Exit调用前需要确保系统内所有其他模组都已经完成去初始化。

    • MI_SYS_Exit调用前需要确保系统内所有创建的VBPOOL已经成功销毁。

  • 举例

    参见 系统Init调用Sample举例。

  • 相关主题

    MI_SYS_Init


2.3.3. MI_SYS_GetVersion

  • 功能

    获取MI 的系统版本号。

  • 语法

    MI_S32 MI_SYS_GetVersion (MI_SYS_Version_t *pstVersion);
    
  • 形参

    参数名称 描述 输入/输出
    pstVersion 系统版本号返回数据结构指针 输出
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 举例

    参见 系统Init调用Sample举例。


2.3.4. MI_SYS_GetCurPts

  • 功能

    获取MI系统当前时间戳。

  • 语法

    MI_S32 MI_SYS_GetCurPts (MI_U64 *pu64Pts);
    
  • 形参

    参数名称 描述 输入/输出
    pu64Pts 系统当前时间戳返回地址 输出
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 举例

    参见系统Init调用Sample举例。


2.3.5. MI_SYS_InitPtsBase

  • 功能

    初始化MI系统时间戳基准。

  • 语法

    MI_S32 MI_SYS_InitPtsBase (MI_U64 u64PtsBase);
    
  • 形参

    参数名称 描述 输入/输出
    u64PtsBase 设置的系统时间戳基准 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 举例

    参见系统Init调用Sample举例。


2.3.6. MI_SYS_SyncPts

  • 功能

    微调同步MI系统时间戳。

  • 语法

    MI_S32 MI_SYS_SyncPts (MI_U64 u64Pts);
    
  • 形参

    参数名称 描述 输入/输出
    u64Pts 微调后的系统时间戳基准 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 举例

    参见系统Init调用Sample举例。


2.3.7. MI_SYS_SetReg

  • 功能

    设置寄存器的值,调试用。

  • 语法

    MI_S32 MI_SYS_SetReg (MI_U32 u32RegAddr, MI_U16 u16Value,MI_U16 u16Mask);
    
  • 形参

    参数名称 描述 输入/输出
    u32RegAddr Register 总线之地址 输入
    u16Value 待写入之16bit寄存器值 输入
    u16Mask 本次写入寄存器值之Mask遮挡栏位 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so


2.3.8. MI_SYS_GetReg

  • 功能

    读取寄存器的值,调试用。

  • 语法

    MI_S32 MI_SYS_GetReg (MI_U32 u32RegAddr, MI_U16 *pu16Value);
    
  • 形参

    参数名称 描述 输入/输出
    u32RegAddr Register 总线之地址 输入
    pu16Value 待读回16bit寄存器值返回地址 输出
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so


2.3.9. MI_SYS_ReadUuid

  • 功能

    获取Chip的Unique ID

  • 语法

    MI_S32 MI_SYS_ReadUuid (MI_U64 *u64Uuid);
    
  • 形参

    参数名称 描述 输入/输出
    u64Uuid 获取chip unique ID值的指针 输出
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 举例

    参见系统Init调用Sample举例。


2.3.10. MI_SYS_EnableChnOutputPortLowLatency

  • 功能

    打开或者关闭通道output端口的低延迟输出功能

  • 语法

    MI_S32 MI_SYS_EnableChnOutputPortLowLatency(MI_SYS_ChnPort_t *pstChnPort,MI_BOOL bEnable , MI_U32 u32Param);
    
  • 形参

    参数名称 描述 输入/输出
    pstChnPort 指向模块通道之output端口的指针 输入
    bEnable TRUE:打开 ;FALSE:关闭。默认FALSE 输入
    u32Param Low Latency参数,其含义由具体模块决定 VPE用于设置Line Count,表示写完多少条Line后就Output给User或后级 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    当bEnable 为true时,u32Param必须大于0,否则设置无效

  • 举例

    MI_SYS_ChnPort_t stChnPort;
    
    stChnPort.eModId = E_MI_MODULE_ID_VPE;
    
    stChnPort.u32DevId = 0;
    
    stChnPort.u32ChnId = 0;
    
    stChnPort.u32PortId = 0;
    
    //打开VPE 通道1 output端口0 的低延迟输出功能,设定完成100行即可输出 MI_SYS_EnableChnOutputPortLowLatency(&stChnPort,TRUE , 100);
    
    //关闭VPE 通道1 output端口0 的低延迟输出功能,
    MI_SYS_EnableChnOutputPortLowLatency(&stChnPort,FALSE , 0);
    

2.3.11. MI_SYS_InitDev

  • 功能

    MI_SYS初始化,MI_SYS 模块为系统内其它MI模组提供基础支援,需要早于系统内其它MI 模组初始化,否则其它stream类型的模组初始化时会失败。

  • 语法

    MI_S32 MI_SYS_InitDev(MI_SYS_InitParam_t *pstInitParam);
    
  • 形参

    参数名称 描述 输入/输出
    pstInitParam 设备初始化参数 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • MI_SYS_InitDev需要早于其他MI模组的Init函数调用。

    • 系统在内核启动参数内,需要配置好MMA 内存堆的配置参数。

    • pstInitParam暂未使用,空值传入即可。

    • 此接口在Version 2.17以上版本推荐使用,用于替换原有MI_SYS_Init接口。

  • 相关主题

    MI_SYS_DeInitDev


2.3.12. MI_SYS_DeInitDev

  • 功能

    MI_SYS初始化, 调用MI_SYS_DeInitDev之前,需要确保系统内所有其他模组都已经完成去初始化,所有VBPOOL都已经销毁,否则MI_SYS_DeInitDev 会返回失败。

  • 语法

    MI_S32 MI_SYS_DeInitDev(void);
    
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • 此函数必须在初始化设备后调用,否则返回失败。

    • 此接口同个进程下不支持多次调用,否则会返回失败。

    • MI_SYS_DeInitDev调用前需要确保系统内所有其他模组都已经完成去初始化。

    • 此接口在Version 2.17以上版本推荐使用,用于替换原有MI_SYS_Exit接口。

  • 相关主题

    MI_SYS_InitDev


2.3.13. MI_SYS_SetGlobalFlag

  • 功能

    设置全局标志位的值。通过MI_SYS_SetGlobalFlag设置全局标志位的值来告诉MI_SYS IR灯已打开,目前只支持设置IR标志位的值。

  • 语法

    MI_S32 MI_SYS_SetGlobalFlag(MI_SYS_GlobalFlagParam_t *pstGlobalFlagParam);
    
  • 形参

    参数名称 描述 输入/输出
    pstGlobalFlagParam 设置全局Flag参数 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    当IR灯打开时,需要通过MI_SYS_SetGlobalFlag接口将MI_SYS_GlobalFlagParam_t中的value成员设置为1,这样在后面通过MI_SYS_ChnOutputPortGetBuf 获取到的stBufInfo里面的u32IrFlag成员同样会记录为1。

    若MI_SYS_SetGlobalFlag接口在中断中被调用,则需要将MI_SYS_GlobalFlagParam_t参数中的bIsr参数设置为1。


2.4. 数据流类 API


2.4.1. MI_SYS_BindChnPort

  • 功能

    数据源输出端口到数据接收者输入端口的绑定。

  • 语法

    MI_S32 MI_SYS_BindChnPort( *pstSrcChnPort, *pstDstChnPort, ,MI_U32 u32SrcFrmrate, MI_U32 u32DstFrmrate);
    
  • 形参

    参数名称 参数含义 输入/输出
    pstSrcChnPort 源端口配置信息数据结构指针 输入
    pstDstChnPort 目标端口配置信息数据结构指针 输入
    u32SrcFrmrate 源端口配置的帧率 输入
    u32DstFrmrate 目标端口配置的帧率 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • 源端口必须是通道输出端口。

    • 目标端口必须是通道输入端口。

    • 源和目标端口必须之前没有被绑定过。

    • 本接口只支持按照E_MI_SYS_BIND_TYPE_FRAME_BASE方式绑定模块,在Version 2.0以上版本不推荐使用,请使用MI_SYS_BindChnPort2替代。

  • 举例

    MI_SYS_ChnPort_t stSrcChnPort;
    
    MI_SYS_ChnPort_t stDstChnPort;
    
    MI_U32 u32SrcFrmrate;
    
    MI_U32 u32DstFrmrate;
    
    stSrcChnPort.eModId = E_MI_MODULE_ID_VPE;
    
    stSrcChnPort.u32DevId = 0;
    
    stSrcChnPort.u32ChnId = 0;
    
    stSrcChnPort.u32PortId = 0;
    
    stDstChnPort.eModId = E_MI_MODULE_ID_VENC;
    
    stDstChnPort.u32DevId = 0;
    
    stDstChnPort.u32ChnId = 0;
    
    stDstChnPort.u32PortId = 0;
    
    u32SrcFrmrate = 30;
    
    u32DstFrmrate = 30;
    
    MI_SYS_BindChnPort(&stSrcChnPort, &stDstChnPort, u32SrcFrmrate, u32DstFrmrate);
    
  • 相关主题

    MI_SYS_BindChnPort2

    MI_SYS_UnBind_ChnPort


2.4.2. MI_SYS_BindChnPort2

  • 功能

    数据源输出端口到数据接收者输入端口的绑定,需要额外指定工作模式。

  • 语法

    MI_S32 MI_SYS_BindChnPort2(MI_SYS_ChnPort_t *pstSrcChnPort, MI_SYS_ChnPort_t *pstDstChnPort,MI_U32 u32SrcFrmrate, MI_U32 u32DstFrmrate, MI_SYS_BindType_e eBindType, MI_U32 u32BindParam);
    
  • 形参

    参数名称 参数含义 输入/输出
    pstSrcChnPort 源端口配置信息数据结构指针。 输入
    pstDstChnPort 目标端口配置信息数据结构指针。 输入
    u32SrcFrmrate 源端口配置的帧率 输入
    u32DstFrmrate 目标端口配置的帧率 输入
    eBindType 源端口与目标端口连接的工作模式,参考 MI_SYS_BindType_e 输入
    u32BindParam 不同工作模式需带入的额外参数。 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • 源端口必须是通道输出端口。

    • 目标端口必须是通道输入端口。

    • 同一个源端口可以绑定多个目标端口。

    • 同一个目标端口只能绑定一个源端口,使用之前必须没有被绑定过。

    • MI_SYS_BindChnPort2在pstSrcChnPort、pstDstChnPort和eBindType相同的情况下可以被多次调用,来重新设置需要修改的u32SrcFrmrate和u32DstFrmrate。

    • 旧版本MI SYS不提供此接口,如没有找到,不用设置。

    • 各种eBindType使用场景如下:

    eBindType 适用场景
    E_MI_SYS_BIND_TYPE_SW_LOW_LATENCY u32BindParam表示低时延值,单位ms
    E_MI_SYS_BIND_TYPE_HW_RING u32BindParam表示ring buffer depth,目前是只有vpe和venc(h264/h265)支持这种模式,只支持一路; vif->isp,支持一路;isp->scl,支持多路
    E_MI_SYS_BIND_TYPE_REALTIME u32BindParam未使用,jpe imi会走这种模式,只支持一路
    E_MI_SYS_BIND_TYPE_FRAME_BASE u32BindParam未使用,默认是走这种frame mode
  • 举例

        MI_SYS_ChnPort_t stSrcChnPort;
        MI_SYS_ChnPort_t stDstChnPort;
        MI_U32 u32SrcFrmrate;
        MI_U32 u32DstFrmrate;
        MI_SYS_BindType_e eBindType;
        MI_U32 u32BindParam;
    
        // a.   vpe与venc连接方式为E_MI_SYS_BIND_TYPE_FRAME_BASE,代码如下:
        stSrcChnPort.eModId = E_MI_MODULE_ID_VPE;
        stSrcChnPort.u32DevId = 0;
        stSrcChnPort.u32ChnId = 0;
        stSrcChnPort.u32PortId = 0;
        stDstChnPort.eModId = E_MI_MODULE_ID_VENC;
        stDstChnPort.u32DevId = 0;
        stDstChnPort.u32ChnId = 0;
        stDstChnPort.u32PortId = 0;
        u32SrcFrmrate = 30;
        u32DstFrmrate = 30;
        eBindType = E_MI_SYS_BIND_TYPE_FRAME_BASE;
        u32BindParam = 0;
    STCHECKRESULT(MI_SYS_BindChnPort2(&stSrcChnPort, &stDstChnPort, u32SrcFrmrate, u32DstFrmrate, eBindType, u32BindParam));
    
    // b.   vpe与jpe连接方式为E_MI_SYS_BIND_TYPE_REALTIME,代码如下:
        stSrcChnPort.eModId = E_MI_MODULE_ID_VPE;
        stSrcChnPort.u32DevId = 0;
        stSrcChnPort.u32ChnId = 0;
        stSrcChnPort.u32PortId = 0;
        stDstChnPort.eModId = E_MI_MODULE_ID_VENC;
        stDstChnPort.u32DevId = 1;
        stDstChnPort.u32ChnId = 0;
        stDstChnPort.u32PortId = 0;
        u32SrcFrmrate = 30;
        u32DstFrmrate = 30;
        eBindType = E_MI_SYS_BIND_TYPE_REALTIME;
        u32BindParam = 0;
    STCHECKRESULT(MI_SYS_BindChnPort2(&stSrcChnPort, &stDstChnPort, u32SrcFrmrate, u32DstFrmrate, eBindType, u32BindParam));
    
    // c.   vpe与venc连接方式为E_MI_SYS_BIND_TYPE_HW_RING,代码如下:
        tSrcChnPort.eModId = E_MI_MODULE_ID_VPE;
        stSrcChnPort.u32DevId = 0;
        stSrcChnPort.u32ChnId = 0;
        stSrcChnPort.u32PortId = 0;
        stDstChnPort.eModId = E_MI_MODULE_ID_VENC;
        stDstChnPort.u32DevId = 0;
        stDstChnPort.u32ChnId = 0;
        stDstChnPort.u32PortId = 0;
        u32SrcFrmrate = 30;
        u32DstFrmrate = 30;
        eBindType = E_MI_SYS_BIND_TYPE_HW_RING;
        u32BindParam = 1080;//假设vpe output resolution为1920*1080,设置ring buffer depth为1080
        STCHECKRESULT(MI_SYS_BindChnPort2(&stSrcChnPort, &stDstChnPort, u32SrcFrmrate, u32DstFrmrate, eBindType, u32BindParam));
    
  • 相关主题

    MI_SYS_BindChnPort2

    MI_SYS_UnBind_ChnPort


2.4.3. MI_SYS_UnBind_ChnPort

  • 功能

    数据源输出端口到数据接收者输入端口之间的去绑定。

  • 语法

    MI_S32 MI_SYS_UnBindChnPort(*pstSrcChnPort, *pstDstChnPort);
    
  • 形参

    参数名称 描述 输入/输出
    pstSrcChnPort 源端口配置信息数据结构指针 输入
    pstDstChnPort 目标端口配置信息数据结构指针 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • 源端口必须是通道输出端口。

    • 目标端口必须是通道输入端口。

    • 源和目标端口之间之前必须已经被绑定过

  • 相关主题

    MI_SYS_BindChnPort

    MI_SYS_BindChnPort2


2.4.4. MI_SYS_GetBindbyDest

  • 功能

    查询数据接收者输入端口的对应的源输出端口。

  • 语法

    MI_S32 MI_SYS_GetBindbyDest ( *pstDstChnPort, *pstSrcChnPort);
    
  • 形参

    参数名称 描述 输入/输出
    pstDstChnPort 目标端口配置信息数据结构指针 输入
    pstDstChnPort 源端口配置信息数据结构指针 输出
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • 目标端口必须是通道输入端口。

    • 目标端口之前必须已经被绑定过


2.4.5. MI_SYS_ChnInputPortGetBuf

  • 功能

    分配通道input端口对应的buf object。

  • 语法

    MI_S32 MI_SYS_ChnInputPortGetBuf ( *pstChnPort, *pstBufConf,MI_SYS_BufInfo_t *pstBufInfo, MI_SYS_BUF_HANDLE *phHandle, MI_S32 s32TimeOutMs);
    
  • 形参

    参数名称 描述 输入/输出
    pstChnPort 指向模块通道之input端口的指针 输入
    pstBufConf 待分配内存配置信息 输入
    pstPortBuf 返回之buf 指针 输出
    phHandle 获取的intputPort Buf的handle 输出
    s32TimeOutMs 等待超时的毫秒数,>=0时为具体时间;<0时会采用默认值20ms 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 举例

    MI_SYS_ChnInputPortGetBuf调用Sample

        MI_SYS_ChnPort_t stVpeChnInput;
    
        MI_SYS_BUF_HANDLE hHandle = 0;
    
        MI_SYS_BufConf_t stBufConf;
    
        MI_SYS_BufInfo_t stBufInfo;
    
        **struct** timeval stTv;
    
        MI_U16 u16Width = 1920, u16Height = 1080;
    
        FILE *fp = NULL;
    
        memset(&stVpeChnInput, 0x0, sizeof(MI_SYS_ChnPort_t));
    
        memset(&stBufConf, 0x0, sizeof(MI_SYS_BufConf_t));
    
        memset(&stBufInfo, 0x0, sizeof(MI_SYS_BufInfo_t));
    
        stVpeChnInput.eModId = E_MI_MODULE_ID_VPE;
    
        stVpeChnInput.u32DevId = 0;
    
        stVpeChnInput.u32ChnId = 0;
    
        stVpeChnInput.u32PortId = 0;
    
        fp = fopen("/mnt/vpeport0_1920x1080_pixel0_737.raw","rb");
    
        if(fp == NULL)
    
        {
    
            printf("file %s open fail\\n", "/mnt/vpeport0_1920x1080_pixel0_737.raw");
    
            return 0;
    
        }
    
        while(1)
    
        {
    
            stBufConf.eBufType = E_MI_SYS_BUFDATA_FRAME;
    
            gettimeofday(&stTv, NULL);
    
            stBufConf.u64TargetPts = stTv.tv_sec*1000000 + stTv.tv_usec;
    
            stBufConf.stFrameCfg.eFormat = E_MI_SYS_PIXEL_FRAME_YUV422_YUYV;
    
            stBufConf.stFrameCfg.eFrameScanMode = E_MI_SYS_FRAME_SCAN_MODE_PROGRESSIVE;
    
            stBufConf.stFrameCfg.u16Width = u16Width;
    
            stBufConf.stFrameCfg.u16Height = u16Height;
    
            if(MI_SUCCESS  == MI_SYS_ChnInputPortGetBuf(&stVpeChnInput,&stBufConf,&stBufInfo,&hHandle,0))
    
            {
    
                if(fread(stBufInfo.stFrameData.pVirAddr[0], u16Width*u16Height*2, 1, fp) <= 0)
    
                {
    
                    fseek(fp, 0, SEEK_SET);
    
                }
    
                MI_SYS_ChnInputPortPutBuf(hHandle,&stBufInfo, FALSE);
    
            }
    
        }
    
  • 相关主题

    MI_SYS_ChnInputPortPutBuf

    MI_SYS_ChnPortInjectBuf


2.4.6. MI_SYS_ChnInputPortPutBuf

  • 功能

    把通道input端口对应的buf object加到待处理队列。

  • 语法

    MI_S32 MI_SYS_ChnInputPortPutBuf (MI_SYS_BUF_HANDLE hHandle ,*pstPortBuf, MI_BOOL bDropBuf);
    
  • 形参

    参数名称 描述 输入/输出
    hHandle 当前buf的Handle 输入
    pstPortBuf 待提交的buf 指针 输入
    bDropBuf 是否将buf直接丢弃而不用提交到待处理队列上 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 举例

    参见MI_SYS_ChnInputPortGetBuf调用Sample举例。

  • 相关主题

    MI_SYS_ChnInputPortGetBuf

    MI_SYS_ChnPortInjectBuf


2.4.7. MI_SYS_ChnOutputPortGetBuf

  • 功能

    分配通道output端口对应的buf object。

  • 语法

    MI_S32 MI_SYS_ChnOutputPortGetBuf (*pstChnPort, *pstBufInfo ,MI_SYS_BUF_HANDLE *phHandle);
    
  • 形参

    参数名称 描述 输入/输出
    pstChnPort 指向模块通道之output端口的指针 输入
    pstBufInfo 返回之buf 指针 输出
    phHandle 获取的outputPort Buf的handle 输出
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 举例

    MI_SYS_ChnOutputPortGetBuf调用Sample

    MI_SYS_ChnPort_t stChnPort;
    MI_SYS_BufInfo_t stBufInfo;
    MI_SYS_BUF_HANDLE stBufHandle;
    MI_S32 s32Ret = MI_SUCCESS;
    MI_S32 s32Fd = 0;
    fd_set read_fds;
    struct timeval TimeoutVal;
    char szFileName[128];
    int fd = 0;
    MI_U32 u32GetFramesCount = 0;
    MI_BOOL _bWriteFile = TRUE;
    
    stChnPort.eModId = E_MI_MODULE_ID_DIVP;
    stChnPort.u32DevId = 0;
    stChnPort.u32ChnId = DIVP_CHN_FOR_VDF;
    stChnPort.u32PortId = 0;
    
    s32Ret = MI_SYS_GetFd(&stChnPort, &s32Fd);
    if(MI_SUCCESS != s32Ret)
    {
        ST_ERR("MI_SYS_GetFd 0, error, %X\n", s32Ret);
        return NULL;
    }
    s32Ret = MI_SYS_SetChnOutputPortDepth(&stChnPort, 2, 3);
    if (MI_SUCCESS != s32Ret)
    {
        ST_ERR("MI_SYS_SetChnOutputPortDepth err:%x, chn:%d,port:%d\n", s32Ret,
            stChnPort.u32ChnId, stChnPort.u32PortId);
        return NULL;
    }
    
    sprintf(szFileName, "divp%d.es", stChnPort.u32ChnId);
    printf("start to record %s\n", szFileName);
    fd = open(szFileName, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
    if (fd < 0)
    {
        ST_ERR("create %s fail\n", szFileName);
    }
    
    while (1)
    {
        FD_ZERO(&read_fds);
        FD_SET(s32Fd, &read_fds);
    
        TimeoutVal.tv_sec  = 1;
        TimeoutVal.tv_usec = 0;
    
        s32Ret = select(s32Fd + 1, &read_fds, NULL, NULL, &TimeoutVal);
    
        if(s32Ret < 0)
        {
            ST_ERR("select failed!\n");
            //  usleep(10 * 1000);
            continue;
        }
        else if(s32Ret == 0)
        {
            ST_ERR("get divp frame time out\n");
            //usleep(10 * 1000);
            continue;
        }
        else
        {
            if(FD_ISSET(s32Fd, &read_fds))
            {
                s32Ret = MI_SYS_ChnOutputPortGetBuf(&stChnPort, &stBufInfo, &stBufHandle);
    
                if(MI_SUCCESS != s32Ret)
                {
                    //ST_ERR("MI_SYS_ChnOutputPortGetBuf err, %x\n", s32Ret);
                    continue;
                }
    
                // save one Frame YUV data
                if (fd > 0)
                {
                    if(_bWriteFile)
                    {
                        write(fd, stBufInfo.stFrameData.pVirAddr[0], stBufInfo.stFrameData.u16Height * stBufInfo.stFrameData.u32Stride[0] +
                            stBufInfo.stFrameData.u16Height * stBufInfo.stFrameData.u32Stride[1] /2);
                    }
    
                }
    
                ++u32GetFramesCount;
                printf("channelId[%u] u32GetFramesCount[%u]\n", stChnPort.u32ChnId, u32GetFramesCount);
    
                MI_SYS_ChnOutputPortPutBuf(stBufHandle);
            }
        }
    }
    
    if (fd > 0)
    {
        close(fd);
        fd = -1;
    

    }

    MI_SYS_SetChnOutputPortDepth(&stChnPort, 0, 3);
    printf("exit record\n");
    return NULL;
    
  • 相关主题

    MI_SYS_ChnOutputPortPutBuf

    MI_SYS_ChnPortInjectBuf


2.4.8. MI_SYS_ChnOutputPortPutBuf

  • 功能

    释放通道output端口对应的buf object。

  • 语法

    MI_S32  MI_SYS_ChnOutputPortPutBuf (MI_SYS_BUF_HANDLE hBufHandle);
    
  • 形参

    参数名称 描述 输入/输出
    hBufHandle 待提交的buf 的handle 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 举例

    参见MI_SYS_ChnOutputPortGetBuf调用Sample 举例。

  • 相关主题

    MI_SYS_ChnOutputPortGetBuf

    MI_SYS_ChnPortInjectBuf


2.4.9. MI_SYS_ChnInputPortGetBufPa

  • 功能

    分配通道input端口对应的buf object,仅提供MIU物理地址。

  • 语法

    MI_S32 MI_SYS_ChnInputPortGetBufPa (MI_SYS_ChnPort_t *pstChnPort,MI_SYS_BufConf_t *pstBufConf,  MI_SYS_BufInfo_t *pstBufInfo,  MI_SYS_BUF_HANDLE *phHandle , MI_S32 s32TimeOutMs);
    
  • 形参

    参数名称 描述 输入/输出
    pstChnPort 指向模块通道之input端口的指针 输入
    pstBufConf 待分配内存配置信息 输入
    pstPortBuf 返回之buf 指针 输出
    phHandle 获取的intputPort Buf的 handle 输出
    s32TimeOutMs 等待超时的毫秒数,>=0时为具体时间;<0时会采用默认值20ms 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    与MI_SYS_ChnInputPortGetBuf区别:MI_SYS_ChnInputPortGetBufPa获取的pstBufInfo中只能使用物理地址phyAddr,而MI_SYS_ChnInputPortGetBuf获取的pstBufInfo中物理地址phyAddr和虚拟地址pVirAddr都可以使用。

  • 举例

    MI_SYS_ChnInputPortGetBufPa调用Sample

    MI_SYS_ChnPort_t stVpeChnInput;
    MI_SYS_BUF_HANDLE hHandle = 0;
    MI_SYS_BufConf_t stBufConf;
    MI_SYS_BufInfo_t stBufInfo;
    struct timeval stTv;
    MI_U16 u16Width = 1920, u16Height = 1080;
    FILE *fp = NULL;
    void *pVirAddr = NULL;
    
    memset(&stVpeChnInput, 0x0, sizeof(MI_SYS_ChnPort_t));
    memset(&stBufConf, 0x0, sizeof(MI_SYS_BufConf_t));
    memset(&stBufInfo, 0x0, sizeof(MI_SYS_BufInfo_t));
    
    stVpeChnInput.eModId = E_MI_MODULE_ID_VPE;
    stVpeChnInput.u32DevId = 0;
    stVpeChnInput.u32ChnId = 0;
    stVpeChnInput.u32PortId = 0;
    
    fp = fopen("/mnt/vpeport0_1920x1080_pixel0_737.raw", "rb");
    if (fp == NULL)
    {
        printf("file %s open fail\n", "/mnt/vpeport0_1920x1080_pixel0_737.raw");
        return 0;
    }
    
    while (1)
    {
        stBufConf.eBufType = E_MI_SYS_BUFDATA_FRAME;
        gettimeofday(&stTv, NULL);
        stBufConf.u64TargetPts = stTv.tv_sec * 1000000 + stTv.tv_usec;
        stBufConf.stFrameCfg.eFormat = E_MI_SYS_PIXEL_FRAME_YUV422_YUYV;
        stBufConf.stFrameCfg.eFrameScanMode = E_MI_SYS_FRAME_SCAN_MODE_PROGRESSIVE;
        stBufConf.stFrameCfg.u16Width = u16Width;
        stBufConf.stFrameCfg.u16Height = u16Height;
    
        if (MI_SUCCESS == MI_SYS_ChnInputPortGetBufPa(&stVpeChnInput, &stBufConf, &stBufInfo, &hHandle, 0))
        {
            pVirAddr = MI_SYS_Mmap(stBufInfo.stFrameData.phyAddr[0], stBufInfo.stFrameData.u32BufSize, &pVirAddr, TRUE);
            assert(pVirAddr);
            if (fread(pVirAddr, u16Width * u16Height * 2, 1, fp) <= 0)
            {
                fseek(fp, 0, SEEK_SET);
            }
            MI_SYS_Munmap(pVirAddr, stBufInfo.stFrameData.u32BufSize);
            MI_SYS_ChnInputPortPutBufPa(hHandle, &stBufInfo, FALSE);
        }
    }
    
  • 相关主题

    MI_SYS_ChnInputPortPutBufPa

    MI_SYS_ChnInputPortPutBuf

    MI_SYS_ChnPortInjectBuf


2.4.10. MI_SYS_ChnInputPortPutBufPa

  • 功能

    把通道input端口对应的buf object加到待处理队列,与MI_SYS_ChnInputPortGetBufPa成对使用。

  • 语法

    MI_S32 MI_SYS_ChnInputPortPutBufPa (MI_SYS_BUF_HANDLE hHandle ,MI_SYS_BufInfo_t *pstPortBuf, MI_BOOL bDropBuf);
    

- 形参

|参数名称 |描述|输入/输出|
|hHandle    |当前buf的 Handle  输入|
|pstPortBuf|    待提交的buf 指针| 输入|
|bDropBuf   |直接放弃对buf的修改不提交 |输入|
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码。

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    与MI_SYS_ChnInputPortPutBuf区别:MI_SYS_ChnInputPortPutBufPa提交的pstBufInfo中只能使用物理地址phyAddr,而MI_SYS_ChnInputPortPutBuf提交的pstBufInfo中物理地址phyAddr和虚拟地址pVirAddr都可以使用

  • 举例

    参见 MI_SYS_ChnInputPortGetBufPa调用Sample 举例。

  • 相关主题

    MI_SYS_ChnInputPortGetBufPa

    MI_SYS_ChnInputPortGetBuf

    MI_SYS_ChnPortInjectBuf


2.4.11. MI_SYS_ChnOutputPortGetBufPa

  • 功能

    分配通道output端口对应的buf object,仅提供MIU物理地址。

  • 语法

    MI_S32  MI_SYS_ChnOutputPortGetBufPa (MI_SYS_ChnPort_t *pstChnPort,  MI_SYS_BufInfo_t *pstBufInfo, MI_SYS_BUF_HANDLE *phHandle);
    
  • 形参

    |参数名称 | 描述 |输入/输出| |pstChnPort |指向模块通道之output端口的指针 |输入| |pstBufInfo| 返回之buf 指针| 输出| |phHandle| 获取的outputPort Buf的handle| 输出|

  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    与MI_SYS_ChnOutputPortGetBuf区别:MI_SYS_ChnOutputPortGetBufPa获取的pstBufInfo中只能使用物理地址phyAddr,而MI_SYS_ChnOutputPortGetBuf获取的pstBufInfo中物理地址phyAddr和虚拟地址pVirAddr都可以使用。

  • 举例

    MI_SYS_ChnPort_t stChnPort;
    MI_SYS_BufInfo_t stBufInfo;
    MI_SYS_BUF_HANDLE stBufHandle;
    MI_S32 s32Ret = MI_SUCCESS;
    MI_S32 s32Fd = 0;
    fd_set read_fds;
    struct timeval TimeoutVal;
    char szFileName[128];
    int fd = 0;
    MI_U32 u32GetFramesCount = 0;
    MI_BOOL _bWriteFile = TRUE;
    void *pVirAddr = NULL;
    
    stChnPort.eModId = E_MI_MODULE_ID_DIVP;
    stChnPort.u32DevId = 0;
    stChnPort.u32ChnId = DIVP_CHN_FOR_VDF;
    stChnPort.u32PortId = 0;
    
    s32Ret = MI_SYS_GetFd(&stChnPort, &s32Fd);
    if (MI_SUCCESS != s32Ret)
    {
        ST_ERR("MI_SYS_GetFd 0, error, %X\n", s32Ret);
        return NULL;
    }
    s32Ret = MI_SYS_SetChnOutputPortDepth(&stChnPort, 2, 3);
    if (MI_SUCCESS != s32Ret)
    {
        ST_ERR("MI_SYS_SetChnOutputPortDepth err:%x, chn:%d,port:%d\n", s32Ret,
            stChnPort.u32ChnId, stChnPort.u32PortId);
        return NULL;
    }
    
    sprintf(szFileName, "divp%d.es", stChnPort.u32ChnId);
    printf("start to record %s\n", szFileName);
    fd = open(szFileName, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
    if (fd < 0)
    {
        ST_ERR("create %s fail\n", szFileName);
    }
    
    while (1)
    {
        FD_ZERO(&read_fds);
        FD_SET(s32Fd, &read_fds);
    
        TimeoutVal.tv_sec = 1;
        TimeoutVal.tv_usec = 0;
    
        s32Ret = select(s32Fd + 1, &read_fds, NULL, NULL, &TimeoutVal);
    
        if (s32Ret < 0)
        {
            ST_ERR("select failed!\n");
            //  usleep(10 * 1000);
            continue;
        }
        else if (s32Ret == 0)
        {
            ST_ERR("get divp frame time out\n");
            //usleep(10 * 1000);
            continue;
        }
        else
        {
            if (FD_ISSET(s32Fd, &read_fds))
            {
                s32Ret = MI_SYS_ChnOutputPortGetBufPa(&stChnPort, &stBufInfo, &stBufHandle);
    
                if (MI_SUCCESS != s32Ret)
                {
                    //ST_ERR("MI_SYS_ChnOutputPortGetBufPa err, %x\n", s32Ret);
                    continue;
                }
    
                s32Ret = MI_SYS_Mmap(stBufInfo.stFrameData.phyAddr[0], stBufInfo.stFrameData.u32BufSize, &pVirAddr, TRUE);
                assert(pVirAddr);
                // save one Frame YUV data
                if (fd > 0)
                {
                    if (_bWriteFile)
                    {
                        write(fd, pVirAddr, stBufInfo.stFrameData.u16Height * stBufInfo.stFrameData.u32Stride[0] + stBufInfo.stFrameData.u16Height * stBufInfo.stFrameData.u32Stride[1] / 2);
                    }
                }
    
                ++u32GetFramesCount;
                printf("channelId[%u] u32GetFramesCount[%u]\n", stChnPort.u32ChnId, u32GetFramesCount);
    
                MI_SYS_Munmap(pVirAddr, stBufInfo.stFrameData.u32BufSize);
                MI_SYS_ChnOutputPortPutBufPa(stBufHandle);
            }
        }
    }
    
    if (fd > 0)
    {
        close(fd);
        fd = -1;
    }
    
    MI_SYS_SetChnOutputPortDepth(&stChnPort, 0, 3);
    printf("exit record\n");
    return NULL;
    MI_SYS_ChnOutputPortGetBufPa调用Sample
    
  • 相关主题

    MI_SYS_ChnOutputPortPutBufPa

    MI_SYS_ChnOutputPortPutBuf

    MI_SYS_ChnPortInjectBuf


2.4.12. MI_SYS_ChnOutputPortPutBufPa

  • 功能

    释放通道output端口对应的buf object,与MI_SYS_ChnOutputPortGetBufPa成对使用。

  • 语法

    MI_S32  MI_SYS_ChnOutputPortPutBufPa (MI_SYS_BUF_HANDLE hBufHandle);
    
  • 形参

    参数名称 描述 输入/输出
    hBufHandle 待提交的buf 的handle 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    与MI_SYS_ChnOutputPortPutBuf区别:MI_SYS_ChnOutputPortPutBufPa提交的handle对应的pstBufInfo中只能使用物理地址phyAddr,而MI_SYS_ChnOutputPortPutBuf提交的handle对应的pstBufInfo中物理地址phyAddr和虚拟地址pVirAddr都可以使用。

  • 举例

    参见 MI_SYS_ChnOutputPortGetBufPa调用Sample 举例。

  • 相关主题

    MI_SYS_ChnOutputPortGetBufPa

    MI_SYS_ChnOutputPortGetBuf

    MI_SYS_ChnPortInjectBuf


2.4.13. MI_SYS_SetChnOutputPortDepth

  • 功能

    设置通道output端口对应的系统buf 数量和用户可以拿到的buf数量。

  • 语法

    MI_S32 MI_SYS_SetChnOutputPortDepth(MI_SYS_ChnPort_t *pstChnPort, MI_U32 u32UserFrameDepth, MI_U32 u32BufQueueDepth);
    
  • 形参

    参数名称 描述 输入/输出
    pstChnPort 指向模块通道之output端口的指针 输入
    u32UserFrameDepth 设置该output用户可以拿到的buf最大数量 输入
    u32BufQueueDepth 设置该output系统buf最大数量 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • 在使用完OutputPortBuf(MI_SYS_ChnOutputPortGetBuf / MI_SYS_ChnOutputPortPutBuf 不再需要被调用)之后,建议把u32UserFrameDepth设置为0,可以减少output buf的缓存个数,节省内存。

    • u32UserFrameDepth 必须小于或者等于u32BufQueueDepth。

    • 当u32UserFrameDepth等于u32BufQueueDepth,并且user fifo queue缓存的个数等于u32BufQueueDepth时,当前output port将会停止工作。

    • 如果output port 没有绑定后级,想让当前output port工作,必须设置u32UserFrameDepth 大于0。

    • 如果output port 通过realtime mode或者ring mode方式绑定,当前output port的u32UserFrameDepth必须设置为0。

    • 其他使用限制可参考vif/isp/scl/venc/jpd API介绍。

  • 举例

    参见MI_SYS_ChnOutputPortGetBuf调用Sample 举例。


2.4.14. MI_SYS_ChnPortInjectBuf


2.4.15. MI_SYS_GetFd

  • 功能

    获取当前output Port等待事件的文件描述符

  • 语法

    MI_S32 MI_SYS_GetFd(MI_SYS_ChnPort_t *pstChnPort , MI_S32 *ps32Fd);
    
  • 形参

    参数名称 描述 输入/输出
    pstChnPort 端口信息结构体指针 输入
    ps32Fd 等待事件的文件描述符 输出
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • 需要与MI_SYS_CloseFd 成对使用。

    • 推荐使用使用fd + select 的方式取数据,这样MI_SYS只有在fd对应的port口有数据的时候才会唤醒线程,效率比采用while+sleep循环取数据的效率要高。

  • 举例

    参见MI_SYS_ChnOutputPortGetBuf调用Sample 举例。

  • 相关主题

    MI_SYS_CloseFd


2.4.16. MI_SYS_CloseFd

  • 功能

    关闭当前通道的文件描述符

  • 语法

    MI_S32 MI_SYS_CloseFd(MI_S32 s32ChnPortFd);
    
  • 形参

    参数名称 描述 输入/输出
    s32ChnPortFd 等待事件的文件描述符 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    需要与MI_SYS_GetFd 成对使用。

  • 举例

    参见MI_SYS_ChnOutputPortGetBuf调用Sample 举例。

  • 相关主题

    MI_SYS_GetFd


2.4.17. MI_SYS_DupBuf

  • 功能

    复制一个buf object。

  • 语法

    MI_S32 MI_SYS_DupBuf(MI_SYS_BUF_HANDLE srcBufHandle , MI_SYS_BUF_HANDLE *pDupTargetBufHandle);
    
  • 形参

    参数名称 描述 输入/输出
    srcBufHandle 源buf object 输入
    pDupTargetBufHandle 返回复制的buf object 指针 输出
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 举例

    MI_SYS_DupBuf调用Sample

    int test0()
    {
        MI_SYS_ChnPort_t stChnPort;
        MI_SYS_BufInfo_t stBufInfo;
        MI_SYS_BUF_HANDLE bufHandle ,DupTargetBufHandle;
        MI_S32 s32Ret;
        stChnPort.eModId = E_MI_MODULE_ID_VPE;
        stChnPort.u32DevId = 0;
        stChnPort.u32ChnId = 0;
        stChnPort.u32PortId = 0;
        s32Ret = MI_SYS_ChnOutputPortGetBuf (&stChnPort,&stBufInfo,&bufHandle);
        if(s32Ret != MI_SUCCESS)
            return 0;
        s32Ret =  MI_SYS_DupBuf(bufHandle, &DupTargetBufHandle);
        if(s32Ret != MI_SUCCESS)
        {
            MI_SYS_ChnOutputPortPutBuf(bufHandle);
            return 0;
        }
        stChnPort.eModId = E_MI_MODULE_ID_DIVP;
        stChnPort.u32DevId = 0;
        stChnPort.u32ChnId = 0;
        stChnPort.u32PortId = 0;
        MI_SYS_ChnPortInjectBuf(DupTargetBufHandle , &stChnPort);
    
        ***************************
            可以继续操作stBufInfo
        ***************************
    
        MI_SYS_ChnOutputPortPutBuf(bufHandle);
        return 1;
    }
    
    int test1()
    {
        MI_SYS_ChnPort_t stChnPort;
        MI_SYS_BufInfo_t stBufInfo;
        MI_SYS_BufConf_t stBufConf;
        MI_SYS_BUF_HANDLE bufHandle ,DupTargetBufHandle;
        MI_S32 s32Ret;
        stChnPort.eModId = E_MI_MODULE_ID_DIVP;
        stChnPort.u32DevId = 0;
        stChnPort.u32ChnId = 0;
        stChnPort.u32PortId = 0;
        memset(&stBufConf , 0 , sizeof(stBufConf));
        stBufConf.eBufType = E_MI_SYS_BUFDATA_FRAME;
        stBufConf.stFrameCfg.eFormat = E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_422;
        stBufConf.stFrameCfg.u16Height = 1080;
        stBufConf.stFrameCfg.u16Width = 1920;
        stBufConf.stFrameCfg.eFrameScanMode = E_MI_SYS_FRAME_SCAN_MODE_PROGRESSIVE;
        s32Ret = MI_SYS_ChnInputPortGetBuf (&stChnPort,&stBufConf,&stBufInfo,&bufHandle ,0);
        if(s32Ret != MI_SUCCESS)
            return 0;
        ***************************
            填充stBufInfo
        ***************************
        s32Ret =  MI_SYS_DupBuf(bufHandle, &DupTargetBufHandle);
        if(s32Ret != MI_SUCCESS)
        {
            MI_SYS_ChnInputPortPutBuf(bufHandle);
            return 0;
        }
        MI_SYS_ChnInputPortPutBuf(DupTargetBufHandle , &stChnPort , FALSE);
        ***************************
            可以继续操作stBufInfo
        ***************************
    
        MI_SYS_ChnInputPortPutBuf(bufHandle, & stChnPort, FALSE);
        return 1;
    }
    
  • 相关主题

    MI_SYS_ChnOutputPortGetBuf

    MI_SYS_ChnOutputPortPutBuf

    MI_SYS_ChnInputPortGetBuf

    MI_SYS_ChnInputPortPutBuf

    MI_SYS_ChnPortInjectBuf


2.5. 内存管理类 API


2.5.1. MI_SYS_SetChnMMAConf

  • 功能

    设置模块设备通道输出默认分配内存的MMA池名称。

  • 语法

    MI_S32 MI_SYS_SetChnMMAConf (MI_ModuleId_e eModId, MI_U32 u32DevId, MI_U32 u32ChnId, MI_U8 *pu8MMAHeapName);
    
  • 形参

    参数名称 描述 输入/输出
    eModId 待配置的模块ID 输入
    u32DevId 待配置的设备ID 输入
    u32ChnId 待配置的通道号 输入
    pu8MMAHeapName 设置MMA heap name 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    若不调用MI_SYS_SetChnMMAConf接口设置或者设置pu8MMAHeapName值为NULL时,则使用默认的MMA池名称mma_heap_name0。

  • 举例

    MI_ModuleId_e eVifModeId = E_MI_MODULE_ID_VIF;
    MI_VIF_DEV vifDev = 0;
    MI_VIF_CHN vifChn = 0;
    
    MI_SYS_SetChnMMAConf(eVifModeId, vifDev, vifChn, "mma_heap_name0");
    

2.5.2. MI_SYS_GetChnMMAConf

  • 功能

    获取模块设备通道输出端口默认分配内存的MMA池名称。

  • 语法

    MI_S32 MI_SYS_GetChnMMAConf (MI_ModuleId_e eModId, MI_U32 u32DevId, MI_U32 u32ChnId, void * pu8MMAHeapName, MI_U32 u32Length);
    
  • 形参

    参数名称 描述 输入/输出
    eModId 待配置的模块ID 输入
    u32DevId 待配置的设备ID 输入
    u32ChnId 待配置的通道号 输入
    pu8MMAHeapName 要获取的MMA heap name 输入
    u32Length pu8MMAHeapName 指向内存的长度,最大为64Byte 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 相关主题

    MI_SYS_SetChnMMAConf


2.5.3. MI_SYS_ConfDevPubPools

  • 功能

    配置并初始化模块公共缓冲池。

  • 语法

    MI_S32 MI_SYS_ConfDevPubPools(MI_ModuleId_e eModule, MI_U32 u32DevId, MI_VB_PoolListConf_t stPoolListConf);
    
  • 形参

    参数名称 描述 输入/输出
    eModule 目标模块ID 输入
    u32DevId Dev ID 输入
    stPoolListConf 模块公共缓冲池队列配置 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    Version 2.0及以上版本默认不开启,推荐使用MI_SYS_ConfigPrivateMMAPool


2.5.4. MI_SYS_ReleaseDevPubPools

  • 功能

    释放全局的公共缓冲池。

  • 语法

    MI_S32 MI_SYS_ReleaseDevPubPools(MI_ModuleId_e eModule, MI_U32 u32DevId);
    
  • 形参

    参数名称 描述 输入/输出
    eModule 目标模块ID 输入
    u32DevId Dev ID 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 举例

    Version 2.0及以上版本默认不开启,推荐使用MI_SYS_ConfigPrivateMMAPool


2.5.5. MI_SYS_ConfGloPubPools

  • 功能

    配置并初始化系统全局公共缓冲池。

  • 语法

    MI_S32 MI_SYS_ConfGloPubPools(MI_VB_PoolListConf_t stPoolListConf);
    
  • 形参

    参数名称 描述 输入/输出
    stPoolListConf 模块公共缓冲池队列配置 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    Version2.0及以上版本默认不开启,推荐使用MI_SYS_ConfigPrivateMMAPool


2.5.6. MI_SYS_ReleaseGloPubPools

  • 功能

    释放全局的公共缓冲池。

  • 语法

    MI_S32 MI_VB_ ReleaseGloPubPools (void);
    
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 举例

    Version 2.0及以上版本默认不开启,推荐使用MI_SYS_ConfigPrivateMMAPool


2.5.7. MI_SYS_MMA_Alloc

  • 功能

    直接向MMA内存管理器申请分配内存。

  • 语法

    MI_S32 MI_SYS_MMA_Alloc(MI_U8 *pstMMAHeapName, MI_U32 u32BlkSize ,MI_PHY *phyAddr);
    
  • 形参

    参数名称 描述 输入/输出
    pstMMAHeapName 目标MMA heapname 输入
    u32BlkSize 待分配的块字节大小 输入
    phyAddr 返回的内存块物理地址 输出
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 举例

    MI_SYS_MMA_Alloc调用Sample

    MI_PHY phySrcBufAddr = 0;
    void *pVirSrcBufAddr = NULL;
    MI_U32 srcBuffSize = 1920 * 1980 * 3 / 2;
    srcBuffSize = ALIGN_UP(srcBuffSize, 4096);
    
    ret = MI_SYS_MMA_Alloc(NULL, srcBuffSize, &phySrcBufAddr);
    if(ret != MI_SUCCESS)
    {
        printf("alloc src buff failed\n");
        return -1;
    }
    
    ret = MI_SYS_Mmap(phySrcBufAddr, srcBuffSize, &pVirSrcBufAddr, TRUE);
    if(ret != MI_SUCCESS)
    {
        MI_SYS_MMA_Free(phySrcBufAddr);
        printf("mmap src buff failed\n");
        return -1;
    }
    
    memset(pVirSrcBufAddr, 0, srcBuffSize);
    MI_SYS_FlushInvCache(pVirSrcBufAddr,srcBuffSize);
    MI_SYS_Munmap(pVirSrcBufAddr, srcBuffSize);
    MI_SYS_MMA_Free(phySrcBufAddr);
    
  • 相关主题

    MI_SYS_MMA_Free

    MI_SYS_Mmap

    MI_SYS_FlushInvCache

    MI_SYS_Munmap


2.5.8. MI_SYS_MMA_Free


2.5.9. MI_SYS_Mmap

  • 功能

    映射任意物理内存到当前用户态进程的 CPU虚拟地址空间。

  • 语法

    MI_S32 MI_SYS_Mmap(MI_U64 u64PhyAddr, MI_U32 u32Size , void **ppVirtualAddress ,MI_BOOL bCache);
    
  • 形参

    参数名称 描述 输入/输出
    u64PhyAddr 待映射的物理地址 输入
    u32Size 待映射的物理地址长度 输入
    ppVirtualAddress 存储CPU虚拟地址指针的指针 输出
    bCache 是否map成cache还是un-cache 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • 物理地址是SStar内存控制器地址。

    • 物理地址必须4KByte对齐。

    • 物理地址长度必须4KByte对齐。

    • 物理内存必须完整的落在MMA管理的内存范围内或者linux kenrel管理的内存之外。

  • 举例

    参见 MI_SYS_MMA_Alloc调用Sample 举例。

  • 相关主题

    MI_SYS_MMA_Alloc

    MI_SYS_MMA_Free

    MI_SYS_FlushCache

    MI_SYS_Munmap


2.5.10. MI_SYS_FlushInvCache

  • 功能

    Flush cache。

  • 语法

    MI_S32 MI_SYS_FlushCache(MI_VOID *pVirtualAddress, MI_U32 u32Size);
    
  • 形参

    参数名称 描述 输入/输出
    pVirtualAddress 之前MI_SYS_Mmap 返回的CPU 虚拟地址 输入
    u32Size 待flush的cache长度 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • 待flush cache的物理地址必须4KByte对齐。

    • 待flush cache的映射长度必须4KByte对齐。

    • 待flush cache的映射内存范围必须是之前通过MI_SYS_Mmap API获取到的。

    • 待flush cache的映射内存应该是MI_SYS_Mmap时采用cache方式进行的,nocache的方式无需flush cache。

  • 举例

    参见 MI_SYS_MMA_Alloc调用Sample举例。

  • 相关主题

    MI_SYS_MMA_Alloc

    MI_SYS_MMA_Free

    MI_SYS_Mmap

    MI_SYS_Munmap


2.5.11. MI_SYS_Munmap

  • 功能

    取消物理内存到虚拟地址的映射。

  • 语法

    MI_S32 MI_SYS_UnMmap(MI_VOID *pVirtualAddress, MI_U32 u32Size);
    
  • 形参

    参数名称 描述 输入/输出
    pVirtualAddress 之前MI_SYS_Mmap 返回的CPU 虚拟地址 输入
    u32Size 待取消映射的映射长度 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • 待取消映射的虚拟地址必须4KByte对齐。

    • 待取消映射的映射长度必须4KByte对齐

    • 待取消的映射内存范围必须是之前通过MI_SYS_Mmap API获取到的。

  • 举例

    参见MI_SYS_MMA_Alloc调用Sample 举例。

  • 相关主题

    MI_SYS_MMA_Alloc

    MI_SYS_MMA_Free

    MI_SYS_Mmap

    MI_SYS_FlushInvCache


2.5.12. MI_SYS_MemsetPa

  • 功能

    通过DMA硬件模块,填充整块物理内存.

  • 语法

    MI_S32 MI_SYS_MemsetPa(MI_PHY phyPa, MI_U32 u32Val, MI_U32 u32Lenth);
    
  • 形参

    参数名称 参数含义 输入/输出
    phyPa 填充的物理地址 输入
    u32Val 填充值 输入
    u32Lenth 填充大小,单位为byte 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 举例

    MI_SYS_MemsetPa调用Sample

    MI_PHY phySrcBufAddr = 0;
    MI_PHY phyDstBufAddr = 0;    
    void *pVirSrcBufAddr = NULL;
    void *pVirDstBufAddr = NULL;    
    MI_U32 buffSize = 1920 * 1980 * 3 / 2;
    buffSize = ALIGN_UP(buffSize, 4096);
    
    ret = MI_SYS_MMA_Alloc(NULL, buffSize, &phySrcBufAddr);
    if(ret != MI_SUCCESS)
    {
        printf("alloc src buff failed\n");
        return -1;
    }
    
    ret = MI_SYS_MMA_Alloc(NULL, buffSize, &phyDstBufAddr);
    if(ret != MI_SUCCESS)
    {
        MI_SYS_MMA_Free(phySrcBufAddr);
        printf("alloc dts buff failed\n");
        return -1;
    }
    
    MI_SYS_MemsetPa(phySrcBufAddr, 0xff, buffSize);
    MI_SYS_MemsetPa(phyDstBufAddr, 0x00, buffSize);
    MI_SYS_MemcpyPa(phyDstBufAddr, phySrcBufAddr, buffSize);
    MI_SYS_MMA_Free(phySrcBufAddr);
    MI_SYS_MMA_Free(phyDstBufAddr);
    
  • 相关主题

    MI_SYS_MemcpyPa


2.5.13. MI_SYS_MemcpyPa

  • 功能

    通过DMA硬件模块,把源内存数据拷贝到目标内存上.

  • 语法

    MI_S32 MI_SYS_MemcpyPa(MI_PHY phyDst, MI_PHY phySrc, MI_U32 u32Lenth);
    
  • 形参

    参数名称 参数含义 输入/输出
    phyDst 目的物理地址 输入
    phySrc 源物理地址 输入
    u32Lenth 拷贝大小,单位为byte 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 举例

    参见MI_SYS_MemsetPa 举例。

  • 相关主题

    MI_SYS_MemsetPa


2.5.14. MI_SYS_BufFillPa

  • 功能

    通过DMA硬件模块,填充部分物理内存。

  • 语法

    MI_S32 MI_SYS_BufFillPa(MI_SYS_FrameData_t *pstBuf, MI_U32 u32Val,MI_SYS_WindowRect_t *pstRect);
    
  • 形参

    参数名称 参数含义 输入/输出
    pstBuf 填充的帧数据描述之结构体 输入
    u32Val 填充值 输入
    pstRect 填充的数据范围 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • pstRect数据范围是以pstBuf所描述的首地址为(0,0)点开始,宽高都是以pstBuf中的ePixelFormat来计算每一个pixel所移动的内存数据大小来进行部分填充。

    • pstBuf中u16Width、u16Height、phyAddr、u32Stride、ePixelFormat为必填,其余数值无意义。

  • 举例

    MI_S32 ret = 0;
    MI_SYS_WindowRect_t rect;
    MI_SYS_FrameData_t stSysFrame;
    memcpy(&stSysFrame, &buf->stFrameData, sizeof(MI_SYS_FrameData_t));
    
    if(pRect) {
        rect.u16X = pRect->left;
        rect.u16Y = pRect->top;
        rect.u16Height = pRect->bottom-pRect->top;
        rect.u16Width = pRect->right-pRect->left;
    } else {
        rect.u16X = 0;
        rect.u16Y = 0;
        rect.u16Height = stSysFrame.u16Height;
        rect.u16Width = stSysFrame.u16Width;
    
    }
    
    DBG_INFO("rect %d %d %d %d \n", rect.u16X, rect.u16Y
            , rect.u16Width, rect.u16Height);
    ret = MI_SYS_BufBlitPa(&stSysFrame, u32ColorVal, &rect);
    
    return ret;
    
  • 相关主题

    MI_SYS_BufBlitPa


2.5.15. MI_SYS_BufBlitPa

  • 功能

    通过DMA硬件模块,把源内存数据上的部分区域拷贝到目标内存上的部分区域。

  • 语法

    MI_S32 MI_SYS_BufBlitPa(MI_SYS_FrameData_t *pstDstBuf, MI_SYS_WindowRect_t *pstDstRect, MI_SYS_FrameData_t  *pstSrcBuf, MI_SYS_WindowRect_t *pstSrcRect);
    
  • 形参

    参数名称 参数含义 输入/输出
    pstDstBuf 目标内存物理首地址 输入
    pstDstRect 目标内存拷贝的区域 输入
    pstSrcBuf 源内存物理首地址 输入
    pstSrcRect 源内存拷贝的区域 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • pstDstRect/pstSrcRect数据范围是以pstDstBuf/pstSrcBuf所描述的首地址为(0,0)点开始,宽高都是以其中的ePixelFormat来计算每一个pixel所移动的内存数据大小来进行部分填充。

    • pstDstBuf/pstSrcBuf中u16Width、u16Height、phyAddr、u32Stride、ePixelFormat为必填,其余数值无意义。

    • 源内存或者目标内存的区域部分超过了其本来的范围,则只会拷贝其未超过部分上的数据。

  • 举例

    MI_S32 ret = MI_SUCCESS;
    vdisp_copyinfo_plane_t *plane;
    MI_SYS_FrameData_t stSrcFrame, stDstFrame;
    MI_SYS_WindowRect_t stSrcRect, stDstRect;
    
    plane = &copyinfo->plane[0];
    stSrcFrame.ePixelFormat = E_MI_SYS_PIXEL_FRAME_I8;
    stSrcFrame.phyAddr[0] = plane->src_paddr;
    stSrcFrame.u16Width =  plane->width;
    stSrcFrame.u16Height = plane->height;
    stSrcFrame.u32Stride[0] = plane->src_stride;
    
    stDstFrame.ePixelFormat = E_MI_SYS_PIXEL_FRAME_I8;
    stDstFrame.phyAddr[0] = plane->dst_paddr;
    stDstFrame.u16Width =  plane->width;
    stDstFrame.u16Height = plane->height;
    stDstFrame.u32Stride[0] = plane->dst_stride;
    
    stSrcRect.u16X = 0;
    stSrcRect.u16Y = 0;
    stSrcRect.u16Height = stSrcFrame.u16Height;
    stSrcRect.u16Width = stSrcFrame.u16Width;
    
    stDstRect.u16X = 0;
    stDstRect.u16Y = 0;
    stDstRect.u16Height = stDstFrame.u16Height;
    stDstRect.u16Width = stDstFrame.u16Width;
    
    ret = MI_SYS_BufBlitPa(&stDstFrame, &stDstRect, &stSrcFrame, &stSrcRect);
    
    return ret;
    
  • 相关主题

    MI_SYS_BufFillPa


2.5.16. MI_SYS_ConfigPrivateMMAPool

  • 功能

    为模块配置私有MMA Heap.

  • 语法

    MI_S32 MI_SYS_ConfigPrivateMMAPool(MI_SYS_GlobalPrivPoolConfig_t *pstGlobalPrivPoolConf);
    
  • 形参

    参数名称 参数含义 输入/输出
    pstGlobalPrivPoolConf 配置私有Mma Pool结构体指针 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    • 设备私有MMA Heap与通道私有MMA Heap不能共存。

    • 建议在MI_SYS_Init后就为各模块创建好私有MMA heap。

    • 当pstGlobalPrivPoolConf->bCreate 为TRUE时,创建私有POOL,为FALSE时,销毁私有POOL

    • 各种eConfigType使用场景如下:

    eConfigType 适用场景
    E_MI_SYS_VPE_TO_VENC_PRIVATE_RING_POOL 为绑定为E_MI_SYS_BIND_TYPE_HW_RIN模式的vpe与venc端口设置私有ring heap pool
    E_MI_SYS_PRE_CHN_PRIVATE_POOL 为模块通道设置私有heap pool
    E_MI_SYS_PRE_DEV_PRIVATE_POOL 为模块设备设置私有heap pool
    E_MI_SYS_PER_CHN_PORT_OUTPUT_POOL 为模块output port设置heap pool,设置后该port口的ouput buf优先从其中分配
  • 举例

    假设场景为:IPC 下两路流,一路Main Stream H265最大分辨率1920*1080,一路Sub Stream H264最大分辨率720*576。

    VENC 创建MMA Heap:

    /Main Sream:
    //为通道1创建大小为38745760的私有MMA heap
    MI_SYS_GlobalPrivPoolConfig_t stConfig;
    memset(&stConfig , 0 ,sizeof(stConfig));
    stConfig.eConfigType = E_MI_SYS_PER_CHN_PRIVATE_POOL;
    stConfig.bCreate = TRUE;
    stConfig.uConfig.stPreChnPrivPoolConfig.eModule = E_MI_MODULE_ID_VENC;
    stConfig.uConfig.stPreChnPrivPoolConfig.u32Devid =  0;
    stConfig.uConfig.stPreChnPrivPoolConfig.u32Channel= 1;
    stConfig.uConfig.stPreChnPrivPoolConfig.u32PrivateHeapSize = 38745760;
    MI_SYS_ConfigDevChnPrivateMMAHeap(&stConfig);
    
    //Sub Stream:
    //为通道2创建大小为805152的私有MMA Heap
    stConfig.eConfigType = E_MI_SYS_PER_CHN_PRIVATE_POOL;
    stConfig.bCreate = TRUE;
    stConfig.uConfig.stPreChnPrivPoolConfig.eModule = E_MI_MODULE_ID_VENC;
    stConfig.uConfig.stPreChnPrivPoolConfig.u32Devid =  0;
    stConfig.uConfig.stPreChnPrivPoolConfig.u32Channel= 2;
    stConfig.uConfig.stPreChnPrivPoolConfig.u32PrivateHeapSize = 805152;
    MI_SYS_ConfigDevChnPrivateMMAHeap(&stConfig);
    

    VENC 销毁MMA Heap:

    // Main Sream:
    //销毁通道1的私有MMA heap
    stConfig.eConfigType = E_MI_SYS_PER_CHN_PRIVATE_POOL;
    stConfig.bCreate = FALSE;
    stConfig.uConfig.stPreChnPrivPoolConfig.eModule = E_MI_MODULE_ID_VENC;
    stConfig.uConfig.stPreChnPrivPoolConfig.u32Devid =  0;
    stConfig.uConfig.stPreChnPrivPoolConfig.u32Channel= 1;
    MI_SYS_ConfigDevChnPrivateMMAHeap(&stConfig);
    
    //Sub Stream:
    //销毁通道2的私有MMA Heap
    stConfig.eConfigType = E_MI_SYS_PER_CHN_PRIVATE_POOL;
    stConfig.bCreate = FALSE;
    stConfig.uConfig.stPreChnPrivPoolConfig.eModule = E_MI_MODULE_ID_VENC;
    stConfig.uConfig.stPreChnPrivPoolConfig.u32Devid =  0;
    stConfig.uConfig.stPreChnPrivPoolConfig.u32Channel= 2;
    MI_SYS_ConfigDevChnPrivateMMAHeap(&stConfig);
    

    VPE 创建MMA Heap:

    //为设备0创建大小为0x4f9200的私有MMA Heap
    stConfig.eConfigType = E_MI_SYS_PER_DEV_PRIVATE_POOL;
    stConfig.bCreate = TRUE;
    stConfig.uConfig.stPreDevPrivPoolConfig.eModule = E_MI_MODULE_ID_VPE;
    stConfig.uConfig.stPreDevPrivPoolConfig.u32Devid =  0;
    MI_SYS_ConfigDevChnPrivateMMAHeap(&stConfig);
    

VPE 销毁MMA Heap:

    //销毁设备0的私有MMA Heap
    stConfig.eConfigType = E_MI_SYS_PER_DEV_PRIVATE_POOL;
    stConfig.bCreate = FALSE;
    stConfig.uConfig.stPreDevPrivPoolConfig.eModule = E_MI_MODULE_ID_VPE;
    stConfig.uConfig.stPreChnPrivPoolConfig.u32Devid =  0;
    MI_SYS_ConfigDevChnPrivateMMAHeap(&stConfig);

创建VPE与VENC之间的ring MMA Heap:

     stConfig.eConfigType = E_MI_SYS_VPE_TO_VENC_PRIVATE_RING_POOL;
    stConfig.bCreate = TRUE;
    stConfig.uConfig. stPreVpe2VencRingPrivPoolConfig.u32VencInputRingPoolStaticSize =  8*1024*1024;
    MI_SYS_ConfigDevChnPrivateMMAHeap(&stConfig);

销毁VPE与VENC之间的ring MMA Heap:

    stConfig.eConfigType = E_MI_SYS_VPE_TO_VENC_PRIVATE_RING_POOL;
    stConfig.bCreate = FALSE;
    MI_SYS_ConfigDevChnPrivateMMAHeap(&stConfig);

不同分辨率或开启不同功能size大小都不一样,详细参数请根据使用的场景和规格计算。


2.5.17. MI_SYS_PrivateDevChnHeapAlloc

  • 功能

    从模块通道私有MMA Pool 申请内存.

  • 语法

    MI_S32 MI_SYS_PrivateDevChnHeapAlloc(MI_ModuleId_e eModule, MI_U32 u32Devid,MI_S32 s32ChnId, MI_U8 *pu8BufName, MI_U32 u32blkSize, MI_PHY *pphyAddr,MI_BOOL bTailAlloc);
    
  • 形参

    参数名称 参数含义 输入/输出
    eModule 模块ID 输入
    u32Devid 模块的设备ID 输入
    s32ChnId 模块的通道ID 输入
    pu8BufName 申请私有内存的名字,传Null时,使用 "app-privAlloc"作为默认的名字 输入
    u32blkSize 申请私有内存的大小 输入
    pphyAddr 分配出的私有内存的物理地址 输出
    bTailAlloc 是否从通道私有pool的尾部申请 0-否,1-是 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    使用该接口时,请确定已经先使用MI_SYS_ConfigPrivateMMAPool申请了E_MI_SYS_PRE_CHN_PRIVATE_POOL类型的私有内存池。

  • 举例

    MI_SYS_PrivateDevChnHeapAlloc调用Sample

    MI_PHY *pphyAddr = NULL;
    MI_SYS_GlobalPrivPoolConfig_t stConfig;
    Memset(&stConfig , 0 ,sizeof(stConfig));
    stConfig.eConfigType = E_MI_SYS_PER_CHN_PRIVATE_POOL;
    stConfig.bCreate = TRUE;
    stConfig.uConfig.stPreChnPrivPoolConfig. eModule = E_MI_MODULE_ID_VENC;
    stConfig.uConfig.stPreChnPrivPoolConfig. u32Devid =  0;
    stConfig.uConfig.stPreChnPrivPoolConfig. u32Channel= 1;
    stConfig.uConfig.stPreChnPrivPoolConfig. u32PrivateHeapSize = 38745760;
    MI_SYS_ConfigDevChnPrivateMMAHeap(&stConfig);
    
    ret = MI_SYS_PrivateDevChnHeapAlloc(E_MI_MODULE_ID_VENC, 0, 1, NULL, 4096, pphyAddr, FALSE);
    if(ret != MI_SUCCESS)
    {
        MI_SYS_ConfigDevChnPrivateMMAHeap(&stConfig);
        printf("alloc buff from chn private heap failed\n");
        return -1;
    }
    
    //do something...
    
    MI_SYS_PrivateDevChnHeapFree(E_MI_MODULE_ID_VENC, 0, 1, *pphyAddr);
    MI_SYS_ConfigDevChnPrivateMMAHeap(&stConfig);
    
  • 相关主题

    MI_SYS_ConfigPrivateMMAPool

    MI_SYS_PrivateDevChnHeapFree


2.5.18. MI_SYS_PrivateDevChnHeapFree

  • 功能

    从模块通道私有MMA Pool 释放内存.

  • 语法

    MI_S32 MI_SYS_PrivateDevChnHeapFree(MI_ModuleId_e eModule, MI_U32 u32Devid,MI_S32 s32ChnId, MI_PHY phyAddr);
    
  • 形参

    参数名称 参数含义 输入/输出
    eModule 模块ID 输入
    u32Devid 模块的设备ID 输入
    s32ChnId 模块的通道ID 输入
    phyAddr 需要释放的内存对应的物理地址 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    使用该接口时,请确定已经先使用MI_SYS_ConfigPrivateMMAPool申请了E_MI_SYS_PRE_CHN_PRIVATE_POOL类型的私有内存池。

  • 举例

    参见MI_SYS_PrivateDevChnHeapAlloc调用Sample举例。

  • 相关主题

    MI_SYS_ConfigPrivateMMAPool

    MI_SYS_PrivateDevChnHeapAlloc


2.5.19. MI_SYS_Va2Pa

  • 功能

    将MI内存块的CPU虚拟地址转成内存物理地址.

  • 语法

    MI_S32 MI_SYS_Va2Pa (void *pVirtualAddress, MI_PHY *pPhyAddr);
    
  • 形参

    |参数名称 |参数含义| 输入/输出| |pVirtualAddress| CPU虚拟地址指针 输入| |pPhyAddr| 存储内存块物理地址的指针| 输出|

  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件:mi_sys_datatype.h、mi_sys.h

    • 库文件:libmi_sys.a / libmi_sys.so

  • 注意

    使用该接口时,请确定输入的CPU虚拟地址有效且指向MI中分配的地址空间。

  • 举例

    MI_SYS_Va2Pa调用Sample

    MI_PHY phySrcBufAddr = 0;
    MI_PHY phyAddrVa2Pa = 0;
        void *pVirSrcBufAddr = NULL;
        MI_U32 srcBuffSize = 1920 * 1980 * 3 / 2;
        srcBuffSize = ALIGN_UP(srcBuffSize, 4096);
    
        ret = MI_SYS_MMA_Alloc(NULL, srcBuffSize, &phySrcBufAddr);
        if(ret != MI_SUCCESS)
        {
            printf("alloc src buff failed\n");
            return -1;
        }
    
        ret = MI_SYS_Mmap(phySrcBufAddr, srcBuffSize, &pVirSrcBufAddr, TRUE);
        if(ret != MI_SUCCESS)
        {
            MI_SYS_MMA_Free(phySrcBufAddr);
            printf("mmap src buff failed\n");
            return -1;
        }
    
        MI_SYS_Va2Pa(pVirSrcBufAddr, &phyAddrVa2Pa);
        assert(phySrcBufAddr == phyAddrVa2Pa);
        memset(pVirSrcBufAddr, 0, srcBuffSize);
        MI_SYS_FlushInvCache(pVirSrcBufAddr,srcBuffSize);
        MI_SYS_Munmap(pVirSrcBufAddr, srcBuffSize);
        MI_SYS_MMA_Free(phySrcBufAddr);
    
  • 相关主题

    MI_SYS_Mmap


3. 数据类型


3.1. 数据结构描述格式说明

本手册使用 5个参考域描述数据类型的相关信息,它们作用如 个参考域描述数据类型的相关信息,它们作用如 表 3-1所示。

表3-1 数据结构描述格式说明

标签 功能
说明 简要描述数据类型的主要功能
定义 列出数据类型的定义语句
成员 列出数据结构的成员及含义
注意事项 列出使用数据类型时应注意的事项
相关数据类型及接口 列出与本数据类型相关联的其他数据类型和接口

3.2. 数据结构列表

相关数据类型、数据结构定义如下:

数据类型 定义
MI_ModuleId_e 定义模块ID枚举类型
MI_SYS_PixelFormat_e 定义像素枚举类型
MI_SYS_CompressMode_e 定义压缩方式枚举类型
MI_SYS_FrameTileMode_e 定义Tile格式枚举类型
MI_SYS_FieldType_e 定义Field枚举类型
MI_SYS_BufDataType_e 定义模块ID枚举类型
MI_SYS_FrameIspInfoType_e 定义frame data携带的ISP info枚举类型
MI_SYS_ChnPort_t 定义模块设备通道结构体
MI_SYS_MetaData_t 定义码流MetaData的结构体
MI_SYS_RawData_t 定义码流RawData的结构体
MI_SYS_WindowRect_t 定义Window坐标的结构体
MI_SYS_FrameData_t 定义码流FrameData的结构体
MI_SYS_BufInfo_t Buf信息结构体
MI_SYS_FrameBufExtraConfig_t 定义码流Frame buffer额外配置的结构体
MI_SYS_BufFrameConfig_t Frame buf配置信息结构体
MI_SYS_BufRawConfig_t Raw buf配置信息结构体
MI_SYS_MetaDataConfig_t Meta buf配置信息结构体
MI_SYS_BufConf_t 配置Buf信息结构体
MI_SYS_Version_t Sys版本信息结构体
MI_VB_PoolListConf_t 描述VB Pool链表信息的结构体
MI_SYS_BindType_e 定义前后级工作模式的枚举类型
MI_SYS_FrameData_PhySignalType 描述frame data隶属的buffer类型的枚举类型
MI_SYS_InsidePrivatePoolType_e 描述创建的私有MMA POOL类型的枚举类型
MI_SYS_PerChnPrivHeapConf_t 定义描述通道私有MMA Pool的结构体
MI_SYS_PerDevPrivHeapConf_t 定义描述设备私有MMA Pool的结构体
MI_SYS_PerVpe2VencRingPoolConf_t 定义描述VPE与VENC之间的私有Ring MMA Pool的结构体
MI_SYS_PerChnPortOutputPool_t 定义描述ouput port的私有MMA Pool的结构体
MI_SYS_GlobalPrivPoolConfig_t 定义描述配置私有 MMA Pool的结构体
MI_SYS_FrameIspInfo_t 定义frame data中ISP info的结构体
MI_SYS_InitParam_t 定义Sys设备初始化参数
MI_SYS_BufFrameMultiPlaneConfig_t MultiPlane Frame buf配置信息结构体
MI_SYS_FrameDataSubPlane_t SubPlane Frame buf配置信息结构体
MI_SYS_FrameDataMultiPlane_t MultiPlane Frame buf配置信息结构体
MI_SYS_GlobalFlagType_e 定义全局Flag类型
MI_SYS_GlobalFlagParam_t 定义设置全局Flag参数

3.2.1. MI_ModuleId_e

  • 说明

    定义模块ID枚举类型。

  • 定义

    typedef enum
    
    {
    
        E_MI_MODULE_ID_IVE    = 0,
    
        E_MI_MODULE_ID_VDF      = 1,
    
        E_MI_MODULE_ID_VENC     = 2,
    
        E_MI_MODULE_ID_RGN     = 3,
    
        E_MI_MODULE_ID_AI    = 4,
    
        E_MI_MODULE_ID_AO    = 5,
    
        E_MI_MODULE_ID_VIF   = 6,
    
        E_MI_MODULE_ID_VPE    = 7,
    
        E_MI_MODULE_ID_VDEC    = 8,
    
        E_MI_MODULE_ID_SYS     = 9,
    
        E_MI_MODULE_ID_FB   = 10,
    
        E_MI_MODULE_ID_HDMI  = 11,
    
        E_MI_MODULE_ID_DIVP  = 12,
    
        E_MI_MODULE_ID_GFX   = 13,
    
        E_MI_MODULE_ID_VDISP   = 14,
    
        E_MI_MODULE_ID_DISP     = 15,
    
        E_MI_MODULE_ID_OS     = 16,
    
        E_MI_MODULE_ID_IAE = 17,
    
        E_MI_MODULE_ID_MD = 18,
    
        E_MI_MODULE_ID_OD = 19,
    
        E_MI_MODULE_ID_SHADOW = 20,
    
        E_MI_MODULE_ID_WARP = 21,
    
        E_MI_MODULE_ID_UAC = 22,
    
        E_MI_MODULE_ID_LDC = 23,
    
        E_MI_MODULE_ID_SD = 24,
    
        E_MI_MODULE_ID_PANEL = 25,
    
        E_MI_MODULE_ID_CIPHER = 26,
    
        E_MI_MODULE_ID_SNR = 27,
    
        E_MI_MODULE_ID_WLAN =28,
    
        E_MI_MODULE_ID_IPU = 29,
    
        E_MI_MODULE_ID_MIPITX = 30,
    
        //E_MI_MODULE_ID_SED  = 29,
    
        E_MI_MODULE_ID_MAX,
    
    } MI_ModuleId_e;
    
  • 成员

    模块ID 模块ID HEX值 成员名称 模块
    0 0x00 E_MI_MODULE_ID_IVE 图像智能算子IVE的模块ID
    1 0x01 E_MI_MODULE_ID_VDF 视频智能算法框架模块VDF的模块ID
    2 0x02 E_MI_MODULE_ID_VENC 视频编码模块VPE的模块ID
    3 0x03 E_MI_MODULE_ID_RGN OSD叠加和遮挡模块REG的模块ID
    4 0x04 E_MI_MODULE_ID_AI 音频输入模块AI的模块ID
    5 0x05 E_MI_MODULE_ID_AO 音频输出模块AO的模块ID
    6 0x06 E_MI_MODULE_ID_VIF 视频输入VIF的模块ID
    7 0x07 E_MI_MODULE_ID_VPE 视频图像处理模块VPE的模块ID
    8 0x08 E_MI_MODULE_ID_VDEC 视频处理VPE的模块ID
    9 0x09 E_MI_MODULE_ID_SYS 系统模块SYS的模块ID
    10 0x0A E_MI_MODULE_ID_FB SStar UI显示FrameBuffer Device 模块的模块ID
    11 0x0B E_MI_MODULE_ID_HDMI HMDI模块ID
    12 0x0C E_MI_MODULE_ID_DIVP 视频DI及后处理模块DIVP的模块ID
    13 0x0D E_MI_MODULE_ID_GFX 2D图形处理加速模块GFX的模块ID
    14 0x0E E_MI_MODULE_ID_VDISP 图像拼图模块VDISP的模块ID
    15 0x0F E_MI_MODULE_ID_DISP 视频显示模块DISP的模块ID
    16 0x10 E_MI_MODULE_ID_OS RTOS系统模块ID
    17 0x11 E_MI_MODULE_ID_IAE 音频智能算子IAE的模块ID
    18 0x12 E_MI_MODULE_ID_MD 移动侦测模块MD的模块ID
    19 0x13 E_MI_MODULE_ID_OD 遮挡侦测模块OD的模块ID
    20 0x14 E_MI_MODULE_ID_SHADOW 虚拟MI框架SHADOW的模块ID
    21 0x15 E_MI_MODULE_ID_WARP 图像畸形校正算法WARP的模块ID
    22 0x16 E_MI_MODULE_ID_UAC USB Aduio Class专用ALSA设备的模块ID
    23 0x17 E_MI_MODULE_ID_LDC 图像畸形校正算法LDC的模块ID
    24 0x18 E_MI_MODULE_ID_SD 图像缩放功能的模块ID
    25 0x19 E_MI_MODULE_ID_PANEL 屏显示PANEL的模块ID
    26 0x1A E_MI_MODULE_ID_CIPHER 芯片加密CIPHER的模块ID
    27 0x1B E_MI_MODULE_ID_SNR Sensor传感器模块ID
    28 0x1C E_MI_MODULE_ID_WLAN 无线通信网络WLAN的模块ID
    29 0x1D E_MI_MODULE_ID_IPU 图像识别处理IPU的模块ID
    30 0x1E E_MI_MODULE_ID_MIPITX 使用MIPI协议发送数据模块ID

3.2.2. MI_SYS_PixelFormat_e

  • 说明

    定义像素枚举类型。

  • 定义

    typedef enum
    
    {
    
        E_MI_SYS_PIXEL_FRAME_YUV422_YUYV = 0,
    
        E_MI_SYS_PIXEL_FRAME_ARGB8888,
    
        E_MI_SYS_PIXEL_FRAME_ABGR8888,
    
        E_MI_SYS_PIXEL_FRAME_BGRA8888,
    
        E_MI_SYS_PIXEL_FRAME_RGB565,
    
        E_MI_SYS_PIXEL_FRAME_ARGB1555,
    
        E_MI_SYS_PIXEL_FRAME_ARGB4444,
    
        E_MI_SYS_PIXEL_FRAME_I2,
    
        E_MI_SYS_PIXEL_FRAME_I4,
    
        E_MI_SYS_PIXEL_FRAME_I8,
    
        E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_422,
    
        E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_420,
    
        E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_420_NV21,
    
        E_MI_SYS_PIXEL_FRAME_YUV_TILE_420,
    
        E_MI_SYS_PIXEL_FRAME_YUV422_UYVY,
    
        E_MI_SYS_PIXEL_FRAME_YUV422_YVYU,
    
        E_MI_SYS_PIXEL_FRAME_YUV422_VYUY,
    
        E_MI_SYS_PIXEL_FRAME_YUV422_PLANAR,
    
        E_MI_SYS_PIXEL_FRAME_YUV420_PLANAR,
    
        E_MI_SYS_PIXEL_FRAME_FBC_420,
    
        E_MI_SYS_PIXEL_FRAME_RGB_BAYER_BASE,
    
        E_MI_SYS_PIXEL_FRAME_RGB_BAYER_NUM = E_MI_SYS_PIXEL_FRAME_RGB_BAYER_BASE + E_MI_SYS_DATA_PRECISION_MAX*E_MI_SYS_PIXEL_BAYERID_MAX-1,
    
        E_MI_SYS_PIXEL_FRAME_RGB888,
    
        E_MI_SYS_PIXEL_FRAME_BGR888,
    
        E_MI_SYS_PIXEL_FRAME_GRAY8,
    
        E_MI_SYS_PIXEL_FRAME_FORMAT_MAX,
    
    } MI_SYS_PixelFormat_e;
    
  • 成员

    成员名称 描述
    E_MI_SYS_PIXEL_FRAME_YUV422_YUYV YUV422_YUYV格式
    E_MI_SYS_PIXEL_FRAME_ARGB8888 ARGB8888格式
    E_MI_SYS_PIXEL_FRAME_ABGR8888 ABGR8888格式
    E_MI_SYS_PIXEL_FRAME_BGRA8888 BGRA8888格式
    E_MI_SYS_PIXEL_FRAME_RGB565 RGB565格式
    E_MI_SYS_PIXEL_FRAME_ARGB1555 ARGB1555格式
    E_MI_SYS_PIXEL_FRAME_ARGB4444 ARGB4444格式
    E_MI_SYS_PIXEL_FRAME_I2 2 bpp格式
    E_MI_SYS_PIXEL_FRAME_I4 4 bpp格式
    E_MI_SYS_PIXEL_FRAME_I8 8 bpp格式
    E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_422 YUV422 semi-planar格式
    E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_420 YUV420sp nv12格式
    E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_420_NV21 YUV420sp nv21格式
    E_MI_SYS_PIXEL_FRAME_YUV_TILE_420 内部自定义TILE格式
    E_MI_SYS_PIXEL_FRAME_YUV422_UYVY YUV422_UYVY格式
    E_MI_SYS_PIXEL_FRAME_YUV422_YVYU YUV422_YVYU格式
    E_MI_SYS_PIXEL_FRAME_YUV422_VYUY YUV422_VYUY格式
    E_MI_SYS_PIXEL_FRAME_YUV422_PLANAR YUV422_PLANAR格式
    E_MI_SYS_PIXEL_FRAME_YUV420_PLANAR YUV420_PLANAR格式
    E_MI_SYS_PIXEL_FRAME_FBC_420 内部自定义格式
    E_MI_SYS_PIXEL_FRAME_RGB_BAYER_BASE RGB raw data 组合格式的起始值
    E_MI_SYS_PIXEL_FRAME_RGB_BAYER_NUM RGB raw data 组合格式的最大值
    E_MI_SYS_PIXEL_FRAME_RGB888 RGB888格式
    E_MI_SYS_PIXEL_FRAME_BGR888 BGR888格式
    E_MI_SYS_PIXEL_FRAME_GRAY8 8bit 灰度格式
    E_MI_SYS_PIXEL_FRAME_FORMAT_MAX 枚举的最大值
  • 注意事项

    E_MI_SYS_PIXEL_FRAME_RGB_BAYER_BASE, E_MI_SYS_PIXEL_FRAME_RGB_BAYER_NUM 是提供给RGB raw data 组合格式使用的。此格式下,sensor提供的bit位ePixPrecision和排列顺序eBayerId,通过RGB_BAYER_PIXEL宏对其组合生成RGB raw data 组合格式的enum值;

    RGB_BAYER_PIXEL宏定义:#define RGB_BAYER_PIXEL(BitMode, PixelID) (E_MI_SYS_PIXEL_FRAME_RGB_BAYER_BASE+ BitMode*E_MI_SYS_PIXEL_BAYERID_MAX+ PixelID),其取值范围为: (E_MI_SYS_PIXEL_FRAME_RGB_BAYER_BASE, E_MI_SYS_PIXEL_FRAME_RGB_BAYER_NUM)

    下面提供了一个使用的小例子,更详细的信息请参考对应模块的API文档。

    static MI_SYS_PixelFormat_e getVpeRawType(STUB_SensorType_e sensorType)
    
    {
    
        MI_SYS_PixelFormat_e eVpeRawType = E_MI_SYS_PIXEL_FRAME_RGB_BAYER_NUM;
    
        MI_SNR_PlaneInfo_t stSnrPlane0Info;
    
        memset(&stSnrPlane0Info, 0x0, sizeof(MI_SNR_PlaneInfo_t));
    
        MI_SNR_GetPlaneInfo(E_MI_SNR_PAD_ID_0, 0, &stSnrPlane0Info);
    
        eVpeRawType =  (MI_SYS_PixelFormat_e)RGB_BAYER_PIXEL(stSnrPlane0Info.ePixPrecision, stSnrPlane0Info.eBayerId);
    
        return eVpeRawType;
    }
    

3.2.3. MI_SYS_CompressMode_e

  • 说明

    定义压缩方式枚举类型。

  • 定义

    typedef enum
    
    {
    
        E_MI_SYS_COMPRESS_MODE_NONE, //no compress
    
        E_MI_SYS_COMPRESS_MODE_SEG, //compress unit is 256 bytes as a segment
    
        E_MI_SYS_COMPRESS_MODE_LINE, //compress unit is the whole line
    
        E_MI_SYS_COMPRESS_MODE_FRAME, //compress unit is the whole frame
    
        E_MI_SYS_COMPRESS_MODE_TO_8BIT,
    
        E_MI_SYS_COMPRESS_MODE_BUTT,  //number
    
    }MI_SYS_CompressMode_e;
    
  • 成员

    成员名称 描述
    E_MI_SYS_COMPRESS_MODE_NONE 非压缩的视频格式
    E_MI_SYS_COMPRESS_MODE_SEG 段压缩的视频格式
    E_MI_SYS_COMPRESS_MODE_LINE 行压缩的视频格式,按照一行为一段进行压缩
    E_MI_SYS_COMPRESS_MODE_FRAME 帧压缩的视频格式,将一帧数据进行压缩
    E_MI_SYS_COMPRESS_MODE_TO_8BIT Pixel 压缩到8bit
    E_MI_SYS_COMPRESS_MODE_BUTT 视频压缩方式的数量

3.2.4. MI_SYS_FrameTileMode_e

  • 说明

    定义Tile格式枚举类型。

  • 定义

    typedef enum
    
    {
    
        E_MI_SYS_FRAME_TILE_MODE_NONE = 0,
    
        E_MI_SYS_FRAME_TILE_MODE_16x16,      // tile mode 16x16
    
        E_MI_SYS_FRAME_TILE_MODE_16x32,      // tile mode 16x32
    
        E_MI_SYS_FRAME_TILE_MODE_32x16,      // tile mode 32x16
    
        E_MI_SYS_FRAME_TILE_MODE_32x32,      // tile mode 32x32
    
        E_MI_SYS_FRAME_TILE_MODE_MAX
    
    } MI_SYS_FrameTileMode_e;
    
  • 成员

    成员名称 描述
    E_MI_SYS_FRAME_TILE_MODE_NONE None
    E_MI_SYS_FRAME_TILE_MODE_16x16 16x16 mode
    E_MI_SYS_FRAME_TILE_MODE_16x32 16x32 mode
    E_MI_SYS_FRAME_TILE_MODE_32x16 32x16 mode
    E_MI_SYS_FRAME_TILE_MODE_32x32 32x32 mode

3.2.5. MI_SYS_FieldType_e

  • 说明

    定义枚举类型。

  • 定义

    typedef enum
    
    {
    
        E_MI_SYS_FIELDTYPE_NONE,        //< no field.
    
        E_MI_SYS_FIELDTYPE_TOP,           //< Top field only.
    
        E_MI_SYS_FIELDTYPE_BOTTOM,    //< Bottom field only.
    
        E_MI_SYS_FIELDTYPE_BOTH,        //< Both fields.
    
        E_MI_SYS_FIELDTYPE_NUM
    
    } MI_SYS_FieldType_e;
    
  • 成员

    成员名称 描述
    E_MI_SYS_FIELDTYPE_NONE None
    E_MI_SYS_FIELDTYPE_TOP Top field only
    E_MI_SYS_FIELDTYPE_BOTTOM Bottom field only
    E_MI_SYS_FIELDTYPE_BOTH Both fields

3.2.6. MI_SYS_BufDataType_e

  • 说明

    定义模块ID枚举类型。

  • 定义

    typedef enum
    
    {
    
        E_MI_SYS_BUFDATA_RAW = 0,
    
        E_MI_SYS_BUFDATA_FRAME,
    
        E_MI_SYS_BUFDATA_META,
    
        E_MI_SYS_BUFDATA_MULTIPLANE,
    
    } MI_SYS_BufDataType_e;
    
  • 成员

    成员名称 描述
    E_MI_SYS_BUFDATA_RAW Raw数据类型
    E_MI_SYS_BUFDATA_FRAME Frame数据类型
    E_MI_SYS_BUFDATA_META Meta数据类型
    E_MI_SYS_BUFDATA_MULTIPLANE MultiPlane数据类型

3.2.7. MI_SYS_FrameIspInfoType_e

  • 说明

    定义frame data携带的ISP info枚举类型。

  • 定义

    typedef enum
    
    {
    
        E_MI_SYS_FRAME_ISP_INFO_TYPE_NONE,
    
        E_MI_SYS_FRAME_ISP_INFO_TYPE_GLOBAL_GRADIENT
    
    }MI_SYS_FrameIspInfoType_e;
    
  • 成员

    成员名称 描述
    E_MI_SYS_FRAME_ISP_INFO_TYPE_NONE NONE
    E_MI_SYS_FRAME_ISP_INFO_TYPE_GLOBAL_GRADIENT ISP的全局梯度数据类型

3.2.8. MI_SYS_ChnPort_t

  • 说明

    定义模块设备通道结构体。

  • 定义

    typedef struct MI_SYS_ChnPort_s
    
    {
    
        MI_ModuleId_e eModId;
    
        MI_U32  u32DevId;
    
        MI_U32 u32ChnId;
    
        MI_U32 u32PortId;
    
    } MI_SYS_ChnPort_t;
    
  • 成员

    成员名称 描述
    eModId 模块号
    u32DevId 设备号
    u32ChnId 通道号
    u32PortId 端口号

3.2.9. MI_SYS_MetaData_t

  • 说明

    定义码流MetaData的结构体。

  • 定义

    typedef struct MI_SYS_MetaData_s
    {
        void*  pVirAddr;
        MI_PHY phyAddr;//notice that this is miu bus addr,not cpu bus addr.
    
        MI_U32 u32Size;
        MI_U32 u32ExtraData;    /*driver special flag*/
        MI_ModuleId_e eDataFromModule;
    } MI_SYS_MetaData_t;
    
  • 成员

    成员名称 描述
    pVirAddr 数据存放虚拟地址。
    phyAddr 数据存放物理地址
    u32Size 数据大小
    u32ExtraData driver special flag
    eDataFromModule 来自哪个模块的数据

3.2.10. MI_SYS_RawData_t

  • 说明

    定义码流RawData的结构体。

  • 定义

    typedef struct MI_SYS_RawData_s
    {
        void*   pVirAddr;
        MI_PHY  phyAddr;//notice that this is miu bus addr,not cpu bus addr.
        MI_U32  u32BufSize;
    
        MI_U32  u32ContentSize;
        MI_BOOL bEndOfFrame;
        MI_U64  u64SeqNum;
    } MI_SYS_RawData_t;
    
  • 成员

    成员名称 描述
    pVirAddr 码流包的地址。
    phyAddr 码流包的物理地址
    u32BufSize Buf大小
    u32ContentSize 数据实际占用buf大小
    bEndOfFrame 当前帧是否结束。(预留参数)当前只支持帧模式下按帧传送。
    u64SeqNum 当前帧的帧序号
  • 注意事项

    • 当前只支持按帧传送数据,每次需完整传送一帧数据。

    • 码流帧数据附带PTS时,解码后输出数据输出相同PTS。当PTS=-1时,不参考系统时钟输出数据帧。


3.2.11. MI_SYS_WindowRect_t

  • 说明

    定义window坐标的结构体。

  • 定义

    typedef struct MI_SYS_WindowRect_s
    
    {
    
        MI_U16 u16X;
    
        MI_U16 u16Y;
    
        MI_U16 u16Width;
    
        MI_U16 u16Height;
    
    }MI_SYS_WindowRect_t;
    
  • 成员

    成员名称 描述
    u16X window起始位置的水平方向的值。
    u16Y window起始位置的垂直方向的值。
    u16Width window宽度。
    u16Height window高度。

3.2.12. MI_SYS_FrameData_t

  • 说明

    定义码流FrameData的结构体。

  • 定义

    //N.B. in MI_SYS_FrameData_t should never support u32Size,
    //for other values are enough,and not support u32Size is general standard method.
    typedef  struct  MI_SYS_FrameData_s
    {
        MI_SYS_FrameTileMode_e eTileMode;
        MI_SYS_PixelFormat_e ePixelFormat;
        MI_SYS_CompressMode_e eCompressMode;
        MI_SYS_FrameScanMode_e eFrameScanMode;
        MI_SYS_FieldType_e eFieldType;
        MI_SYS_FrameData_PhySignalType ePhylayoutType;
    
        MI_U16 u16Width;
        MI_U16 u16Height;
    //in case ePhylayoutType equal to REALTIME_FRAME_DATA, pVirAddr would be MI_SYS_REALTIME_MAGIC_PADDR and phyAddr would be MI_SYS_REALTIME_MAGIC_VADDR
    
        void* pVirAddr[3];
        MI_PHY phyAddr[3];//notice that this is miu bus addr,not cpu bus addr.
        MI_U32 u32Stride[3];
        MI_U32 u32BufSize;//total size that allocated for this buffer,include consider alignment.
    
        MI_U16 u16RingBufStartLine;//Valid in case RINGBUF_FRAME_DATA,  u16RingBufStartLine must be LGE than 0 and less than u16Height
        MI_U16 u16RingBufRealTotalHeight;///Valid in case RINGBUF_FRAME_DATA,  u16RingBufStartLine must be LGE than u16Height
    
        MI_SYS_FrameIspInfo_t stFrameIspInfo;//isp info of each frame
        MI_SYS_WindowRect_t stContentCropWindow;
    } MI_SYS_FrameData_t;
    
  • 成员

    成员名称 描述
    eTileMode Tile模式
    ePixelFormat 像素格式
    eCompressMode 压缩格式
    eFrameScanMode Frame scan模块
    eFieldType File类型
    ePhylayoutType frame data隶属的buffer的类型
    u16Width Frame宽度
    u16Height Frame高度
    pVirAddr 虚拟地址
    phyAddr 物理地址
    u32Stride 图片每行所占字节数
    u32BufSize Sys分配给当前frame的实际buf大小
    u16RingBufStartLine ring mode时,frame data开始于ring buffer的行数
    u16RingBufRealTotalHeight ring mode时,frame data的真实高度
    stFrameIspInfo ISP info struct
    stContentCropWindow Crop info struct

3.2.13. MI_SYS_BufInfo_t

  • 说明

    定义码流信息的结构体。

  • 定义

    typedef  struct  MI_SYS_BufInfo_s
    {
        MI_U64 u64Pts;
        MI_U64 u64SidebandMsg;
        MI_SYS_BufDataType_e eBufType;
        MI_U32 bEndOfStream : 1;
        MI_U32 bUsrBuf : 1;
        MI_U32 bDrop : 1;
        MI_U32 u32IrFlag : 2; // For Window Hello Usage: 0x00/off, 0x01/on, 0x02/invalid
        MI_U32 u32Reserved : 27;
        MI_U32 u32SequenceNumber;    union
        {
            MI_SYS_FrameData_t stFrameData;
            MI_SYS_RawData_t stRawData;
            MI_SYS_MetaData_t stMetaData;
            MI_SYS_FrameDataMultiPlane_t stFrameDataMultiPlane;
        };
    } MI_SYS_BufInfo_t;
    
  • 成员

    成员名称 描述
    eBufType Buf类型
    u64Pts 时间戳
    bEndOfStream 是否已发完所有信息
    u32IrFlag Ir标志位

3.2.14. MI_SYS_FrameBufExtraConfig_t

  • 说明

    定义码流Frame buffer额外配置的结构体。

  • 定义

    typedef struct MI_SYS_FrameBufExtraConfig_s
    {
    //Buf alignment requirement in horizontal
    MI_U16 u16BufHAlignment;
    //Buf alignment requirement in vertical
    MI_U16 u16BufVAlignment;
    //Buf alignment requirement in chroma
    MI_U16 u16BufChromaAlignment;
    //Clear padding flag
    MI_BOOL bClearPadding;
    }MI_SYS_FrameBufExtraConfig_t;
    
  • 成员

    成员名称 描述
    u16BufHAlignment 水平方向对齐值
    u16BufVAlignment 垂直方向对齐值
    u16BufChromaAlignment 色度buffer size对齐值
    bClearPadding 是否对buffer的边缘进行涂黑

3.2.15. MI_SYS_BufFrameConfig_t

  • 说明

    定义码流Frame buffer配置的结构体。

  • 定义

    typedef struct MI_SYS_BufFrameConfig_s
    {
        MI_U16 u16Width;
        MI_U16 u16Height;
        MI_SYS_FrameScanMode_e eFrameScanMode;//
        MI_SYS_PixelFormat_e eFormat;
        MI_SYS_CompressMode_e eCompressMode;
    }MI_SYS_BufFrameConfig_t;
    
  • 成员

    成员名称 描述
    u16Width Frame宽度
    u16Height Frame高度
    eFrameScanMode Frame Scan Mode
    eFormat Frame像素格式
    eCompressMode Frame 压缩模式

3.2.16. MI_SYS_BufRawConfig_t

  • 说明

    定义码流raw buffer配置的结构体。

  • 定义

    typedef struct MI_SYS_BufRawConfig_s
    
    {
    
        MI_U32 u32Size;
    
    }MI_SYS_BufRawConfig_t;
    
  • 成员

    成员名称 描述
    u32Size Buf大小

3.2.17. MI_SYS_MetaDataConfig_t

  • 说明

    定义码流meta buffer配置的结构体。

  • 定义

    typedef struct MI_SYS_MetaDataConfig_s
    
    {
    
        MI_U32 u32Size;
    
    }MI_SYS_MetaDataConfig_t;
    
  • 成员

成员名称 描述
u32Size Buf大小

3.2.18. MI_SYS_BufConf_t

  • 说明

    定义码流Port Buf配置的结构体。

  • 定义

    typedef struct MI_SYS_BufConf_s
    {
        MI_SYS_BufDataType_e eBufType;
        MI_U32 u32Flags;   //0 or MI_SYS_MAP_VA
        MI_U64 u64TargetPts;
        union
        {
            MI_SYS_BufFrameConfig_t stFrameCfg;
            MI_SYS_BufRawConfig_t stRawCfg;
            MI_SYS_MetaDataConfig_t stMetaCfg;
            MI_SYS_BufFrameMultiPlaneConfig_t stMultiPlaneCfg;
        };
    }MI_SYS_BufConf_t;
    
  • 成员

    成员名称 描述
    eBufType Buf type
    u32Flags Buf是否map kernel space va

3.2.19. MI_SYS_Version_t

  • 说明

    定义Sys版本信息结构体。

  • 定义

    typedef struct MI_SYS_Version_s
    
    {
    
        MI_U8 u8Version[128];
    
    }MI_SYS_Version_t;
    
  • 成员

    成员名称 描述
    u8Version[128] 描述sys版本信息的字符串buf

3.2.20. MI_VB_PoolListConf_t

  • 说明

    定义描述VB Pool链表信息的结构体。

  • 定义

    typedef struct MI_VB_PoolListConf_s
    
    {
    
        MI_U32 u32PoolListCnt;
    
        MI_VB_PoolConf_t stPoolConf[MI_VB_POOL_LIST_MAX_CNT];
    
    } MI_VB_PoolListConf_t;
    
  • 成员

    成员名称 描述
    u32PoolListCnt VB pool 链表成员数量
    stPoolConf VB pool 链表成员配置信息

3.2.21. MI_SYS_BindType_e

  • 说明

    定义前后级工作模式。

  • 定义

    typedef enum
    
    {
    
       E_MI_SYS_BIND_TYPE_FRAME_BASE = 0x00000001,
    
       E_MI_SYS_BIND_TYPE_SW_LOW_LATENCY = 0x00000002,
    
       E_MI_SYS_BIND_TYPE_REALTIME = 0x00000004,
    
       E_MI_SYS_BIND_TYPE_HW_AUTOSYNC = 0x00000008,
    
       E_MI_SYS_BIND_TYPE_HW_RING = 0x00000010
    
    }MI_SYS_BindType_e;
    
  • 成员

    成员名称 描述
    E_MI_SYS_BIND_TYPE_FRAME_BASE frame mode,默认工作方式
    E_MI_SYS_BIND_TYPE_SW_LOW_LATENCY 低时延工作方式
    E_MI_SYS_BIND_TYPE_REALTIME 硬件直连工作方式
    E_MI_SYS_BIND_TYPE_HW_AUTOSYNC 前后级handshake,buffer size与图像分辨率一致
    E_MI_SYS_BIND_TYPE_HW_RING 前后级handshake,ring buffer depth可以调小于图像分辨率高
  • 注意事项

    • 旧版本MI SYS不提供此功能,如没有找到,不用设置。

    • FRAME_BASE和HW_RING类型使用的内存为DRAM,REALTIME类型使用的内存为SRAM。

    • 由于底层限制,被HW_RING或REALTIME类型bind的input port不能使用MI_SYS_ChnInputPortGetBuf/ MI_SYS_ChnInputPortPutBuf接口,output port不能使用 MI_SYS_ChnOutputPortGetBuf/ MI_SYS_ChnOutputPortPutBuf接口。

    • 不同bindtype使用内存大小比较:FRAME_BASE类型 > HW_RING类型 > REALTIME类型。


3.2.22. MI_SYS_FrameData_PhySignalType

  • 说明

    描述frame data隶属的buffer类型的枚举类型。

  • 定义

    typedef enum
    
    {
    
      REALTIME_FRAME_DATA,
    
      RINGBUF_FRAME_DATA,
    
      NORMAL_FRAME_DATA,
    
    }MI_SYS_FrameData_PhySignalType;
    
  • 成员

    成员名称 描述
    REALTIME_FRAME_DATA 以E_MI_SYS_BIND_TYPE_REALTIME模式 产生的frame data
    RINGBUF_FRAME_DATA 以E_MI_SYS_BIND_TYPE_HW_RING模式 产生的frame data
    NORMAL_FRAME_DATA 以E_MI_SYS_BIND_TYPE_FRAME_BASE模式产生的frame data
  • 注意事项

    旧版本MI SYS不提供此功能,如没有找到,不用设置。


3.2.23. MI_SYS_InsidePrivatePoolType_e

  • 说明

    描述创建的私有MMA POOL类型的枚举类型。

  • 定义

    typedef enum
    
    {
    
       E_MI_SYS_VPE_TO_VENC_PRIVATE_RING_POOL = 0,
    
       E_MI_SYS_PER_CHN_PRIVATE_POOL=1,
    
       E_MI_SYS_PER_DEV_PRIVATE_POOL=2,
    
       E_MI_SYS_PER_CHN_PORT_OUTPUT_POOL=3,
    
    }MI_SYS_InsidePrivatePoolType_e;
    
  • 成员

    成员名称 描述
    E_MI_SYS_VPE_TO_VENC_PRIVATE_RING_POOL VPE与VENC 的私有Ring Pool 类型
    E_MI_SYS_PER_CHN_PRIVATE_POOL 通道私有Pool 类型
    E_MI_SYS_PER_DEV_PRIVATE_POOL 设备私有Pool 类型
    E_MI_SYS_PER_CHN_PORT_OUTPUT_POOL 输出端口私有Pool类型
  • 注意事项

    旧版本MI SYS不提供此功能,如没有找到,不用设置。


3.2.24. MI_SYS_PerChnPrivHeapConf_t

  • 说明

    定义描述通道私有MMA Pool的结构体。

  • 定义

    typedef struct MI_PerChnPrivHeapConf_s
    
    {
    
        MI_ModuleId_e eModule;
    
        MI_U32 u32Devid;
    
        MI_U32 u32Channel;
    
        MI_U8 u8MMAHeapName[MI_MAX_MMA_HEAP_LENGTH];
    
        MI_U32 u32PrivateHeapSize;
    
    }MI_SYS_PerChnPrivHeapConf_t;
    
  • 成员

    成员名称 描述
    eModule 模块ID
    u32Devid 设备ID
    u32Channel 通道ID
    u8MMAHeapName Mma heap name
    u32PrivateHeapSize 私有pool 大小

3.2.25. MI_SYS_PerDevPrivHeapConf_t

  • 说明

    定义描述设备私有MMA Pool的结构体。

  • 定义

    typedef struct MI_PerDevPrivHeapConf_s
    
    {
    
        MI_ModuleId_e eModule;
    
        MI_U32 u32Devid;
    
        MI_U32 u32Reserve;
    
        MI_U8 u8MMAHeapName[MI_MAX_MMA_HEAP_LENGTH];
    
        MI_U32 u32PrivateHeapSize;
    
    }MI_SYS_PerDevPrivHeapConf_t;
    
  • 成员

    成员名称 描述
    eModule 模块ID
    u32Devid 设备ID
    u32Reserve 预留
    u8MMAHeapName Mma heap name
    u32PrivateHeapSize 私有pool 大小

3.2.26. MI_SYS_PerVpe2VencRingPoolConf_t

  • 说明

    定义描述VPE与VENC之间的私有Ring MMA Pool的结构体。

  • 定义

    typedef struct MI_SYS_PerVpe2VencRingPoolConf_s
    
    {
    
        MI_U32 u32VencInputRingPoolStaticSize;
    
        MI_U8 u8MMAHeapName[MI_MAX_MMA_HEAP_LENGTH];
    
    }MI_SYS_PerVpe2VencRingPoolConf_t;
    
  • 成员

    成员名称 描述
    u32VencInputRingPoolStaticSize 私有pool大小
    u8MMAHeapName Mma heap name

3.2.27. MI_SYS_PerChnPortOutputPool_t

  • 说明

    定义描述ouput port的私有MMA Pool的结构体。

  • 定义

    typedef struct MI_SYS_PerChnPortOutputPool_s
    
    {
    
        MI_ModuleId_e eModule;
    
        MI_U32 u32Devid;
    
        MI_U32 u32Channel;
    
        MI_U32 u32Port;
    
        MI_U8 u8MMAHeapName[MI_MAX_MMA_HEAP_LENGTH];
    
        MI_U32 u32PrivateHeapSize;
    
    }MI_SYS_PerChnPortOutputPool_t;
    
  • 成员

    成员名称 描述
    eModule 模块ID
    u32Devid 设备ID
    u32Channel 通道ID
    u32Port 端口ID
    u8MMAHeapName Mma heap name
    u32PrivateHeapSize 私有pool 大小

3.2.28. MI_SYS_GlobalPrivPoolConfig_t

  • 说明

    定义描述配置私有 MMA Pool的结构体。

  • 定义

    typedef struct MI_SYS_GlobalPrivPoolConfig_s
    
    {
    
        MI_SYS_InsidePrivatePoolType_e eConfigType;
    
        MI_BOOL bCreate;
    
        union
    
        {
    
            MI_SYS_PerChnPrivHeapConf_t stPreChnPrivPoolConfig;
    
            MI_SYS_PerDevPrivHeapConf_t stPreDevPrivPoolConfig;
    
            MI_SYS_PerVpe2VencRingPoolConf_t stPreVpe2VencRingPrivPoolConfig;
    
            MI_SYS_PerChnPortOutputPool_t stPreChnPortOutputPrivPool;
    
        }uConfig;
    
    }MI_SYS_GlobalPrivPoolConfig_t;
    
  • 成员

    成员名称 描述
    eConfigType 私有pool类型
    bCreate 是否创建私有pool。true:创建 false:销毁
    uConfig 不同类型私有pool的结构体

3.2.29. MI_SYS_FrameIspInfo_t

  • 说明

    定义frame data中ISP info的结构体。

  • 定义

    typedef struct MI_SYS_FrameIspInfo_s
    
    {
    
        MI_SYS_FrameIspInfoType_e eType;
    
        union
    
        {
    
            MI_U32 u32GlobalGradient;
    
        }uIspInfo;
    
    }MI_SYS_FrameIspInfo_t;
    
  • 成员

    成员名称 描述
    eType ISP info type
    uIspInfo ISP info union

3.2.30. MI_SYS_InitParam_t

  • 说明

    SYS设备初始化参数。

  • 定义

    typedef struct MI_SYS_InitParam_s
    {
        MI_U32 u32DevId;
        MI_U8 *u8Data;
    } MI_SYS_InitParam_t;
    
  • 成员

    成员名称 描述
    u32DevId 设备ID
    u8Data 数据指针buffer
  • 相关数据类型及接口

    MI_SYS_InitDev


3.2.31. MI_SYS_BufFrameMultiPlaneConfig_t

  • 说明

    定义码流multiplane buffer配置的结构体。

  • 定义

    typedef struct MI_SYS_BufFrameMultiPlaneConfig_s
    
    {
    
        MI_U8 u8SubPlaneNum;
    
        MI_SYS_BufFrameConfig_t stFrameCfg;
    
    }MI_SYS_BufFrameMultiPlaneConfig_t;
    

- 成员

|成员名称|描述|
|------|-----|
|u8SubPlaneNum|Buf 个数|
|stFrameCfg|定义码流Frame buffer配置的结构体|

3.2.32. MI_SYS_FrameDataSubPlane_t

  • 说明

    定义码流SubPlane FrameData的结构体。

  • 定义

    typedef struct MI_SYS_FrameDataSubPlane_s
    {
        MI_SYS_PixelFormat_e ePixelFormat;
        MI_SYS_CompressMode_e eCompressMode;
        MI_U64 u64FrameId;
    
        MI_U16 u16Width;
        MI_U16 u16Height;
        void* pVirAddr[2];
        MI_PHY phyAddr[2];
        MI_U16 u16Stride[2];
        MI_U32 u32BufSize;
    } MI_SYS_FrameDataSubPlane_t;
    
  • 成员

    成员名称 描述
    ePixelFormat 像素格式
    eCompressMode 压缩格式
    u64FrameId Frame id
    u16Width Frame宽度
    u16Height Frame高度
    pVirAddr 虚拟地址
    phyAddr 物理地址
    U16Stride 图片每行所占字节数
    u32BufSize Sys分配给当前frame的实际buf大小

3.2.33. MI_SYS_FrameDataMultiPlane_t

  • 说明

    定义码流MultiPlane FrameData的结构体。

  • 定义

    typedef struct MI_SYS_FrameDataMultiPlane_s
    {
        MI_U8 u8SubPlaneNum;
        MI_SYS_FrameDataSubPlane_t stSubPlanes[MI_SYS_MAX_SUB_PLANE_CNT];
    } MI_SYS_FrameDataMultiPlane_t;
    
  • 成员

    成员名称 描述
    u8SubPlaneNum Buf个数
    stSubPlanes 定义码流MultiPlane FrameData的结构体

3.2.34. MI_SYS_GlobalFlagType_e

  • 说明 定义全局Flag类型。

  • 定义

    typedef enum
    {
        E_MI_SYS_GLOBALFLAG_IR,
        E_MI_SYS_GLOBALFLAG_NUM,
    } MI_SYS_GlobalFlagType_e;
    
  • 成员

    成员名称 描述
    E_MI_SYS_GLOBALFLAG_IR IR全局Flag

3.2.35. MI_SYS_GlobalFlagParam_t

  • 说明

    定义设置全局Flag参数。

  • 定义

    typedef struct MI_SYS_GlobalFlagParam_s
    {
        MI_SYS_GlobalFlagType_e eFlagType;
        MI_BOOL bIsr;
        MI_U32 u32Value;
    } MI_SYS_GlobalFlagParam_t;
    
  • 成员

    成员名称 描述
    eFlagType 设置Flag的类型,目前只支持设置为MI_SYS_GLOBALFLAG_IR
    bIsr 该Flag设置是否会在中断中执行,若在中断中调用,需设置为1
    u32Value 设置的全局标志位值,目前只支持设置IR标志位,0x01表示IR灯打开,0x00表示IR灯关闭
  • 注意事项

    设置IR全局Flag时,u32Value为0时则表示OFF,为1时则表示ON。


4. 错误码


4.1. 错误码的组成

MI 返回的错误码为4字节,共32bits,由表4-1所示五部分组成:

表4-1 错误码的组成

位置 所占位数 描述
BIT [0-11] 12bits 错误类型,表示该错误码的具体错误含义。
BIT [12-15] 4bits 错误等级,固定返回2。
BIT [16-23] 8bits 模块ID,表示该错误码是属于哪个模块。
BIT [24-31] 8bits 固定为0xA0。

Tips:

我们可以简单的把错误码看成两个双字节(16bits)做快速解读,以错误码 0xA0092001为例:

“A009”:表示该错误发生在模块ID为9的模块,通过查看“MI_ModuleId_e”的定义可知为MI_SYS模块。

“2001”:表示该错误的错误类型是1,即“设备 ID 超出合法范围”。


4.2. MI_SYS API错误码表

MI_SYS模块所有 API 返回的值都为4字节,0表示执行成功,其它值表示执行失败,需要注意的是,所有非0的返回值都应该是表4-2中列出的,否则为非法值。

表4-1 MI_SYS模块 API错误码

错误码 宏定义 描述
0xA0092001 MI_ERR_SYS_INVALID_DEVID 设备 ID 超出合法范围
0xA0092002 MI_ERR_SYS_INVALID_CHNID 通道组号错误或无效区域句柄
0xA0092003 MI_ERR_SYS_ILLEGAL_PARAM 参数超出合法范围
0xA0092004 MI_ERR_SYS_EXIST 重复创建已存在的设备、通道或资源
0xA0092005 MI_ERR_SYS_UNEXIST 试图使用或者销毁不存在的设 备、通道或者资源
0xA0092006 MI_ERR_SYS_NULL_PTR 函数参数中有空指针
0xA0092007 MI_ERR_SYS_NOT_CONFIG 模块没有配置
0xA0092008 MI_ERR_SYS_NOT_SUPPORT 不支持的参数或者功能
0xA0092009 MI_ERR_SYS_NOT_PERM 该操作不允许,如试图修改静态配置参数
0xA009200C MI_ERR_SYS_NOMEM 分配内存失败,如系统内存不足
0xA009200D MI_ERR_SYS_NOBUF 分配缓存失败,如申请的数据缓冲区太大
0xA009200E MI_ERR_SYS_BUF_EMPTY 缓冲区中无数据
0xA009200F MI_ERR_SYS_BUF_FULL 缓冲区中数据满
0xA0092010 MI_ERR_SYS_NOTREADY 系统没有初始化或没有加载相应模块
0xA0092011 MI_ERR_SYS_BADADDR 地址非法
0xA0092012 MI_ERR_SYS_BUSY 系统忙
0xA0092013 MI_ERR_SYS_CHN_NOT_STARTED 通道没有开始
0xA0092014 MI_ERR_SYS_CHN_NOT_STOPED 通道没有停止
0xA0092015 MI_ERR_SYS_NOT_INIT 模块没有初始化
0xA0092016 MI_ERR_SYS_INITED 模块已经初始化
0xA0092017 MI_ERR_SYS_NOT_ENABLE 通道或端口没有ENABLE
0xA0092018 MI_ERR_SYS_NOT_DISABLE 通道或端口没有DISABLE
0xA0092019 MI_ERR_SYS_TIMEOUT 超时
0xA009201A MI_ERR_SYS_DEV_NOT_STARTED 设备没有开始
0xA009201B MI_ERR_SYS_DEV_NOT_STOPED 设备没有停止
0xA009201C MI_ERR_SYS_CHN_NO_CONTENT 通道没有资料
0xA009201D MI_ERR_SYS_NOVASAPCE 映射虚拟地址失败
0xA009201E MI_ERR_SYS_NOITEM RingPool中没有record记录
0xA009201F MI_ERR_SYS_FAILED 未明确定义的错误