跳到主要内容

MPP 介绍与入门

MPP(Media Process Platform)媒体处理软件平台,分为 mpp-middleware 和 mpp-framework 两部分。mpp-middleware 是底层组件层,提供视频和音频的采集、处理、编码、解码等功能,支持硬件加速,适用于各种应用场景。mpp-framework 是面向应用层的多媒体框架,针对特定产品(如CDR、SDV)进行了API封装,简化了开发过程,但灵活性较差,适用性较为有限。MPP平台的核心功能包括视频音频的录制和播放,支持多通道、硬件加速、流媒体等,广泛应用于智能设备、车载系统、安防监控等领域。

MPP 平台在 menuconfig 中提供了丰富的配置选项,用户可以根据项目需求选择所需的组件、音频3A算法库、音视频编解码库等。select mpp sample 选项包含多个示例程序,覆盖不同功能,供用户编译和试用。示例源码展示了如何调用 MPP 平台的各类组件,帮助用户参考和开发自己的应用。

image-20241119103907753

MPP 设计了一套功能多样的接口,涵盖视频和音视频的采集、处理、编码、解码等功能。下表是MPP提供的组件与功能:

功能组件
组件管理和系统相关mpi_sys
视频采集(v4l2)mpi_vi
视频采集(usbCamera)mpi_uvc
ISP效果mpi_isp
视频编码mpi_venc
osd叠加区域管理mpi_region
音频采集mpi_ai
音频编码mpi_aenc
字幕编码(目前为gps信息)mpi_tenc
文件封装mpi_mux
文件解封装mpi_demux
视频解码mpi_vdec
视频输出mpi_vo
音频解码mpi_adec
音频输出mpi_ao
时钟管理mpi_clock

MPP 配置

MPP 配置页

使用 make menuconfig 进入 SDK 应用配置界面,选择 Allwinner 选项

image-20241119104210501

选择 eyesee-mpp

image-20241119104231645

即可进入 MPP 的配置界面

image-20241119104335544

MPP 配置项说明

eyesee-mpp-dragonboard

MPP 产测工具,用于生产测试阶段,可以勾选 run automatically at startup in tina 选项自动运行方便产测,仅产测时需要使用。

image-20241119104546328

eyesee-mpp-external

MPP 模块的第三方库,用于给MPP提供基础支持,例如lz4,json支持。客户一般无需配置。

image-20241119104628423

eyesee-mpp-framework

mpp-framework是全志自研产品CDR、SDV的app使用的多媒体框架,内部调用mpp-middleware层的各种组件完成相关功能。mpp-framework的API根据CDR,SDV等产品的使用场景定制

image-20241119104853422

eyesee-mpp-middleware

mpp-middleware组件层。提供各类音视频的采集、处理、编码、解码等组件,ISP支持,客户需重点关注此部分内容

image-20241119105023948

在eyesee-mpp-middleware中,提供了大量的示例Sample以供参考

image-20241119110701436

eyesee-mpp-private

提供了 onvif,rtsp协议的支持库

image-20241119111003962

eyesee-mpp-system

提供系统控制相关功能

image-20241119111102076

MPP 编译

这里以编译 MPP Sample sample_smartIPC_demo 为例,演示如何编译 MPP

首先运行 MPP 配置页,找到 select mpp sample,按空格选中

image-20241118164505217

找到 mpp sample smartIPC_demo,按空格选中

image-20241118164525565

退出配置页面,使用make命令编译 SDK,编译后的 sample 会在 platform/allwinner/eyesee-mpp/middleware/sun300iw1/sample/bin 目录下,由于一般 MPP Sample 比较大,所以默认不会编译进入 rootfs

image-20241119111800259

MPP 相关快捷命令

为方便客户快速跳转到源码位置,SDK编写了若干shell文件提供了快捷跳转函数,在工程目录下也编写了shell文件提供MPP源码的跳转函数:

命令跳转位置
cmpp_popenwrt/package/allwinner/eyesee-mpp/middleware
cmpp_splatform/allwinner/eyesee-mpp/middleware/sun300iw1
cispplatform/allwinner/eyesee-mpp/middleware/sun300iw1/media/LIBRARY/libisp
clibcedarc_popenwrt/package/allwinner/multimedia/tina_multimedia/libcedarc_mpp
clibcedarc_splatform/allwinner/multimedia/libcedarc_mpp/sun300iw1
cfw_popenwrt/package/allwinner/eyesee-mpp/framework
cfw_splatform/allwinner/eyesee-mpp/framework/sun300iw1
crtsp_popenwrt/package/allwinner/eyesee-mpp/private/rtsp
crtsp_splatform/allwinner/eyesee-mpp/system/private/rtsp
cpdet_popenwrt/package/allwinner/vision/person_detection
cpdet_sopenwrt/package/allwinner/vision/person_detection
cmpplibsout/v821/ipc/openwrt/staging_dir/target/usr/lib/eyesee-mpp
cmppheadersout/v821/ipc/openwrt/staging_dir/target/usr/include/eyesee-mpp
clibcedarcheadersout/v821/ipc/openwrt/staging_dir/target/usr/include/libcedarc
mkmpp编译libcedarc, mpp-middleware
cleanmpp清理mpp-middleware和libcedarc
mkall编译整个工程
cleanall清理整个工程

MPP 库整合使用

如果客户想把mpp的头文件和库导入到自己的SDK中去使用,方法如下:

  1. 编译 Tina-v821 sdk,编译指令参考tina-sdk的说明文档。编译完之后,无需反复编译了。

  2. 执行 mkmpp,编译 mpp 平台代码。编译完后,在 out 目录下就生成了mpp的头文件和库,libcedarc的头文件和库。

  3. 执行 cmppheaders 跳转到mpp头文件目录,执行 cmpplibs 跳转到mpp库目录,执行clibcedarcheaders 跳转到 libcedarc 头文件目录,把头 文件目录和库目录复制到自己的SDK里面就可以了。

mpp头文件目录为:out/v821/ipc/openwrt/staging_dir/target/usr/include/eyesee-mpp

mpp库目录为:out/v821/ipc/openwrt/staging_dir/target/usr/lib/eyesee-mpp

libcedarc头文件目录为:out/v821/ipc/openwrt/staging_dir/target/usr/include/libcedarc

libcedarc库目录为:out/v821/ipc/openwrt/staging_dir/target/usr/lib

libcedarc是全志的视频编解码库。libcedarc库没有单独建目录,而是放在通用目录下,所以拷贝时最好指定库的名称,v821一般编译出 的视频编解码库有以下这些:

libawmjpegplus.a
libvdecoder.a
libvideoengine.a
libvencoder.a
libvenc_jpeg.a
libvenc_h264.a
libvenc_common.a
libvenc_base.a
libMemAdapter.a
libVE.a
libcdc_base.a

软件框架

MPP平台的设计思想是根据功能划分组件。每个组件负责一个单一功能。通过把各种组件组合起来完成复杂功能。

组件内部核心代码设计借鉴了OpenMaxIL协议规范,在此协议基础上进一步精简接口。OpenMaxIL协议的tunnel和non-tunnel模式,对应组 件对外的绑定和非绑定模式。组件间的绑定,实质是组件内部核心模块之间建立了隧道链接互传数据。为和OpenMaxIL协议代码区分,该 协议定义的OMX前缀的宏定义、函数声明在MPP平台内的头文件中均改为COMP前缀。

OpenMaxIL协议网站是: https://www.khronos.org/openmaxil

组件的代码实现分为两层:

组件层次

外层提供mpi风格的API,实现通道的概念,建立通道的链表对组件实例进行管理。通过调用内层组件的接口来实现API功能。

内层为Component核心代码。Component的模板代码为"mm_component.h",Component注册、创建、操作机制的代码放在mm_component.c 中。Component调用更底层的库(如视频编解码库、音频编解码库,libisp库,音频3A算法库,音频变速库,文件解封装库,文件封装 库,alsa-lib,v4l2驱动)实现具体功能。

以mpi_venc组件为例:

  • 外层API: mpi_venc.h,mpi_venc.c
MPP_API:
AW_MPI_VENC_CreateChn()
AW_MPI_VENC_DestroyChn()
AW_MPI_VENC_StartRecvPic()
AW_MPI_VENC_StopRecvPic()
AW_MPI_VENC_GetStream()
AW_MPI_VENC_ReleaseStream()
AW_MPI_VENC_RegisterCallback()
AW_MPI_VENC_SendFrame()
  • 内层Component: VideoEnc_Component.c
Component API:

typedef struct MM_COMPONENTTYPE
{
void* pComponentPrivate;
void* pApplicationPrivate;
ERRORTYPE (*SendCommand)();
ERRORTYPE (*GetConfig)();
ERRORTYPE (*SetConfig)();
ERRORTYPE (*GetState)();
ERRORTYPE (*ComponentTunnelRequest)();
ERRORTYPE (*EmptyThisBuffer)();
ERRORTYPE (*FillThisBuffer)();
ERRORTYPE (*SetCallbacks)();
ERRORTYPE (*ComponentDeInit)();
} MM_COMPONENTTYPE;
  • 视频编码库: vencoder.h
VideoEncoder *VencCreate(VENC_CODEC_TYPE eCodecType);
void VencDestroy(VideoEncoder *pEncoder);
int VencInit(VideoEncoder *pEncoder, VencBaseConfig *pConfig);
int VencStart(VideoEncoder *pEncoder);
int VencPause(VideoEncoder *pEncoder);
int VencReset(VideoEncoder *pEncoder);
int VencFlush(VideoEncoder *pEncoder, VencFlushType eFlushType);
int VencGetParameter(VideoEncoder *pEncoder, VENC_INDEXTYPE indexType, void *paramData);
int VencSetParameter(VideoEncoder *pEncoder, VENC_INDEXTYPE indexType, void *paramData);
int VencDequeueOutputBuf(VideoEncoder *pEncoder, VencOutputBuffer *pBuffer);
int VencQueueOutputBuf(VideoEncoder *pEncoder, VencOutputBuffer *pBuffer);
int VencQueueInputBuf(VideoEncoder *pEncoder, VencInputBuffer *inputbuffer);
int VencSetCallbacks(VideoEncoder *pEncoder, VencCbType *pCallbacks, void *pAppData);

mpi_venc组件的代码类图如下:

mpi_venc类图

组件的状态统一设计为下图:

组件状态图

在创建通道过程中,Component刚创建时处于LOADED状态,配置完Component后,转换为IDLE状态。所以app一般在创建完通道后,组件状 态就已经是IDLE状态。随后app可以调用mpi接口,将组件转换为EXECUTING、PAUSE、IDLE状态,最后销毁组件。

MPP 常用调试节点

mpp可以为若干硬件驱动生成proc节点,挂载在debugfs文件系统下,供使用者在系统运行过程中实时查看驱动的运行信息。

配置内核 make kernel_menuconfig,打开配置 CONFIG_SUNXI_MPP 即可生成proc节点。

系统启动后,在终端执行命令:mount -t debugfs none /sys/kernel/debug,挂载debugfs文件系统(默认自动挂载)。然后通过cat指令查看mpp节点信息:

cat /sys/kernel/debug/mpp/vi
cat /sys/kernel/debug/mpp/ve*
cat /sys/kernel/debug/mpp/vo

静态属性:指只能在系统未初始化、未启用设备或通道时,才能设置的属性。 动态属性:指在任何时刻都可以设置的属性。

VI 节点

cat /sys/kernel/debug/mpp/vi

输出示例:

*****************************************************
VIN hardware feature list:
mcsi 2, ncsi 1, parser 2, isp 1, vipp 2, dma 2
CSI_VERSION: CSI300_600, ISP_VERSION: ISP603_100
CSI_CLK: 200000000, ISP_CLK: 0
*****************************************************
vi0:
gc1084_mipi => mipi0 => csi0 => isp0 => vipp0
input => hoff: 0, voff: 0, w: 1280, h: 720, fmt: GRBG10
output => width: 1280, height: 720, fmt: LBC_1X
interface: MIPI, isp_mode: NORMAL, hflip: 0, vflip: 0
prs_in => x: 1280, y: 720, hb: 2432, hs: 6451
bkuf => cnt: 4 size: 1429504 rest: 4, work_mode: online
frame => cnt: 306, lost_cnt: 7, error_cnt: 0
internal => avg: 34(ms), max: 34(ms), min: 33(ms)
CSI Bandwidth: 0
*****************************************************
vi4:
(efault) => mipi0 => csi0 => isp0 => vipp4
input => hoff: 0, voff: 0, w: 0, h: 0, fmt: NULL
output => width: 0, height: 0, fmt: NULL
interface: NULL, isp_mode: NORMAL, hflip: 0, vflip: 0
prs_in => x: 0, y: 0, hb: 0, hs: 0
bkuf => cnt: 0 size: 0 rest: 0, work_mode: online
frame => cnt: 0, lost_cnt: 0, error_cnt: 0
internal => avg: 0(ms), max: 0(ms), min: 0(ms)
CSI Bandwidth: 0
*****************************************************

参数说明:

参数描述
mcsiMIPI通道号,0/1
ncsiDVP通道号,0
parser图像数据解析通道号,0/1/2/3
ispISP通道号,0/1
vippVI通道号,0~12
input => hoff输入图像水平偏移
input => voff输入图像垂直偏移
input => w输入图像宽度
input => h输入图像高度
input => fmt输入图像格式,RAW:RGGB/BGGR/GRBG/GBRG,YUV:
output => width输出图像宽度
output => height输出图像高度
output => fmt输出图像格式:RAW8/10/12,YUV420等,LBC_1/1.5/2/2.5X
interface接口类型:PARALLEL/MIPI/BT656/SUBLVDS/HISPI
isp_modeISP模式:NORMAL/DOL_WDR/CMD_WDR/SEHDR
hflip输出图像水平(镜像)翻转:0/1
vflip输出图像垂直翻转:0/1
prs_in => xparser输入数据宽度
prs_in => yparser输入数据高度
prs_in => hb行消隐时间
prs_in => hs行同步时间
bkbuf => cnt图像buffer个数
bkbuf => size图像buffer大小
bkbuf => rest空闲图像buffer个数
bkbuf => work_mode图像编码模式:offline/online
tdmbuf => cntTDM buffer个数
tdmbuf => sizeTDM buffer大小
tdmbuf => cmp_ratioTDM LBC 压缩系数
ispbuf => cntISP 3DNR buffer个数
ispbuf => sizeISP 3DNR buffer大小
ispbuf => cmp_ratioISP 3DNR 压缩系数
frame => cnt图像帧计数
frame => lost_cnt图像丢帧计数
frame => error_cnt图像异常帧计数
internal => avg图像帧间隔平均值(ms)
internal => max图像帧间隔最大值(ms)
internal => min图像帧间隔最小值(ms)

VE_BASE 节点

cat /sys/kernel/debug/mpp/ve_base

输出示例:

**********Ch[0] H264 F240 BaseInfo Start**********
Version: 4a182bd42c931bea2f77b0ff9a531d233df8541e
Link: Isp2Ve:1 Ve2Isp:0, Sharp:1
Online: Mode:1, Chan:0, BufNum:1, Overwrite:0
Input: LBC1.0X BT709Full 1280(1280)x720->1280x720, Rot:0
BaseSpec: 1048576bps, 30fps, 100Key
RateCtrl: StaticIPC, VBR(new,BalanceQuality), NormalP, IpcCase, Colour
Qp: Limit:1, Init:37, I[25,45,45], P[25,45,45]
BitRate(Kbps): Avg:863, Act:136
FrameRate(fps): Avg:29, Act:30
VBV(Byte): Total:1445888, Unused:1445568, Valid:320, FrmNum:1, Th:921600
Ref(Byte): LBC1.5X, Reduce:1, Lbc:61440+1314816, Qsub:6144+118784
CurrPic: PQp:27, Bits:23631->2304
Drop: User:0, Lib:0
HwTime(us): Enc{Cur:4914, Avg:4945, Max:0}, Empty{Cur:29115, Avg:29098, Max:29404}
SwTime(us): Num:241, Enc{Cur:1730, Avg:2684, Max:6105}, Empty{Cur:32304, Avg:31212, Max:44385}, Mb:1069, Bin:0, Sei:0,Pskip:0
**********Ch[0] H264 F240 BaseInfo End**********

参数说明:

类别描述
标题信息Ch: 编码通道号,0/1/2/3
H265: 编码类型,H264/H265/MJPEG
F240: 编码输出的总帧数。F代表Frame,240表示截止目前输出总帧数为240帧
Version编码库版本,对应的commit ID
Link联动锐化配置信息:
Isp2Ve: 获取ISP->VE的信息
Ve2Isp: VE的滤波信息反馈给ISP,ISP调节滤波参数
Sharp: 编码锐化使能,0:不使能,1:使能
Online在线编码参数:
Mode: 不支持应用配置,当前默认Mode为1。1:轮询编码(默认),0:非轮询编码(每个编码通道一个线程)
Chan: 编码通道在线(1)/离线(0)
BufNum: 在线编码CSI与VE共享buffer个数,0/1/2。
Overwrite: 在线编码模式下,发生数据覆盖次数
Input编码输入配置,分别为:
InputFormat: 编码像素格式,支持YUV格式和LBC压缩格式。例如YUV420SP。
ColorSpace: 颜色空间。例如BT709Full。
PicSize: 编码输入分辨率(编码输入VI buffer的实际宽度)->(编码输入裁剪水平坐标,编码输入裁剪垂直坐标)编码输入裁剪分辨率->编码输出分辨率。例如 1280(1280)x720->(320,160)640x360->1280x720
Rot: 编码旋转角度,0°/90°/180°/270°
BaseSpec用户设置的编码基础信息。
bitrate: 用户设置的码率,单位bps。例如1048576bps。
framerate: 用户设置的帧率,单位fps。例如30fps。
I帧帧间隔: 例如100Key表示I帧帧间隔是100。即每100个视频帧包含一个I帧。
RateCtrl码率控制参数:
ProductMode: 编码预设设备模型默认参数。支持StaticIPC(固定类IPC设备)、MovingIPC(移动类IPC设备)、Doorbell(门锁类设备)、CDR(行车记录仪)、SDV(运动相机)、Projection(投影类设备)、UAV(无人机类图传设备)、Others(其他设备)。本例中是StaticIPC。
RcMode: 码控模式,CBR/VBR/FixQp。本例中VBR(new,BalanceQuality)表示VBR新码控。
GopMode: NormalP: 正常连续单个参考帧结构,DoubleP: 双参考帧,SmartP: 跳帧参考。编码库判断的编码场景: 例如IpcCase表示编码库判断是ipc场景。彩色/灰度图: Colour表示彩色图。
QpLimit: MB级QP受限制使能,1:MB级QP也限制在帧级QP允许范围内波动,0:不使能
Init: 初始QP,取值范围[1,50]
IQp: 最小/最大I帧QP/初始I帧QP,取值范围[1,50]。例如I[25,45,45]
PQp: 最小/最大P帧QP/初始P帧QP,取值范围[1,50]。例如P[25,45,45]
BitRate(Kbps)编码输出实际码率信息:
Avg: 到目前为止的平均码率,按编码器拿到的VI Buffer的时间戳每隔一秒更新一次,单位:Kbps。例如109表示109Kbps。
Act: 实际最近一秒内的瞬时码率,按编码器拿到的VI Buffer的时间戳每隔一秒更新一次,单位:Kbps。例如49表示49Kbps。
FrameRate(fps)编码输出实际帧率信息:
Avg: 到目前为止的平均帧率,按编码器拿到的VI Buffer的时间戳每隔一秒更新一次,单位:fps。例如29表示29fps。
Act: 实际最近一秒内的瞬时帧率,按编码器拿到的VI Buffer的时间戳每隔一秒更新一次,单位:fps。例如30表示30fps。
VBV(Byte)编码输出VBV buffer信息:
Total: VBV buffer总长度。
Unused: VBV buffer剩余可用空间。
Valid: VBV buffer已占用空间。
ValidFrmNum: 占用VBV buffer未归还的帧数量。
Th: VBV buffer设定的阈值。剩余空间超过阈值才允许编码。
Ref(Byte)编码库内部参考帧信息:
RecFormat: 参考帧压缩格式。支持LBC1.5X(默认)、LBC2.0X、LBC2.5X、no lsssy(无损格式)。本例为LBC1.5X。
Reduce: 1:启用参考帧省内存,即参考帧与重建帧共用buffer。0:不启用。
Lbc: 主参考+重建图索引信息消耗字节数,本例为61440字节。主参考+重建图压缩数据消耗字节数,本例为1314816字节。
Qsub: 1/4参考+重建图索引信息消耗字节数,本例为6144字节。1/4参考+重建图压缩数据消耗字节数,本例为118784字节。
CurrPic编码当前帧的信息:
当前帧的QP: PQp表示当前帧是P帧,SliceQp值是28。
Bits: 当前帧的目标比特数和实际比特数。本例中,希望编码为27642比特,实际编码出2368比特。
Drop编码丢帧信息:
User: 用户设置的主动丢帧数量。
Lib: 编码过程中的异常丢帧数量。
HwTime(us)硬件线程统计时间: EncCur:硬件处理当前帧耗时,本例为4973微秒, Avg:硬件处理每帧平均耗时,本例为4982微秒, Max:硬件处理一帧最大耗时,本例为0(可能有统计错误)
硬件线程处理相邻两帧间隔耗时: EmptyCur:硬件处理当前帧间隔耗时,本例为28048微秒, Avg:硬件处理每帧间隔平均耗时,本例为29061微秒, Max:硬件处理间隔最大耗时,本例为30170微秒
SwTime(us)软件线程统计时间:
Num: 软件处理累计帧数,本例为241帧
EncCur:软件处理当前帧耗时,本例为1679微秒, Avg:软件处理每帧平均耗时,本例为1992微秒, Max:软件处理一帧最大耗时,本例为5744微秒
软件线程处理相邻两帧间隔耗时: EmptyCur:软件处理当前帧间隔耗时,本例为33299微秒, Avg:软件处理每帧间隔平均耗时,本例为31901微秒, Max:软件处理间隔最大耗时,本例为41669微秒
Mb: 统计宏块信息的耗时。本例为1055微秒。

ISP 节点

cat /sys/kernel/debug/mpp/isp

示例输出:

*****************************************************
VIN hardware feature list:
CSI_VERSION: CSI300_600, ISP_VERSION: ISP603_100
CSI_CLK: 200000000, ISP_CLK: 0
vipp0, isp_dode: NORMAL
*****************************************************
ISP0 debug param list:
===> exp: 12000, gain: 24, lum_idx: 185, coms_temp: 45
===> color_temp: 6577, rgain: 504, bgain: 435
===> contrast: 256, sharp: 256, bright: 256
===> satur: 256, tdnf: 256, bdnf: 256, pltm: 0
*****************************************************
[ISP Colorspace]
====> REC709_FULL
[ISP Cfg Version Name]
====> gc1084_mipi_isp603_20240828_190004_clean_rgb_30fps
[ISP Libs Commit Version]
====> commit: 2ea5bec2fbfd8d5018938eb9ddf0f950986bb43f
*****************************************************

参数说明:

类别参数描述
VIN硬件功能CSI_VERSIONCSI的版本
ISP_VERSIONISP的版本
CSI_CLKCSI的时钟频率,单位:Hz
ISP_CLKISP的时钟频率,单位:Hz
vippVIPP设备号
isp_mode当前ISP功能模式,NORMAL为线性模式,
DOL_WDR为WDR模式
ISP调试参数exp曝光行
gain增益(16为一倍)
lum_idxAE亮度索引
coms_tempsensor 温度(需要 sensor 驱动实现回调)
color_temp色温
rgain白平衡R分量增益
bgain白平衡B分量增益
contrastISP特效接口结点--对比度
sharpISP特效接口结点--锐度
brightISP特效接口结点--亮度
saturISP特效接口结点--饱和度
tdnfISP特效接口结点--3D降噪强度
bdnfISP特效接口结点--2D降噪强度
pltmISP特效接口结点--数字宽动态强度
ISP版本参数ISP Colorspace颜色空间类型
ISP Cfg Version NameISP效果文件版本信息
ISP Libs Commit VersionISP库的版本commit信息

MIPI 节点

cat /sys/kernel/debug/mpp/mipi

示例输出

*************** MIPI Register Status List **************
------------------ PHY COMMON Register -----------------
phy_link_mode: 0x0 (unrecognized link mode)

-------------- PHY Digital Layer Register --------------
[mipi0]
phy_en: enabled
data_lane_en: 0x1 (lane0 enabled)
clk_lane_en: enabled
deskew: 0x2
settle_time: 0x28
mipi_bps: 396 Mbps
data_lane0: 0x5 (HS_S, ok)
data_lane1: 0x0 (error)
clk_lane: 0x5 (HS_S, ok)

[mipi1]
phy_en: disabled

-------------- PORT Payload Layer Register -------------
[mipi0]
port_en: enabled
lane_num: 1 lane
channel_num: 1 channel
out_data_num: 1 data
wdr_mode: normal
unpack_en: enabled
yuv_seq: YUYV
ch_field: progressive
int_pending: 0xf (ok)
cur_data_type: 0x2b (RAW10)
vir_ch: 0

[mipi1]
port_en: disabled
********************************************************

参数说明:

类别参数描述
PHY Commonphy_link_mode当前mipi所配置的连接模式(2x2-lane 或 1x4-lane)
PHY Digitalphy_enMIPI DPHY使能位
data_lane_en数据lane使能位
clk_lane_en时钟lane使能位
deskewPHY时钟lane0延迟,软件设定的延时值
settle_timePHY时钟lane和数据lane从接收到高速RX(LP11-LP01-LP00)请求到开启高速比较器的延时,单位为cmb_clk_cycle
mipi_bpsMIPI当前数据传输速率(bps),单位为Mbps
data_lane0MIPI数据lane0的状态(正常状态:在0x03(LP11S低功耗模式)和0x05(HS_S高速模式)两个状态之间来回翻转)
data_lane1MIPI数据lane1的状态(正常状态:在0x03(LP11S低功耗模式)和0x05(HS_S高速模式)两个状态之间来回翻转)
clk_laneMIPI时钟lane0的状态(正常状态:在0x03(LP11S低功耗模式)和0x05(HS_S高速模式)两个状态之间来回翻转)
PORT Payloadport_enPORT通道使能位
lane_num当前MIPI配置的lane数(取值范围:1~4 lane,其中PORT0最高支持4 lane,PORT1最高支持2 lane)
channel_num当前MIPI配置的通道个数(取值范围:1~4 channels)
out_data_num每次输出的数据个数(取值范围:1 data 或 2 data)
wdr_mode0x0:Normal模式(无WDR/MIPI VC/MIPI DT);0x2:Pixel Data模式,通过每行的第1个Pixel data区分多路WDR图像
unpack_enMIPI CSI2协议解包使能开关
yuv_seqMIPI YUV格式传输顺序
ch_fieldMIPI输入源类型配置状态(0:progressive,输入源配置为逐行扫描数据;1:interlaced,输入源配置为隔行扫描数据)
int_pending中断pending寄存器状态(正常状态为:0x0f 或 0x4f 或 0x3f)
cur_data_typeMIPI根据收到的包头信息获取到的数据格式类型
vir_chMIPI当前的虚拟通道编号

mipi_bps 计算公式为:

mipi_bps = 1000 * dphy_clk * 8 / phy_freq_cnt

phy_freq_cnt 为PHY_FREQ_CNT寄存器值(0x0034[31:16]),表示1000个 PHY byte clk cycle 时间内的 cmb_clk_cycle 个数,用于换算 PHY0 或 PHY1 的 byte clk 频率,其中 dphy_clk 为 VIN_TOP_CLK,即CSI频率,单位为M;

MPP 打印开启方法

编码库打印等级调整

  • 开始编码前,通过以下命令调整编码库打印等级。
echo 3 > /tmp/libcedarc_dynamic_log_level

其中,3为logd等级。
设置logd等级后,logd、logi、logw、loge都可打印。

等级定义:

loge:6
logw:5
logi:4
logd:3
logv:2
  • 也可以修改/etc/cedarc.conf中的cdc_log_level配置项改变打印等级,打印等级的定义如下:
# #VERBOSE = 2,
# #DEBUG = 3,
# #INFO = 4,
# #WARNING = 5,
# #ERROR = 6,

默认为cdc_log_level = 5

MPP 平台打印等级调整

make menuconfig中配置,编译时就生效。MPP打印等级的数值越低表示等级越高。高于等于打印等级的打印编译进固件。低于打印等级的打印不编译。

#define OPTION_LOG_LEVEL_CLOSE      0
#define OPTION_LOG_LEVEL_ERROR 1
#define OPTION_LOG_LEVEL_WARN 2
#define OPTION_LOG_LEVEL_DEBUG 3
#define OPTION_LOG_LEVEL_VERBOSE 4
Allwinner
-> eyesee-mpp
-> select log level for compile (debug) --->

( ) close
( ) error
( ) warn
(X) debug
( ) verbose

再动态配置打印等级。MPP平台默认的打印等级为OPTION_LOG_LEVEL_DEBUG。允许用户在运行时动态改变打印等级,在串口终端输入指令:

echo 3 > /tmp/mpp_log_level

就表示动态设置打印等级为 3(debug等级),mpp 内部的环境变量监控线程会检测并读取 /tmp/mpp_log_level 的值,并设置给内部全局变量MPP_GLOBAL_LOG_LEVEL。当打印语句执行时,打印等级高于 debug 等级的打印语句会调用打印函数输出。MPP_GLOBAL_LOG_LEVEL默认为OPTION_LOG_LEVEL_DEBUG。但打印语句必须被编译进固件才能真正打印出来。所以make menuconfig菜单中的打印等级选项是允许的最低打印等级。

MPP 版本查询方法

编码库版本

  • 日志打印

编码库的打印等级降为LOG_LEVEL_DEBUG时,在启动时会打印版本信息。编码库初始化时从/etc/cedarc.conf读取配置,配置中包含cdc_log_level指定打印等级。默认的打印等级为cdc_log_level = 5,就是LOG_LEVEL_WARNING。修改为cdc_log_level = 3后,启动编码库查看编码库版本的打印信息如下:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Cedar Codec <<<<<<<<<<<<<<<<<<<<<<<<<<<<
tag :
branch: master
commit: 4a182bd42c931bea2f77b0ff9a531d233df8541e
date : Thu May 25 15:34:03 2017 +0800
author: none
change-id : none
release_author : jenkins8080
patch :
----------------------------------------------------------------------
  • VE调试节点

测试过程中,通过查看VE节点的调试信息可以查询编码版本信息。

cat /sys/kernel/debug/mpp/ve_base

**********Ch[0] H265 F239 BaseInfo Start**********
CommitVersion: 6d05da88d956f3b7b9327f240303e7067f8eabf2

ISP 库版本

  • 日志打印

测试时,ISP初始化时会打印版本信息。

[ISP]>>>>>>>>>>>>>>>>>>>> ISP VERSION INFO <<<<<<<<<<<<<<<<<<<
IPCORE: ISP603
branch: libisp-dev
commit: 2ea5bec2fbfd8d5018938eb9ddf0f950986bb43f
date : Thu Oct 17 11:18:04 2024 +0800
author: <mayifei@allwinnertech.com>
--------------------------------------------------------
  • ISP调试节点

测试过程中,通过查看ISP节点的调试信息可以查询ISP版本信息。

cat /sys/kernel/debug/mpp/isp 
====> commit: 14df8348718d093707641fea73eba7db962885f5