MI SYS API
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。
Soc: 全称 System on Chip,即系统级芯片,也称片上系统,主芯片。
SocId:本文中指的是描述特定Soc的序列号。某些平台会通过PCIE进行多芯片级联,此时需要用SocId进行区分。MI_SYS仅有部分接口支持跨Soc设置,这些接口都带有SocId参数。 如下图所示,通过PCIE桥接Soc1和Soc2。Soc1作为Master芯片,运行Linux环境、MI SDK和用户业务程序,Soc2作为Slave芯片,仅运行Linux环境和MI SDK,而没有业务程序。但是可以通过调用携带SocId参数的API选择对Soc1或Soc2进行操作。
图 1-2: PCIE级联Soc模型
补充说明:
-
如无单独说明,本文中MI_SYS 和SYS,MI_DISP和DISP是相同意思,其余模块名称类似。
-
本文中出现的所有模块名称可以在MI_ModuleId_e中查阅其功能描述。
1.4. 流程框图¶
1.4.1. Dev/Chn/Port的关系¶
一个典型的MI 模块都会有Dev/Chn/Port三级结构如图1-3。
Dev
一个MI 模块会有一个或多个Dev,一般来说不同的Dev表示该模块设备需要调用不同的HW资源,或者工作在不同的工作模式。比如说,VENC 在编码H264/H265时和编码Jpeg时,需要调用不同的HW资源,这个时候Dev有要分开了。
Chn
一个Dev 会有一个或多个Chn(通道),一般来说不同的Chn表示该通道虽然和同Dev下的其他Chn共享HW资源,但是数据来源或者工作模式是不一样的。比如码流来源不同,Chn一般也不一样。
Port
一个Chn 会有一个或多个Port(端口),分为InputPort(数据流入的端口)和OutputPort(数据流出的端口)。一般来说不同的Port表示该通道虽然和同Dev同Chn下的其他Port共享HW资源和数据来源,但是需要设置的参数是不一样的,比如分辨率不同。
一般来说,Port才是用户操作MI模块的最小独立单位,因为它明确了所有的信息:HW资源、数据来源、参数属性。 注意::一个Chn并不是总是必须有InputPort和OutputPort的,其InputPort和OutputPort的数量取决于该模块的行为。
图1-3 列出了MI_SYS中单个Chn下Port排列的不同场景:
-
只有InputPort,用于需要数据输入,但是无需输出的模块。比如,Disp这样的模块,只需要InputPort,无需OutputPort,它直接把结果显示到了Panel上。
-
只有OutputPort,用于无数据输入,或者数据输入不经过MI_SYS的模块。比如,Vdec这样的模块,数据来源可以是用户调用Vdec接口直接送入Vdec RingPool,不经过InputPort。
-
一个InputPort,一个OutputPort,用于单个数据输入,单个数据输出的模块。比如,Ldc这样的模块,先接受一个数据输入,然后硬件处理后,输入对应的结果。
-
一个InputPort,多个OutputPort,用于单个数据输入,但是会有不同的处理,输出不同数据的模块。比如,Scl这样的模块,共享一个数据源,然后会按照不同的OutputPort设置的参数来进行处理,输出不同的结果。
图 1-3 MI 模块的三级结构
Tips:
Chn和Port的界限并不是总是能区分清楚,如果某模块API文档的解释和上文的解释有差异,调用该模块请以它的API文档为准。
1.4.2. 一个典型的NVR数据流¶
图 1-4是一个典型的NVR数据流模型。流动过程如下:
-
建立Vdec->Disp的绑定关系;
-
用户写入一段码流到Vdec的RingPool;
-
Vdec解码,写入解码后的数据到Vdec OutpuPort申请的内存,送入下一级;
-
Disp 将接收到的数据显示出来。
图 1-4 一个典型的NVR数据流模型
Tips:
实际上,Vdec工作在不同模式下,OutputPortBuf中存储的不一定是真实的解码后帧数据。此处区别,用户无需过多关注。
1.4.3. 一个典型的IPC数据流¶
图 1-5是一个典型的IPC数据流模型,流动过程如下:
-
建立Vif->Isp->Scl->Venc的绑定关系;
-
Sensor 将数据送入vif处理;
-
Vif 将处理后的数据写入Output Port申请的内存,送入下一级;
-
Isp接收数据,进行处理,将结果写入Output Port申请的内存,送入下一级;
-
Scl 接收数据,进行处理,将结果写入Output Port申请的内存,送入下一级;
-
Venc接收数据,送入编码器进行编码处理,将编码后的数据写入RingPool内存区;
-
用户调用Venc的接口取流,送入用户业务层App。
图 1-5 一个典型的IPC数据流模型
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 |
entry_size | enable mmu后配置这个才有效 | Tiramisu支援128/256/512,单位:KByte Ex: entry_size=128,表示设置128KByte |
cmdQBufSize | cmdq 内存大小 | 由产品规格决定,单位:KByte Ex: cmdQBufSize=256,表示设置256KByte |
2. API 参考¶
2.1. API描述格式说明¶
本手册使用 8个参考域描述 API 的相关信息,它们作用如 表所表示。
标签 | 功能 |
---|---|
功能 | 简要描述API的主要功能。 |
语法 | 列出调用API应包括的头文件以及API的原型声明。 |
参数 | 列出API的参数、参数说明及参数属性。 |
返回值 | 列出API所有可能的返回值及其含义。 |
依赖 | 列出API包含的头文件和API编译时要链接的库文件。 |
注意 | 列出使用API时应注意的事项。 |
举例 | 列出使用API的实例。 |
相关主题 | 调用上下文中有关联的接口。 |
2.2. 功能模块API列表¶
如前文所述,我们可以粗略的把MI_SYS的API分为三大类:系统功能类、数据流类、内存管理类。
Tips: MI_SYS仅有部分接口支持跨Soc设置,这些接口都带有u16SocId参数,没有携带此参数的接口默认不支持跨Soc设置。
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_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_ChnInputPortSetUserPicture | 按照设定帧率,驱动会重复输入该buf到当前input port,并加到待处理队列 |
MI_SYS_EnableUserPicture | 打开user picture 功能 |
MI_SYS_DisableUserPicture | 关闭user picture 功能 |
内存管理类 | |
MI_SYS_SetChnMMAConf | 设置模块设备通道输出端口默认分配内存的MMA池名称 |
MI_SYS_GetChnMMAConf | 获取模块设备通道输出端口默认分配内存的MMA池名称 |
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(MI_U16 u16SocId);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_sys_datatype.h、mi_sys.h
-
库文件:libmi_sys.a / libmi_sys.so
-
-
注意
-
MI_SYS_Init需要早于其他MI模组的Init函数调用。
-
可以在同一进程或多进程中重复调用MI_SYS_InitMI_SYS_Init,但必须和MI_SYS_Exit成对使用,否则会报错。
-
系统在内核启动参数内,需要配置好MMA 内存堆的配置参数。
-
-
举例
系统Init调用Sample
#define ST_DEFAULT_SOC_ID 0 MI_S32 ST_Sys_Init(void) { MI_SYS_Version_t stVersion; MI_U64 u64Pts = 0; MI_U16 u16SocId = ST_DEFAULT_SOC_ID; STCHECKRESULT(MI_SYS_Init(u16SocId)); memset(&stVersion, 0x0, sizeof(MI_SYS_Version_t)); STCHECKRESULT(MI_SYS_GetVersion(u16SocId , &stVersion)); ST_INFO("u8Version:%s\n", stVersion.u8Version); STCHECKRESULT(MI_SYS_GetCurPts(u16SocId, &u64Pts)); ST_INFO("u64Pts:0x%llx\n", u64Pts); u64Pts = 0xF1237890F1237890; STCHECKRESULT(MI_SYS_InitPtsBase(u16SocId, u64Pts)); u64Pts = 0xE1237890E1237890; STCHECKRESULT(MI_SYS_SyncPts(u16SocId, u64Pts)); return MI_SUCCESS; } MI_S32 ST_Sys_Exit(void) { MI_U16 u16SocId = ST_DEFAULT_SOC_ID; STCHECKRESULT(MI_SYS_Exit(u16SocId)); 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 (MI_U16 u16SocId);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_sys_datatype.h、mi_sys.h
-
库文件:libmi_sys.a / libmi_sys.so
-
-
注意
-
MI_SYS_Exit调用前需要确保系统内所有其他模组都已经完成去初始化。
-
MI_SYS_Exit调用前需要确保系统内所有创建的VBPOOL已经成功销毁。
-
-
举例
参见 系统Init调用Sample举例。
-
相关主题
2.3.3. MI_SYS_GetVersion¶
-
功能
获取MI 的系统版本号。
-
语法
MI_S32 MI_SYS_GetVersion (MI_U16 u16SocId, MI_SYS_Version_t *pstVersion);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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_U16 u16SocId, MI_U64 *pu64Pts);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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_U16 u16SocId, MI_U64 u64PtsBase);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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_U16 u16SocId, MI_U64 u64Pts);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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_U16 u16SocId, MI_U32 u32RegAddr, MI_U16 u16Value,MI_U16 u16Mask);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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_U16 u16SocId, MI_U32 u32RegAddr, MI_U16 *pu16Value);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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_U16 u16SocId, MI_U64 *u64Uuid);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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_U16 u16SocId, MI_SYS_ChnPort_t *pstChnPort,MI_BOOL bEnable , MI_U32 u32Param);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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_EnableChnOutputPortLowLatency调用Sample
MI_SYS_ChnPort_t stChnPort; MI_U16 u16SocId = ST_DEFAULT_SOC_ID; stChnPort.eModId = E_MI_MODULE_ID_ISP; stChnPort.u32DevId = 0; stChnPort.u32ChnId = 0; stChnPort.u32PortId = 0; //打开ISP 通道1 output端口0 的低延迟输出功能,设定完成100行即可输出 MI_SYS_EnableChnOutputPortLowLatency(u16SocId, &stChnPort,TRUE , 100); //关闭ISP 通道1 output端口0 的低延迟输出功能, MI_SYS_EnableChnOutputPortLowLatency(u16SocId, &stChnPort,FALSE , 0);
2.4. 数据流类 API¶
2.4.1. MI_SYS_BindChnPort¶
-
功能
数据源输出端口到数据接收者输入端口的绑定。
-
语法
MI_S32 MI_SYS_BindChnPort(MI_U16 u16SocId, MI_SYS_ChnPort_t *pstSrcChnPort, MI_SYS_ChnPort_t *pstDstChnPort, ,MI_U32 u32SrcFrmrate, MI_U32 u32DstFrmrate);
-
形参
参数名称 参数含义 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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_BindChnPort调用Sample
MI_SYS_ChnPort_t stSrcChnPort; MI_SYS_ChnPort_t stDstChnPort; MI_U32 u32SrcFrmrate; MI_U32 u32DstFrmrate; MI_U16 u16SocId = ST_DEFAULT_SOC_ID; stSrcChnPort.eModId = E_MI_MODULE_ID_ISP; 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(u16SocId, &stSrcChnPort, &stDstChnPort, u32SrcFrmrate, u32DstFrmrate);
-
相关主题
2.4.2. MI_SYS_BindChnPort2¶
-
功能
数据源输出端口到数据接收者输入端口的绑定,需要额外指定工作模式。
-
语法
MI_S32 MI_SYS_BindChnPort2(MI_U16 u16SocId, MI_SYS_ChnPort_t *pstSrcChnPort, MI_SYS_ChnPort_t *pstDstChnPort,MI_U32 u32SrcFrmrate, MI_U32 u32DstFrmrate, MI_SYS_BindType_e eBindType, MI_U32 u32BindParam);
-
形参
参数名称 参数含义 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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)支持这种模式,只支持一路 E_MI_SYS_BIND_TYPE_REALTIME u32BindParam未使用,该模式使用场景:jpe imi,只支持一路;vif->isp,支持一路;isp->scl,支持多路 E_MI_SYS_BIND_TYPE_FRAME_BASE u32BindParam未使用,默认是走这种frame mode
-
-
举例
MI_SYS_BindChnPort2调用Sample
MI_SYS_ChnPort_t stSrcChnPort; MI_SYS_ChnPort_t stDstChnPort; MI_U32 u32SrcFrmrate; MI_U32 u32DstFrmrate; MI_SYS_BindType_e eBindType; MI_U32 u32BindParam; MI_U16 u16SocId = ST_DEFAULT_SOC_ID; // a. ISP与venc连接方式为E_MI_SYS_BIND_TYPE_FRAME_BASE,代码如下: stSrcChnPort.eModId = E_MI_MODULE_ID_ISP; 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(u16SocId, &stSrcChnPort, &stDstChnPort, u32SrcFrmrate, u32DstFrmrate, eBindType, u32BindParam)); // b. ISP与jpe连接方式为E_MI_SYS_BIND_TYPE_REALTIME,代码如下: stSrcChnPort.eModId = E_MI_MODULE_ID_ISP; 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(u16SocId, &stSrcChnPort, &stDstChnPort, u32SrcFrmrate, u32DstFrmrate, eBindType, u32BindParam)); // c. ISP与venc连接方式为E_MI_SYS_BIND_TYPE_HW_RING,代码如下: tSrcChnPort.eModId = E_MI_MODULE_ID_ISP; 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;//假设ISP output resolution为1920*1080,设置ring buffer depth为1080 STCHECKRESULT(MI_SYS_BindChnPort2(u16SocId, &stSrcChnPort, &stDstChnPort, u32SrcFrmrate, u32DstFrmrate, eBindType, u32BindParam));
-
相关主题
2.4.3. MI_SYS_UnBind_ChnPort¶
-
功能
数据源输出端口到数据接收者输入端口之间的去绑定。
-
语法
MI_S32 MI_SYS_UnBindChnPort(MI_U16 u16SocId, MI_SYS_ChnPort_t *pstSrcChnPort, MI_SYS_ChnPort_t *pstDstChnPort);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 pstSrcChnPort 源端口配置信息数据结构指针 输入 pstDstChnPort 目标端口配置信息数据结构指针 输入 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_sys_datatype.h、mi_sys.h
-
库文件:libmi_sys.a / libmi_sys.so
-
-
注意
-
源端口必须是通道输出端口。
-
目标端口必须是通道输入端口。
-
源和目标端口之间之前必须已经被绑定过
-
-
相关主题
2.4.4. MI_SYS_GetBindbyDest¶
-
功能
查询数据接收者输入端口的对应的源输出端口。
-
语法
MI_S32 MI_SYS_GetBindbyDest (MI_U16 u16SocId, MI_SYS_ChnPort_t *pstDstChnPort, MI_SYS_ChnPort_t *pstSrcChnPort , MI_SYS_BindType_e *peBindType);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 pstDstChnPort 目标端口配置信息数据结构指针。 输入 pstSrcChnPort 源端口配置信息数据结构指针。 输出 peBindType 绑定模式 输出 -
返回值
-
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 (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调用Sample
MI_SYS_ChnPort_t stIspChnInput; 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(&stIspChnInput, 0x0, sizeof(MI_SYS_ChnPort_t)); memset(&stBufConf, 0x0, sizeof(MI_SYS_BufConf_t)); memset(&stBufInfo, 0x0, sizeof(MI_SYS_BufInfo_t)); stIspChnInput.eModId = E_MI_MODULE_ID_ISP; stIspChnInput.u32DevId = 0; stIspChnInput.u32ChnId = 0; stIspChnInput.u32PortId = 0; fp = fopen("/mnt/ispport0_1920x1080_pixel0_737.raw","rb"); if(fp == NULL) { printf("file %s open fail\n", "/mnt/ispport0_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(&stIspChnInput,&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); } }
-
相关主题
2.4.6. MI_SYS_ChnInputPortPutBuf¶
-
功能
把通道input端口对应的buf object加到待处理队列。
-
语法
MI_S32 MI_SYS_ChnInputPortPutBuf (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
-
-
举例
-
相关主题
2.4.7. MI_SYS_ChnOutputPortGetBuf¶
-
功能
分配通道output端口对应的buf object。
-
语法
MI_S32 MI_SYS_ChnOutputPortGetBuf (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调用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;
MI_U16 u16SocId = ST_DEFAULT_SOC_ID;
stChnPort.eModId = E_MI_MODULE_ID_SCL; stChnPort.u32DevId = 0; stChnPort.u32ChnId = SCL_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(u16SocId, &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, "scl%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 scl 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(u16SocId, &stChnPort, 0, 3); printf("exit record\n"); return NULL;
-
相关主题
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
-
-
举例
-
相关主题
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 获取的inputPort 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 stIspChnInput; 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; MI_U16 u16SocId = ST_DEFAULT_SOC_ID; memset(&stIspChnInput, 0x0, sizeof(MI_SYS_ChnPort_t)); memset(&stBufConf, 0x0, sizeof(MI_SYS_BufConf_t)); memset(&stBufInfo, 0x0, sizeof(MI_SYS_BufInfo_t)); stIspChnInput.eModId = E_MI_MODULE_ID_ISP; stIspChnInput.u32DevId = 0; stIspChnInput.u32ChnId = 0; stIspChnInput.u32PortId = 0; fp = fopen("/mnt/ispport0_1920x1080_pixel0_737.raw", "rb"); if (fp == NULL) { printf("file %s open fail\n", "/mnt/ispport0_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(&stIspChnInput, &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); } }
-
相关主题
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 举例。
-
相关主题
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_ChnOutputPortGetBufPa调用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; void *pVirAddr = NULL; MI_U16 u16SocId = ST_DEFAULT_SOC_ID; stChnPort.eModId = E_MI_MODULE_ID_SCL; stChnPort.u32DevId = 0; stChnPort.u32ChnId = SCL_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(u16SocId, &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, "scl%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 scl 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_ChnOutputPortGetBuf err, %x\n", s32Ret); continue; } pVirAddr = 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(u16SocId, &stChnPort, 0, 3); printf("exit record\n"); return NULL;
-
相关主题
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 举例。
-
相关主题
2.4.13. MI_SYS_SetChnOutputPortDepth¶
-
功能
设置通道output端口对应的系统buf 数量和用户可以拿到的buf数量。
-
语法
MI_S32 MI_SYS_SetChnOutputPortDepth(MI_U16 u16SocId, MI_SYS_ChnPort_t *pstChnPort, MI_U32 u32UserFrameDepth, MI_U32 u32BufQueueDepth);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 pstChnPort 指向模块通道之output端口的指针 输入 u32UserFrameDepth 设置该output用户可以拿到的buf最大数量 输入 u32BufQueueDepth 设置该output系统buf最大数量 输入 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_sys_datatype.h、mi_sys.h
-
库文件:libmi_sys.a / libmi_sys.so
-
-
注意
-
u32UserFrameDepth 默认为0,u32BufQueueDepth默认为4。
-
在使用完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文档介绍。
-
-
举例
2.4.14. MI_SYS_ChnPortInjectBuf¶
-
功能
把获取的outputPort buf插到指定的inputPort Buf Queue中
-
语法
MI_S32 MI_SYS_ChnPortInjectBuf(MI_SYS_BUF_HANDLE hHandle, MI_SYS_ChnPort_t *pstChnPort);
-
形参
参数名称 描述 输入/输出 hHandle 获取的outputPort Buf的handle句柄 输入 pstChnPort 指向模块通道之input端口的指针 输入 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_sys_datatype.h、mi_sys.h
-
库文件:libmi_sys.a / libmi_sys.so
-
-
注意
调用MI_SYS_ChnPortInjectBuf 后,user不能再显示的release handle了。
-
举例
-
相关主题
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循环取数据的效率要高。
-
-
举例
-
相关主题
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 成对使用。
-
举例
-
相关主题
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_ISP; 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_SCL; 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_SCL; 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 ***************************/ return 1; }
-
相关主题
2.4.18. MI_SYS_ChnInputPortSetUserPicture¶
-
功能
按照设定帧率驱动会重复输入该buf到当前input port,并加到待处理队列。
-
语法
MI_S32 MI_SYS_ChnInputPortSetUserPicture(MI_SYS_BUF_HANDLE BufHandle , MI_SYS_BufInfo_t *pstBufInfo, MI_SYS_UserPictureInfo_t *pstUserPictureInfo);
-
形参
参数名称 | 描述 | 输入/输出 |
---|---|---|
BufHandle | 当前buf的Handle句柄 | 输入 |
pstBufInfo | 待提交的buf 指针 | 输入 |
pstUserPictureInfo | 向驱动设定帧率信息的指针 | 输入 |
-
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_sys_datatype.h、mi_sys.h
-
库文件:libmi_sys.a / libmi_sys.so
-
-
注意
开启user picture功能的Input port不能被绑定且需要被开启。
-
举例
MI_SYS_ChnInputPortSetPicture调用Sample int test0() { MI_SYS_ChnPort_t stChnPort; MI_SYS_BufConf_t stBufConf; MI_SYS_BufInfo_t stBufInfo; MI_SYS_BUF_HANDLE bufHandle; MI_SYS_UserPictureInfo_t stUserPictureInfo; memset(&stChnPort , 0 , sizeof(stChnPort)); memset(&stBufConf, 0 , sizeof(stBufConf)); memset(&stBufInfo, 0 , sizeof(stBufInfo)); stChnPort.eModId = E_MI_MODULE_ID_ISP; stChnPort.u32DevId = 0; stChnPort.u32ChnId = 0; stChnPort.u32PortId =0; stBufConf.eBufType = E_MI_SYS_BUFDATA_FRAME; stBufConf.stFrameCfg.u16Width = 1920; stBufConf.stFrameCfg.u16Height = 1080; stBufConf.stFrameCfg.eFormat = E_MI_SYS_PIXEL_FRAME_YUV422_YUYV; MI_SYS_ChnInputPortGetBuf(&stChnPort , & stBufConf , & stBufInfo , & bufHandle , 100); /*************************** 向stBufInfo里填充相应数据 ***************************/ stUserPictureInfo.u32SrcFrc = 30;//每秒30帧 MI_SYS_ChnInputPortSetUserPicture( bufHandle , & stBufInfo , & stUserPictureInfo); MI_SYS_EnableUserPicture(bufHandle); …….. …….. …….. MI_SYS_DisableUserPicture(bufHandle); return 0; }
-
相关主题
2.4.19. MI_SYS_EnableUserPicture¶
-
功能
打开user picture 功能。
-
语法
MI_S32 MI_SYS_EnableUserPicture(MI_SYS_BUF_HANDLE BufHandle);
-
形参
参数名称 描述 输入/输出 BufHandle 通过MI_SYS_ChnInputPortSetUserPicture 向驱动设定bufinfo 的Handle句柄 输入 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_sys_datatype.h、mi_sys.h
-
库文件:libmi_sys.a / libmi_sys.so
-
-
举例
参见 MI_SYS_ChnInputPortSetUserPicture调用Sample 举例。
-
相关主题
2.4.20 MI_SYS_DisableUserPicture¶
-
功能
关闭user picture 功能,并释放buf
-
语法
MI_S32 MI_SYS_ DisableUserPicture (MI_SYS_BUF_HANDLE hHandle);
-
形参
参数名称 描述 输入/输出 BufHandle 通过MI_SYS_ChnInputPortSetUserPicture 向驱动设定的bufinfo 的Handle句柄 输入 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_sys_datatype.h、mi_sys.h
-
库文件:libmi_sys.a / libmi_sys.so
-
-
举例
参见 MI_SYS_ChnInputPortSetUserPicture调用Sample 举例。
-
相关主题
2.5. 内存管理类 API¶
2.5.1. MI_SYS_SetChnMMAConf¶
-
功能
设置模块设备通道输出默认分配内存的MMA池名称。
-
语法
MI_S32 MI_SYS_SetChnMMAConf (MI_U16 u16SocId, MI_ModuleId_e eModId, MI_U32 u32DevId, MI_U32 u32ChnId, MI_U8 *pu8MMAHeapName);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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_U16 u16SocId = ST_DEFAULT_SOC_ID; MI_SYS_SetChnMMAConf(u16SocId, eVifModeId, vifDev, vifChn, "mma_heap_name0");
2.5.2. MI_SYS_GetChnMMAConf¶
-
功能
获取模块设备通道输出端口默认分配内存的MMA池名称。
-
语法
MI_S32 MI_SYS_GetChnMMAConf (MI_U16 u16SocId, MI_ModuleId_e eModId, MI_U32 u32DevId, MI_U32 u32ChnId, void *pu8MMAHeapName, MI_U32 u32Length);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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
-
-
相关主题
2.5.3. MI_SYS_MMA_Alloc¶
-
功能
直接向MMA内存管理器申请分配内存。
-
语法
MI_S32 MI_SYS_MMA_Alloc(MI_U16 u16SocId, MI_U8 *pstMMAHeapName, MI_U32 u32BlkSize ,MI_PHY *phyAddr);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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; MI_U16 u16SocId = ST_DEFAULT_SOC_ID; srcBuffSize = ALIGN_UP(srcBuffSize, 4096); ret = MI_SYS_MMA_Alloc(u16SocId, 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(u16SocId, phySrcBufAddr);
-
相关主题
2.5.4. MI_SYS_MMA_Free¶
-
功能
直接向MMA内存管理器释放之前分配的内存。
-
语法
MI_S32 MI_SYS_MMA_Free(MI_U16 u16SocId, MI_U64 phyAddr);
-
形参
参数名称 描述 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 phyAddr 待释放之内存的物理地址 输入 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_sys_datatype.h、mi_sys.h
-
库文件:libmi_sys.a / libmi_sys.so
-
-
举例
-
相关主题
2.5.5. 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 举例。
-
相关主题
2.5.6. 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举例。
-
相关主题
2.5.7. 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 举例。
-
相关主题
2.5.8. MI_SYS_MemsetPa¶
-
功能
通过DMA硬件模块,填充整块物理内存.
-
语法
MI_S32 MI_SYS_MemsetPa(MI_U16 u16SocId, MI_PHY phyPa, MI_U32 u32Val, MI_U32 u32Lenth);
-
形参
参数名称 参数含义 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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; MI_U16 u16SocId = ST_DEFAULT_SOC_ID; buffSize = ALIGN_UP(buffSize, 4096); ret = MI_SYS_MMA_Alloc(u16SocId, NULL, buffSize, &phySrcBufAddr); if(ret != MI_SUCCESS) { printf("alloc src buff failed\n"); return -1; } ret = MI_SYS_MMA_Alloc(u16SocId, NULL, buffSize, &phyDstBufAddr); if(ret != MI_SUCCESS) { MI_SYS_MMA_Free(u16SocId, phySrcBufAddr); printf("alloc dts buff failed\n"); return -1; } MI_SYS_MemsetPa(u16SocId, phySrcBufAddr, 0xff, buffSize); MI_SYS_MemsetPa(u16SocId, phyDstBufAddr, 0x00, buffSize); MI_SYS_MemcpyPa(u16SocId, phyDstBufAddr, phySrcBufAddr, buffSize); MI_SYS_MMA_Free(u16SocId, phySrcBufAddr); MI_SYS_MMA_Free(u16SocId, phyDstBufAddr);
-
相关主题
2.5.9. MI_SYS_MemcpyPa¶
-
功能
通过DMA硬件模块,把源内存数据拷贝到目标内存上.
-
语法
MI_S32 MI_SYS_MemcpyPa(MI_U16 u16SocId, MI_PHY phyDst, MI_PHY phySrc, MI_U32 u32Lenth);
-
形参
参数名称 参数含义 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 phyDst 目的物理地址 输入 phySrc 源物理地址 输入 u32Lenth 拷贝大小,单位为byte 输入 -
返回值
-
0 成功。
-
非0 失败,参照错误码。
-
-
依赖
-
头文件:mi_sys_datatype.h、mi_sys.h
-
库文件:libmi_sys.a / libmi_sys.so
-
-
举例
参见MI_SYS_MemsetPa 举例。
-
相关主题
2.5.10. MI_SYS_BufFillPa¶
-
功能
通过DMA硬件模块,填充部分物理内存。
-
语法
MI_S32 MI_SYS_BufFillPa(MI_U16 u16SocId, MI_SYS_FrameData_t *pstBuf, MI_U32 u32Val, MI_SYS_WindowRect_t *pstRect);
-
形参
参数名称 参数含义 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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_SYS_BufFillPa调用Sample
MI_S32 ret = 0; MI_SYS_WindowRect_t rect; MI_SYS_FrameData_t stSysFrame; MI_U16 u16SocId = ST_DEFAULT_SOC_ID; 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_BufFillPa(u16SocId, &stSysFrame, u32ColorVal, &rect); return ret;
-
相关主题
2.5.11. MI_SYS_BufBlitPa¶
-
功能
通过DMA硬件模块,把源内存数据上的部分区域拷贝到目标内存上的部分区域。
-
语法
MI_S32 MI_SYS_BufBlitPa(MI_U16 u16SocId, MI_SYS_FrameData_t *pstDstBuf, MI_SYS_WindowRect_t *pstDstRect, MI_SYS_FrameData_t *pstSrcBuf, MI_SYS_WindowRect_t *pstSrcRect);
-
形参
参数名称 参数含义 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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_SYS_BufBlitPa调用Sample
MI_S32 ret = MI_SUCCESS; vdisp_copyinfo_plane_t *plane; MI_SYS_FrameData_t stSrcFrame, stDstFrame; MI_SYS_WindowRect_t stSrcRect, stDstRect; MI_U16 u16SocId = ST_DEFAULT_SOC_ID; plane = ©info->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(u16SocId, &stDstFrame, &stDstRect, &stSrcFrame, &stSrcRect); return ret;
-
相关主题
2.5.12. MI_SYS_ConfigPrivateMMAPool¶
-
功能
为模块配置私有MMA Heap.
-
语法
MI_S32 MI_SYS_ConfigPrivateMMAPool(MI_U16 u16SocId, MI_SYS_GlobalPrivPoolConfig_t *pstGlobalPrivPoolConf);
-
形参
参数名称 参数含义 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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_SCL_TO_VENC_PRIVATE_RING_POOL 为绑定为E_MI_SYS_BIND_TYPE_HW_RIN模式的scl与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口的output 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; MI_U16 u16SocId = ST_DEFAULT_SOC_ID; 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_ConfigPrivateMMAPool(u16SocId, &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_ConfigPrivateMMAPool(u16SocId, &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_ConfigPrivateMMAPool(u16SocId, &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_ConfigPrivateMMAPool(u16SocId, &stConfig);
ISP 创建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_ISP; stConfig.uConfig.stPreDevPrivPoolConfig.u32Devid = 0; MI_SYS_ConfigPrivateMMAPool(u16SocId, &stConfig);
ISP 销毁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_ISP; stConfig.uConfig.stPreChnPrivPoolConfig.u32Devid = 0; MI_SYS_ConfigPrivateMMAPool(u16SocId, &stConfig);
创建SCL与VENC之间的ring MMA Heap:
stConfig.eConfigType = E_MI_SYS_SCL_TO_VENC_PRIVATE_RING_POOL; stConfig.bCreate = TRUE; stConfig.uConfig. stPreScl2VencRingPrivPoolConfig.u32VencInputRingPoolStaticSize = 8*1024*1024; MI_SYS_ConfigPrivateMMAPool(u16SocId, &stConfig);
销毁SCL与VENC之间的ring MMA Heap:
stConfig.eConfigType = E_MI_SYS_SCL_TO_VENC_PRIVATE_RING_POOL; stConfig.bCreate = FALSE; MI_SYS_ConfigPrivateMMAPool(u16SocId, &stConfig);
不同分辨率或开启不同功能size大小都不一样,详细参数请根据使用的场景和规格计算。
2.5.13. MI_SYS_PrivateDevChnHeapAlloc¶
-
功能
从模块通道私有MMA Pool 申请内存.
-
语法
MI_S32 MI_SYS_PrivateDevChnHeapAlloc(MI_U16 u16SocId, MI_ModuleId_e eModule, MI_U32 u32Devid, MI_S32 s32ChnId, MI_U8 *pu8BufName, MI_U32 u32blkSize, MI_PHY *pphyAddr, MI_BOOL bTailAlloc);
-
形参
参数名称 参数含义 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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; MI_U16 u16SocId = ST_DEFAULT_SOC_ID; 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_ConfigPrivateMMAPool(u16SocId, &stConfig); ret = MI_SYS_PrivateDevChnHeapAlloc(u16SocId, E_MI_MODULE_ID_VENC, 0, 1, NULL, 4096, pphyAddr, FALSE); if(ret != MI_SUCCESS) { MI_SYS_ConfigPrivateMMAPool(u16SocId, &stConfig); printf("alloc buff from chn private heap failed\n"); return -1; } //do something... MI_SYS_PrivateDevChnHeapFree(u16SocId, E_MI_MODULE_ID_VENC, 0, 1, *pphyAddr); MI_SYS_ConfigPrivateMMAPool(u16SocId, &stConfig);
-
相关主题
2.5.14. MI_SYS_PrivateDevChnHeapFree¶
-
功能
从模块通道私有MMA Pool 释放内存.
-
语法
MI_S32 MI_SYS_PrivateDevChnHeapFree(MI_U16 u16SocId, MI_ModuleId_e eModule, MI_U32 u32Devid, MI_S32 s32ChnId, MI_PHY phyAddr);
-
形参
参数名称 参数含义 输入/输出 u16SocId 指定执行本操作的目标Soc 输入 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类型的私有内存池。
-
举例
-
相关主题
2.5.15. 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; MI_U16 u16SocId = ST_DEFAULT_SOC_ID; srcBuffSize = ALIGN_UP(srcBuffSize, 4096); ret = MI_SYS_MMA_Alloc(u16SocId, 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(u16SocId, 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(u16SocId, phySrcBufAddr);
-
相关主题
3. 数据类型¶
3.1. 数据结构描述格式说明¶
本手册使用 5个参考域描述数据类型的相关信息,它们作用如 个参考域描述数据类型的相关信息,它们作用如 表 3-1所示。
表3-1 数据结构描述格式说明
标签 | 功能 |
---|---|
说明 | 简要描述数据类型的主要功能 |
定义 | 列出数据类型的定义语句 |
成员 | 列出数据结构的成员及含义 |
注意事项 | 列出使用数据类型时应注意的事项 |
相关数据类型及接口 | 列出与本数据类型相关联的其他数据类型和接口 |
3.2. 数据结构列表¶
相关数据类型、数据结构定义如下:
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_GYRO = 31, E_MI_MODULE_ID_JPD = 32, E_MI_MODULE_ID_ISP = 33, E_MI_MODULE_ID_SCL = 34, E_MI_MODULE_ID_WBC = 35, //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 视频编码模块VENC的模块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 视频解码VEDC的模块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 31 0x1F E_MI_MODULE_ID_GYRO 陀螺仪的模块ID 32 0x20 E_MI_MODULE_ID_JPD JPD处理的模块ID 33 0x21 E_MI_MODULE_ID_ISP 图像信号处理的模块ID 34 0x22 E_MI_MODULE_ID_SCL 图像缩放处理的模块ID 35 0x23 E_MI_MODULE_ID_WBC 视频回写的模块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 getRawType(STUB_SensorType_e sensorType) { MI_SYS_PixelFormat_e eRawType = 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); eRawType = (MI_SYS_PixelFormat_e)RGB_BAYER_PIXEL(stSnrPlane0Info.ePixPrecision, stSnrPlane0Info.eBayerId); return eRawType; }
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;
-
成员
成员名称 描述 u64Pts 时间戳 u64SidebandMsg 带外数据 eBufType Buf类型 Bit field Bit 0 bEndOfStream 是否已发完所有信息 Bit 1 bUsrBuf 是否是用户使用buf Bit 2 bDrop 是否需要丢弃buf Bit 3-4 u32IrFlag Ir标志位 Bit 5-31 u32Reserved 保留位 u32SequenceNumber 序列号 Union stFrameData Frame数据格式结构体 stRawData Raw数据格式结构体 stMetaData Meta数据格式结构体 stFrameDataMultiPlane 多Frame集合数据格式结构体
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 u64TargetPts 设置buf 的Pts Union stFrameCfg 设置Frame数据格式参数 stRawCfg 设置Raw数据格式参数 stMetaCfg 设置Meta数据格式参数 stMultiPlaneCfg 设置多Frame数据格式参数
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_SCL_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_SCL_TO_VENC_PRIVATE_RING_POOL SCL与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_PerScl2VencRingPoolConf_t¶
-
说明
定义描述SCL与VENC之间的私有Ring MMA Pool的结构体。
-
定义
typedef struct MI_SYS_PerScl2VencRingPoolConf_s { MI_U32 u32VencInputRingPoolStaticSize; MI_U8 u8MMAHeapName[MI_MAX_MMA_HEAP_LENGTH]; } MI_SYS_PerScl2VencRingPoolConf_t;
-
成员
成员名称 描述 u32VencInputRingPoolStaticSize 私有pool大小 u8MMAHeapName Mma heap name
3.2.27. MI_SYS_PerChnPortOutputPool_t¶
-
说明
定义描述output 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_PerScl2VencRingPoolConf_t stPreScl2VencRingPrivPoolConfig; 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_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.31. 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.32. 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.33. MI_SYS_UserPictureInfo_t¶
-
说明
定义描述user picture 信息的结构体。
-
定义
typedef struct MI_SYS_UserPictureInfo_s { MI_U32 u32SrcFrc; } MI_SYS_UserPictureInfo_t;
-
成员
成员名称 描述 u32SrcFrc 设定Input port buf输入的帧率
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 | 未明确定义的错误 |