瑞芯微RK3568开发:RGA模块的使用问题分析

news/2025/3/19 10:42:35/

rga模块介绍

        rk系列的rga模块硬件版本、驱动版本和动态库版本都比较多,说实话一款芯片能把其中的一个硬核做成这么多差异版本出来,也是不容易。以下是sdk文档《Rockchip_Developer_Guide_RGA_CN》中的介绍。

        除此之外,在接口层的重载设计,也是五花八门,第一眼看去都不知道该用哪个接口了。

rga问题分析

        问题描述:RGA_MMU unsupported memory larger than 4G!

[ 6653.664110] rga_mm: RGA_MMU unsupported memory larger than 4G!
[ 6653.664189] rga_mm: scheduler core[4] unsupported mm_flag[0x8]!
[ 6653.664290] rga_mm: rga_mm_map_buffer map virtual address error!
[ 6653.664306] rga: buffer[0] mm import buffer failed! memory = 0x7f87539010, type = virt_addr(0x1)
[ 6653.664955] rga_mm: RGA_MMU unsupported memory larger than 4G!
[ 6653.664973] rga_mm: scheduler core[4] unsupported mm_flag[0x8]!
[ 6653.665071] rga_mm: rga_mm_map_buffer map virtual address error!
[ 6653.665082] rga: buffer[0] mm import buffer failed! memory = 0x7f86d4f010, type = virt_addr(0x1)

        出现上述这个表现的根本原因是,rk3568的rga硬核的iommu范围是32bit,不能寻址到大于4GB的内存空间。再简单点说,就是rk这里兼容性设计的不好,在程序使用上,不能随意分配内存的起始地址,所以使用上有2点约束。

1、使用32bit寻址空间内的地址,而且最好是dma映射的空间,因为dma的效率更高;

        那么低32bit的dma-buf空间怎么映射的呢?

        参考内核源码drivers/dma-buf/heaps/rk_system_heap.c,已经做好了几个空间的dma_heap,下图是注册的几个字符设备节点,“system-uncached-dma32” 映射的就是低32bit的地址空间,如下图是文件系统查看到的节点。

        所以在编程使用上,只需要去申请“system-uncached-dma32”节点的映射空间即可,这个节点在头文件linux-rga/samples/utils/allocator/include/dma_alloc.h中被申明为宏DMA_HEAP_DMA32_UNCACHE_PATCH。

2、必须importbuffer_virtualaddr,不能跳过而直接wrapbuffer_xxx,意思是告诉rga模块这个已经分配好的共享地址;

rga编程demo

        以linux-rga中的一个例程做简单的demo。

以接口dma_buf_alloc(DMA_HEAP_DMA32_UNCACHE_PATCH, src_buf_size, &src_dma_fd, (void **)&src_buf)去申请共享地址空间。

#if USE_DMA_HEAPret = dma_buf_alloc(DMA_HEAP_DMA32_UNCACHE_PATCH, src_buf_size, &src_dma_fd, (void **)&src_buf);if (ret < 0) {printf("alloc src dma32_heap buffer failed!\n");return -1;}ret = dma_buf_alloc(DMA_HEAP_DMA32_UNCACHE_PATCH, dst_buf_size, &dst_dma_fd, (void **)&dst_buf);if (ret < 0) {printf("alloc dst dma32_heap buffer failed!\n");return -1;}
#else(void)(src_dma_fd);(void)(dst_dma_fd);src_buf = (char *)malloc(src_buf_size);dst_buf = (char *)malloc(dst_buf_size);if (src_buf == NULL || dst_buf == NULL) {printf("malloc failed!\n");return -1;}
#endif/* fill image data */if (0 != read_image_from_file(src_buf, LOCAL_FILE_PATH, src_width, src_height, src_format, 0)) {printf("src image read err\n");memset(src_buf, 0xaa, src_buf_size);}memset(dst_buf, 0x80, dst_buf_size);src_handle = importbuffer_virtualaddr(src_buf, src_buf_size);dst_handle = importbuffer_virtualaddr(dst_buf, dst_buf_size);if (src_handle == 0 || dst_handle == 0) {printf("importbuffer failed!\n");goto release_buffer;}src_img = wrapbuffer_handle(src_handle, src_width, src_height, src_format);dst_img = wrapbuffer_handle(dst_handle, dst_width, dst_height, dst_format);ret = imcheck(src_img, dst_img, {}, {});if (IM_STATUS_NOERROR != ret) {printf("%d, check error! %s", __LINE__, imStrError((IM_STATUS)ret));return -1;}


http://www.ppmy.cn/news/1580298.html

相关文章

采购供应链管理培训及供应链网络优化案例P109(109页PPT)(文末有下载方式)

资料解读&#xff1a;采购供应链管理培训及供应链网络优化案例P109 详细资料请看本解读文章的最后内容。 供应链管理是企业运营中至关重要的一环&#xff0c;尤其是在全球化背景下&#xff0c;供应链的复杂性和重要性愈发凸显。本文将从供应链管理的全局观、供应商管理、供应…

AI教我做事之RAG开发-21 RAGFlow深度研究

引言 检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;自2020年由Lewis等人提出以来&#xff0c;已成为AI领域的重要范式&#xff0c;尤其在需要外部知识支持的场景中表现出色。RAG Flow框架是对RAG的进一步抽象和优化&#xff0c;旨在通过定义清晰的…

VSCode - 查看 PDF 文件

VSCode 原生并不支持 查看 PDF 文件&#xff0c;需要额外安装插件。 这里我使用 vscode-pdf&#xff0c;效果还不错&#xff0c;有需要的可以搜索安装。 效果&#xff1a; 2025-03-18&#xff08;二&#xff09;

C++基础: Rule of five/zero/three

Rule of five 在 C Core Guidelines 中&#xff0c;有这样的一条指导原则: C.21: If you define or delete any copy, move, or destructor function, define or delete them all 就是说如果你定义了或者删除(delete): 拷贝构造函数, 移动构造函数, 拷贝赋值函数, 移动赋值函数…

调试 Rust + WebAssembly 版康威生命游戏

1. 启用 Panic 日志 1.1 让 Panic 信息显示在浏览器控制台 如果 Rust 代码发生 panic!()&#xff0c;默认情况下不会在浏览器开发者工具中显示详细的错误信息。这使得排查问题变得困难。 我们可以使用 console_error_panic_hook 这个 Rust crate&#xff0c;将 Panic 信息打…

解决uni-app授权弹框华为审核拒绝

背景&#xff1a; 在使用定位、相机、文件、电话&#xff0c;需要用户同意授权时&#xff0c;华为和vivo需要告知用户使用权限目的。 方案&#xff1a; 在uni授权时&#xff0c;弹框告诉授权目的&#xff0c;效果如下&#xff1a; 代码&#xff1a; const perListener {//…

AI爬虫 :Crawl4AI的安装和详细使用案例(开源 LLM 友好型网络爬虫)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Crawl4AI概述1.1 Crawl4AI 介绍1.2 Crawl4AI 做什么?1.3 Crawl4AI 的核心理念1.4 Crawl4AI v0.5.0 新功能2. Crawl4AI的安装和第一个案例2.1 Crawl4AI 的安装2.2 初始设置2.3 诊断2.4 第一个案例2.5 高级安装(可选…

Linux top 命令详解:从入门到高级用法

Linux top 命令详解&#xff1a;从入门到高级用法 在 Linux 系统中&#xff0c;top 是一个强大的实时监控工具&#xff0c;用于查看系统资源使用情况和进程状态。它可以帮助你快速了解 CPU、内存、负载等信息&#xff0c;是系统管理员和开发者的日常利器。本文将从基本用法开始…