MPP 介绍与入门
MPP(Media Process Platform)媒体处理软件平台,分为 mpp-middleware 和 mpp-framework 两部分。mpp-middleware 是底层组件层,提供视频和音频的采集、处理、编码、解码等功能,支持硬件加速,适用于各种应用场景。mpp-framework 是面向应用层的多媒体框架,针对特定产品(如CDR、SDV)进行了API封装,简化了开发过程,但灵活性较差,适用性较为有限。MPP平台的核心功能包括视频音频的录制和播放,支持多通道、硬件加速、流媒体等,广泛应用于智能设备、车载系统、安防监控等领域。
MPP 平台在 menuconfig 中提供了丰富的配置选项,用户可以根据项目需求选择所需的组件、音频3A算法库、音视频编解码库等。select mpp sample
选项包含多个示例程序,覆盖不同功能,供用户编译和试用。示例源码展示了如何调用 MPP 平台的各类组件,帮助用户参考和开发自己的应用。
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 选项
选择 eyesee-mpp
即可进入 MPP 的配置界面
MPP 配置项说明
eyesee-mpp-dragonboard
MPP 产测工具,用于生产测试阶段,可以勾选 run automatically at startup in tina
选项自动运行方便产测,仅产测时需要使用。
eyesee-mpp-external
MPP 模块的第三方库,用于给MPP提供基础支持,例如lz4,json支持。客户一般无需配置。
eyesee-mpp-framework
mpp-framework是全志自研产品CDR、SDV的app使用的多媒体框架,内部调用mpp-middleware层的各种组件完成相关功能。mpp-framework的API根据CDR,SDV等产品的使用场景定制
eyesee-mpp-middleware
mpp-middleware组件层。提供各类音视频的采集、处理、编码、解码等组件,ISP支持,客户需重点关注此部分内容
在eyesee-mpp-middleware中,提供了大量的示例Sample以供参考
eyesee-mpp-private
提供了 onvif,rtsp协议的支持库
eyesee-mpp-system
提供系统控制相关功能
MPP 编译
这里以编译 MPP Sample sample_smartIPC_demo 为例,演示如何编译 MPP
首先运行 MPP 配置页,找到 select mpp sample
,按空格选中
找到 mpp sample smartIPC_demo
,按空格选中
退出配置页面,使用make命令编译 SDK,编译后的 sample 会在 platform/allwinner/eyesee-mpp/middleware/sun300iw1/sample/bin
目录下,由于一般 MPP Sample 比较大,所以默认不会编译进入 rootfs
MPP 相关快捷命令
为方便客户快速跳转到源码位置,SDK编写了若干shell文件提供了快捷跳转函数,在工程目录下也编写了shell文件提供MPP源码的跳转函数:
命令 | 跳转位置 |
---|---|
cmpp_p | openwrt/package/allwinner/eyesee-mpp/middleware |
cmpp_s | platform/allwinner/eyesee-mpp/middleware/sun300iw1 |
cisp | platform/allwinner/eyesee-mpp/middleware/sun300iw1/media/LIBRARY/libisp |
clibcedarc_p | openwrt/package/allwinner/multimedia/tina_multimedia/libcedarc_mpp |
clibcedarc_s | platform/allwinner/multimedia/libcedarc_mpp/sun300iw1 |
cfw_p | openwrt/package/allwinner/eyesee-mpp/framework |
cfw_s | platform/allwinner/eyesee-mpp/framework/sun300iw1 |
crtsp_p | openwrt/package/allwinner/eyesee-mpp/private/rtsp |
crtsp_s | platform/allwinner/eyesee-mpp/system/private/rtsp |
cpdet_p | openwrt/package/allwinner/vision/person_detection |
cpdet_s | openwrt/package/allwinner/vision/person_detection |
cmpplibs | out/v821/ipc/openwrt/staging_dir/target/usr/lib/eyesee-mpp |
cmppheaders | out/v821/ipc/openwrt/staging_dir/target/usr/include/eyesee-mpp |
clibcedarcheaders | out/v821/ipc/openwrt/staging_dir/target/usr/include/libcedarc |
mkmpp | 编译libcedarc, mpp-middleware |
cleanmpp | 清理mpp-middleware和libcedarc |
mkall | 编译整个工程 |
cleanall | 清理整个工程 |
MPP 库整合使用
如果客户想把mpp的头文件和库导入到自己的SDK中去使用,方法如下:
-
编译
Tina-v821 sdk
,编译指令参考tina-sdk的说明文档。编译完之后,无需反复编译了。 -
执行
mkmpp
,编译mpp
平台代码。编译完后,在out
目录下就生成了mpp
的头文件和库,libcedarc
的头文件和库。 -
执行
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组件的代码类图如下:
组件的状态统一设计为下图:
在创建通道过程中,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
*****************************************************
参数说明:
参数 | 描述 |
---|---|
mcsi | MIPI通道号,0/1 |
ncsi | DVP通道号,0 |
parser | 图像数据解析通道号,0/1/2/3 |
isp | ISP通道号,0/1 |
vipp | VI通道号,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_mode | ISP模式:NORMAL/DOL_WDR/CMD_WDR/SEHDR |
hflip | 输出图像水平(镜像)翻转:0/1 |
vflip | 输出图像垂直翻转:0/1 |
prs_in => x | parser输入数据宽度 |
prs_in => y | parser输入数据高度 |
prs_in => hb | 行消隐时间 |
prs_in => hs | 行同步时间 |
bkbuf => cnt | 图像buffer个数 |
bkbuf => size | 图像buffer大小 |
bkbuf => rest | 空闲图像buffer个数 |
bkbuf => work_mode | 图像编码模式:offline/online |
tdmbuf => cnt | TDM buffer个数 |
tdmbuf => size | TDM buffer大小 |
tdmbuf => cmp_ratio | TDM LBC 压缩系数 |
ispbuf => cnt | ISP 3DNR buffer个数 |
ispbuf => size | ISP 3DNR buffer大小 |
ispbuf => cmp_ratio | ISP 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表示彩色图。 | |
Qp | Limit: 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_VERSION | CSI的版本 |
ISP_VERSION | ISP的版本 | |
CSI_CLK | CSI的时钟频率,单位:Hz | |
ISP_CLK | ISP的时钟频率,单位:Hz | |
vipp | VIPP设备号 | |
isp_mode | 当前ISP功能模式,NORMAL为线性模式, | |
DOL_WDR为WDR模式 | ||
ISP调试参数 | exp | 曝光行 |
gain | 增益(16为一倍) | |
lum_idx | AE亮度索引 | |
coms_temp | sensor 温度(需要 sensor 驱动实现回调) | |
color_temp | 色温 | |
rgain | 白平衡R分量增益 | |
bgain | 白平衡B分量增益 | |
contrast | ISP特效接口结点--对比度 | |
sharp | ISP特效接口结点--锐度 | |
bright | ISP特效接口结点--亮度 | |
satur | ISP特效接口结点--饱和度 | |
tdnf | ISP特效接口结点--3D降噪强度 | |
bdnf | ISP特效接口结点--2D降噪强度 | |
pltm | ISP特效接口结点--数字宽动态强度 | |
ISP版本参数 | ISP Colorspace | 颜色空间类型 |
ISP Cfg Version Name | ISP效果文件版本信息 | |
ISP Libs Commit Version | ISP库的版本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 Common | phy_link_mode | 当前mipi所配置的连接模式(2x2-lane 或 1x4-lane) |
PHY Digital | phy_en | MIPI DPHY使能位 |
data_lane_en | 数据lane使能位 | |
clk_lane_en | 时钟lane使能位 | |
deskew | PHY时钟lane0延迟,软件设定的延时值 | |
settle_time | PHY时钟lane和数据lane从接收到高速RX(LP11-LP01-LP00)请求到开启高速比较器的延时,单位为cmb_clk_cycle | |
mipi_bps | MIPI当前数据传输速率(bps),单位为Mbps | |
data_lane0 | MIPI数据lane0的状态(正常状态:在0x03(LP11S低功耗模式)和0x05(HS_S高速模式)两个状态之间来回翻转) | |
data_lane1 | MIPI数据lane1的状态(正常状态:在0x03(LP11S低功耗模式)和0x05(HS_S高速模式)两个状态之间来回翻转) | |
clk_lane | MIPI时钟lane0的状态(正常状态:在0x03(LP11S低功耗模式)和0x05(HS_S高速模式)两个状态之间来回翻转) | |
PORT Payload | port_en | PORT通道使能位 |
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_mode | 0x0:Normal模式(无WDR/MIPI VC/MIPI DT);0x2:Pixel Data模式,通过每行的第1个Pixel data区分多路WDR图像 | |
unpack_en | MIPI CSI2协议解包使能开关 | |
yuv_seq | MIPI YUV格式传输顺序 | |
ch_field | MIPI输入源类型配置状态(0:progressive,输入源配置为逐行扫描数据;1:interlaced,输入源配置为隔行扫描数据) | |
int_pending | 中断pending寄存器状态(正常状态为:0x0f 或 0x4f 或 0x3f) | |
cur_data_type | MIPI根据收到的包头信息获取到的数据格式类型 | |
vir_ch | MIPI当前的虚拟通道编号 |
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