【MPP踩坑记录】RK3588跑MPP的./mpi_dec_test运行报错

报错截图

图片[1]-【MPP踩坑记录】RK3588跑MPP的./mpi_dec_test运行报错-天煜博客
topeet@topeet:~/work/mpp/build/linux/aarch64/test$ ./mpi_dec_test -i /home/topeet/Videos/vehicle_record_0_20260503_175006_raw.h264  -o out/out1.yuv -w 1920 -h 1080 -t 7 
mpp[104928]: mpp_platform: client 4 driver is not ready!
mpp[104928]: mpi_dec_utils: input file /home/topeet/Videos/vehicle_record_0_20260503_175006_raw.h264 size 11415441
mpp[104928]: mpi_dec_utils: cmd parse result:
mpp[104928]: mpi_dec_utils: input  file name: /home/topeet/Videos/vehicle_record_0_20260503_175006_raw.h264
mpp[104928]: mpi_dec_utils: output file name: out/out1.yuv
mpp[104928]: mpi_dec_utils: width      : 1920
mpp[104928]: mpi_dec_utils: height     : 1080
mpp[104928]: mpi_dec_utils: type       :    7
mpp[104928]: mpi_dec_utils: max frames :    0
mpp[104928]: mpi_dec_test: mpi_dec_test start
mpp[104928]: mpp_info: mpp version: 2e93ab79 author: Herman Chen   2026-04-28 fix: fix CHANGELOG.md
mpp[104928]: mpi_dec_test: 0x5595346080 mpi_dec_test decoder test start w 1920 h 1080 type 7
mpp[104928]: mpp_dma_heap: os_allocator_dma_heap_open open dma heap type 0 system failed!
mpp[104928]: mpp_buffer: MppBufferService get_group failed to get allocater with mode 0 type 20001
mpp[104928]: mpp_buffer: mpp_buffer_group_limit_config input invalid group (nil)
mpp[104928]: mpp_dma_heap: os_allocator_dma_heap_open open dma heap type 0 system-uncached failed!
mpp[104928]: mpp_buffer: MppBufferService get_group failed to get allocater with mode 0 type 1
mpp[104928]: mpp_hal: hal_impl_init mpp_buffer_group_get_internal failed. ret: -1
mpp[104928]: mpp_hal: mpp_hal_init soc rockchip,rk3588-evb7-v11 rockchip,rk3588 hal h264d_vdpu34x init failed ret -1
mpp[104928]: mpp_dec: mpp_dec_init could not init hal
mpp[104928]: mpp: error found on mpp initialization
mpp[104928]: mpi_dec_test: 0x5595346080 mpp_init failed
mpp[104928]: mpi_dec_test: test failed ret -1
mpp[104928]: mpp_mem_pool: put_pool pool mpp_packet       found 1 used buffer size  328 at mpp_packet_srv_deinit

问题分析

看这个错误日志,问题很明确:MPP 无法打开 DMA heap 设备节点,导致硬件解码器初始化失败。

核心错误定位

mpp_dma_heap: os_allocator_dma_heap_open open dma heap type 0 system failed!
mpp_dma_heap: os_allocator_dma_heap_open open dma heap type 0 system-uncached failed!
mpp_platform: client 4 driver is not ready!

MPP 在 RK3588 上需要通过 /dev/dma_heap/system/dev/dma_heap/system-uncached 来分配 DMA 内存给 VPU 使用。打开失败通常是设备节点不存在当前用户没有权限

排查步骤

1. 检查 dma_heap 设备节点是否存在

ls -l /dev/dma_heap/

正常情况下应该看到:

crw-rw---- 1 root video ... system
crw-rw---- 1 root video ... system-uncached
crw-rw---- 1 root video ... cma  

如果目录不存在或为空 → 内核未启用 CONFIG_DMABUF_HEAPS_SYSTEM / CONFIG_DMABUF_HEAPS_CMA,需要重新编译内核或更换正确的内核镜像,这里是存在的。

2. 检查权限

groups
ls -l /dev/dma_heap/system /dev/dma_heap/system-uncached

如果设备属于 video 组而用户 topeet 不在该组里,把用户加进去:

sudo usermod -aG video topeet
# 注销重新登录,或临时用 newgrp video 生效

或者图省事先用 sudo 跑一下,验证是不是纯权限问题:

sudo ./mpi_dec_test -i /home/topeet/Videos/vehicle_record_0_20260503_175006_raw.h264 -o out/out1.yuv -w 1920 -h 1080 -t 7

sudo 果然能跑通,那就是权限问题。

图片[2]-【MPP踩坑记录】RK3588跑MPP的./mpi_dec_test运行报错-天煜博客

按照上面的加组也没完全解决,因为权限是 600,owner/group 都是 root,普通用户根本无法打开。已经在 video 组里了,但设备节点没归到 video 组,所以加组也没用。需要修改 udev 规则把这两个节点的权限放开给 video 组。

crw------- 1 root root  /dev/dma_heap/system
crw------- 1 root root  /dev/dma_heap/system-uncached

3. 检查 VPU 驱动是否加载

ls /dev/mpp_service /dev/rkvdec* /dev/rkvenc* 2>/dev/null
dmesg | grep -iE "mpp|rkvdec|rkvenc|vpu"

client 4 driver is not ready 这条提示对应 H.264 解码器(client type 4 = VDPU/RKVDEC),如果上面这些设备节点缺失,说明 VPU 驱动根本没加载进内核。

解决方法

添加udec规则可以彻底解决该问题

在/etc/udev/rules.d/目录下发现了99-rockchip-permissions.rules文件,里面正是对权限的一些配置:

图片[3]-【MPP踩坑记录】RK3588跑MPP的./mpi_dec_test运行报错-天煜博客

使用VIM编辑器将DMA相关的配置添加到MALI配置后面,然后保存退出:

KERNEL==”system”, SUBSYSTEM==”dma_heap”, GROUP=”video”, MODE=”0660″
KERNEL==”system-uncached”, SUBSYSTEM==”dma_heap”, GROUP=”video”, MODE=”0660″
KERNEL==”cma”, SUBSYSTEM==”dma_heap”, GROUP=”video”, MODE=”0660″

完整的/etc/udev/rules.d/99-rockchip-permissions.rules文件内容如下:

ACTION=="remove", GOTO="permissions_end"

# VPU devices
KERNEL=="avsd", MODE="0660", GROUP="video"
KERNEL=="vepu", MODE="0660", GROUP="video"
KERNEL=="h265e", MODE="0660", GROUP="video"
KERNEL=="rkvdec", MODE="0660", GROUP="video"
KERNEL=="rkvenc", MODE="0660", GROUP="video"
KERNEL=="mpp_service", MODE="0660", GROUP="video"
KERNEL=="vpu[_-]service", MODE="0660", GROUP="video"
KERNEL=="hevc[_-]service", MODE="0660", GROUP="video"

# RGA device
KERNEL=="rga", MODE="0660", GROUP="video"

# MALI devices (/dev/mali for mali400)
KERNEL=="mali*", MODE="0660", GROUP="video"

# DMA-BUF heaps (for RK3588 MPP buffer allocation)
SUBSYSTEM=="dma_heap", KERNEL=="system",          MODE="0660", GROUP="video"
SUBSYSTEM=="dma_heap", KERNEL=="system-uncached", MODE="0660", GROUP="video"
SUBSYSTEM=="dma_heap", KERNEL=="cma",             MODE="0660", GROUP="video"

LABEL="permissions_end"

然后让规则立即生效:

sudo udevadm control --reload-rules
sudo udevadm trigger

验证一下:

ls -l /dev/dma_heap/

应该变成 crw-rw---- root video。然后直接以 topeet 身份跑 mpi_dec_test 就行。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容