display sample
功能概述
本文实现单路、多路MIPI CSI TX输出、IDU回写、IDU oneshot模式、绑定输出VPS数据等功能,此处主要介绍各sample的实现与使用方法。
软件架构说明
本文中绑定VPS输出功能基于libvio API实现,调用libvio提供的API,同时通过配置文件的方式,实现pym数据回灌,输出绑定IDU的输入图层,由MIPI CSI TX进行输出。
回环sample需要调用libcam提供的camera初始化接口,用于初始化MIPI RX和加解串器,还需要调用libvio的接口,初始化CIM模块将MIPI RX的数据存到DDR中。
其余sample都基于libidu实现,同时通过配置文件,实现IDU和MIPI CSI TX的初始化配置,调用libidu的API实现oneshot触发、获取回写buffer等功能。

硬件数据流说明
基于Matrix 6E/M硬件使用,各项功能硬件连接及数据流通路如下:
回写sample硬件数据流:

上图为IDU回写和oneshot sample的简要硬件结构及数据流向图,数据从DRR回灌到IDU输入图层,通过IDU回写输出到DDR,可将输出数据直接dump到文件系统,通过查看数据文件验证输出正确性。
绑定通路sample硬件数据流

上图为绑定VPS输出的sample,数据从DDR回灌到PYM,通过配置文件和libvio的接口实现PYM输出绑定IDU输入图层,将PYM的数据通过IDU和MIPI CSI TX进行显示输出。
回环sample硬件数据流:

上图为MIPI CSI TX输出回环sample,将MIPI CSI TX的输出通过加串器、解串器接入RX,通过CIM将数据输出到DDR,通过查看数据文件验证输出正确性。
此处仅标注使用了1个MIPI CSI TX和MIPI CSI RX接口作为示意,但实际并不限于1条通路。
- 1V OVX8B绑定IDU输出硬件数据流:

上图为1V OVX8B数据,通过绑定配置,由MIPI CSI TX输出的硬件数据流。
代码位置与目录结构
代码位置如下:
\ 描述 备注
sample名称 display_sample
代码位置 {sdk_dir}/test/samples/platform_samples/source/S83_Sample/S83E04_Module/display_sample
代码结构 display_sample Kconfig为编译系统配置,可配置加入整体编译;
├── Kconfig Makefile为编译规则,包括部署;
├── Makefile src下为sample源码,入口为main();
├── Makefile.in cfg下为sample需要的配置文件;
├── src res下为sample需要的图像文件;
├── cfg display_sample.sh为sample运行脚本;
├── res weston下为显示服务deb包和环境脚本;
├── weston
└── display_sample.sh
板上部署 /app/sample/S83_Sample/S83E04_Module/display_sample/bin/
示例配置 /app/sample/S83_Sample/S83E04_Module/display_sample/cfg/
API流程说明
以下为sample内API调用流程:

上图为绑定场景下sample的API调用流程。

上图为回写、oneshot、MIPI CSI TX输出等场景下的API调用流程。
编译说明
本模块依赖libvio提供的VIO API头文件和libidu提供的display API头文件,并且需要依赖libhbmem头文件用于buffer申请:
#include "hb_mem_mgr.h"
#include "idu_interface.h"
#include "hbn_idu_cfg.h"
#include "hbn_vpf_interface.h"
#include "hb_camera_interface.h"
#include "hb_vio_interface.h"
编译依赖的库有如下:
LIBS += -lalog -lhbmem -lgdcbin -lcam -lvpf -lidu -lvio
编译命令:
# 进入SDK所有目录{sdk_dir},并source构建环境。
# 编译本sample:
bdm display-sample
# 输出文件:
{sdk_dir}/out/debug-gcc_{gcc_version}/build/test/samples/platform_samples/source/S83_Sample/S83E04_Module/display_sample
运行

上图左侧二合一端子为TX输出,右侧四合一端子为RX0输入
- 回环sample连接方式:TX输出1接RX输入4,TX输出2接RX输入3。
- 1V OVX8B绑定IDU输出sample连接方式:OVX8B接入RX输入3,TX输出任意端口外接RX
板端部署及配置:
刷写系统软件镜像后,本sample的可执行文件位于板端:``/app/sample/S83_Sample/S83E04_Module/display_sample/bin/display_sample``;
执行脚本位于板端:``/app/sample/S83_Sample/S83E04_Module/display_sample/script/display_sample.sh``;
需要使用的配置文件位于板端:``/app/sample/S83_Sample/S83E04_Module/display_sample/cfg``;
需要使用的图像文件位于板端:``/app/sample/S83_Sample/S83E04_Module/display_sample/res``。
运行方法:
IDU回写运行命令:display_writeback_sample,数据流参考 :ref:`回写数据流 `。
/app/sample/S83_Sample/S83E04_Module/display_sample/script/display_sample.sh display_writeback_sample
IDU oneshot运行命令:display_oneshot_sample,数据流参考 :ref:`回写数据流 `。
/app/sample/S83_Sample/S83E04_Module/display_sample/script/display_sample.sh display_oneshot_sample
PYM输出绑定IDU运行命令:display_bind_sample,数据流参考 :ref:`绑定场景数据流 `。
/app/sample/S83_Sample/S83E04_Module/display_sample/script/display_sample.sh display_bind_sample
单路Loopback运行命令:matrix_display_loopback_sample_tx0\1,其中matrix_display_loopback_sample_tx0输出IDU0的1080P数据,matrix_display_loopback_sample_tx1由IDU1两个图层拼接输出1920x2160数据,数据流参考 :ref:`回环场景数据流 `。
/app/sample/S83_Sample/S83E04_Module/display_sample/script/display_sample.sh matrix_display_loopback_sample_tx0
/app/sample/S83_Sample/S83E04_Module/display_sample/script/display_sample.sh matrix_display_loopback_sample_tx1
两路Loopback运行命令:matrix_display_loopback_sample_tx01,TX0输出1080P数据,TX1输出1920x2160数据,数据流参考 :ref:`回环场景数据流 `。
/app/sample/S83_Sample/S83E04_Module/display_sample/script/display_sample.sh matrix_display_loopback_sample_tx01
1V OVX8B绑定输出运行命令:1v_ovx8b_rx0_cpe0_idu0_tx0_max9295e,数据流参考 :ref:`1V绑定数据流 `。
/app/sample/S83_Sample/S83E04_Module/display_sample/script/display_sample.sh 1v_ovx8b_rx0_cpe0_idu0_tx0_max9295e
运行参数说明:
+--------+----------------------------------------------+----------+---------------------+
| 参数名 | 说明 | 是否必须 | 备注 |
+========+==============================================+==========+=====================+
| -l | 指定sample运行循环次数 | 否 | 默认1次 |
+--------+----------------------------------------------+----------+---------------------+
| -V | 指定配置文件目录 | 是 | 需指定 |
+--------+----------------------------------------------+----------+---------------------+
| -D | 使能dump功能 | 否 | -D 5,dump 5帧图片 |
+--------+----------------------------------------------+----------+---------------------+
| -d | 指定显示硬件设备id | 是 | 1:idu0,2:idu1 |
+--------+----------------------------------------------+----------+---------------------+
| -p | 指定输入图片路径 | 否 | |
+--------+----------------------------------------------+----------+---------------------+
| -L | 使能Loopback,需要配合camera初始化 | 否 | |
+--------+----------------------------------------------+----------+---------------------+
| -B | 使能VIO绑定功能,需配合VPS初始化 | 否 | |
+--------+----------------------------------------------+----------+---------------------+
| -s | 带sensor输入,需配合camera初始化 | 否 | |
+--------+----------------------------------------------+----------+---------------------+
| -T | 运行时长,单位秒 | 否 | |
+--------+----------------------------------------------+----------+---------------------+
| -m | pipeline mask | 否 | |
+--------+----------------------------------------------+----------+---------------------+
| -g | 使能debug打印 | 否 | |
+--------+----------------------------------------------+----------+---------------------+
| -h | 查看帮助信息 | 否 | |
+--------+----------------------------------------------+----------+---------------------+
| -v | 查看版本信息 | 否 | |
+--------+----------------------------------------------+----------+---------------------+
可通过-h参数查看帮助:
Usage: -v --version Display test case version
-l --loop Excute count
-V --vnode_cfg vnode config file
-D --dump_enable dump flag
-d --device idu hw device id
-p --Pattern pattern path
-M --md5 md5 check
-L --loop_back loop back
-B --vio_bind vio bind
-s --sensor with sensor
-T --tims time(s)
-m --pipe_mask pipeline mask
-g --debug enable debug log
-h --help help info
运行结果说明:
以下为display_writeback_sample正常运行的log:
[INFO] display: display device index = 1
[INFO] display: dump flag = 5
[INFO] display: loop = 5
[INFO] display: display cfg = /app/sample/S83_Sample/S83E04_Module/display_sample/cfg/idu_plane1_nv12_wb_nv12_1080p_30fps/
[INFO] display: display pattern = /app/sample/S83_Sample/S83E04_Module/display_sample/res/nv16_1920x1080.yuv
[INFO] display: Exit Display Sample[0].
运行结束后可以看到当前目录有五张yuv图片,格式为NV12 1080P,可以通过看图软件查看,下图仅为示例,实际情况请结合输入图片进行确认:

- 以下为display_oneshot_sample正常运行的log:
[INFO] display: display device index = 1
[INFO] display: dump flag = 5
[INFO] display: loop = 5
[INFO] display: display cfg = /app/sample/S83_Sample/S83E04_Module/display_sample/cfg/idu_plane1_nv12_wb_nv12_1080p_oneshot/
[INFO] display: display pattern = /app/sample/S83_Sample/S83E04_Module/display_sample/res/nv16_1920x1080.yuv
[INFO] display: Exit Display Sample[0].
运行结束后可以看到当前目录有五张yuv图片,格式为NV12 1080P,可以通过看图软件查看,下图仅为示例,实际情况请结合输入图片进行确认:

- 以下为display_bind_sample正常运行的log:
[INFO] display: display device index = 1
[INFO] display: loop = 10000
[INFO] display: display cfg = /app/sample/S83_Sample/S83E04_Module/display_sample/cfg/vnode_hbn_ddr_pym_idu_mipitx_1080p/
[INFO] display: Exit Display Sample[0].
本文通过MIPI CSI TX发送10000帧数据,可以通过RX收图查看。
- 以下为matrix_display_loopback_sample_tx0正常运行的log:
[INFO] display: display device index = 1
[INFO] display: dump flag = 5
[INFO] display: loop = 5
[INFO] display: display cfg = /app/sample/S83_Sample/S83E04_Module/display_sample/cfg/matrix_idu0_plane1_nv12_csi0_yuv422_max9295_max96712_rx0_1080p_30fps/
[INFO] display: display pattern = /app/sample/S83_Sample/S83E04_Module/display_sample/res/nv16_1920x1080.yuv
[INFO] display: Exit Display Sample[0].
本文通过MIPI CSI TX0发送5帧数据,通过MAX9295E->MAX96712回环到RX0,
通过CIM将数据存到DDR,然后存成文件,可以通过看图软件查看,下图仅为示例,实际情况请结合输入图片进行确认:

- 以下为matrix_display_loopback_sample_tx1正常运行的log:
[INFO] display: display device index = 2
[INFO] display: dump flag = 5
[INFO] display: loop = 5
[INFO] display: display cfg = /app/sample/S83_Sample/S83E04_Module/display_sample/cfg/matrix_idu1_plane1_nv12_csi1_yuv422_max9295_max96712_rx0_1080p_30fps/
[INFO] display: display pattern = /app/sample/S83_Sample/S83E04_Module/display_sample/res/nv16_1920x1080.yuv
[INFO] display: Exit Display Sample[0].
本文通过MIPI CSI TX1发送5帧数据,通过MAX9295E->MAX96712回环到RX0,
通过CIM将数据存到DDR,然后存成文件,可以通过看图软件查看,下图仅为示例,实际情况请结合输入图片进行确认:

- 以下为matrix_display_loopback_sample_tx01正常运行的log:
[INFO] display: display device index = 3
[INFO] display: dump flag = 5
[INFO] display: loop = 5
[INFO] display: display cfg = /app/sample/S83_Sample/S83E04_Module/display_sample/cfg/matrix_idu01_plane1_nv12_csi01_yuv422_max9295_max96712_rx0_1080p_30fps/
[INFO] display: display pattern = /app/sample/S83_Sample/S83E04_Module/display_sample/res/nv16_1920x1080.yuv
[INFO] display: Exit Display Sample[0].
本文通过两路MIPI CSI TX发送5帧数据,通过MAX9295E->MAX96712回环到RX0,
通过CIM将数据存到DDR,然后存成文件,可以通过看图软件查看,本sample效果和TX0、TX1单路输出相同,实际情况请结合输入图片进行确认。
- 以下为1v_ovx8b_rx0_cpe0_idu0_tx0_max9295e正常运行的log,sample运行时长为100秒,可以通过脚本中的-T参数进行时长设置:
[INFO] display: display cfg = /app/sample/S83_Sample/S83E04_Module/display_sample/cfg/1v_ovx8b_rx0_cpe0_idu0_tx0_max9295e/
[INFO] display: Exit Display Sample[0].
本文通过MIPI CSI TX将OVX8B的输入数据进行发送,可以接入MIPI RX查看数据。在运行时可以通过命令“cat /sys/class/vps/flow/fps”查看fps是否正常,可以看到idu0的ichn0的输入帧率为30:
-------------------------------------------------------------------
Flow10 FPS
-------------------------------------------------------------------
vin0 ctx 0: | ich0 30 | och0 0 | och1 30 | och3 0 | och4 0 |
isp0 ctx 0: | ich0 30 | och0 30 |
pym0 ctx 0: | ich0 30 | och0 30 |
idu0 ctx 0: | ich0 30 | ich1 0 | ich2 0 | ich3 0 | ich4 0 | ich5 0 | och0 0 | och1 0 | och2 0 |
