rk3568 rockit编译测试

rk3568 rockit编译测试编译 rockit 不能使用 SDK 默认编译 kernel 的交叉编译 需要采用编译 buildroot 的 而编译 buildroot 的编译器 SDK 并没有存放 需要编译过 buildroot 之后才可以用

大家好,欢迎来到IT知识分享网。

前言

环境介绍:

1.编译环境

Ubuntu 20.04.6 LTS

2.SDK版本

rk3568_linux_5.10

3.单板

迅为itop-3568开发板


一、编译rockit组件包

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=2 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=0 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.] rkisp_hw fdff0000.rkisp: set isp clk = Hz 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.] rockchip-csi2-dphy0: dphy0, data_rate_mbps 840 [ 3341.] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:1, dphy0 drm_output_create crtc id 68 [ 3341.] rockchip-vop2 fe040000.vop: [drm:vop2_crtc_atomic_enable] Update mode to 1280x720p60, type: 11(if:800) for vp0 dclk:  rk-debug init version=3.78,args[16,16,2], threadId=4 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] 

三、修改输出分辨率

我测试用的小屏显示器分辨率是1280×720的,例程视频输出默认是1920×1080,导致无法正常显示

drm_get_vo_type connector 18 1 out of vo intf type range [ 4111.] rockchip-csi2-dphy0: dphy0, data_rate_mbps 840 [ 4111.] rockchip-csi2-dphy csi2-dphy0: csi2_dphy_s_stream stream on:1, dphy0 [ 4111.] rockchip-vop2 fe040000.vop: [drm:vop2_crtc_atomic_disable] Crtc atomic disable vp0 drm_output_create crtc id 68 [ 4111.] rockchip-vop2 fe040000.vop: [drm:vop2_crtc_atomic_enable] Update mode to 1280x720p60, type: 11(if:800) for vp0 dclk:  rk-debug init version=3.78,args[16,16,2], threadId=4 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下面内容,重新编译即可

static RK_S32 create_vo(TEST_VI_CTX_S *ctx, RK_U32 u32Ch) { 
    stLayerAttr.enPixFormat = RK_FMT_RGB888; stLayerAttr.stDispRect.s32X = 0; stLayerAttr.stDispRect.s32Y = 0; //原先分辨率 // stLayerAttr.u32DispFrmRt = 30; // stLayerAttr.stDispRect.u32Width = 1920; // stLayerAttr.stDispRect.u32Height = 1080; // stLayerAttr.stImageSize.u32Width = 1920; // stLayerAttr.stImageSize.u32Height = 1080; // 修改后的设置,确保在输出范围内 stLayerAttr.u32DispFrmRt = 60; stLayerAttr.stDispRect.u32Width = 1280; stLayerAttr.stDispRect.u32Height = 720; stLayerAttr.stImageSize.u32Width = 1280; stLayerAttr.stImageSize.u32Height = 720; } 

四、图像旋转与裁切

图像旋转与裁切主要依靠vpss模块,需要对如下两个函数修改

4.1 test_vi_bind_vo_loop 修改

test_vi_init初始化vi后,创建vpss模块,并bind_vi_vpss,要使裁剪旋转等生效VpssChnMode,设置为VPSS_CHN_MODE_USER

static RK_S32 test_vi_bind_vo_loop(TEST_VI_CTX_S *ctx) { 
    MPP_CHN_S stViChn, stVpssChn, stVoChn; RK_S32 loopCount = 0; void *pData = RK_NULL; RK_S32 s32Ret = RK_FAILURE; RK_U32 i; s32Ret = test_vi_init(ctx); if (s32Ret != RK_SUCCESS) { 
    RK_LOGE("vi %d:%d init failed:%x", ctx->devId, ctx->channelId, s32Ret); goto __FAILED; } //初始化vpss,实现旋转功能,视频数据路径vi->vpss->vo /* vpss */ ctx->stVpssCfg.u32VpssChnCnt = 1; ctx->stVpssCfg.stGrpVpssAttr.u32MaxW = 4096; ctx->stVpssCfg.stGrpVpssAttr.u32MaxH = 4096; ctx->stVpssCfg.stGrpVpssAttr.enPixelFormat = RK_FMT_RGB888; ctx->stVpssCfg.stGrpVpssAttr.stFrameRate.s32SrcFrameRate = -1; ctx->stVpssCfg.stGrpVpssAttr.stFrameRate.s32DstFrameRate = -1; ctx->stVpssCfg.stGrpVpssAttr.enCompressMode = COMPRESS_MODE_NONE; for (i = 0; i < VPSS_MAX_CHN_NUM; i ++) { 
    ctx->stVpssCfg.stVpssChnAttr[i].enChnMode = VPSS_CHN_MODE_USER;//Enable crop and rotation, change mode to VPSS_CHN_MODE_USER ctx->stVpssCfg.stVpssChnAttr[i].enDynamicRange = DYNAMIC_RANGE_SDR8; ctx->stVpssCfg.stVpssChnAttr[i].enPixelFormat = RK_FMT_RGB888; ctx->stVpssCfg.stVpssChnAttr[i].stFrameRate.s32SrcFrameRate = -1; ctx->stVpssCfg.stVpssChnAttr[i].stFrameRate.s32DstFrameRate = -1; ctx->stVpssCfg.stVpssChnAttr[i].u32Width = ctx->width; ctx->stVpssCfg.stVpssChnAttr[i].u32Height = ctx->height; ctx->stVpssCfg.stVpssChnAttr[i].enCompressMode = COMPRESS_MODE_NONE; } // init vpss s32Ret = create_vpss(&ctx->stVpssCfg, 0, ctx->stVpssCfg.u32VpssChnCnt); if (s32Ret != RK_SUCCESS) { 
    RK_LOGE("creat 0 grp vpss failed!"); goto __FAILED; } //end init vpss // bind vi to vpss stViChn.enModId = RK_ID_VI; stViChn.s32DevId = ctx->devId; stViChn.s32ChnId = ctx->channelId; stVpssChn.enModId = RK_ID_VPSS; stVpssChn.s32DevId = 0; stVpssChn.s32ChnId = 0; RK_LOGD("vi to vpss ch %d vpss group %d", stVpssChn.s32ChnId , stVpssChn.s32DevId); s32Ret = RK_MPI_SYS_Bind(&stViChn, &stVpssChn); if (s32Ret != RK_SUCCESS) { 
    RK_LOGE("vi and vpss bind error "); goto __FAILED; } // vo init and create ctx->s32VoLayer = RK356X_VOP_LAYER_CLUSTER_0; ctx->s32VoDev = RK356X_VO_DEV_HD0; s32Ret = create_vo(ctx, 0); if (s32Ret != RK_SUCCESS) { 
    RK_LOGE("create vo ch:%d failed", ctx->channelId); goto __FAILED; } stVoChn.enModId = RK_ID_VO; stVoChn.s32DevId = ctx->s32VoLayer; stVoChn.s32ChnId = 0; s32Ret = RK_MPI_SYS_Bind(&stVpssChn, &stVoChn); if (s32Ret != RK_SUCCESS) { 
    RK_LOGE("vi band vo fail:%x", s32Ret); goto __FAILED; } // enable vo s32Ret = RK_MPI_VO_EnableChn(ctx->s32VoLayer, 0); if (s32Ret != RK_SUCCESS) { 
    RK_LOGE("Enalbe vo chn failed, s32Ret = %d\n", s32Ret); goto __FAILED; } while (loopCount < ctx->loopCountSet) { 
    loopCount++; //RK_LOGE("loopCount:%d", loopCount); // can not get the vo frameout count . so here regard as 33ms one frame. usleep(33*1000); } __FAILED: s32Ret = RK_MPI_SYS_UnBind(&stViChn, &stVpssChn); if (s32Ret != RK_SUCCESS) { 
    RK_LOGE("RK_MPI_SYS_UnBind fail %x", s32Ret); } s32Ret = RK_MPI_SYS_UnBind(&stVpssChn, &stVoChn); if (s32Ret != RK_SUCCESS) { 
    RK_LOGE("RK_MPI_SYS_UnBind fail %x", s32Ret); } // disable vo RK_MPI_VO_DisableLayer(ctx->s32VoLayer); RK_MPI_VO_DisableLayer(RK356X_VOP_LAYER_ESMART_0); RK_MPI_VO_DisableLayer(RK356X_VOP_LAYER_ESMART_1); RK_MPI_VO_DisableLayer(RK356X_VOP_LAYER_SMART_0); RK_MPI_VO_DisableLayer(RK356X_VOP_LAYER_SMART_1); RK_MPI_VO_DisableChn(ctx->s32VoLayer, 0); RK_MPI_VO_Disable(ctx->s32VoDev); // 5. disable one chn s32Ret = RK_MPI_VI_DisableChn(ctx->pipeId, ctx->channelId); RK_LOGE("RK_MPI_VI_DisableChn %x", s32Ret); RK_MPI_VO_DisableChn(ctx->s32VoLayer, 0); // 6.disable dev(will diabled all chn) s32Ret = RK_MPI_VI_DisableDev(ctx->devId); RK_LOGE("RK_MPI_VI_DisableDev %x", s32Ret); return s32Ret; } 

4.2 create_vpss 修改

static RK_S32 create_vpss(VPSS_CFG_S *pstVpssCfg, RK_S32 s32Grp, RK_S32 s32OutChnNum) { 
    RK_S32 s32Ret = RK_SUCCESS; VPSS_CHN VpssChn[VPSS_MAX_CHN_NUM] = { 
    VPSS_CHN0, VPSS_CHN1, VPSS_CHN2, VPSS_CHN3 }; VPSS_CROP_INFO_S stCropInfo; s32Ret = RK_MPI_VPSS_CreateGrp(s32Grp, &pstVpssCfg->stGrpVpssAttr); if (s32Ret != RK_SUCCESS) { 
    return s32Ret; } stCropInfo.bEnable = RK_TRUE; stCropInfo.enCropCoordinate = VPSS_CROP_RATIO_COOR; stCropInfo.stCropRect.s32X = 0; //192 + 3456 + 192 = 3840, when x = 192, video on center stCropInfo.stCropRect.s32Y = 0; stCropInfo.stCropRect.u32Width = 3456; stCropInfo.stCropRect.u32Height = 2160; for (RK_S32 i = 0; i < s32OutChnNum; i++) { 
    s32Ret = RK_MPI_VPSS_SetChnAttr(s32Grp, VpssChn[i], &pstVpssCfg->stVpssChnAttr[i]); if (s32Ret != RK_SUCCESS) { 
    return s32Ret; } //图像裁切 s32Ret = RK_MPI_VPSS_SetChnCrop(s32Grp, VpssChn[i], &stCropInfo); if (s32Ret != RK_SUCCESS) { 
    return s32Ret; } //旋转 90° s32Ret = RK_MPI_VPSS_SetChnRotation(s32Grp, VpssChn[i], ROTATION_90); if (s32Ret != RK_SUCCESS) { 
    return s32Ret; } s32Ret = RK_MPI_VPSS_EnableChn(s32Grp, VpssChn[i]); if (s32Ret != RK_SUCCESS) { 
    return s32Ret; } } s32Ret = RK_MPI_VPSS_EnableBackupFrame(s32Grp); if (s32Ret != RK_SUCCESS) { 
    return s32Ret; } s32Ret = RK_MPI_VPSS_StartGrp(s32Grp); if (s32Ret != RK_SUCCESS) { 
    return s32Ret; } return RK_SUCCESS; } 

五、修改之后 test_mpi_vi.cpp

https://gitcode.com/zfenggo/rk356x_rockit.git

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/153191.html

(0)
上一篇 2025-03-05 17:05
下一篇 2025-03-05 17:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信