1、概述
本文总结 RK 产品平台上,处理 RGA 相关的各种显示问题的步骤和方法。本文一方面作为对过往工作方法的总结,另一方面也可以作为后续调试工作的参考。
RK
芯片中使用的 RGA,分为 2 两个大版本:
- RGA1 在 RK31xx RK30xx 系列芯片中使用
- RGA2 在 RK32xx RK33xx 系列芯片中使用
RGA 相关的问题主要可以分为两种类型的问题。第一类是 UserSpace 的问题这种类型的问题主要是
用户在调用使用 RGA 接口的时候存在的不会使用和错误使用,这累问题是 RGA 相关问题最多也是最主要的问题。关于这类问题的解决方法将在 RGA_
FAQ 一章详细介绍。第二类是
kernelSpace 的问题,此类问题主要是驱动存在 bug 和需要优化的地方,反应出来的现象比较严重例如
内核 crash 和系统卡死。这类问题需要相关工程可以收集好需要的 log 和前期分析帮助驱动维护的工程师可以快速定位问题。
2、RGA 问题相关 log 获取和说明
用户调用 RGA 驱动有两种方式一种是通过 librga 的相关 hal 层接口调底层驱动,另外一种是直接通过IOCTL 命令调用底层驱动。第一种方式在 hal 层封装了 RGA 驱动的调用接口使得调用者可以更加方便安全的使用 RGA 工作。关于 librga 的使用请参考 librga 的相关文档。该文档详细介绍了 librga 的使用说明和相关 demo 介绍,以及调试方法。固本文对 librga 的使用不再赘述,主要介绍 kernel 驱动的调试方法。
RGA kernel 驱动的调式节点概述
新版的内核 RGA 驱动在旧版本的基础上将相关的调试 log 进行了相对友好的字符串转换,便于调式人员对 log 的分析。同时通过加入节点的方式使得调式信息的输出可控,且不需要重新编译下载代码。通过节点可以方便通过一些命令跑一些测试 case 方便调试。前文提到 RGA 有两个大版本 RGA1 和 RGA2。两者的调试节点的使用完全相同调式方法也是一样的唯一的区别在于节点的路径做了版本的区别。
Rga1 版本调式节点路径为:d/rga_debug/rga
Rga2 版本调试节点路径为:d/rga2_debug/rga2
2.1 RGA kernel 驱动的调式节点使用说明
1. RGA1 和 RGA2 的调试节点的使用方法完全相同我们以 RGA2 的节点为例子做介绍。
2. cat rga2 该命令可以让
串口打印 RGA 节点的使用说明。
rk322x_box:/d/rga2_debug # cat rga2
echo reg > rga2 to open rga reg MSG //开启寄存器配置打印
echo msg > rga2 to open rga msg MSG //开启传递参数打印
echo time > rga2 to open rga time MSG //开启耗时打印
echo check > rga2 to open rga check flag //打开检查 case 功能
echo stop > rga2 to stop using hardware //停用 rga 驱动
echo int > rga2 to open interruppt MSG //打开中断信息打印
echo slt > rga2 to open slt test // 进行内部 slt 测试
3. RGA 的通过节点打开的相关打印信息打印级别为 KERNEL_DEBUG。需要敲入 dmesg 才能在串口或者通过
adb 看到相关打印。
4. 打印 log 的开启于关闭命令是一样的,每次输入命令会切换当前的打印状态。可以通过相关的打印信息”open xxx” 或者”close xxx” 来确认。
rk322x_box:/d/rga2_debug # echo msg > rga2;dmesg -c //敲入命令
[49578.694343] rga2: open rga2 test MSG! // 打印信息提示当前为打开状态
rk322x_box:/d/rga2_debug # echo msg > rga2;dmesg -c //敲入命令
[49579.462952] rga2: close rga2 test MSG! // 打印信息提示当前为关闭状态
5. echo msg > rga 该命令开关 RGA 上层配置参数信息的打印。打开该打印时,上层调用 rga 驱动传递的参数将被打印出来。
6. echo time > rga 该命令开关 RGA 工作耗时信息的打印。打开该打印时,将会打印每一次的调用rga 工作的耗时。
7. echo reg > rga 该命令开关 RGA 寄存器配置信息的打印。打开该打印时,将会打印每次 rga 工作寄存器的配置值。
8. echo int > rga 该命令开关 RGA 寄存器中断信息的打印。打开该打印时,将会在 RGA 进入中断后打印中断寄存器和状态基础器的当前值。
9. echo check > rga 该命令开关 RGA 内部的测试 case。打开该打印时,将会在 RGA 每次工作的时候检查相关的参数,主要是内存的检查,和对齐是否满足要求。若输出如下 log 表示通过检查。若内存存在越界的情况,将会导致内核 crash。可以通过 cash 之前的打印 log 确认是 src 数据的问题还是 dst 数据的问题。
10. echo stop > rga 该命令开关 RGA 的工作状态。开启时,rga 将不工作直接返回。用于一些特殊情况下的调式。
11. echo slt > rga 该命令让 rga 驱动执行内部 SLT case 测试 rga 硬件是否正常。 若输出如下log 表示正常。
2.2 RGA 打印 log 说明
对于 RGA 的问题调试需要借助相关的 log 来弄清当前 RGA 执行的是什么工作,上文已经说明了相关 log的开启。接下来将说明如何分析这些 log。
下图是开启 msg 串口输出的 log 示例。
1. rga2: cmd is RGA_GET_
version //获取版本信息
2. rga2: cmd is RGA_BLIT_SYNC //显示当前传入的工作模式
3. rga2: render_mode:bitblt, //调用的接口
4. blitBlit_mode=0, //合成模式 0:A+B = B ,1: A+B+C 目前使用的是 A+B=B
5. rotate_mode:270 degree //旋转角度
6. rga2: src : y=7 uv=0 v=e1000 aw=1280 ah 720 vw=1280 wh=720 xoff=0 yoff=0 format=YCbCr420SP数据源 y:Fd uv:虚拟地址 v: vw*vh aw,ah 实宽实高 vw ,vh 虚宽虚高 xoff,yoff: x,y 方向偏移 format :数据格式
7. rga2: dst : y=8 uv=0 v=e1000 aw=720 ah 1280 vw=720 wh=1280 xoff=0 yoff=0 format=YCbCr420SP目的数据:说明同上。
8. rga2: mmu : src=01 src1=00 dst=01 els=00 //mmu 使能位 1 开启 0 关闭
9. rga2: blend mode alpha //alpha 合成模式 105 ; 405
10. rga2:
YUV2rgb mode ,rgb2yuv mode // yuv 色域选择位
RGA 的两种工作模式说明:
RGA 驱动对外提供同步和异步接口既 SYNC 和 ASYNC。如图一所示,当配置同步模式时,驱动只有在完成本次工作或者出现异常情况才会返回。如图二所示,当配置异步模式时,驱动会将配置的工作任务加入到工作队列,开启硬件工作模式不用等待工作完成直接返回。当应用层需要使用 RGA 处理过的 buffer 数据时再配入 FLUSH 命令用于查询硬件工作完成情况。
更多详细内容请下载附件查看