rv1126 mpp部署加解决问题

rv1126 mpp部署 + test 执行失败问题

1.1 mpp 环境部署

​ 首先在我们自己的sdk中 ~/rv1126_linux_240110/external/mpp 将改目录拷贝到需要的目录下,下来我们将修改cmake 相关编译脚本

cd mpp/build/linux/arm/ ; vi make-Makefiles.bash

修改交叉编译工具路径 MPP_TOOLCHAIN=

bash 复制代码
#!/bin/bash
# Run this from within a bash shell

set +e

MPP_PWD=`pwd`
MPP_TOP=${MPP_PWD}/../../..

# toolchain detection
check_cmd(){
    "$@" >> /dev/null 2>&1
}
check_system_arm_linux_gcc(){
    check_cmd arm-linux-gcc -v
}

check_system_arm_linux_gcc
if [ $? -eq 127 ];then
#    MPP_TOOLCHAIN=${MPP_TOP}/../prebuilts/toolschain/usr/bin
    MPP_TOOLCHAIN=/home/alientek/work/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin                                                                                       
    export PATH=$PATH:${MPP_TOOLCHAIN}
fi

# generate Makefile
cmake -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_TOOLCHAIN_FILE=./arm.linux.cross.cmake \
      -DHAVE_DRM=ON \
      -G "Unix Makefiles" \
      ${MPP_TOP}                        

在同一个目录下 打开 arm.linux.cross.cmake

bash 复制代码
  1 
  2 cmake_minimum_required( VERSION 2.6.3 )
  3 
  4 SET(CMAKE_SYSTEM_NAME Linux)
  5 #SET(CMAKE_C_COMPILER "arm-linux-gnueabi-gcc")
  6 #SET(CMAKE_CXX_COMPILER "arm-linux-gnueabi-g++")
  7 #SET(CMAKE_SYSTEM_PROCESSOR "armv7-a")
  8 #SET(CMAKE_SYSTEM_PROCESSOR "armv7-a_hardfp")
  9 
 10 SET(CMAKE_C_COMPILER "arm-linux-gnueabihf-gcc")
 11 SET(CMAKE_CXX_COMPILER "arm-linux-gnueabihf-g++")
 12 SET(CMAKE_SYSTEM_PROCESSOR "armv7-a_hardfp")
 13 
 14 add_definitions(-fPIC)
 15 add_definitions(-DARMLINUX)                                                                                                                                                                            
 16 #add_definitions(-Dlinux)
 17 add_definitions(-D__gun_linux__)

接下来 操作 make;export DESTDIR=./install;make install;

在这个install 目录下所有生成的库就在这里面。

.

└── usr

└── local

├── bin

│ ├── mpi_dec_mt_test

│ ├── mpi_dec_multi_test

│ ├── mpi_dec_nt_test

│ ├── mpi_dec_test

│ ├── mpi_enc_mt_test

│ ├── mpi_enc_test

│ ├── mpi_rc2_test

│ ├── mpp_info_test

│ └── vpu_api_test

├── include

│ └── rockchip

│ ├── mpp_buffer.h

│ ├── mpp_compat.h

│ ├── mpp_err.h

│ ├── mpp_frame.h

│ ├── mpp_log_def.h

│ ├── mpp_log.h

│ ├── mpp_meta.h

│ ├── mpp_packet.h

│ ├── mpp_rc_api.h

│ ├── mpp_rc_defs.h

│ ├── mpp_task.h

│ ├── rk_hdr_meta_com.h

│ ├── rk_mpi_cmd.h

│ ├── rk_mpi.h

│ ├── rk_type.h

│ ├── rk_vdec_cfg.h

│ ├── rk_vdec_cmd.h

│ ├── rk_venc_cfg.h

│ ├── rk_venc_cmd.h

│ ├── rk_venc_rc.h

│ ├── rk_venc_ref.h

│ ├── vpu_api.h

│ └── vpu.h

└── lib

├── librockchip_mpp.so -> librockchip_mpp.so.1

├── librockchip_mpp.so.0

├── librockchip_mpp.so.1 -> librockchip_mpp.so.0

├── librockchip_vpu.so -> librockchip_vpu.so.1

├── librockchip_mpp.so.0

├── librockchip_vpu.so.1 -> librockchip_vpu.so.0

└── pkgconfig

├── rockchip_mpp.pc

└── rockchip_vpu.pc

1.2 编译demo mpi_enc_test

arm-linux-gnueabihf-gcc mpi_enc_test.c -o mpi_enc_test -I ../inc/ -I ../osal/inc/ -I ../utils/ -L ../build/linux/arm/install/usr/local/lib/ -lrockchip_mpp -lrockchip_vpu -lpthread -L ../build/linux/arm/utils/ -lutils

这里都是相对路径 读者可以直接复制的。

接下来我们将其推入板子里执行一下。

2.2 mpi_enc_test 执行不通过问题

如果在执行的时候出现 undefined symbol._mpp_log_l 错误 直接把 librockchip_mpp.so.0 librockchip_mpp.so.0 放在开发板上的/oem/usr/lib/ 文件里

./mpi_enc_test 加上一些参数 执行起来。

好好好 逗我开心是吧

bash 复制代码
mpp_rt: NOT FOUND drm allocator
mpp_serivce: mpp_service_cmd_send i octl MPP_IOC_CFG_V1 failed ret -1 errno 112 Cannot allocate memory

这是什么错误 看了一下博客 说是drm 无法申请内存 原因是找不到/dev/dri/card0

看一下系统日志

bash 复制代码
[    0.000000] OF: fdt: Reserved memory: failed to reserve memory for node 'drm-logo@00000000': base 0x00000000, size 0 MiB
[    0.199884] rockchip-drm display-subsystem: Linked as a consumer to ffb00000.vop
[    0.201754] rockchip-drm display-subsystem: devfreq is not set
[    0.202337] rockchip-drm display-subsystem: bound ffb00000.vop (ops 0xb0940e80)
[    0.202374] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[    0.202395] [drm] No driver support for vblank timestamp query.
[    0.202537] rockchip-drm display-subsystem: failed to parse loader memory
[    0.202835] rockchip-drm display-subsystem: master bind failed: -22
[    0.202913] rockchip-drm: probe of display-subsystem failed with error -22

那就追一下 drm驱动吧。

主要问题就是 倒数第二句 也是drm probe 的时候失败了

c 复制代码
static int rockchip_drm_bind(struct device *dev)
追到这个函数 
    -->rockchip_drm_fbdev_init  死在这里面了  
    看一下这个函数实现
  1 F   f    rockchip_drm_fbdev_init  /home/alientek/work/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c
               int rockchip_drm_fbdev_init(struct drm_device *dev)
  2 F   f    rockchip_drm_fbdev_init  /home/alientek/work/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.h
               static inline int rockchip_drm_fbdev_init(struct drm_device *dev)
   
    大概追了一下 实现这个函数有两个地方  一个内敛函数直接就是return 0; 另一个就不一样了, 因为我编译了 rockchip_drm_fbdev.c 导致在设备树中没有匹配上 所以在 fbdev_init 失败了  因为硬件根本没有 所以没有添加相关节点。
   
       下面还有个函数   drm_dev_register 他就是注册 card0设备的
  
  make menuconfig  关掉这个编译符号
      

来吧 执行

bash 复制代码
[root@ATK-DLRV1126:/userdata]# mpi_enc_test -i 200frames_count.yuv  -o 1.h264 -w
 640 -h 480
mpp[934]: mpi_enc_utils: cmd parse result:
mpp[934]: mpi_enc_utils: input  file name: 200frames_count.yuv
mpp[934]: mpi_enc_utils: output file name: 1.h264
mpp[934]: mpi_enc_utils: width      : 640
mpp[934]: mpi_enc_utils: height     : 480
mpp[934]: mpi_enc_utils: format     : 0
mpp[934]: mpi_enc_utils: type       : 7
mpp[934]: mpi_enc_test: mpi_enc_test start
mpp[934]: mpp_rt: NOT found ion allocator
mpp[934]: mpp_rt: found drm allocator
mpp[934]: mpp_info: mpp version: unknown mpp version for missing VCS info
mpp[934]: mpi_enc_test: 0x34120 mpi_enc_test encoder test start w 640 h 480 type 7
mpp[934]: mpp_enc: MPP_ENC_SET_RC_CFG bps 1152000 [72000 : 1224000] fps [30:30] gop 60
mpp[934]: h264e_api_v2: MPP_ENC_SET_PREP_CFG w:h [640:480] stride [640:480]
mpp[934]: mpp_enc: send header for set cfg change input/format
mpp[934]: mpp_enc: mode vbr bps [72000:1152000:1224000] fps fix [30/1] -> fix [30/1] gop i [60] v [0]
mpp[934]: mpi_enc_test: 0x34120 encoded frame 0    size 501     qp 22
..............................................................................
mpp[934]: mpi_enc_test: 0x34120 encoded frame 197  size 2077    qp 10
mpp[934]: mpi_enc_test: 0x34120 encoded frame 198  size 1633    qp 10
mpp[934]: mpi_enc_test: 0x34120 encoded frame 199  size 3780    qp 11
mpp[934]: mpi_enc_test: 0x34120 found last frame. feof 1
mpp[934]: mpi_enc_test: 0x34120 encoded frame 200  size 0
mpp[934]: mpi_enc_test: 0x34120 found last packet
mpp[934]: mpi_enc_test: 0x34120 mpi_enc_test success total frame 201 bps 381785

就这么多 希望大家调试不会err fail 只有success 常伴