前言
环境介绍:
1.编译环境
Ubuntu 20.04.6 LTS
2.SDK版本
rk3568_linux_5.10
3.单板
迅为itop-3568开发板
一、编译rockit组件包
rockit组件包在4.10版本需要手动编译,奈何我的版本怎么都编译不了,后来改用5.10版本才编译通过。
4.10版本报错信息
undefined reference to ... @GLIBCXX_3.35
改用5.10版本编译buildroot,需要将虚拟机内存调整到8GB以上,因为默认编译采用多线程,导致内存不足出现个别包无法编译导致固件无法编译完成。
rockit组件包在5.10版本在编译buildroot系统的时候是自动编译的,并且会安装到编译的系统里面。固件烧录后在单板直接测试即可。此处跳过系统,单领出来编译。
系统编译完成后存放默认路径
/home/zfeng/rk3568_linux_5.10/buildroot/output/rockchip_rk3568/build/rockit/
进入原来SDK组件存放路径
zfeng@ubuntu:~$ cd /home/zfeng/rk3568_linux_5.10/external/rockit/
zfeng@ubuntu:~/rk3568_linux_5.10/external/rockit$ ls
CMakeLists.txt lib mpi README.md tgi
rockit采用cmake,我们需要指定交叉编译器路径
编译rockit不能使用SDK默认编译kernel的交叉编译,需要采用编译buildroot的,而编译buildroot的编译器SDK并没有存放,需要编译过buildroot之后才可以用。
buildroot编译器路径为
/home/zfeng/rk3568_linux_5.10/buildroot/output/rockchip_rk3568/host/share/buildroot//bin/aarch64-buildroot-linux-gnu-gcc
在rockit里面新建toolchainfile.cmake,添加下面内容,指定cmake交叉编译器
# Example toolchain.cmake content
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)# 指定交叉编译器路径
string(REPLACE "/share/buildroot" "" RELOCATED_HOST_DIR /home/zfeng/rk3568_linux_5.10/buildroot/output/rockchip_rk3568/host/share/buildroot/)set(CMAKE_C_COMPILER "${RELOCATED_HOST_DIR}/bin/aarch64-buildroot-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "${RELOCATED_HOST_DIR}/bin/aarch64-buildroot-linux-gnu-g++")# 设置目标系统根目录
set(CMAKE_FIND_ROOT_PATH /home/zfeng/rk3568_linux_5.10/buildroot/output/rockchip_rk3568/target/)# 配置 CMake 查找程序和库文件的方式
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
新建build文件夹
zfeng@ubuntu:~/rk3568_linux_5.10/external/rockit$ mkdir build
zfeng@ubuntu:~/rk3568_linux_5.10/external/rockit$ ls
build CMakeLists.txt lib mpi README.md tgi toolchainfile.cmake
进入build文件夹,执行cmake … -DCMAKE_TOOLCHAIN_FILE=…/toolchainfile.cmake
zfeng@ubuntu:~/rk3568_linux_5.10/external/rockit$ cd build/
zfeng@ubuntu:~/rk3568_linux_5.10/external/rockit/build$ cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchainfile.cmake
等命令执行完再执行make即可
zfeng@ubuntu:~/rk3568_linux_5.10/external/rockit$ cd build/
zfeng@ubuntu:~/rk3568_linux_5.10/external/rockit/build$ cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchainfile.cmake^C
zfeng@ubuntu:~/rk3568_linux_5.10/external/rockit/build$ ls
CMakeCache.txt CMakeFiles cmake_install.cmake compile_commands.json Makefile mpi tgi
zfeng@ubuntu:~/rk3568_linux_5.10/external/rockit/build$ make
[ 30%] Built target rt_test_comm
[ 34%] Built target rk_mpi_ao_test
[ 38%] Built target rk_mpi_adec_test
[ 41%] Built target rk_mpi_vpss_test
[ 45%] Built target rk_mpi_vgs_test
[ 49%] Built target rk_mpi_mb_test
[ 52%] Built target rk_mpi_sys_test
[ 56%] Built target rk_mpi_vdec_test
[ 60%] Built target rk_mpi_all_test
[ 63%] Built target rk_mpi_venc_test
[ 67%] Built target rk_mpi_tde_test
[ 70%] Built target rk_mpi_ai_test
[ 74%] Built target rk_mpi_rgn_test
[ 78%] Built target rk_mpi_vo_test
[ 81%] Built target rk_mpi_aenc_test
[ 85%] Built target rk_mpi_vi_test
[ 89%] Built target rk_mpi_mmz_test
[ 92%] Built target rk_mpi_gdc_test
[ 96%] Built target rk_mpi_avio_test
[100%] Built target rk_mpi_amix_test
zfeng@ubuntu:~/rk3568_linux_5.10/external/rockit/build$
最后将编译完成的可执行文件放到开发板即可,可执行文件路径为
/home/zfeng/rk3568_linux_5.10/external/rockit/build/mpi/example/mod/
二、测试
以rk_mpi_vi_test举例
接上摄像头模组与HDMI显示器,开机
因为系统默认已经安装了rockit组件,直接命令测试即可
rk_mpi_vi_test -w 1920 -h 1080 -t 4 -n /dev/video0 -m 4 -l 1000
命令参数相关解析可查阅代码,这里提醒一下-l参数,这是程序运行计数,默认是100,时间很短,基本上显示画面一闪而过,一度以为是程序哪里出问题了,改用-l 1000,画面显示时间加长。
root@topeet:/# rk_mpi_vi_test -w 1920 -h 1080 -t 4 -n /dev/video0 -m 4 -l 1000
vi 08:59:14-994 {main :1387} test running enter!
vi 08:59:14-995 {main :1493} test running enter ctx->aEntityName=/dev/video0!
cmd parse result:
output file open : 0
yuv output file name : /
enc0 output file path : //
enc1 output file path : //
loop count : 1000
enMode : 4
dev : 0
pipe : 0
channel : 1
width : 1920
height : 1080
enCompressMode : 0
enMemoryType : 4
aEntityName : /dev/video0
depth : 0
enPixelFormat : 0
bFreeze : 0
src_frame rate : -1
dst frame rate : -1
out buf count : 3
bUserPicEnabled : 0
bEnRgn : 0
rgn count : 1
rgn type : 5
bGetConnecInfo : 0
bGetEdid : 0
bSetEdid : 0
rk-debug init version=3.78,args[16,16,0], threadId=547676397952
arm_release_ver: g13p0-01eac0, rk_so_ver: 3
rk-debug setupGraphicsRenderRGB [6,1,0,0]
rk-debug setupGraphicsRenderRGB [9,1,0,-1]
rk-debug init version=3.78,args[16,16,0], threadId=547532763520
rk-debug setupGraphicsRenderRGB [6,1,0,0]
rk-debug setupGraphicsRenderRGB [9,1,0,-1]
RTVersion 08:59:15-709 {dump :064} ---------------------------------------------------------
RTVersion 08:59:15-714 {dump :065} rockit version: git-855c43b3b Fri May 5 15:05:16 2023 +0800
RTVersion 08:59:15-724 {dump :066} rockit building: built-Chu 2023-05-19 14:11:19
RTVersion 08:59:15-733 {dump :067} ---------------------------------------------------------
Using mplane plugin for capture
Using mplane plugin for capture
Using mplane plugin for capture
[ 3341.198103] rkisp_hw fdff0000.rkisp: set isp clk = 297000000Hz
mpi_vo 08:59:15-763 {RK_MPI_VO_DisableL:1114} layer 0 had already been diabled
mpi_vo 08:59:15-769 {RK_MPI_VO_DisableL:1114} layer 4 had already been diabled
mpi_vo 08:59:15-777 {RK_MPI_VO_DisableL:1114} layer 5 had already been diabled
mpi_vo 08:59:15-785 {RK_MPI_VO_DisableL:1114} layer 6 had already been diabled
mpi_vo 08:59:15-793 {RK_MPI_VO_DisableL:1114} layer 7 had already been diabled
drm_get_vo_type connector 18 1 out of vo intf type range
[ 3341.200172] rockchip-csi2-dphy0: dphy0, data_rate_mbps 840
[ 3341.200215] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:1, dphy0
drm_output_create crtc id 68
[ 3341.325977] rockchip-vop2 fe040000.vop: [drm:vop2_crtc_atomic_enable] Update mode to 1280x720p60, type: 11(if:800) for vp0 dclk: 74250000
rk-debug init version=3.78,args[16,16,2], threadId=547264328064
vi 08:59:15-909 {test_vi_bind_vo_lo:755} loopCount:1
vi 08:59:15-943 {test_vi_bind_vo_lo:755} loopCount:2
rk-debug setupGraphicsRenderRGB [6,1,0,0]
rk-debug setupGraphicsRenderRGB [9,1,0,-1]
三、修改输出分辨率
我测试用的小屏显示器分辨率是1280x720的,例程视频输出默认是1920x1080,导致无法正常显示
drm_get_vo_type connector 18 1 out of vo intf type range
[ 4111.828169] rockchip-csi2-dphy0: dphy0, data_rate_mbps 840
[ 4111.828210] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:1, dphy0
[ 4111.910321] rockchip-vop2 fe040000.vop: [drm:vop2_crtc_atomic_disable] Crtc atomic disable vp0
drm_output_create crtc id 68
[ 4111.971000] rockchip-vop2 fe040000.vop: [drm:vop2_crtc_atomic_enable] Update mode to 1280x720p60, type: 11(if:800) for vp0 dclk: 74250000
rk-debug init version=3.78,args[16,16,2], threadId=547578614144
rk-debug setupGraphicsRenderRGB [6,1,0,0]
rk-debug setupGraphicsRenderRGB [9,1,0,-1]
drm_render 09:12:06-845 {vo_render_set_plan:247} layer cord [0, 0, 1920, 1080] out of output range [1280 x 720]
drm_render 09:12:06-850 {drm_render :780} event 1 add prop failed
drm_render 09:12:06-857 {drm_render :882} collect infomation failed a0098003
drm_render 09:12:06-879 {vo_render_set_plan:247} layer cord [0, 0, 1920, 1080] out of output range [1280 x 720]
drm_render 09:12:06-883 {drm_render :780} event 1 add prop failed
drm_render 09:12:06-890 {drm_render :882} collect infomation failed a0098003
drm_render 09:12:06-911 {vo_render_set_plan:247} layer cord [0, 0, 1920, 1080] out of output range [1280 x 720]
drm_render 09:12:06-916 {drm_render :780} event 1 add prop failed
drm_render 09:12:06-923 {drm_render :882} collect infomation failed a0098003
修改rk_mpi_vi_test.cpp下面内容,重新编译即可
stLayerAttr.enPixFormat = RK_FMT_RGB888;stLayerAttr.stDispRect.s32X = 0;stLayerAttr.stDispRect.s32Y = 0;stLayerAttr.u32DispFrmRt = 60;//原先分辨率// stLayerAttr.stDispRect.u32Width = 1920;// stLayerAttr.stDispRect.u32Height = 1080;// stLayerAttr.stImageSize.u32Width = 1920;// stLayerAttr.stImageSize.u32Height = 1080;// 修改后的设置,确保在输出范围内stLayerAttr.stDispRect.u32Width = 1280;stLayerAttr.stDispRect.u32Height = 720;stLayerAttr.stImageSize.u32Width = 1280;stLayerAttr.stImageSize.u32Height = 720;