MI SYS API


1. 概述


1.1. 模块说明

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

图1-1 MI_SYS系统框架图

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,即网络视频录像机。

DVR: 全称Digital Video Recorder,即数字视频录像机或数字硬盘录像机。

XVR: 全称X(代表任何一种或多种功能) Video Recorder,目前sstar实现是NVR+DVR。

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

HW: 全称hardware,即硬件。

Dev: 全称Device,本文中表示MI模块设备,详见1.4.1。

Chn: 全称Channel,本文中表示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资源、数据来源、参数属性。

Tips:

一个Chn并不是总是必须有InputPort和OutputPort的,其InputPort和OutputPort的数量取决于该模块的行为。

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

图1-3 列出了MI_SYS中单个Chn下Port排列的不同场景:

  1. 只有InputPort,用于需要数据输入,但是无需输出的模块。比如,Disp这样的模块,只需要InputPort,无需OutputPort,它直接把结果显示到了Panel上。

  2. 只有OutputPort,用于无数据输入,或者数据输入不经过MI_SYS的模块。比如,Vdec这样的模块,数据来源可以是用户调用Vdec接口直接送入Vdec RingPool,不经过InputPort。

  3. 一个InputPort,一个OutputPort,用于单个数据输入,单个数据输出的模块。比如,Ldc这样的模块,先接收一个数据输入,然后硬件处理后,输入对应的结果。

  4. 一个InputPort,多个OutputPort,用于单个数据输入,但是会有不同的处理,输出不同数据的模块。比如,Scl这样的模块,共享一个数据源,然后会按照不同的OutputPort设置的参数来进行处理,输出不同的结果。

Tips:

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


1.4.2. 一个典型的NVR数据流

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

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

  2. 用户接收码流数据存盘并写入到Vdec的RingPool;

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

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

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

Tips:

实际上,Vdec工作在不同模式下,OutputPortBuf中存储的不一定是真实的解码后帧数据。此处区别,用户无需过多关注。


1.4.3. 一个典型的IPC数据流

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

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

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

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

  4. Isp接收数据,进行处理,将结果写入Output Port申请的内存,送入下一级;

  5. Scl 接收数据,进行处理,将结果写入Output Port申请的内存,送入下一级;

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

  7. 用户调用Venc的接口取流,送入用户业务层App,通过网络转送。

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


1.4.4. 一个典型的DVR数据流

图1-6是一个典型的DVR数据流模型,根据输入数据流类型及应用场景不同分为两种情况:

  • 第一种情况,输入源为从磁盘读取的H264/H265编码数据类型的回放场景,流动过程如下:

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

    2. 用户写入码流到Vdec的RingPool;

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

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

  • 第二种情况,输入源为sensor,流动过程如下:

    1. 建立Vif->Isp->Scl->Disp的绑定关系;

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

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

    4. Isp接收数据,进行处理,将结果写入Output Port申请的内存,送入下一级;

    5. Scl 接收数据,进行处理,将结果写入Output Port申请的内存,送入下一级;

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

    7. Disp将接收到的数据进行预览显示;

    8. 用户调用Venc的接口取流,送入用户业务层App,存入磁盘。

图1-6 一个典型的DVR数据流模型


1.4.5. 一个典型的XVR数据流

XVR同时具备NVR和DVR的功能,可自由在两种设备功能间自由切换,其数据流也是如此。


1.5. Bind和帧率控制场景说明

下面列出了一些常见的数据流场景来说明帧率的工作机制,图中成员的定义如下:

图1-7 Bind场景成员定义

Tips:

为了保证接口易用性,MI_SYS 内部会自动校准前级Output的帧率。

用户设置的u32SrcFrmrate和MI_SYS内部计算值有偏差时,以MI_SYS内部计算值替代u32SrcFrmrate来做帧率控制。但是MI_SYS内部计算需要时间,当帧率发生较大变化时,会出现1-2秒的抖动。

因此,使用MI_SYS_BindXXX接口时,请尽量保证这两个帧率设置准确。并且帧率有变化时,主动调用MI_SYS_BindXXX更新帧率。

下文中假定用户设置的u32SrcFrmrate是准确的前级帧率,u32DstFrmrate是客户想要的后级帧率。

1.5.1. 一对一Bind

图1-8 一对一Bind场景

对应前级Chnport 的Output 一对一bind 后级Chnport Input的场景,由Bind Type决定帧率控制策略。

如果是 FRAME_BASE模式,前级Output帧率控制起效,把输出帧率控制到目标值,后级Input帧率控制不起效。如果是 REALTIME/HW_RING模式,前级Output帧率控制不起效,后级Input帧率控制直接控制到目标值。

以图示为例:

Case1 设置Bind FRC: (30,5) ,Bind Type:FRAME_BASE, 此时前级ISP的输出帧率就被控制到5FPS。

Case2 设置Bind FRC: (30,5) Bind Type:REALTIME, 此时前级ISP的输出帧率维持30FPS不变,后端SCL的输入帧率被控制到5FPS。

Tips:

对于 REALTIME/HW_RING模式,无论是哪种场景下,前级Output帧率控制都不起效的,此时只能控制后级Input帧率,这是硬件工作机制决定的,下文不再复述。


1.5.2. 一对多Bind

图1-9 一对多Bind场景

对应前级Chnport 的Output 一对多bind 后级Chnport Input的场景,Bind Type和Bind FRC 共同决定帧率控制策略。

如果是 FRAME_BASE模式,由于前级ISP同时Bind多个后级,只能把帧率控制到能满足所有后级bind模块的帧率需求,然后在后级Input分别再做帧率控制。如果是 REALTIME/HW_RING模式,前级Output帧率控制不起效,后级Input分别做帧率控制。

以图示为例:

在该场景中,对ISP ChnPort0 的两次bind帧率分别是(30,5)(30,10),因此,ISP ChnPort0 的Output 帧率为10FPS。

SCL ChnPort0 的input需要进一步把帧率从10FPS 控制到5FPS。SCL ChnPort1 则无需再进行帧率控制。


1.5.3. Bind的同时设置了UserDepth

图1-10 Bind的同时设置了UserDepth

对应Bind后级的同时,前级Output端同时设置了UserDepth的场景,帧率控制策略是固定且唯一的。 调用MI接口设置的UserDepth,表明用户需要拿输出数据去使用,这个时候前级Output总是倾向把最新的数据给到用户,因此对前端输出不做帧率控制。

假如有bind后级,则在后级Input做帧率控制。假如没有bind后级,帧率控制就完全不起效了,此时数据输出就由数据产生和消费的速度来决定。我们会在说明Depth概念时,再详细解释。

以图示为例:

在该场景中,对ISP ChnPort0 的两次bind帧率分别是(30,5)(30,10),但是设置了ISP ChnPort0 的Output Depth为(1, 4)。因此,ISP ChnPort0 的Output 帧率为30FPS。SCL ChnPort0 的input把帧率从30FPS 控制到5FPS。SCL ChnPort1 把帧率从30FPS 控制到10FPS。


1.5.4. NVR场景下Vdec帧率控制的补充

图1-11 对于NVR场景下Vdec帧率控制的补充

对应 Vdec Chnport 的Output 一对一bind 后级 Chnport Input 的场景,由BindFRC决定帧率控制策略。

由于NVR 需要用户输入码流到Vdec,很难严格保证送码流的速度是均衡的,这一点和IPC这种数据源由中断严格控制时序的场景是不一样的。如果用户无法保证送入的帧率稳定,可以使用MI提供的自动计算送帧速度的功能,该功能在u32SrcFrmrate设置为-1时自动开启,此时MI会严格按照 u32DstFrmrate 来决定是否分配 Buffer 给Vdec。

此外,由于NVR 会提供倍速播放的功能,当后级Disp的Timing跟不上,就需要在输入Disp之前主动丢帧。如果Vdec解码速度快于Disp显示Timing,可使用MI提供的按比例丢帧功能,通过设置u32SrcFrmrate和u32DstFrmrate的比例来做达到想要的帧率。

以图示为例:

Case1 设置 Bind FRC: (-1,30) Bind Type:FRAME_BASE,假设前级Vdec Output输出帧率是30,此时 Vdec Output 每 1000ms/30 = 33.3ms才能得到 MI 分配的Buffer。

Case2 设置Bind FRC: (60, 30) Bind Type:FRAME_BASE,比例为 60/30 = 2/1,假设前级Vdec Output输出帧率是60,此时 Vdec Output每解码两张,只有一张会推送到Disp的Input。

Tips:

对于NVR产品,可以通过MI_VDEC的API接口查询当前ChnPort的遗留帧来动态选择两种策略,以达到更好的效果,此处不再赘述。

对于Vdec Bind 后级时,自动校准前级Output的真实帧率功能不再起效。


1.6. insmod参数说明

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

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

参数 含义 取值
bEnableMmu 是否使能MMU 1:enable mmu
0:disable mmu
由于需要底层逻辑的配合,设置成1不一定会enable MMU。设置成0会disable MMU。默认值是1。
Ex:
bEnableMmu=1,表示使能mmu
bEnableMmu=0,表示禁止mmu
logBufSize 缓存log的内存长度 默认为4KByte,单位:Byte
Ex:
logBufSize=4096,表示设置4096Byte,即4KByte
entrySize enable mmu后配置这个才有效 Tiramisu支援128/256/512,单位:KByte
entrySize的默认值是0,默认会使用系统配置的size,不同IC用的size有可能不一样。
Ex:
entrySize=128,表示设置128KByte
cmdQBufSize cmdq 内存大小 由产品规格决定,单位:KByte
cmdQBufSize的默认值在linux是1024,在RTK针对不同的IC可能会不一样。
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 获取当前Output Port等待事件的文件描述符
MI_SYS_CloseFd 关闭Output Port对应的文件描述符
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 .

  • 相关主题

    MI_SYS_Exit


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举例。

  • 相关主题

    MI_SYS_Init


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 通道0 output端口0 的低延迟输出功能,设定完成100行即可输出
    MI_SYS_EnableChnOutputPortLowLatency(u16SocId, &stChnPort,TRUE , 100);
    
    //关闭ISP 通道0 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

  • 注意

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

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

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

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

    • 本接口只支持按照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);
    
  • 相关主题

    MI_SYS_BindChnPort2

    MI_SYS_UnBind_ChnPort

    Bind和帧率控制场景说明


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和u32BindParam使用场景如下:

      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));
    
  • 相关主题

    MI_SYS_BindChnPort2

    MI_SYS_UnBind_ChnPort

    Bind和帧率控制场景说明


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

  • 注意

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

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

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

  • 相关主题

    MI_SYS_BindChnPort

    MI_SYS_BindChnPort2


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);
        }
    }
    
  • 相关主题

    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, MI_SYS_BufInfo_t *pstBufInfo, MI_BOOL bDropBuf);
    
  • 形参

    参数名称 描述 输入/输出
    hHandle 当前buf的Handle句柄 输入
    pstBufInfo 待提交的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 (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;
    
  • 相关主题

    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 获取的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);
        }
    }
    
  • 相关主题

    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_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;
    
  • 相关主题

    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_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文档介绍。

  • 举例

    参见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

  • 功能

    关闭Output Port对应的文件描述符

  • 语法

    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_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;
    }
    
  • 相关主题

    MI_SYS_ChnOutputPortGetBuf

    MI_SYS_ChnOutputPortPutBuf

    MI_SYS_ChnInputPortGetBuf

    MI_SYS_ChnInputPortPutBuf

    MI_SYS_ChnPortInjectBuf


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;
    }
    
  • 相关主题

    MI_SYS_ChnInputPortGetBuf

    MI_SYS_ChnInputPortSetUserPicture

    MI_SYS_EnableUserPicture

    MI_SYS_DisableUserPicture


2.4.19. MI_SYS_EnableUserPicture


2.4.20 MI_SYS_DisableUserPicture


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

  • 相关主题

    MI_SYS_SetChnMMAConf


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

  • 注意

    如果参数pstMMAHeapName传入是NULL,系统会在除了MMU_MMA、mma_heap_codec、mma_heap_ipu、imi_mma_heap以外的其他heap分配内存,具体用哪个heap不确定。

  • 举例

    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(u16SocId, 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);
    
  • 相关主题

    MI_SYS_MMA_Free

    MI_SYS_Mmap

    MI_SYS_FlushInvCache

    MI_SYS_Munmap


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

  • 举例

    参见MI_SYS_MMA_Alloc调用Sample举例。

  • 相关主题

    MI_SYS_MMA_Alloc

    MI_SYS_Mmap

    MI_SYS_FlushInvCache

    MI_SYS_Munmap


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 举例。

  • 相关主题

    MI_SYS_MMA_Alloc

    MI_SYS_MMA_Free

    MI_SYS_FlushCache

    MI_SYS_Munmap


2.5.6. MI_SYS_FlushInvCache

  • 功能

    Flush cache。

  • 语法

    MI_S32 MI_SYS_FlushInvCache(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.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 举例。

  • 相关主题

    MI_SYS_MMA_Alloc

    MI_SYS_MMA_Free

    MI_SYS_Mmap

    MI_SYS_FlushInvCache


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 填充值(注意是4字节) 输入
    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, 0xffffffff, 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);
    
  • 相关主题

    MI_SYS_MemcpyPa


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 举例。

  • 相关主题

    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;
    
  • 相关主题

    MI_SYS_BufBlitPa


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 = &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(u16SocId, &stDstFrame, &stDstRect, &stSrcFrame, &stSrcRect);
    
    return ret;
    
  • 相关主题

    MI_SYS_BufFillPa


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_VPE_TO_VENC_PRIVATE_RING_POOL
      为绑定为E_MI_SYS_BIND_TYPE_HW_RING模式的scl与venc端口设置私有ring heap pool。
      如果是mi_sys v2.0,则表示vpe与venc端口的设置。
      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_VPE_TO_VENC_PRIVATE_RING_POOL;
    stConfig.bCreate = TRUE;
    stConfig.uConfig. stPreVpe2VencRingPrivPoolConfig.u32VencInputRingPoolStaticSize =  8*1024*1024;
    MI_SYS_ConfigPrivateMMAPool(u16SocId, &stConfig);
    

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

    stConfig.eConfigType = E_MI_SYS_VPE_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);
    
  • 相关主题

    MI_SYS_ConfigPrivateMMAPool

    MI_SYS_PrivateDevChnHeapFree


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类型的私有内存池。如果没有配置对应的私有池,默认会在mma_heap_name0申请内存。

  • 举例

    参见MI_SYS_PrivateDevChnHeapAlloc调用Sample举例。

  • 相关主题

    MI_SYS_ConfigPrivateMMAPool

    MI_SYS_PrivateDevChnHeapAlloc


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);
    
  • 相关主题

    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 定义描述SCL与VENC之间的私有Ring MMA Pool的结构体。Mi_sys v2.0 则表示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_FbcData_t 定义frame buffer compress数据结构体
MI_SYS_BufFrameMultiPlaneConfig_t MultiPlane Frame buf配置信息结构体
MI_SYS_FrameDataSubPlane_t SubPlane Frame buf配置信息结构体
MI_SYS_BufFrameMetaConfig_t 定义frame meta data的结构体
MI_SYS_FrameDataMultiPlane_t MultiPlane Frame buf配置信息结构体
MI_SYS_UserPictureInfo_t 定义描述User picture info的结构体

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_DSP = 36,
        E_MI_MODULE_ID_PCIE = 37,
        E_MI_MODULE_ID_DUMMY = 38,
    
        //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
    36 0X24 E_MI_MODULE_ID_DSP DSP模块ID
    37 0X25 E_MI_MODULE_ID_PCIE PCIE模块ID
    38 0X26 E_MI_MODULE_ID_DUMMY 内部测试模块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_RGB101010,
    
        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_RGB101010 RGB101010 格式
    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_TO_6BIT, 
        E_MI_SYS_COMPRESS_MODE_AFBC, 
        E_MI_SYS_COMPRESS_MODE_SFBC0,
        E_MI_SYS_COMPRESS_MODE_SFBC1,
        E_MI_SYS_COMPRESS_MODE_SFBC2,
        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_TO_6BIT Pixel 压缩到6bit
    E_MI_SYS_COMPRESS_MODE_AFBC Arm frame buffer compression
    E_MI_SYS_COMPRESS_MODE_SFBC0 Sigmastar 压缩方式0
    E_MI_SYS_COMPRESS_MODE_SFBC1 Sigmastar 压缩方式1
    E_MI_SYS_COMPRESS_MODE_SFBC2 Sigmastar 压缩方式2
    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_128x32,     // tile mode 128x32
        E_MI_SYS_FRAME_TILE_MODE_128x64,     // tile mode 128x64
        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
    E_MI_SYS_FRAME_TILE_MODE_128x32 128x32 mode
    E_MI_SYS_FRAME_TILE_MODE_128x64 128x64 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,
        E_MI_SYS_BUFDATA_FBC,
        E_MI_SYS_BUFDATA_MAX
    } 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数据类型
    E_MI_SYS_BUFDATA_FBC FBC数据类型
    E_MI_SYS_BUFDATA_MAX 数据类型数目

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 u32SequenceNumber;
        MI_U32 bEndOfStream : 1;
        MI_U32 bUsrBuf : 1;
        MI_U32 bDrop : 1;
        MI_U32 bCrcCheck : 1;
        MI_U32 u32IrFlag : 2; // For Window Hello Usage: 0x00/off, 0x01/on, 0x02/invalid
        MI_U32 u32Reserved : 26;
        union
        {
            MI_SYS_FrameData_t stFrameData;
            MI_SYS_RawData_t stRawData;
            MI_SYS_MetaData_t stMetaData;
            MI_SYS_FrameDataMultiPlane_t stFrameDataMultiPlane;
            MI_SYS_FbcData_t stFbcData;
        };
    } MI_SYS_BufInfo_t;
    
  • 成员


    成员名称 描述
    u64Pts 时间戳
    u64SidebandMsg 带外数据
    eBufType Buf类型
    u32SequenceNumber 序列号
    Bit field Bit 0 bEndOfStream 是否已发完所有信息
    Bit 1 bUsrBuf 是否是用户使用buf
    Bit 2 bDrop 是否需要丢弃buf
    Bit 3 bCrcCkeck 是否开启CRC check
    Bit 4-5 u32IrFlag Ir标志位
    Bit 6-31 u32Reserved 保留位
    Union stFrameData Frame数据格式结构体
    stRawData Raw数据格式结构体
    stMetaData Meta数据格式结构体
    stFrameDataMultiPlane 多Frame集合数据格式结构体
    stFbcData Frame buffer压缩数据结构体


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;
        // Buf alignment requirement after compress
        MI_U16 u16BufCompressAlignment;
        // Buf Extra add after alignment
        MI_U16 u16BufExtraSize;
        //Clear padding flag
        MI_BOOL bClearPadding;
    } MI_SYS_FrameBufExtraConfig_t;
    
  • 成员

    成员名称 描述
    u16BufHAlignment 水平方向对齐值
    u16BufVAlignment 垂直方向对齐值
    u16BufChromaAlignment 色度buffer size对齐值
    u16BufCompressAlignment 压缩模式buffer size对齐值
    u16BufExtraSize 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;
        MI_BOOL bDirectBuf; // Direct alloc buffer by Others.
        MI_BOOL bCrcCheck;
        union
        {
            MI_SYS_BufFrameConfig_t stFrameCfg;
            MI_SYS_BufRawConfig_t stRawCfg;
            MI_SYS_MetaDataConfig_t stMetaCfg;
            MI_SYS_BufFrameMultiPlaneConfig_t stMultiPlaneCfg;
            MI_SYS_BufFrameMetaConfig_t stFrameMetaCfg; // support frame buffer has alloced by Others.
            MI_SYS_FbcDataConfig_t stFbcCfg;
        };
    } MI_SYS_BufConf_t;
    
  • 成员

    成员名称 描述
    eBufType Buf type
    u32Flags Buf是否map kernel space va
    u64TargetPts 设置buf 的Pts
    bDirectBuf Direct alloc buffer by Others
    bCrcCheck Buf是否开启crc校验
    Union stFrameCfg 设置Frame数据格式参数
    stRawCfg 设置Raw数据格式参数
    stMetaCfg 设置Meta数据格式参数
    stMultiPlaneCfg 设置多Frame数据格式参数
    stFrameMetaCfg Frame meta data配置
    stFbcCfg Fbc数据配置


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 SCL与VENC 的私有Ring Pool 类型。
    mi_sys v2.0则表示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

  • 说明

    定义描述SCL与VENC之间的私有Ring MMA Pool的结构体。mi_sys v2.0则表示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

  • 说明

    定义描述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_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_FbcData_t

  • 说明

    定义frame buffer compress数据结构体。

  • 定义

    typedef struct MI_SYS_FbcData_s
    {
        MI_SYS_FrameTileMode_e eTileMode;
        MI_SYS_PixelFormat_e   ePixelFormat;
        MI_SYS_CompressMode_e  eCompressMode;
    
        MI_SYS_FrameData_PhySignalType ePhylayoutType;
    
        MI_U16 u16Width;
        MI_U16 u16Height;
    
        void*  pVirAddr[2];
        MI_PHY phyAddr[2]; // notice that this is miu bus addr,not cpu bus addr.
        MI_U32 u32Stride[2];
        MI_U32 u32BufSize; // total size that allocated for this buffer,include consider alignment.
    
        /*
        *                           ----------------- ----------------
        *                           |               |              ^
        *                           |               |              |
        *   u16RingBufStartLine -->   |               |----           |
        *                           |               | ^            |
        *                           |     Ring      | |             |
        *                           |               | u16Height    |
        *                           |     Heap      | |            |
        *                           |               | |       u16RingHeapTotalLines
        *                           |               | v            |
        *   u16RingBufEndLine -->   |               |----           |
        *                           |               |              |
        *                           |               |              v
        *                           ----------------- ----------------
        */
    
        MI_U16 u16RingBufStartLine;
        MI_U16 u16RingBufEndLine;
        MI_U16 u16RingHeapTotalLines;
    
        MI_PHY phyFbcTableAddr[2];
        MI_U32 u32FbcTableSize[2];
    } MI_SYS_FbcData_t;
    
  • 成员

    成员名称 描述
    eTileMode Tile格式类型
    ePixelFormat 像素枚举类型
    eCompressMode 压缩方式类型
    ePhylayoutType Frame data隶属的buffer类型
    u16Width Frame data的宽
    u16Height Frame data的高
    pVirAddr[2] Frame data buffer的虚拟地址
    phyAddr[2] Frame data buffer 的物理地址
    u32Stride[2] Frame data每行所占字节数
    u32BufSize Frame data buffer大小
    u16RingBufStartLine Ring buffer起始行
    u16RingBufEndLine Ring buffer 结束行
    u16RingHeapTotalLines Ring buffer 总行数
    phyFbcTableAddr[2] 把Fbc data转成nv12的table,目前只支持转到nv12。
    u32FbcTableSize[2] Fbc data转成nv12的table大小。

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_BufFrameMetaConfig_t

  • 说明

    定义frame meta data的结构体。

  • 定义

    typedef struct MI_SYS_BufFrameMetaConfig_s
    {
        MI_U16                 u16Width;
        MI_U16                 u16Height;
        MI_SYS_FrameScanMode_e eFrameScanMode; //
        MI_SYS_PixelFormat_e   eFormat;
        MI_SYS_CompressMode_e  eCompressMode;
    
        void*  pVirAddr[3];
        MI_PHY phyAddr[3];
        MI_U16 u32Stride[3];
        MI_U32 u32BufSize;
    } MI_SYS_BufFrameMetaConfig_t;
    
  • 成员

    成员名称 描述
    u16Width 数据的宽
    u16Height 数据的高
    eFrameScanMode 逐行扫描或者隔行扫描的模式
    eFormat 像素格式
    eCompressMode 压缩模式
    pVirAddr[3] 虚拟地址
    phyAddr[3] 物理地址
    u32Stride[3] 图片每行所占字节数
    u32BufSize Sys分配给当前frame的实际buf大小

3.2.34. 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.35. 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 未明确定义的错误

5. PROCFS介绍


5.1. common

5.1.1. dump_mmap

  • 调试信息

    # /config/dump_mmap
    

  • 调试信息分析

    /config/dump_mmap根据文件/config/mmap.ini显示内存相关信息。

  • 参数分析

    参数 描述
    u32TotalSize Dram总大小
    u32Miu0Size MIU0的寻址大小
    u32Miu1Size MIU1的寻址大小
    u32MiuBoundary MIU0 end address
    u32MmapItemsNum 将Dram mmap的个数,这里是2个,分别是E_LX_MEM和E_MMAP_ID_EMI
    bIs4kAlign 读写Dram是否需要4K对齐
    bMiu1Enable MIU1是否enable
    E_LX_MEM GID Mmap id
    Addr Memory address
    Size Memory size
    Layer Memory layer
    Align Memory align
    MemoryType Memory type
    MiuNo MIU NO.
    CMAID CMA id
    E_MMAP_ID_DUMMY1   同上
    E_LX_LOGO_RESERVED_FB   同上
    E_MMAP_ID_EMI   同上

5.1.2. dump_config

  • 调试信息

    # /config/dump_config
    
    panel cnt:59
    PanelName:RM68200_720x1280 Intftype:11 timing:55
    PanelName:SAT070AT50H18BH_1024x600 Intftype:0 timing:55
    PanelName:BT1120OUTPUT_720p_60HZ Intftype:14 timing:55
    PanelName:BT656OUTPUT_576p_50HZ Intftype:12 timing:55
    PanelName:ST7789V Intftype:16 timing:55
    PanelName:ILI9881C_800x1280 Intftype:11 timing:55
    PanelName:ILI9163C_128x128 Intftype:15 timing:55
    PanelName:DACOUT_576I Intftype:7 timing:4
    PanelName:DACOUT_480I Intftype:7 timing:2
    PanelName:DACOUT_1080P_24 Intftype:8 timing:10
    PanelName:DACOUT_1080P_25 Intftype:8 timing:11
    PanelName:DACOUT_1080P_30 Intftype:8 timing:12
    PanelName:DACOUT_1080P_50 Intftype:8 timing:15
    PanelName:DACOUT_720P_2997 Intftype:8 timing:6
    PanelName:DACOUT_720P_50 Intftype:8 timing:7
    PanelName:DACOUT_720P_5994 Intftype:8 timing:8
    PanelName:DACOUT_720P_60 Intftype:8 timing:9
    PanelName:DACOUT_1080P_2997 Intftype:8 timing:13
    PanelName:DACOUT_1080I_50 Intftype:7 timing:14
    PanelName:DACOUT_1080P_5994 Intftype:8 timing:16
    PanelName:DACOUT_1080I_60 Intftype:7 timing:17
    PanelName:DACOUT_1080P_60 Intftype:8 timing:18
    PanelName:DACOUT_576P Intftype:8 timing:5
    PanelName:DACOUT_480P Intftype:8 timing:3
    PanelName:DACOUT_2K2KP_30 Intftype:8 timing:27
    PanelName:DACOUT_2K2KP_60 Intftype:8 timing:28
    PanelName:DACOUT_4K2KP_24 Intftype:8 timing:33
    PanelName:DACOUT_4K2KP_25 Intftype:8 timing:34
    PanelName:DACOUT_4K2KP_30 Intftype:8 timing:35
    PanelName:DACOUT_4K2KP_50 Intftype:8 timing:36
    PanelName:DACOUT_4K2KP_60 Intftype:8 timing:37
    PanelName:DACOUT_1440P_50 Intftype:8 timing:19
    PanelName:DACOUT_1440P_60 Intftype:8 timing:20
    PanelName:VGAOUT_1024x768P_60 Intftype:8 timing:45
    PanelName:VGAOUT_1280x1024P_60 Intftype:8 timing:48
    PanelName:VGAOUT_1366x768P_60 Intftype:8 timing:46
    PanelName:VGAOUT_1440x900P_60 Intftype:8 timing:49
    PanelName:VGAOUT_1280x800P_60 Intftype:8 timing:47
    PanelName:VGAOUT_1680x1050P_60 Intftype:8 timing:51
    PanelName:VGAOUT_1600x1200P_60 Intftype:8 timing:50
    PanelName:BT1120OUT_576P_50 Intftype:14 timing:5
    PanelName:BT1120OUT_480P_60 Intftype:14 timing:3
    PanelName:BT1120OUT_1080P_25 Intftype:14 timing:11
    PanelName:BT1120OUT_1080P_30 Intftype:14 timing:12
    PanelName:BT1120OUT_1080P_50 Intftype:14 timing:15
    PanelName:BT1120OUT_1080P_2997 Intftype:14 timing:13
    PanelName:BT1120OUT_1080P_5994 Intftype:14 timing:16
    PanelName:BT1120OUT_1080P_60 Intftype:14 timing:18
    PanelName:BT1120OUT_720P_50 Intftype:14 timing:7
    PanelName:BT1120OUT_720P_5994 Intftype:14 timing:8
    PanelName:BT1120OUT_720P_60 Intftype:14 timing:9
    PanelName:BT656OUT_576P_50 Intftype:12 timing:5
    PanelName:BT656OUT_480P_60 Intftype:12 timing:3
    PanelName:BT656OUT_1080P_25 Intftype:12 timing:11
    PanelName:BT656OUT_1080P_2997 Intftype:12 timing:13
    PanelName:BT656OUT_1080P_30 Intftype:12 timing:12
    PanelName:BT656OUT_720P_50 Intftype:12 timing:7
    PanelName:BT656OUT_720P_60 Intftype:12 timing:9
    PanelName:BT656OUT_720P_5994 Intftype:12 timing:8
    pq enable:0
    pq table size:25892
    DBC Value=
            0,0,0
            0,0,0
            0,0,0
    start dump [motion_table](0, 0)
    end dump
    start dump [motion_hdmi_dtv_table](0, 0)
    end dump
    start dump [motion_comp_pc_table](0, 0)
    end dump
    start dump [misc_param_table](0, 0)
    end dump
    start dump [misc_luma_table](0, 0)
    end dump
    start dump [noise_table](0, 0)
    end dump
    start dump [misc_table](0, 0)
    end dump
    
  • 调试信息分析

    ./config/dump_config得到的是/proc/mi_modules/common/里各文件的信息,含panel size、DBC Value、motion_table、motion_hdmi_dtv_table、motion_comp_pc_table、misc_param_table、misc_luma_table、noise_table、misc_table等。

  • 参数分析

    参数 描述
    panel PanelName LCD屏名称
    Intftype LCD屏接口类型:
    E_MAPI_PNL_INTF_TTL = 0, ///< TTL type
    E_MAPI_PNL_INTF_LVDS, ///< LVDS type
    E_MAPI_PNL_INTF_RSDS, ///< RSDS type
    E_MAPI_PNL_INTF_MINILVDS, ///< TCON
    ///< Analog TCON
    E_MAPI_PNL_INTF_ANALOG_MINILVDS,
    ///< Digital TCON
    E_MAPI_PNL_INTF_DIGITAL_MINILVDS,
    E_MAPI_PNL_INTF_MFC, ///< Ursa (TTL output to Ursa)
    E_MAPI_PNL_INTF_DAC_I, ///< DAC output
    E_MAPI_PNL_INTF_DAC_P, ///< DAC output
    ///< For PDP(Vsync use Manually MODE)
    E_MAPI_PNL_INTF_PDPLVDS,
    E_MAPI_PNL_INTF_EXT, ///< EXT LPLL TYPE
    E_MAPI_PNL_INTF_MIPI_DSI,
    E_MAPI_PNL_INTF_BT656,
    E_MAPI_PNL_INTF_BT601,
    E_MAPI_PNL_INTF_BT1120, ///< BT1120
    E_MAPI_PNL_INTF_MCU_TYPE, ///< MCU Type
    E_MAPI_PNL_INTF_SRGB, ///< sRGB
    E_MAPI_PNL_INTF_TTL_SPI_IF,
    timing LCD屏显示输出时序:
    DISPLAYTIMING_MIN = 0,
    DISPLAYTIMING_DACOUT_DEFAULT = 0,
    DISPLAYTIMING_DACOUT_FULL_HD,
    DISPLAYTIMING_DACOUT_480I,
    DISPLAYTIMING_DACOUT_480P,
    DISPLAYTIMING_DACOUT_576I,
    DISPLAYTIMING_DACOUT_576P, // 5
    DISPLAYTIMING_DACOUT_720P_2997,
    DISPLAYTIMING_DACOUT_720P_50,
    DISPLAYTIMING_DACOUT_720P_5994,
    DISPLAYTIMING_DACOUT_720P_60,
    DISPLAYTIMING_DACOUT_1080P_24,
    DISPLAYTIMING_DACOUT_1080P_25,
    DISPLAYTIMING_DACOUT_1080P_30, // 12
    DISPLAYTIMING_DACOUT_1080P_2997,
    DISPLAYTIMING_DACOUT_1080I_50,
    DISPLAYTIMING_DACOUT_1080P_50,
    DISPLAYTIMING_DACOUT_1080P_5994,
    DISPLAYTIMING_DACOUT_1080I_60,
    DISPLAYTIMING_DACOUT_1080P_60,
    DISPLAYTIMING_DACOUT_1440P_50,
    DISPLAYTIMING_DACOUT_1440P_60,
    DISPLAYTIMING_DACOUT_1470P_24,
    DISPLAYTIMING_DACOUT_1470P_30,
    DISPLAYTIMING_DACOUT_1470P_60,
    DISPLAYTIMING_DACOUT_2205P_24,
    // For 2k2k
    DISPLAYTIMING_DACOUT_2K2KP_24, // 23
    DISPLAYTIMING_DACOUT_2K2KP_25,
    DISPLAYTIMING_DACOUT_2K2KP_30,
    DISPLAYTIMING_DACOUT_2K2KP_60,
    // For 4k0.5k
    DISPLAYTIMING_DACOUT_4K540P_240,
    // For 4k1k
    DISPLAYTIMING_DACOUT_4K1KP_30,
    DISPLAYTIMING_DACOUT_4K1KP_60,
    DISPLAYTIMING_DACOUT_4K1KP_120,
    // For 4k2k
    DISPLAYTIMING_DACOUT_4K2KP_24,
    DISPLAYTIMING_DACOUT_4K2KP_25,
    DISPLAYTIMING_DACOUT_4K2KP_30, // 33
    DISPLAYTIMING_DACOUT_4K2KP_50,
    DISPLAYTIMING_DACOUT_4K2KP_60,
    DISPLAYTIMING_DACOUT_4096P_24,
    DISPLAYTIMING_DACOUT_4096P_25,
    DISPLAYTIMING_DACOUT_4096P_30,
    DISPLAYTIMING_DACOUT_4096P_50,
    DISPLAYTIMING_DACOUT_4096P_60,
    // For VGA OUTPUT
    DISPLAYTIMING_VGAOUT_640x480P_60,
    DISPLAYTIMING_VGAOUT_1280x720P_60,
    DISPLAYTIMING_VGAOUT_1024x768P_60,
    DISPLAYTIMING_VGAOUT_1366x768P_60,
    DISPLAYTIMING_VGAOUT_1280x800P_60,
    DISPLAYTIMING_VGAOUT_1280x1024P_60,
    DISPLAYTIMING_VGAOUT_1440x900P_60,
    DISPLAYTIMING_VGAOUT_1600x1200P_60,
    DISPLAYTIMING_VGAOUT_1680x1050P_60,
    DISPLAYTIMING_VGAOUT_1920x1080P_60, // 43
    // For TTL output
    DISPLAYTIMING_TTLOUT_480X272_60,
    DISPLAYTIMING_DACOUT_4K2KP_120,
    DISPLAYTIMING_USER,
    DISPLAYTIMING_MAX_NUM,
    pq enable   判断pq 是否enable
    pq table size   pq table size的值
    DBC Value   暂时无效果
    motion_table   暂时无效果
    motion_hdmi_dtv_table   暂时无效果
    motion_comp_pc_table   暂时无效果
    misc_param_table   暂时无效果
    misc_luma_table   暂时无效果
    noise_table   暂时无效果
    misc_table   暂时无效果


5.2. mi_log_info

5.2.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_log_info
    
    ---------------- Log Path ------------------------
    log path:  
    ---------------- Store Path ----------------------
    store path:  /mnt
    ---------------- Module Log Level ----------------
    Log module        Level
    --------------------------
    mi_ive            2(WRN)
    mi_vdf            2(WRN)
    mi_venc           2(WRN)
    mi_rgn            2(WRN)
    mi_ai             2(WRN)
    mi_ao             2(WRN)
    mi_vif            2(WRN)
    mi_vpe            2(WRN)
    mi_vdec           2(WRN)
    mi_sys            2(WRN)
    mi_fb             2(WRN)
    mi_hdmi           2(WRN)
    mi_divp           2(WRN)
    mi_gfx            2(WRN)
    mi_vdisp          2(WRN)
    mi_disp           2(WRN)
    mi_os             2(WRN)
    mi_iae            2(WRN)
    mi_md             2(WRN)
    mi_od             2(WRN)
    mi_shadow         2(WRN)
    mi_warp           2(WRN)
    mi_uac            2(WRN)
    mi_ldc            2(WRN)
    mi_sd             2(WRN)
    mi_panel          2(WRN)
    mi_cipher         2(WRN)
    mi_sensor         2(WRN)
    mi_wlan           2(WRN)
    mi_ipu            2(WRN)
    mi_mipitx         2(WRN)
    mi_gyro           2(WRN)
    mi_jpd            2(WRN)
    mi_isp            2(WRN)
    mi_scl            2(WRN)
    mi_wbc            2(WRN)
    mi_dsp            2(WRN)
    mi_pcie           2(WRN)
    mi_dummy          2(WRN)
    
    help example:
    echo mi_sys=2 > /proc/mi_modules/mi_log_info 
    echo mi_vdisp=1 > /proc/mi_modules/mi_log_info 
    echo log=/mnt > /proc/mi_modules/mi_log_info 
    echo storepath=/mnt > /proc/mi_modules/mi_log_info
    
  • 调试信息分析

    说明了默认的log path 或 store path 以及 各module的debug_level的值,同时给出了help example。

  • 参数分析

    参数 描述
    mi_log_info log path 暂时无效果
    store path 暂时无效果
    Log module 各个模块的名称
    Level 打印等级

5.2.2. echo

功能
修改模块debug_level
命令 echo [ModID]=[Level] > /proc/mi_modules/mi_log_info
参数说明 [ModID] 模块的名字
mi_ive / mi_vdf / mi_venc / mi_rgn
mi_ai / mi_ao / mi_vif / mi_shadow
mi_vdec / mi_sys / mi_fb / mi_hdmi
mi_gfx / mi_vdisp / mi_disp / mi_od
mi_os / mi_iae / mi_md
[Level]
0 无Debug信息 (MI_DBG_NONE)
1 只显示error的信息 (MI_DBG_ERR)
2 显示level<=2的信息 (MI_DBG_WRN)
3 显示level<=3的信息 (MI_DBG_API)
4 显示level<=4的信息 (MI_DBG_KMSG)
5 显示level<=5的信息 (MI_DBG_INFO)
6 显示level<=6的信息 (MI_DBG_DEBUG)
7 显示 level<=7的信息 (MI_DBG_TRACE)
8 显示所有信息 (MI_DBG_ALL)
举例 echo mi_sys=2 > /proc/mi_modules/mi_log_info mi_sys 的debug_level修改为2
功能
修改log的路径
命令 echo log=[Path] > /proc/mi_modules/mi_log_info
参数说明 [Path] 路径
举例 echo log=/mnt > /proc/mi_modules/mi_log_info
功能
修改存储log的路径
命令 echo storepath=[Path] > /proc/mi_modules/mi_log_info
参数说明 [Path] 路径
举例 echo storepath=/mnt > /proc/mi_modules/mi_log_info

5.3. mi_global_info

5.3.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_global_info
    miu_and_lx_info:
    ARM_MIU0_BUS_BASE 0x20000000       ARM_MIU0_BASE_ADDR 0x0
    ARM_MIU1_BUS_BASE 0x200000000       ARM_MIU1_BASE_ADDR 0x80000000
    ARM_MIU2_BUS_BASE 0xffffffffffffffff       ARM_MIU2_BASE_ADDR 0xffffffffffffffff
    lx_mem_addr  0x20000000     lx_mem_size  0x3ffe0000
    lx_mem2_addr 0xffffffff     lx_mem2_size 0xffffffff
    lx_mem3_addr 0xffffffff     lx_mem3_size 0xffffffff
    
    KernelProtect IP white list:
        clientId                                    name
            0x70                                   CPU_W
            0x0f                                MCU51_RW
            0x12                              USB20_H_RW
            0x11                                USB20_RW
            0x10                                USB30_RW
            0x17                                 EMAC_RW
            0x18                                EMAC1_RW
            0x13                                 SD30_RW
            0x14                               SDIO30_RW
            0x04                               AESDMA_RW
            0x07                                URDMA_RW
            0x02                                 BDMA_RW
            0x03                              MOVDMA0_RW
            0x16                                 SATA_RW
            0x00                                    NONE
            0x00                                    NONE
    
    MmuProtect IP white list:
        clientId                                    name
            0x05                                 CMDQ0_R
            0x06                                 CMDQ1_R
            0x70                                   CPU_W
            0x73                                   CPU_R
            0x20                                VCODEC_R
            0x21                                VCODEC_W
            0x00                                    NONE
            0x00                                    NONE
            0x00                                    NONE
            0x00                                    NONE
            0x00                                    NONE
            0x00                                    NONE
            0x00                                    NONE
            0x00                                    NONE
            0x00                                    NONE
            0x00                                    NONE
    
    Sigmastar Module mi_sys version: project_commit.81f869a sdk_commit.513c3cc build_time.20211029104555
    
  • 调试信息分析

    该调试信息提供了全局global的一些信息。

  • 参数分析

    参数 描述
    miu_and_lx_info(以只有一个MIU为例) ARM_MIU0_BUS_BASE Miu0 bus base
    ARM_MIU0_BASE_ADDR Miu0 base addr
    lx_mem_addr Linux镜像占的memory的起始地址(属于cpu bus address)
    lx_mem_size Linux镜像占的memory的size
    kernelProtect IP white list clientId Miu protect的IP白名单里的IP的id(从未分group的角度看的全局的id)
    name 与clientId对应的该IP的实际的名字
      PAGE_OFFSET The virtual address of the start of the kernel image
    TASK_SIZE The maximum size of a user space task
    VMALLOC_START The start address of vmalloc memory
    VMALLOC_END The end address of vmalloc memory
    Sigmastar Module mi_sys version project_commit project对应的commit
    sdk_commit sdk对应的commit
    build_time sdk的build时间


5.4. mi_bufqueue_status

5.4.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_bufqueue_status
    

  • 调试信息分析

    Dump当前各modules的enable input/output port 相关Queue的信息。

  • 参数分析

    参数 描述
    dump Queues in input port only for enabled port ModId 该 input port 所在的 module id。
    DevId 该 input port 所在的 device id。
    ChnId 该 input port 所在的 channel id。
    PassId 该 input port 所在的 pass id。
    InPortId 该 input port 的 id。
    UsrInjectQ_cnt 该 InputPort中UsrInjectBufQueue 里的buffer 数目。
    BindInQ_cnt 该 InputPort中UsrPipeInBufQueue 里的buffer 数目。
    InputPendingQueueSize 该 InputPort 的cur_working_input_queue里的 buffer 总size。
    dump Queues in output port only for enabled port ModId 该output port所在的module id。
    DevId 该 output port 所在的 device id。
    ChnId 该 output port 所在的 channel id。
    PassId 该 output port 所在的 pass id。
    OutPortId 该 output port 的 id。
    DrvBkRefFifoQ_cnt 该 OutputPort 的 DrvBkRefFifoQueue里的 buffer 数目。
    DrvBkRefFifoQ_size 该 OutputPort 的 DrvBkRefFifoQueue里的 buffer 的总 size。
    UsrGetFifoQ_cnt 该 OutputPort 的UsrGetFifoBufQueue 里的 buffer 数目。
    UsrGetFifoQ_size 该 OutputPort 的UsrGetFifoBufQueue 里的 buffer的总 size。


5.5. mi_dump_buffer_delay_worker

5.5.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_dump_buffer_delay_worker
    
    delay_worker_id  module_name  force_stop  dev_id  chn_id  port_type  port_id  Queue_name
            0            mi_disp        0          0       0     inport       0      BindInput
    stored_dir  dump_method  dump_method_value 
        /mnt       bunfnum            2
    
  • 调试信息分析

    /proc/mi_modules/mi_dump_buffer_delay_worker 文件是和 mi_modulenamedevid相连的一个概念,dump device 里的 Queue 里的 buffer 采用的是 delay worker 的方式实现的,可以通过对mi_dump_buffer_delay_worker 的 cat 操作查看还有哪些 delay worker 正在进行中,echo force_stop_dump delay_worker_id 强制结束指定的一个 delay worker 过程。

  • 参数说明

    参数 描述
    delay_worker_id 该 delay worker 的 id。如果 delay worker 完成的话,该 id 会回收,给后续其他的 delay worker 作为 id 使用。
    module_name 该 delay worker 所对应的 module 的 id。
    force_stop 该 delay worker 当前是否处于强制结束阶段,1 表示已经被设置了强制结束,0 表示未被设置。
    dev_id 该 delay worker 所对应的 device id。
    chn_id 该 delay worker 所对应的 channel id。
    port_type 该 delay worker 所对应的 port 的 type,是 input port或outputport。
    port_id 该 delay worker 所对应的 port 的 id。
    Queue_name 该 delay worker 所对应的 Queue 的 name。
    stored_dir 该 delay worker 所对应的要 dump 的 data 所要存放的绝对路径(不含最终存放的文件名)。
    dump_method 该 delay worker 所对应的 dump 方法: bufnum 或 time 或 start。
    dump_method_value Dump 方法所对应的值。

5.5.2. echo

功能
强制结束 delay worker
命令 echo force_stop_dump [WorkID] >/proc/mi_modules/mi_dump_buffer_delay_worker
参数说明 [WorkID]:delay_work 的 ID
举例 echo force_stop_dump 0 > /proc/mi_modules/mi_dump_buffer_delay_worker 强制停止 delay_work 0

5.6. mi_infer_graph.py

5.6.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_infer_graph.py
    

  • 调试信息分析

    sys提供proc fs生成运行时信息的python脚本,可以将其cat出来保存到linux server上, 然后将其拷贝到文本里,然后在Linux server上使用pyhton2运行,会输出两张图片,默认的图片格式是简化版,一张是“infer_DAG”,一张是“perf_static”,其中一张输出的图片如下:

    矩形框中表示的是 channel pass name;

    线上的label表示的是从哪个input port到哪个output port,以及bind type,和source frame rate、dest frame rate。


5.7. mi_graph_contrl

5.7.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_graph_contrl
    

  • 调试信息分析

    上述命令的“dump bind”字段表示mi_infer_graph.py脚本输出的样式,”off”表示输出简化绑定关系图,”on” 表示输出详细绑定关系图。


5.7.2. echo

功能
控制python脚本输出的图片样式
命令 echo [command] >/proc/mi_modules/mi_graph_contrl
参数说明 [command] 命令:
dump bind on:控制输出详细绑定关系图
dump bind off:控制输出简化绑定关系图
举例 输出详细绑定关系图:
# echo dump bind on > /proc/mi_modules/mi_graph_contrl
# cat /proc/mi_modules/mi_infer_graph.py

5.8. debug_level

5.8.1. cat/echo

  • 调试信息

    # cat /proc/mi_modules/mi_sys/debug_level
    
    2
    
  • 调试信息分析

    为了控制打印级别,每个module(包括sys)都有各自的debug level,分别由/proc/mi_modules/mi_modulename/debug_level控制,其中disp, rgn等为modulename。上面以/proc/mi_modules/mi_sys/debug_level为例。

    功能
    打印debug警告级别
    命令 cat /proc/mi_modules/[ModuleName]/debug_level
    参数说明 [ModuleName] 模块的名字
    mi_disp / mi_gfx / mi_rgn / mi_vdec / mi_vif / mi_ai
    mi_shadow / mi_vdisp / mi_ao / mi_hdmi / mi_sys / mi_venc
    举例 cat /proc/mi_modules/mi_sys/debug_level
    2
    mi_sys 的debug警告级别为2(显示warning和error的信息)
    功能
    修改警告级别
    命令 echo [Level] > /proc/mi_modules/[ModuleName]/debug_level
    参数说明 [Level]
    0 无Debug信息 (MI_DBG_NONE)
    1 只显示error的信息 (MI_DBG_ERR)
    2 显示level<=2的信息 (MI_DBG_WRN)
    3 显示level<=3的信息 (MI_DBG_API)
    4 显示level<=4的信息 (MI_DBG_KMSG)
    5 显示level<=5的信息 (MI_DBG_INFO)
    6 显示level<=6的信息 (MI_DBG_DEBUG)
    7 显示 level<=7的信息 (MI_DBG_TRACE)
    8 显示所有信息 (MI_DBG_ALL)
    [ModuleName] 模块的名字
    mi_disp / mi_gfx / mi_rgn / mi_vdec / mi_vif
    mi_ai / mi_vdisp / mi_ao / mi_hdmi / mi_sys / mi_venc
    举例 echo 1 > /proc/mi_modules/mi_vdec/debug_level
    将mi_vdec 模块的警告级别修改为只显示error的信息

5.9. debug_file

5.9.1. echo

  • 调试信息

    # echo mi_sys_impl.c > /proc/mi_modules/mi_sys/debug_file
    
  • 调试信息分析

    用于debug时使能文件mi_sys_impl.c里的所有level等级的DBG log信息都可以在串口打印。

  • 参数说明

    参数 描述
    命令 echo [fileName] … > /proc/mi_modules/mi_xxx/debug_file
    表示运行时使能打印函数fileName里的所有level等级的DBG log信息,可以同时使能多个函数,函数之间用空格隔开。
    echo > /proc/mi_modules/mi_xxx/debug_file
    表示关闭之前已打开的函数fileName的所有level等级的打印功能,此时函数fileName里的DBG log打印只能按/proc/mi_modules/mi_xxx/debug_level设置的等级打印。
    注:fileName必须属于对应的mi_xxx模块。
    参数说明 [mi_xxx] 表示MI模块名称,可取:
    mi_disp / mi_gfx / mi_rgn / mi_vdec / mi_vif / mi_ai
    mi_shadow / mi_vdisp / mi_ao / mi_hdmi / mi_sys / mi_venc

5.10. debug_func

5.10.1. echo

  • 调试信息

    # echo MI_SYS_IMPL_Init > /proc/mi_modules/mi_sys/debug_func
    
  • 调试信息分析

    用于debug时使能函数MI_SYS_IMPL_Init()里的所有level等级的DBG log信息都可以在串口打印。

  • 参数说明

    参数 描述
    命令 echo [funcName] … > /proc/mi_modules/mi_xxx/debug_func
    表示运行时使能打印函数funcName里的所有level等级的DBG log信息,可以同时使能多个函数,函数之间用空格隔开。
    echo > /proc/mi_modules/mi_xxx/debug_func
    表示关闭之前已打开的函数funcName的所有level等级的打印功能,此时函数funcName里的DBG log打印只能按/proc/mi_modules/mi_xxx/debug_level设置的等级打印。
    注:funcName必须属于对应的mi_xxx模块。
    参数说明 [mi_xxx] 表示MI模块名称,可取:
    mi_disp / mi_gfx / mi_rgn / mi_vdec / mi_vif / mi_ai
    mi_shadow / mi_vdisp / mi_ao / mi_venc / mi_hdmi / mi_sys

5.11. module_version_file

5.11.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_ai/module_version_file
    
    Sigmastar Module mi_ai version: project_commit.81f869a sdk_commit.513c3cc build_time.20211029104555
    
    # cat /proc/mi_modules/mi_global_info
    
    Sigmastar Module mi_sys version: project_commit.81f869a sdk_commit.513c3cc build_time.20211029124046
    
  • 调试信息分析

    /proc/mi_modules/mi_modulename/module_version_file 提供了份version信息,/proc/mi_modules/mi_global_info里我们也提供了份version信息,不过其本质上指的是mi_sys模块的version信息,上面只是以mi_ai 和 mi_global_info 为例子,每个模块都有自己对应的version file。

  • 参数说明

    参数 描述
    Version Info project_commit 模块编译ko时的整包project commit,如果单独替换ko,模块基于的commit有变化,ko version里得到的commit也会变更。
    sdk_commit 模块编译ko时的整包sdk commit,如果单独替换ko,模块基于的commit有变化,ko version里得到的commit也会变更。
    build_time 实际的build时间,精确到秒,即使make clean;make image整体来build的话,各个ko的时间也会有差别。


5.12. show threads

5.12.1. echo

  • 调试信息

    # echo show_threads > /proc/mi_modules/mi_sys/mi_sys0
    

  • 调试信息分析

    查看当前所有线程的 call stack 状态。

    • 该命令可以帮组查询&定位死锁问题。

    • 该命令打印较多,最好放在kmsg中打印,以免被其他信息污染。


5.13. debug_frc

5.13.1. echo

  • 调试信息

    # echo debug_frc on 12 0 0 0 0 "out" > /proc/mi_modules/mi_sys/mi_sys0
    
  • 调试信息分析

    printk in _MI_SYS_IMPL_Common_WriteProc,

    Switch enable debug FRC, Modid:12, Dev:0, Chn:0, Pass:0, Port:0, BufType:1,使能帧率控制debug开关

  • 参数说明

    参数 描述
    命令 Switch enable debug FRC:
    echo debug_frc on [Modid] [Devid] [Chnid] [Passid] [Portid] [in/out] > /proc/mi_modules/mi_sys/mi_sys0
    打开帧率控制debug开关
    Switch disable debug FRC:
    echo debug_frc off > /proc/mi_modules/mi_sys/mi_sys0
    关闭帧率控制debug开关
    参数说明 [Modid] : module id
    [Devid] : device id
    [Chnid] : channel id
    [Passid] : pass id
    [Portid] : port id
    [in/out] : input/output方向

5.14. set_outputport_depth

5.14.1. echo

  • 调试信息

    # echo set_ouputport_depth 6 0 0 0 0 0 2 4 > /proc/mi_modules/mi_sys/mi_sys0
    
  • 参数说明

    参数 描述
    命令 Set output port depth:
    echo set_ouputport_depth [Modid] [Devid] [Chnid] [Passid] [Portid] [u32userFrameDepth] [u32BufQueueDepth] > /proc/mi_modules/mi_sys/mi_sys0
    参数说明 [Modid] : module id
    [Devid] : device id
    [Chnid] : channel id
    [Passid] : pass id
    [Portid] : port id
    [u32userFrameDepth]: 设置该output用户可以拿到的buf最大数量
    [u32BufQueueDepth]: 设置该output系统buf最大数量

5.15. set_thread_priority

5.15.1. echo

  • 调试信息

    # echo set_thread_priority 8 849 99 > /proc/mi_modules/mi_sys/mi_sys0
    
  • 参数说明

    参数 描述
    命令 set_thread_priority by pid:
    echo set_thread_priority 8 [pid] [u32Priority] > /proc/mi_modules/mi_sys/mi_sys0
    参数说明 [pid]: 线程pid
    [u32Priority]: 需要设定的线程等级

5.16. mmu debug

5.16.1. echo

  • 调试信息

    # echo debug_mmu debug_log 1 1 1 33,34 > /proc/mi_modules/mi_sys/mi_sys0
    
  • 参数说明

    参数 描述
    命令 Enable/disable alloc/free buf log:
    echo debug_mmu debug_log [enable/disable] [enable/disable free] [enable/disable alloc] [module id list] > /proc/mi_modules/mi_sys/mi_sys0
    参数说明 [enable/disable] :enable or disable
    [module id list]: module list, Separated by commas
  • 举例

    1.echo debug_mmu debug_log 1           --- enable alloc/free buf log
    2.echo debug_mmu debug_log 1 0         --- enable free buf log
    3.echo debug_mmu debug_log 1 1 0       --- enable alloc buf log
    4.echo debug_mmu debug_log 1 1 1 33,34    --- enable ISP & SCL alloc/free buf log
    5.echo debug_mmu debug_log 1 0 1 33,34    --- enable ISP & SCL free buf log
    6.echo debug_mmu debug_log 1 1 0 33,34    --- enable ISP & SCL alloc buf log
    

5.16.2. insmod

  • 调试信息

    # insmod /config/modules/4.9.227/mi_sys.ko bDebugMmu=1
    
  • 参数说明

    参数 描述
    命令 For debug memory access out of bounds:
    insmod /config/modules/4.9.227/mi_sys.ko bDebugMmu=1/bDebugMmu=0
    # Depends on enable mmu
    参数说明 bDebugMmu=1 :enable
    bDebugMmu=0 :disable
    default disable

5.17. set_inputport_pattern

5.17.1. echo

  • 调试信息

    # echo set_inputport_pattern 33 0 0 0 0 1 > /proc/mi_modules/mi_sys/mi_sys0
    
  • 调试信息分析

    设置使能ModId33 DevId0 ChnId0 PassId0 InputPortId0 ,此时pipeline中ModId33模块只会保留有一张buf数据向后级模块传递数据(ModId33与后级模块的bindtype需要设置为frame mode),用于debug定位是哪个ModId的buf数据有问题。

  • 参数说明

    参数 描述
    命令 echo set_inputport_pattern [Modid] [Devid] [ChnId] [PassId] [InputPortId] [bEnable] > /proc/mi_modules/mi_sys/mi_sys0
    设置ModId的某个inputPort只保留一张buf数据,来向后级ModId传递数据(该ModId与后级ModId的bindType需要设置为frame mode),用于debug定位是哪个ModId的buf数据有问题。
    参数说明 [Modid] : module id.
    [Devid] : device id.
    [ChnId] : channel id.
    [PassId] : pass id.
    [inputPortId] : inputPort Id.
    [bEnable] : 是否使能,0/1.

5.18. mi_sys0

5.18.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_sys/mi_sys0
    

  • 调试信息分析

    该命令显示了当前设备pipeline时,各modId模块数据流buf处理的相关信息。

  • 参数说明

    参数 描述
    (mod-dev-chn info) module module Id,取值:
    mi_disp / mi_gfx / mi_rgn / mi_vdec / mi_ai / mi_shadow / mi_vdisp / mi_ao / mi_hdmi / mi_sys / mi_venc / mi_vif
    devId device Id
    chn channel Id
    pre
    (咨询当前modId是否可以处理buf的handleinfo)
    suc 当前modId已成功预处理buf的次数
    busy 当前modId处于busy的次数
    drop 当前modId对预处理的buf进行drop操作的次数
    Enq
    (将buf添加到当前modId的队列中的handleinfo)
    run 当前modId enqueue操作返回处于running状态的次数
    done 当前modId已处理完成queue里buf的次数
    retry 当前modId重新尝试处理queue中buf的次数
    drop 当前modId将queue中待处理的buf drop掉的次数
    bar cmdq相关
    checkin
    (inputport buf handleinfo)
    run 当前modId处理inputport buf操作返回处于running状态的次数
    done 当前modId已处理完成inputport里的buf个数
    retry 当前modId重新尝试处理inputport buf的系数
    drop 当前modId将待处理的inputport buf drop掉的次数
    checkout
    (outputport buf handleinfo)
    run 当前modId处理outputport buf操作返回处于running状态的次数
    done 当前modId已处理完成outputport里buf的次数
    retry 当前modId重新尝试处理outputport buf的次数
    drop 当前modId将待处理的outputport buf drop掉的次数


5.19. miu_protect

5.19.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_sys_mma/miu_protect
    
    =============  start miu_protect_info  ==================
    LX :
    cpu_start_addr:0x20000000    size:0x3ffe0000
    
    miu_index   miuBlockIndex   start_cpu_bus_pa   length
    
            miu_index  miuBlockIndex    start_cpu_bus_pa    end_cpu_bus_pa   length
    Hex:          0             11           812b2000          816ac000      3fa000
    
        MmuProtect IP white list:
        clientId                                    name
            0x70                                   CPU_W
            0x73                                   CPU_R
            0x20                                VCODEC_R
            0x21                                VCODEC_W
    
            miu_index  miuBlockIndex   start_cpu_bus_pa   end_cpu_bus_pa   length
    Hex:          0             10         180000000        180300000      300000
    
        MmuProtect IP white list:
        clientId                                    name
            0x05                                 CMDQ0_R
            0x06                                 CMDQ1_R
            0x70                                   CPU_W
            0x73                                   CPU_R
    
            miu_index  miuBlockIndex   start_cpu_bus_pa   end_cpu_bus_pa   length
    Hex:          0              0          20000000         40000000      20000000
    
        KernelProtect IP white list:
        clientId                                    name
            0x70                                   CPU_W
            0x0f                                MCU51_RW
            0x12                              USB20_H_RW
            0x11                                USB20_RW
            0x10                                USB30_RW
            0x17                                 EMAC_RW
            0x18                                EMAC1_RW
            0x13                                 SD30_RW
            0x14                               SDIO30_RW
            0x04                               AESDMA_RW
            0x07                                URDMA_RW
            0x02                                 BDMA_RW
            0x03                              MOVDMA0_RW
            0x16                                 SATA_RW
    
            miu_index  miuBlockIndex   start_cpu_bus_pa   end_cpu_bus_pa    length
    Hex:          0              1          5f000000          5ffe0000      fe0000
    
        KernelProtect IP white list:
        clientId                                    name
            0x70                                   CPU_W
            0x0f                                MCU51_RW
            0x12                              USB20_H_RW
            0x11                                USB20_RW
            0x10                                USB30_RW
            0x17                                 EMAC_RW
            0x18                                EMAC1_RW
            0x13                                 SD30_RW
            0x14                               SDIO30_RW
            0x04                               AESDMA_RW
            0x07                                URDMA_RW
            0x02                                 BDMA_RW
            0x03                              MOVDMA0_RW
            0x16                                 SATA_RW
    
  • 调试信息分析

    该命令显示了miu protect相关的信息。

  • 参数分析

    参数 描述
    LX
    (以只有一个LX为例,LX表示linux 镜像对应的memory)
    cpu_start_addr 该LX对应的起始CPU addr。
    size 该LX对应的size。
    某个kernel protect 的range的相关信息 miu_index 编号。
    miuBlockIndex miu个数范围的编号信息。
    start_cpu_bus_pa 该range的起始cpu bus addr。
    length 该range的length。
    KernelProtect IP white list clientId Miu protect的IP白名单里的IP的id(从未分group的角度看的全局id)。
    name 与clientId对应的该IP的实际的名字。


5.20. mma_heap_name0

5.20.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_sys_mma/mma_heap_name0 
    heap_info:
            heap_name     pa_start       length         avail
        mma_heap_name0    40000000     1f000000      1b238000
    heap_param:
            mmuEnable    addsize_before   addsize_after   delayUnmap  freeEntryNum
                    1                0            0             0           361
    
    main_chunk_mgr:
            vpa_start      length       avail      used       HighPeak      LowPeak
            60000000    20000000   1c238000   3dc8000      40c5000       d40000
            ------------------------------------------------------------------------------------------------------
                offset    length      used_flag    task_name       pid       Module
                   0      300000           1         CMDMEM         -1       mi_sys
                300000      1000           1       sys-logConfig    -1       mi_sys
                301000     40000           1       sys-logBuffer    -1       mi_sys
                341000    1fb000           1        vif0-out0-0     867      mi_vif
                53c000    1fb000           1        vif0-out0-0     867      mi_vif
                737000    1fb000           1        vif0-out0-0     867      mi_vif
                932000    3fa000           1       mma_heap_codec   -1       mi_sys
                d2c000     21000           1        ven_mv_0        867      mi_venc
                d4d000     23000           1        ven_fcty_0      867      mi_venc
                d70000     12000           1        ven_fctc_0      867      mi_venc
                d82000     41000           1        ven_rdo_0       867      mi_venc
                dc3000      1000           1        ven_inst_0      867      mi_venc
                dc4000      1000           1        venc-algo-m     867      mi_venc
                dc5000     60000           0           NA           -1       mi_sys
                e25000     a3000           1        ISP_STATIS      867      mi_isp
                ec8000      1000           1        ISP_WDR         867      mi_isp
                ec9000     22000           1        DNR_INFO1       867      mi_isp
                eeb000    32a000           1        DNR_INFO0       867      mi_isp
                1215000     6000           1       ISP_IDX_CMDQ     867      mi_isp
                121b000    10000           1       ISP_CMDQ         867      mi_isp
                122b000     4000           1       ISP_MLOAD        867      mi_isp
                122f000   152000           1       RingHeapAlloc    -1       mi_sys
                1381000   1a6000           0          NA            -1       mi_sys
                1527000     4000           1       ISP_MLOAD        867      mi_isp
                152b000   3f5000           1       venc-ring-mem0   867      mi_venc
                1920000   3b1000           1        ven_rec_0_0     867      mi_venc
                1cd1000   2fd000           0           NA           -1       mi_sys
                1fce000  2000000           1      venc-ring-mem1    867      mi_venc
                3fce000   2fd000           1       scl0-out0-0      867      mi_scl
                42cb000  1bd35000          0           NA           -1       mi_sys
    
    (mma_heap_codec)sub_chunk_mgr:
            vpa_start      length        avail       used      HighPeak    LowPeak
            60932000       3fa000        2df000     11b000      11b000        0
    
            ------------------------------------------------------------------------------------------------------
                offset    length     used_flag    task_name        pid     Module
                  0       ea000           1       vcodec_dev        -1     mi_venc
                ea000     31000           1     ven_work_ven_ta     -1     mi_venc
                11b000    2df000          0          NA             -1     mi_sys
    
    (CMDMEM)sub_chunk_mgr:
            vpa_start        length          avail
            60000000         300000          195000
    
            ------------------------------------------------------------------------------------------------------
                offset     length     used_flag      cmdq_id       pid     ModDev
                  0        20000           0            -1         -1         NA
                20000      16b000          1             1          0      mi_isp0
                20000      16b000          1             1          0      mi_scl0
                20000      16b000          1             1          0      mi_venc8
                18b000     175000          0            -1         -1         NA
    
  • 调试信息分析

    该cat信息对应的是该mma heap的基本信息和当前的一些状态。

  • 参数分析

    参数 描述
    heap_info heap_name mma heap的name
    pa_start heap的起始PA
    length mma heap的length
    avail heap里剩余未用的memory总量
    heap_param mmuEnable 表示是否启用HW_MMU,1为启用,0为不启用
    addrsize_before 设置在申请的buf前多申请预留的size大小
    addrsize_after 设置在申请的buf后多申请预留的size大小
    delayUnmap buf free时是否开启延时unmap当前申请的buf,当下次再被申请时,先unmap再map
    1:开启延时unmap
    0:关闭延时unmap
    freeEntryNum 空闲的entry的个数
    main_chunk_mgr vpa_start main chunk mgr的起始地址,如果开启HW_MMU,该地址为vpa,否则为pa(对应名字会显示pa_start)。main chunk mgr涵盖了整个mma heap的大小。
    length chunk mgr管理的整个mma vpa length,由于整个mma heap做为一个chunk mgr,因此当关闭mmu时,该值等于mma heap length;当开启mmu时,该值大于mma heap length。
    avail chunk mgr(即heap)里的剩余的未用的memory的总量
    used chunk mgr(即heap)里已使用的memory的总量
    HighPeak 统计的一段时间内的内存峰值
    LowPeak 统计的一段时间内的内存谷值
    offset 该chunk在chunk mgr里的offset
    length 该chunk的length
    used_flag 该chunk是否被alloc出去使用了。是的话该值为1;否则free状态的话该值为0。
    task_name 如果used flag为1,则task_name里存的是哪个task使用的它;否则该值为无效值NA。
    pid 暂时无效
    Module 该chunk被哪个Module使用了
    (mma_heap_codec)
    sub_chunk_mgr
    (mma_heap_codec)
    sub_chunk_mgr
    属于main chunk mgr的子chunk mgr,对应task name里的mma_heap_codec,显示的参数表示的意思请参考main chunk mgr。
    sub chunk mgr默认不会打印,需要下命令才会打印。下命令后,有可能没有sub chunk mgr,或者会有不止一个sub chunk mgr打印出来。
    需要下的命令为 echo show_privMma 1 > /proc/mi_modules/mi_sys/mi_sys0
    (CMDMEM)
    sub_chunk_mgr
    (CMDMEM)
    sub_chunk_mgr
    属于main chunk mgr的子chunk mgr,对应task name里的CMDMEM。此sub chunk mgr会默认打印,表示cmdq使用mma buf的情况。
    vpa_start (CMDMEM)sub chunk mgr的起始地址,如果开启HW_MMU,该地址为vpa,否则为pa(对应名字会显示pa_start)。
    length 分配给cmdq的mma buf大小
    avail cmdq剩余可使用的mma buf大小
    offset 该cmdq申请的buf在名为CMDMEM mma buf中的起始offset
    length 该cmdq在名为CMDMEM mma buf中申请的mma buf大小
    used_flag 该buf是否被alloc出去使用了。是的话该值为1;否则free状态的话该值为0。
    cmdq_id 使用buf对应cmdq的id
    pid 暂时无效
    ModDev 申请cmdq buf的module以及对应的device id


5.20.2. echo

功能
即dump 指定offset和length的data到指定的路径
命令 echo [Path] [Offset] [Length] > /proc/mi_modules/mi_sys_mma/mma_heap_name[Num]
参数说明 [Path] 文件要保存的路径,只需提供路径,系统会根据参数自动生成对应的文件名。
[Offset] 从该mma heap的offset开始dump data,必须4KB对齐。
[Length] 在该mma heap里dump的总数据量, 必须4KB对齐
[Num] mma head 对应的数字,目前 mma_heap_name0 可通过 cat /proc/cmdline 查看
举例 echo /mnt/ 0 4096 > /proc/mi_modules/mi_sys_mma/mma_heap_name0
在 /mnt下产生 mma__mma_heap_name0__0__4096.bin 文件

5.21. imi_mma_heap

5.21.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_sys_mma/imi_mma_heap 
        mma heap         nameheap_base_cpu_bus_addr     length     chunk_mgr_avail       mmuEnable              addsize_before       addsize_after         bMmuDelayUnmap         free_entry_num
        imi_mma_heap          20000000                   43800               26800                   0                          0                   0                       0                          0
    chunk_mgr info:
                offset     length    avail      used      HighPeak      LowPeak
                    0      43800     26800     1d000        1d000          0
    
    each chunk info:
                offset     length      used_flag  task_name     pid      Module
                  0        1d000           1       SRAM         -1       mi_venc
                1d000      26800           0         NA         -1       mi_sys
    
  • 调试信息分析

    该cat信息对应的是该mma heap的基本信息和当前的一些状态。

  • 参数分析

    参数 描述
    heap basic info mma heap name mma heap 的 name
    heap_base_cpu_bus_addr 该allocator里的allocations中未被使用的数目
    length heap 的 length
    chunk_mgr_avail heap 里的剩余的未用的 memory 的总量
    mmuEnable Mma heap 是否支持 HW_MMU。该值为 1 表示支持,为 0 表示不支持
    addrsize_before 设置在申请的buf前多申请预留的size大小
    addrsize_after 设置在申请的buf后多申请预留的size大小
    bMmuDelayUnmap buf free时是否开启延时unmap当前申请的buf,当下次再被申请时,先unmap再map
    1:开启延时unmap
    0:关闭延时unmap
    free_entry_num 空闲的entry的个数
    chunk_mgr info offset chunk mgr 的 offset,由于整个 mma heap 做为一个 chunk mgr,因此该值永远为 0。allocator里的逻辑offset。
    length chunk mgr 的 length,由于整个 mma heap 做为一个 chunk mgr,因此该值永远为 mma heap length。
    avail chunk mgr (即heap)里空闲的memory的总量
    used chunk mgr(即heap)里已使用的memory的总量
    HighPeak 统计的一段时间内的内存峰值
    LowPeak 统计的一段时间内的内存谷值
    each chunk info (chunk mgr 里各 chunk 的信息和使 用情况) offset 该 chunk 在 chunk mgr 里的 offset
    length 该 chunk 的 length
    used_flag 该 chunk 是否被 alloc 出去使用了。是的话该值为 1;否则 free 状态的话该值为 0。
    task_name 如果 used flag 为 1,则 task_name里存的是哪个 task 使用的它;否则该值为无效值 NA。
    pid 该 chunk 所属的current->tgid
    Module 该 chunk 所属的模块


5.22. meta

5.22.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_sys_mma/meta
    
    ===================  start meta_info  =========================
    basic info:
    total page count:16        each meta data size:256    total_count_with_metadatasize  256    total_free_count_with_metadatasize:254
    meta info :
    ref_cnt=3  
    each allocation info:
    offset_in_pool   length    phy_addr       va_in_kern        real_used_flag
    0x0              0x100     0x2336000      c1736000             0
    0x100            0x100     0x2336100      c1736100             0
    0x200            0x100     0x2336200      c1736200             0
    0x300            0x100     0x2336300      c1736300             0
    0x400            0x100     0x2336400      c1736400             0
    0x500            0x100     0x2336500      c1736500             0
    0x600            0x100     0x2336600      c1736600             0
    0x700            0x100     0x2336700      c1736700             0
    0x800            0x100     0x2336800      c1736800             0
    0x900            0x100     0x2336900      c1736900             0
    0xa00            0x100     0x2336a00      c1736a00             0
    ……
    ===================  end meta_info  ================================
    
  • 调试信息分析

    只要用过meta allocator(只有一个meta allocator),就会生成/proc/mi_modules/mi_sys_mma/meta,且其对应的memory就会完全alloc,等待被使用。


5.22.2. echo

功能
即dump 指定offset和length的data到指定的路径
命令 echo [Path] [Offset] [Length] > /proc/mi_modules/mi_sys_mma/ vb_pool_global
参数说明 [Path] 文件要保存的路径,只需提供路径,系统会根据参数自动生成对应的文件名。
[Offset] 从该allocator的哪个offset开始dump data,是allocator的逻辑offset。
[Length]在该allocator里dump的总的数据量的大小。
举例 echo /mt 0 1024 > /proc/mi_modules/mi_sys_mma/meta
在 /mnt 下产生 meta__0__1024.bin

5.23. mi_modulenamedevid

5.23.1. cat

  • 调试信息

    cat /proc/mi_modules/mi_scl/mi_scl0
    

  • 调试信息分析

    cat操作的结果是分为2部分的,第一部分是MI_SYS提供的针对该device的通用的调试信息,从device、channel、input port、output port四个角度提供;第二部分是该device私有的信息。私有的信息各module的内容别处会阐述,这里SYS角度只阐述通用的信息。

    以cat /proc/mi_modules/mi_scl/mi_scl0为例,得到上面的结果。

  • 参数说明

    参数 描述
    Common info for device ChnNum 该device的总的channel 的数目。
    EnChnNum 该device的enabled了的channel的数目。
    PassNum 该device的pass的数目。
    InPortNum 该device的input port的数目。
    OutPortNum 该device的output port的数目。
    CollectSize 该dev对应的AllocatorCollection含有的allocator的数目总和。
    CMDQ kickoff counter PassId 该device使用到cmdq的pass id。
    CmdqId 使用的cmdq的id。
    TotalKickoff 该cmdq当前kickoff的次数。
    kickoffFence 该cmdq当前kickoff时的fence值。
    Idle 该cmdq当前kickoff时的Idle次数。
    DevId 该mi module的device id。
    current_buf_size 该device当前使用的buf大小。
    Peak_buf_size 该device使用buf的峰值。
    each dev buf info offset Buf开始的offset。
    length Buf的长度。
    used_flag 记录buf是否使用的flag。
    task_name 使用这块buf的task name。
    Common info for channel(only dump enabled channel) ChnId Channel 的id值。
    PassNum Pass的id值。
    EnInPNum 该channel的enabled input port数量。
    EnOutPNum 该channel的enabled output port数量。
    MMAHeapName 如果有SetChnMMAConf的话,该值为对应的mma heap name;如果没有设置的话,该值为NULL。
    current_buf_size 该channel当前使用的buf size。
    Peak_buf_size 该channel使用buf的目前峰值。
    user_pid 该channel对应的pid。
    each chn buf info offset 该channel使用buf的起始offset。
    length Buf的长度。
    used_flag 记录buf是否使用的flag。
    task_name 该buf对应的task name。
    chn pass pipeline delay in us Flow 流程点:
    OnPreProcessInputTask:MI PASS判断是否需要处理当前task,如果可以给output buffer配置;
    EnqueueInputTask:将input task 交由MI PASS开始处理;
    BarrierInputTask:插入CMDQ同步指令(比如waitevent, polling engine done);
    CheckInputTaskStatus:检查input task是否完成,及完成状态(成功,失败,etc);
    DequeueInputTask:通知MI PASS释放input task相关联的资源;
    OnPollingAsyncOutputTaskConfig:对于输入输出不同步的MI Pass,或者只有输出没有输入的MI Pass,MI SYS查询是否有独立output buf request需求;
    EnqueueAsyncOutputTask:将非同步输出的output task交由MI PASS做处理;
    BarrierAsyncOutputTask:对非同步output task插入cmdq同步指令;
    CheckOutputTaskStatus:检查output task是否完成,及完成状态(成功,失败,etc);
    DequeueOutputTask:通知MI PASS释放output task相关联的资源;
    FinDMADispatch:MI SYS将MI PASS的output task中的buffer传递到绑定的下级MI PASS的input queue。
    Min Buffer产生到该MI PASS对应Flow所经过的最小延时。
    Max Buffer产生到该MI PASS对应Flow所经过的最大延时。
    Avg Buffer产生到该MI PASS对应Flow所经过的平均延时。
    Diff Buffer产生到该MI PASS对应Flow所经过的当前延时。
    Input port common info(only dump enabled Input port) ChnId 该input port所在的channel id。
    PassId 该 input port 所在的 pass id。
    PortId 该input port的id。
    user_buf_quota 该InputPort的buff数目的Quota。
    UsrInjectQ_cnt 该InputPort 里的UsrInjectBufQueue(usr inject进来还没处理完成的buf队列)里的buff数目。
    BindInQ_cnt 该InputPort 里的BindInputBufQueue(由绑定前级enq进来还没处理完成的buf队列)里的buff数目。
    TotalPendingBuf_size 该inputPort的cur_working_input_queue(还没开始处理,即将处理)里面各个buf的size总和。
    usrLockedInjectCnt 用户当前拿到了多少个buf。
    newPulseQ_cnt 该inputPort在new_pulse_fifo_inputqueue(input port buf缓存队列0)的buf数目。
    nextTodoPulseQ_cnt 该inputPort在new_todo_pulse_inputqueue(input port buf缓存队列1)的buf数目。
    curWorkingQ_cnt 该inputPort在cur_working_input_queue(还没开始处理,即将处理)的buf数目。
    workingTask_cnt 该inputPort在input_working_tasklist(正在处理的input task的列表)的task数目。
    lazzyRewindTask_cnt 该inputPort在lazzy_rewind_inputtask_list(即将回退到cur_working_input_queue队列中task列表)的task数目。
    Enable 标记该input port是否enable。
    bind_module_id 与该input port 进行了binded的output port所在的module的id。
    bind_module_name 与该input port 进行了binded的output port所在的module的name。
    bind_DevId 与该input port 进行了binded的output port所在的device的id。
    bind_ChnId 与该input port 进行了binded的output port所在的channel的id。
    bind_PortId 与该input port 进行了binded的output port的id。
    bind_Type 绑定模式。
    bind_Param 该input port进行bind时所带的参数。
    enable 标记绑定的output port是否enable。
    SrcFrmrate Src帧率。
    DstFrmrate Dst帧率。
    GetFrame/Ms 统计的帧数/统计所耗的时间。
    FPS 实际帧率。
    FinishCnt 该Input port finish buf的个数。
    RewindCnt 该Input port rewind buf的个数。
    DropCnt 该Input port drop buf的个数。
    Output port common info (only dump enabled Output port) ChnId 该output port所在的channel的id。
    PassId 该output port所在的pass的id。
    PortId 该output port的id。
    usrDepth User最多可以拿到的output buf数量。
    BufCntQuota 该OutputPort的 buff数目的Quota。
    usrLockedCnt 从UsrGetFifoBufQueue(用户获取output port buf的队列)里用户实际拿走了多少个buffer。
    totalOutPortInUsed totalOutputPortInUsedBuf数目。
    DrvBkRefFifoQ_cnt 该OutputPort的DrvBkRefFifoQueue(驱动预处理队列,目前没用到)里的buffer数目。
    DrvBkRefFifoQ_size 该OutputPort的DrvBkRefFifoQueue(驱动预处理队列,目前没用到)里的buffer的总size。
    UsrGetFifoQ_cnt 该OutputPort的UsrGetFifoBufQueue(用户获取output port buf的队列)里的buffer数目。
    UsrGetFifoQ_size 该OutputPort的UsrGetFifoBufQueue(用户获取output port buf的队列)里的buffer的总size。
    UsrGetFifoQ_seqnum 被加到UsrGetFifoBufQueue(用户获取output port buf的队列)的buf总个数。
    UsrGetFifoQ_discardnum 由于UsrGetFifoBufQueue(用户获取output port buf的队列)满了而被discard的buf个数。
    workingTask_cnt 当前在output_working_tasklist(正在处理的output task的列表)的task总个数。
    finishedTask_cnt 当前在output_finished_tasklist(已经处理完成还没推到下一级的列表)的task总个数。
    GetFrame/Ms 统计的帧数/统计所耗的时间。
    FPS 实际帧率。
    FinishCnt 该output port finish buf的总个数。
    RewindCnt 该output port rewind buf的总个数。
    GetTotalCnt 向mi_sys申请output buf的总次数。
    GetOkCnt 向mi_sys申请output buf成功的次数。
    BindPeerInputPortList ChnId 该output port所在的channel的id。
    PassId 该output port所在的pass的id。
    PortId 该output port的id。
    Enable 标记该output是否enable。
    bind_module_id 与该output port 进行了binded的input port list中的其中一个input port(以下简称该binded input port)所在的module的id。
    bind_module_name 该binded input port所在的module的name。
    bind_DevId 该binded input port所在的device id。
    bind_ChnId 该binded input port所在的channel id。
    bind_PortId 该binded input port的id。
    bind_Type 绑定模式。
    bind_Param 绑定时所下的参数。
    enable 标记已绑定的input port是否enable。

5.23.2. echo

功能
获得模块的help信息
命令 echo help > /proc/mi_modules/[ModName]/[ModID]
参数说明 [ModName] 模块的名字
mi_disp / mi_gfx / mi_rgn / mi_vdec / mi_scl / mi_ai / mi_isp / mi_shadow / mi_vdisp / mi_ao / mi_hdmi / mi_sys / mi_venc / mi_vif
[ModID] 模块中对应的文件一般为模块的名字+数字
如mi_disp0 / mi_gfx0 / mi_rgn0
举例 echo help > /proc/mi_modules/mi_disp/mi_disp0
得到mi_disp0 节点文件的帮助信息
功能
Dump Port 的信息
命令 echo dump_buffer [ChnID] [PortType] [PortID] [QueueName][Path] [EndMethod] > /proc/mi_modules/[ModName]/[ModID]
参数说明 [ChnID] 通道的ID
[PortType] iport 或 oport 分别代表input port output port
[PortID] 该port的id
[QueueName] 如果是input port,值只能是"UsrInject" 或者"BindInput" , 如果是output port,值只能是"UsrGetFifo"
[Path] 数据保存的文件路径。注意是绝对路径,系统会根据参数自动生成文件名,不同的buffer保存在不同的文件
[EndMethod] dump buffer的结束方法。仅支持三类:
(1) "bufnum=xxx":dump指定数目的buffer
(2) "time=xxx"(unit: ms):dump过程持续time对应的时间
(3) "start/end" pair:用start开始dump,用end结束dump,使用时其他5个参数需完全一致。
[ModName] 模块的名字
mi_disp / mi_gfx / mi_rgn / mi_vdec / mi_scl / mi_ai / mi_isp / mi_shadow / mi_vdisp / mi_ao / mi_hdmi / mi_sys / mi_venc / mi_vif
[ModID] 模块中对应的文件, 一般为模块的名字+数字
举例 echo dump_buffer 0 iport 0 BindInput /mnt bufnum=1 > /proc/mi_modules/mi_disp/mi_disp0
dump disp模块 iport 的数据

5.24. mem_stat

5.24.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_sys_mma/mem_stat
          mi_sys
                    CMDMEM               c0000
                sys-logBuffer            40000
                sys-logConfig            1000
                    TotalSize            101000
                 AllTotalSize            101000
    
  • 调试信息分析

    打印出mi sys 内存状态。

  • 参数说明

    参数 描述
    Mem_stat mi_sys 所属mi_sys模块
    CMDMEM Cmd的内存大小
    sys-logBuffer Sys log最大可申请的buf大小
    sys-logConfig 分配(申请)给sys log的buf大小
    TotalSize ModuleUsdTotalSize 模块使用的size
    AllTotalSize 总的size