RK356X rockit_mpi解析 (一)实现HDMI输出

主要目的为能在debian下实现HDMI输出Camera ISP流

平台:RK3568

熟悉瑞芯微RV1126的应该知道之前有一套rkmedia的框架,现在的rk3568已经不再是之前的旧框架了,但仍沿用了RK_MPI的内容。

rockit代码路径在external\rockit\mpi\example\mod

文件夹下的demo并不是全部编译的,要想编译哪个demo,可以编辑文件下的CMakeLists.txt文件

此处我们使用的demo为test_mpi_vi.cpp,编辑CMakeList.txt文件打开mpi_vi的编译

set(RK_MPI_TEST_VI_SRC
    test_mpi_vi.cpp
)

#--------------------------
# rk_mpi_vi_test
#--------------------------
add_executable(rk_mpi_vi_test ${RK_MPI_TEST_VI_SRC} ${RK_MPI_TEST_COMMON_SRC})
target_link_libraries(rk_mpi_vi_test ${ROCKIT_DEP_COMMON_LIBS})
install(TARGETS rk_mpi_vi_test RUNTIME DESTINATION "bin")

在buildroot文件夹下运行

make rockit-rebuild

可以看到rockit下的demo的编译细节

编译会遇到一个函数定义报错的问题,直接注释掉报错内容即可

/home/hya/workspace/SVN/RK3568SDK_Kernel5/buildroot/output/rockchip_rk3568/build/rockit/mpi/example/mod/test_mpi_vi.cpp: 在函数‘RK_S32 readFromPic(TEST_VI_CTX_S*, VIDEO_FRAME_S*)’中:
/home/hya/workspace/SVN/RK3568SDK_Kernel5/buildroot/output/rockchip_rk3568/build/rockit/mpi/example/mod/test_mpi_vi.cpp:377:14: 警告:ignoring return value of ‘size_t fread(void*, size_t, size_t, FILE*)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  377 |         fread(RK_MPI_MB_Handle2VirAddr(srcBlk), 1 , stMbPicCalResult.u32MBSize, fp);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[100%] Linking CXX executable rk_mpi_vi_test
/home/hya/workspace/SVN/RK3568SDK_Kernel5/buildroot/output/rockchip_rk3568/host/lib/gcc/aarch64-buildroot-linux-gnu/12.3.0/../../../../aarch64-buildroot-linux-gnu/bin/ld: CMakeFiles/rk_mpi_vi_test.dir/test_mpi_vi.cpp.o: in function `main':
test_mpi_vi.cpp:(.text.startup+0x1ee0): undefined reference to `TEST_COMM_APP_VDEC_StopProcWithDstChn'
/home/hya/workspace/SVN/RK3568SDK_Kernel5/buildroot/output/rockchip_rk3568/host/lib/gcc/aarch64-buildroot-linux-gnu/12.3.0/../../../../aarch64-buildroot-linux-gnu/bin/ld: test_mpi_vi.cpp:(.text.startup+0x1eec): undefined reference to `TEST_COMM_APP_VDEC_Stop'
/home/hya/workspace/SVN/RK3568SDK_Kernel5/buildroot/output/rockchip_rk3568/host/lib/gcc/aarch64-buildroot-linux-gnu/12.3.0/../../../../aarch64-buildroot-linux-gnu/bin/ld: test_mpi_vi.cpp:(.text.startup+0x1fec): undefined reference to `TEST_COMM_APP_VDEC_StartProcWithDstChn'
collect2: 错误:ld 返回 1
make[4]: *** [mpi/example/mod/CMakeFiles/rk_mpi_vi_test.dir/build.make:99:mpi/example/mod/rk_mpi_vi_test] 错误 1
make[3]: *** [CMakeFiles/Makefile2:390:mpi/example/mod/CMakeFiles/rk_mpi_vi_test.dir/all] 错误 2
make[2]: *** [Makefile:136:all] 错误 2
make[1]: *** [package/pkg-generic.mk:314:/home/hya/workspace/SVN/RK3568SDK_Kernel5/buildroot/output/rockchip_rk3568/build/rockit/.stamp_built] 错误 2
make: *** [Makefile:110:_all] 错误 2

编译完的可执行文件在buildroot\output/rockchip_rk3568/target/usr/bin/rk_mpi_vi_test

默认是编译到buildroot里的,然而我们的系统为debian系统

所以尝试将二进制文件直接push到debian系统下运行,报错

./rk_mpi_vi_test: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by ./rk_mpi_vi_test)

由此可知是debian与buildroot的GLIBC版本不兼容的问题

debian的glibc版本为2.31

root@hya:/# ldd --version
ldd (Debian GLIBC 2.31-13+deb11u7) 2.31

buildroo的glibc为2.37

root@rk3568-buildroot:/# strings ./usr/lib/libc.so.6 | grep "version"
versionsort64
gnu_get_libc_version
argp_program_version
versionsort
__nptl_version
argp_program_version_hook
RPC: Incompatible versions of RPC
RPC: Program/version mismatch
GNU C Library (Buildroot) stable release version 2.37.
Compiled by GNU CC version 12.3.0.

所以buildroot里编译的rockit_demo,push到debian系统里无法运行

升级debian的glibc版本

编辑 /etc/apt/sources.list 文件,将所有的bullseye替换为 testing

deb http://mirrors.ustc.edu.cn/debian testing main contrib
deb-src http://mirrors.ustc.edu.cn/debian testing main contrib
deb http://mirrors.ustc.edu.cn/debian-security testing-security main contrib
deb-src http://mirrors.ustc.edu.cn/debian-security testing-security main contrib
deb http://mirrors.ustc.edu.cn/debian testing-updates main contrib
deb-src http://mirrors.ustc.edu.cn/debian testing-updates main contrib
deb http://mirrors.ustc.edu.cn/debian/ testing-backports main contrib
deb-src http://mirrors.ustc.edu.cn/debian/ testing-backports main contrib

更新libc版本

sudo apt update
sudo apt install libc6/testing

升级完后再切换回Bullseye版本

deb http://mirrors.ustc.edu.cn/debian bullseye main contrib
deb-src http://mirrors.ustc.edu.cn/debian bullseye main contrib
deb http://mirrors.ustc.edu.cn/debian-security bullseye-security main contrib
deb-src http://mirrors.ustc.edu.cn/debian-security bullseye-security main contrib
deb http://mirrors.ustc.edu.cn/debian bullseye-updates main contrib
deb-src http://mirrors.ustc.edu.cn/debian bullseye-updates main contrib
deb http://mirrors.ustc.edu.cn/debian/ bullseye-backports main contrib
deb-src http://mirrors.ustc.edu.cn/debian/ bullseye-backports main contrib

更新系统

apt-get update
apt-get upgrade

使用此命令查看libc版本,可以看到debian的版本已经是最新的了

ldd --version

root@linaro-alip:/tmp# ldd --version
ldd (Debian GLIBC 2.37-12) 2.37
Copyright (C) 2023 自由软件基金会。
这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性
或者适合某些特殊目的。
由 Roland McGrath 和 Ulrich Drepper 编写。

手动更新GLIBC库有风险!慎用

将rockit的依赖库都push到debian的/usr/lib下

库路径在

buildroot/output/rockchip_rk3568/target/usr/lib/librockit.so

buildroot/output/rockchip_rk3568/target/usr/lib/libRkSwCas.so

buildroot/output/rockchip_rk3568/target/usr/lib/librkAlgoDis.so

buildroot/output/rockchip_rk3568/target/usr/lib/libgraphic_lsf.so

运行命令为rk_mpi_vi_test -w 1920 -h 1080 -t 4 -n /dev/video8 -m 4

其中-n为isp的mainpath节点

-m 4为vi_bind_vo_loop(阅读源码可以知道这个demo有多种bind模式)

大致流程则为

test_vi_init

create_vo

vi_bind_vo

重点关注create_vo前可以选择要使能的VoLayer和VoDev

基本流程也是getDev、setDev、enableDev、bind_dev_volayer、setLayerattr、enableLayer、setChnattr、enableChn

通过stLayerAttr设置要使能的图层分辨率、位置、帧率、格式等参数

通过stChnAttr设置通道参数

### 回答1: roc-rk3568-pc是款基于RK3568芯片的台式电脑板,它能够提供高性能、低功耗、多媒体处理以及AI加速等特性。roc-rk3568-pc实现了PC级性能和功能,可以运行Linux和Android操作系统,同时支持多种显示接口和存储接口。 例如,roc-rk3568-pc支持双频WiFi和蓝牙,可以通过HDMI、DP、VGA等接口连接显示器,还可以使用USB3.0、SATA、NVMe等接口连接存储设备。此外,roc-rk3568-pc还配备了四个USB 2.0接口、两个USB 3.0接口、个千兆网口、个SPI Flash等。 对于开发者和爱好者来说,roc-rk3568-pc提供了完整的软件开发包(SDK),包括操作系统、编译器、驱动程序、应用程序等。同时,roc-rk3568-pc还有丰富的软件生态系统和社区支持,大大降低了开发门槛和开发成本。 总之,roc-rk3568-pc是款高性能、全功能、易开发的台式电脑板,适用于各种应用场景,例如家庭娱乐、远程办公、物联网等。 ### 回答2: ROC-RK3568-PC例程是个基于ROC-RK3568平台设计的针对PC设备的系统应用程序。该例程主要提供了个使用ROC-RK3568平台的PC设备的示例,用户可通过该例程学习ROC-RK3568平台的基本应用,相应的硬件配置和软件编程技术。 针对ROC-RK3568-PC例程,用户需要掌握定的嵌入式系统开发技术。首先,用户需要了解ROC-RK3568平台的基本知识,并安装相应的开发环境和编译器。在编写程序的过程中,用户需要熟悉C/C++语言和Linux操作系统,同时掌握设备驱动和应用程序的编写方法,用于实现安装、媒体播放、网络通信、GUI开发等功能。 ROC-RK3568-PC例程的主要任务是提供个基本的嵌入式系统应用程序示例,让开发者通过学习和修改代码,快速掌握ROC-RK3568平台的开发和应用。该例程的编写需要开发者对ROC-RK3568平台熟悉到定程度,需要有定的软件编码能力和嵌入式系统设计经验。同时,用户还需要具备较好的沟通能力和团队协作能力,与其他成员共同完成开发任务。 总的来说,ROC-RK3568-PC例程是个有实际应用价值的例程,对于想要深入了解嵌入式系统开发的开发者,学习和掌握该例程的编写技术是非常有益的。 ### 回答3: ROC-RK3568-PC例程是指基于ROC-RK3568芯片的PC开发板的样例程序。ROC-RK3568是款高性能的处理器芯片,可以广泛应用于智能家居、工业控制、远程监控等领域。ROC-RK3568-PC是采用该芯片设计的款开发板,可以为开发者提供丰富的硬件接口,并支持多种操作系统,如Ubuntu、Android等。 ROC-RK3568-PC例程提供了各种各样的代码示例和应用程序,可以帮助开发者更好地理解和使用ROC-RK3568芯片,实现自己的应用程序。例如,样例程序包括了基于Qt的UI界面设计、GPIO控制、I2C读写、串口通信、网络通信、摄像头采集等功能。此外,还提供了蓝牙配对、TCP/IP通信、远程控制等应用程序,可以帮助开发者快速搭建自己的应用系统。 对于需要使用ROC-RK3568芯片进行开发的开发者来说,ROC-RK3568-PC例程是个非常有用的参考,可以加快开发进度,提高开发效率。自定义应用程序时,只需要根据自己的需求进行修改或者扩展即可。ROC-RK3568-PC例程提供了良好的参考和基础,为开发者快速实现自己所需的功能提供了便利。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值