xref: /OK3568_Linux_fs/external/linux-rga/docs/Rockchip_FAQ_RGA_CN.md (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun# RGA FAQ
2*4882a593Smuzhiyun
3*4882a593Smuzhiyun文件标识:RK-PC-YF-404
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun发布版本:V1.1.2
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun日期:2023-06-28
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun文件密级:□绝密   □秘密   □内部资料   ■公开
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun**免责声明**
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun本文档按“现状”提供,瑞芯微电子股份有限公司(“本公司”,下同)不对本文档的任何陈述、信息和内容的准确性、可靠性、完整性、适销性、特定目的性和非侵权性提供任何明示或暗示的声明或保证。本文档仅作为使用指导的参考。
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun由于产品版本升级或其他原因,本文档将可能在未经任何通知的情况下,不定期进行更新或修改。
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun**商标声明**
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun“Rockchip”、“瑞芯微”、“瑞芯”均为本公司的注册商标,归本公司所有。
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun本文档可能提及的其他所有注册商标或商标,由其各自拥有者所有。
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun**版权所有 © 2022 瑞芯微电子股份有限公司**
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun超越合理使用范畴,非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun瑞芯微电子股份有限公司
28*4882a593Smuzhiyun
29*4882a593SmuzhiyunRockchip Electronics Co., Ltd.
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun地址:     福建省福州市铜盘路软件园A区18号
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun网址:     [www.rock-chips.com](http://www.rock-chips.com)
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun客户服务电话: +86-4007-700-590
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun客户服务传真: +86-591-83951833
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun客户服务邮箱: [fae@rock-chips.com](mailto:fae@rock-chips.com)
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun---
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun**读者对象**
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun本文档(本指南)主要适用于以下工程师:
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun- 技术支持工程师
48*4882a593Smuzhiyun- 软件开发工程师
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun**修订记录**
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun| **日期**   | **版本** | **作者** | **修改说明**                    |
53*4882a593Smuzhiyun| ---------- | -------- | -------- | ------------------------------- |
54*4882a593Smuzhiyun| 2021/06/28 | 1.0.0    | 余乔伟   | 初始版本                        |
55*4882a593Smuzhiyun| 2022/12/21 | 1.1.0    | 余乔伟   | 增加针对multi_rga驱动的异常案例 |
56*4882a593Smuzhiyun| 2023/02/09 | 1.1.1    | 余乔伟   | 更正文档格式                    |
57*4882a593Smuzhiyun| 2023/06/28 | 1.1.2    | 余乔伟   | 补充Q&A                         |
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun---
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun**目录**
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun[TOC]
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun---
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun## 概述
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun本文针对于RGA驱动以及用户态接口librga,总结RK平台上调用RGA硬件实现OSD(On Screen Display)和 GUI(Graphics User Interface)图形绘制加速功能时遇到的一些常见问题。
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun---
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun## 版本说明
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun### 硬件版本
78*4882a593Smuzhiyun
79*4882a593SmuzhiyunRGA硬件主要分为三个版本版本:RGA1、RGA2、RGA3。具体平台搭载信息、支持功能以及限制条件可以查看 [Rockchip_Developer_Guide_RGA_CN](./Rockchip_Developer_Guide_RGA_CN.md) ——概述 章节。
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun### 软件版本
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun以下仅提供常用的版本查询方式,详细的可以查阅 [Rockchip_Developer_Guide_RGA_CN](./Rockchip_Developer_Guide_RGA_CN.md)  —— 版本说明 章节。
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun#### librga
88*4882a593Smuzhiyun
89*4882a593SmuzhiyunAPI版本号分为主版本号、次版本号、修订版本号、编译版本号,四个等级版本号对应不同程度的功能更新。
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun- 版本号查询
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun  比较通用的查询方法如下:
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun  ```
96*4882a593Smuzhiyun  strings librga.so |grep rga_api |grep version
97*4882a593Smuzhiyun  ```
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun- 更新版本方式
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun  当发现版本不满足要求时,可以通过以下方式获取源码或预编译的库文件。
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun  - github预编译仓库:
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun    https://github.com/airockchip/librga
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun  - 百度网盘链接:
108*4882a593Smuzhiyun
109*4882a593Smuzhiyunhttps://eyun.baidu.com/s/3jJ9Aiz0
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun#### RGA driver
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun驱动版本号分为主版本号、次版本号、修订版本号、编译版本号,四个等级版本号对应不同程度的功能更新,通常发布的SDK中HAL库与驱动是匹配的,librga内部会进行校验版本,开发者无需关心该版本。当出现单独更新librga时出现以下报错,则须要更新驱动至对应版本即可。
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun- 版本号查询
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun  不同芯片平台debug节点开启路径不同,通常有以下两个路径。
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun  ```
122*4882a593Smuzhiyun  cat /sys/kernel/debug/rkrga/driver_version
123*4882a593Smuzhiyun  cat /proc/rkrga/driver_version
124*4882a593Smuzhiyun  ```
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun- 更新版本方式
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun  当发现版本不满足要求时,可以通过以下方式获取源码更新kernel。
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun  - 百度网盘链接:
131*4882a593Smuzhiyun
132*4882a593Smuzhiyunhttps://eyun.baidu.com/s/3dGhufEL
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun#### 版本对应关系
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun使用RGA时需要确认保证当前的运行环境是可以正常工作的,下表为常用的librga与驱动版本对应关系。
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun| librga版本    | 对应驱动                                                     | 硬件支持         |
141*4882a593Smuzhiyun| ------------- | ------------------------------------------------------------ | ---------------- |
142*4882a593Smuzhiyun| 无版本号      | 对应SDK内驱动                                                | RGA1、RGA2       |
143*4882a593Smuzhiyun| 1.0.0 ~ 1.3.2 | RGA Device Driver(kernel - 4.4及以上)<br/>RGA2 Device Driver(无版本号或v2.1.0) | RGA1、RGA2       |
144*4882a593Smuzhiyun| > 1.4.0       | RGA multicore Device Driver(v1.2.0及以上)                  | RGA2、RGA3       |
145*4882a593Smuzhiyun| > 1.9.0       | RGA Device Driver(kernel-4.4及以上)<br/>RGA2 Device Driver(无版本号和v2.1.0)<br/>RGA multicore Device Driver(v1.2.0及以上) | RGA1、RGA2、RGA3 |
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun通常发布的SDK中是版本是匹配的,但是出于一些应用对高版本librga.so的依赖,可以使用以下百度网盘链接获取RGA模块代码更新包:
148*4882a593Smuzhiyun
149*4882a593Smuzhiyunhttps://eyun.baidu.com/s/3i6sbsDR
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun- update-to-MULTI_RGA
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun​		原有驱动为RGA Device Driver、RGA2 Device Driver时,使用该更新包更新驱动到RGA multicore Device Driver,并更新匹配版本的librga。
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun- MUTIL_RGA
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun  原有驱动为RGA multicore Device Driver时,使用该更新包更新驱动版本,并更新匹配版本的librga。
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun- RGA2
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun  原有驱动为RGA2 Device Driver时,使用该更新包更新驱动版本,并更新匹配版本的librga。
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun- RGA1
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun  原有驱动为RGA Device Driver时,使用该更新包更新驱动版本,并更新匹配版本的librga。
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun---
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun## 调试说明
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun### HAL层运行日志
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun#### 日志开关
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun- Android平台
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun  Android平台支持使用属性配置librga是否开启HAL层日志打印:
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun  - 开启日志打印:
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun  ```shell
184*4882a593Smuzhiyun  setprop vendor.rga.log 1
185*4882a593Smuzhiyun  logcat -s librga
186*4882a593Smuzhiyun  ```
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun  - 设置日志等级:
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun    日志等级分为全打印(0)、DEFAULT(1)、DEBUG(3)、INFO(4)、WRANING(5)、ERROR(6)。
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun  ```
193*4882a593Smuzhiyun  setprop vendor.rga.log_level 6
194*4882a593Smuzhiyun  ```
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun- Linux平台
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun  Linux平台支持通过设置环境变量的方式(librga 1.9.0版本以上),开启/关闭HAL层日志打印:
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun  - 开启日志打印:
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun  ```
205*4882a593Smuzhiyun  export ROCKCHIP_RGA_LOG=1
206*4882a593Smuzhiyun  ```
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun  - 设置日志等级:
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun    日志等级分为全打印(0)、DEFAULT(1)、DEBUG(3)、INFO(4)、WRANING(5)、ERROR(6)。
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun  ```
213*4882a593Smuzhiyun  export ROCKCHIP_RGA_LOG_LEVEL=6
214*4882a593Smuzhiyun  ```
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun#### 日志说明
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun- 初始化日志
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun当每个进程首次调用librga时,会初始化librga的单例,并打印当前的API版本号等信息
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun```C++
225*4882a593SmuzhiyunE rockchiprga: rga_api version 1.9.0_[0]
226*4882a593Smuzhiyun```
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun当出现驱动版本与librga版本不适配时,会打印对应的报错。
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun> 当驱动版本较低时,会启动兼容模式,并在单例初始化时打印如下日志,这时可以考虑更新驱动到日志提示的版本,也可以继续使用兼容模式运行。
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun```shell
233*4882a593Smuzhiyunlibrga fail to get driver version! Compatibility mode will be enabled.
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun29 im2d_rga_impl rga_version_below_minimun_range_user_driver(310): The driver may be compatible, but it is best to update the driver to version 1.2.4. You can try to update the SDK or update the <SDK>/kernel/drivers/video/rockchip/rga3 directory individually. current version: librga 1.8.5, driver .
236*4882a593Smuzhiyun```
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun> 当librga版本较低时,通过imStrError()会返回一些Invalid parameters相关的报错,这表明当前的librga版本过低,需要更新librga版本。
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun```
241*4882a593SmuzhiyunInvalid parameters: invaild GraphicBuffer, can not get fd and virtual address,
242*4882a593Smuzhiyun```
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun- 运行日志
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun```C++
249*4882a593SmuzhiyunD librga  : <<<<-------- print rgaLog -------->>>>								//以下部分为传入librga的参数打印。
250*4882a593SmuzhiyunD librga  : src->hnd = 0x0 , dst->hnd = 0x0 , src1->hnd = 0x0					//三个通道(src、src1、dst)传入的内存句柄的值
251*4882a593SmuzhiyunD librga  : src: Fd = 00 , phyAddr = 0x0 , virAddr = 0xb400007431ed6040			//src通道传入的内存类型对应的值,对应为DMA_FD、物理地址、虚拟地址。
252*4882a593SmuzhiyunD librga  : dst: Fd = 00 , phyAddr = 0x0 , virAddr = 0xb400007431b4f040			//dst通道传入的内存类型对应的值,对应为DMA_FD、物理地址、虚拟地址。
253*4882a593SmuzhiyunD librga  : src: Fd = -01 , buf = 0xb400007431ed6040, mmuFlag = 1, mmuType = 0	//src通道将配置传递的内存类型对应的值以及是否使能MMU,这里HAL层选择虚拟地址传入驱动。
254*4882a593SmuzhiyunD librga  : dst: Fd = -01 , buf = 0xb400007431b4f040, mmuFlag = 1, mmuType = 0	//dst通道将配置传递的内存类型对应的值以及是否使能MMU,这里HAL层选择虚拟地址传入驱动。
255*4882a593SmuzhiyunE librga  : blend = 0 , perpixelAlpha = 1										//混合模式以及图像格式是否本身存在Alpha值
256*4882a593SmuzhiyunD librga  : scaleMode = 0 , stretch = 0;										//缩放模式(RGA1)。
257*4882a593SmuzhiyunE librga  : rgaVersion = 3.200000  , ditherEn =0								//硬件版本号,16阶灰度图(Y4)dither使能。
258*4882a593SmuzhiyunD librga  : srcMmuFlag = 1 , dstMmuFlag = 1 , rotateMode = 0					//MMU使能标志位,旋转模式。
259*4882a593SmuzhiyunD librga  : <<<<-------- rgaReg -------->>>>									//以下为配置入驱动的参数打印。
260*4882a593SmuzhiyunE librga  : render_mode=0 rotate_mode=0											//RGA运行模式,旋转模式。
261*4882a593SmuzhiyunE librga  : src:[0,b400007431ed6040,b400007431fb7040],x-y[0,0],w-h[1280,720],vw-vh[1280,720],f=0	//src通道的内存、图像参数、格式信息。
262*4882a593SmuzhiyunE librga  : dst:[0,b400007431b4f040,b400007431c30040],x-y[0,0],w-h[1280,720],vw-vh[1280,720],f=0	//dst通道的内存、图像参数、格式信息。
263*4882a593SmuzhiyunE librga  : pat:[0,0,0],x-y[0,0],w-h[0,0],vw-vh[0,0],f=0						//pat/src1通道的内存、图像参数、格式信息,由于当前模式没有使用到该通道,所以参数均为0。
264*4882a593Smuzhiyun//以下部分开发者通常不用关心,为librga配置入驱动的不同模式的相关参数。
265*4882a593SmuzhiyunE librga  : ROP:[0,0,0],LUT[0]													//ROP模式配置,LUT表配置
266*4882a593SmuzhiyunE librga  : color:[0,0,0,0,0]													//colorkey配置(max color, min color), 填充颜色配置(前景色配置,背景色配置,颜色填充配置)
267*4882a593SmuzhiyunE librga  : MMU:[1,0,80000521]													//MMU配置
268*4882a593SmuzhiyunE librga  : mode[0,0,0,0]														//palette、csc、colorkey配置
269*4882a593SmuzhiyunE librga  : Full CSC : en[0]													//full csc使能标志
270*4882a593SmuzhiyunE librga  : gr_color_x [0, 0, 0]												//填充颜色配置,对应R、G、B的颜色值
271*4882a593Smuzhiyun```
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun### 驱动调试节点
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun#### 调试节点路径
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun不同的SDK kernel的配置不同,通常RGA的调试节点存在在以下两个目录其中一个或者均存在:
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun- 使用默认使能CONFIG_ROCKCHIP_RGA_DEBUG_FS编译选项的kernel。
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun```
284*4882a593Smuzhiyun/sys/kernel/debug
285*4882a593Smuzhiyun```
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun- 使能ROCKCHIP_RGA_PROC_FS编译选项的kernel。
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun```
290*4882a593Smuzhiyun/proc
291*4882a593Smuzhiyun```
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun除了默认的开启外,也可以根据自己的项目需求修改kernel的编译选项实现自定义RGA调试节点路径。
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun#### 调试节点名称
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun不同的驱动上调试节点的名称是不相同的,后续更新的驱动中会统一为rkrga,rgax_debug的名称目前已经弃用。
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun| 驱动名称                       | 调试节点路径 |
302*4882a593Smuzhiyun| ------------------------------ | ------------ |
303*4882a593Smuzhiyun| RGA Device Driver              | rga_debug    |
304*4882a593Smuzhiyun| RGA2 Device Driver(无版本号) | rga2_debug   |
305*4882a593Smuzhiyun| RGA2 Device Driver(v2.1.0)   | rkrga        |
306*4882a593Smuzhiyun| RGA multicore Device Driver    | rkrga        |
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun#### 调试节点功能
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun##### 概述
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun- rga_debug/rga2_debug
315*4882a593Smuzhiyun
316*4882a593Smuzhiyunrga_debug/rga2_debug节点仅支持运行日志开关功能。
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun- rkrga
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun该版本调试节点支持运行日志开关、负载查询、版本查询、硬件信息查询、内存/任务管理器状态查询等功能。
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun
324*4882a593Smuzhiyun##### 运行日志
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun###### 日志开关
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun- 运行日志开关节点名称
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun| 驱动名称                       | 调试节点路径    |
331*4882a593Smuzhiyun| ------------------------------ | --------------- |
332*4882a593Smuzhiyun| RGA Device Driver              | rga_debug/rga   |
333*4882a593Smuzhiyun| RGA2 Device Driver(无版本号) | rga2_debug/rga2 |
334*4882a593Smuzhiyun| RGA2 Device Driver(v2.1.0)   | rkrga/debug     |
335*4882a593Smuzhiyun| RGA multicore Device Driver    | rkrga/debug     |
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun- 调试功能说明
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun不同的驱动版本调试日志的开关方式是相同的,都是对rga/rga2/debug节点进行操作。
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun以RGA multicore Device Driver为例,在对应的目录下可以通过cat节点,获取对应功能说明:
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun```shell
344*4882a593Smuzhiyun/# cd /sys/kerne/debug/rkrga/
345*4882a593Smuzhiyun/# cat debug
346*4882a593SmuzhiyunREG [DIS]
347*4882a593SmuzhiyunMSG [DIS]
348*4882a593SmuzhiyunTIME [DIS]
349*4882a593SmuzhiyunINT [DIS]
350*4882a593SmuzhiyunCHECK [DIS]
351*4882a593SmuzhiyunSTOP [DIS]
352*4882a593Smuzhiyun
353*4882a593Smuzhiyunhelp:
354*4882a593Smuzhiyun 'echo reg > debug' to enable/disable register log printing.
355*4882a593Smuzhiyun 'echo msg > debug' to enable/disable message log printing.
356*4882a593Smuzhiyun 'echo time > debug' to enable/disable time log printing.
357*4882a593Smuzhiyun 'echo int > debug' to enable/disable interruppt log printing.
358*4882a593Smuzhiyun 'echo check > debug' to enable/disable check mode.
359*4882a593Smuzhiyun 'echo stop > debug' to enable/disable stop using hardware
360*4882a593Smuzhiyun```
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun> echo reg > debug:该命令开关 RGA 寄存器配置信息的打印。打开该打印时,将会打印每次 rga 工作寄存器的配置值
363*4882a593Smuzhiyun>
364*4882a593Smuzhiyun> echo msg> debug:该命令开关 RGA 上层配置参数信息的打印。打开该打印时,上层调用 rga 驱动传递的参数将被打印出来。
365*4882a593Smuzhiyun>
366*4882a593Smuzhiyun> echo time> debug:该命令开关 RGA 工作耗时信息的打印。打开该打印时,将会打印每一次的调用rga 工作的耗时
367*4882a593Smuzhiyun>
368*4882a593Smuzhiyun> echo check> debug:该命令开关 RGA 内部的测试 case。打开该打印时,将会在 RGA 每次工作的时候检查相关的参数,主要是内存的检查,和对齐是否满足要求。若输出如下 log 表示通过检查。若内存存在越界的情况,将会导致内核 crash。可以通过 cash 之前的打印 log 确认是 src 数据的问题还是 dst 数据的问题。
369*4882a593Smuzhiyun>
370*4882a593Smuzhiyun> echo stop> debug:该命令开关 RGA 的工作状态。开启时,rga 将不工作直接返回。用于一些特殊情况下的调式。
371*4882a593Smuzhiyun>
372*4882a593Smuzhiyun> echo int> debug:该命令开关 RGA 寄存器中断信息的打印。打开该打印时,将会在 RGA 进入中断后打印中断寄存器和状态基础器的当前值。
373*4882a593Smuzhiyun>
374*4882a593Smuzhiyun> echo slt> debug:该命令让 rga 驱动执行内部 SLT case 测试 rga 硬件是否正常。 若输出日志“rga slt success !!”则表示功能正常。
375*4882a593Smuzhiyun
376*4882a593Smuzhiyun- 开关调试节点
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun日志打印的开启与关闭命令是相同的,每次输入命令进行切换状态(开启/关闭),可以通过cat debug节点或者输入命令后打印的日志信息(“open xxx”或者“close xxx”)确认日志打印功能是否如预期般开启或者关闭。
379*4882a593Smuzhiyun
380*4882a593Smuzhiyun```
381*4882a593Smuzhiyunecho <cmd> > <节点名>
382*4882a593Smuzhiyun```
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun以RGA multicore Device Driver为例,开启运行日志 ‘msg’
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun```shell
387*4882a593Smuzhiyun/# cd /sys/kernel/debug/rkrga/
388*4882a593Smuzhiyun/# cat debug
389*4882a593SmuzhiyunREG [DIS]
390*4882a593SmuzhiyunMSG [DIS]
391*4882a593SmuzhiyunTIME [DIS]
392*4882a593SmuzhiyunINT [DIS]
393*4882a593SmuzhiyunCHECK [DIS]
394*4882a593SmuzhiyunSTOP [DIS]
395*4882a593Smuzhiyun
396*4882a593Smuzhiyunhelp:
397*4882a593Smuzhiyun 'echo reg > debug' to enable/disable register log printing.
398*4882a593Smuzhiyun 'echo msg > debug' to enable/disable message log printing.
399*4882a593Smuzhiyun 'echo time > debug' to enable/disable time log printing.
400*4882a593Smuzhiyun 'echo int > debug' to enable/disable interruppt log printing.
401*4882a593Smuzhiyun 'echo check > debug' to enable/disable check mode.
402*4882a593Smuzhiyun 'echo stop > debug' to enable/disable stop using hardware
403*4882a593Smuzhiyun/# echo msg > debug
404*4882a593Smuzhiyun/# cat debug
405*4882a593SmuzhiyunREG [DIS]
406*4882a593SmuzhiyunMSG [EN]
407*4882a593SmuzhiyunTIME [DIS]
408*4882a593SmuzhiyunINT [DIS]
409*4882a593SmuzhiyunCHECK [DIS]
410*4882a593SmuzhiyunSTOP [DIS]
411*4882a593Smuzhiyun
412*4882a593Smuzhiyunhelp:
413*4882a593Smuzhiyun 'echo reg > debug' to enable/disable register log printing.
414*4882a593Smuzhiyun 'echo msg > debug' to enable/disable message log printing.
415*4882a593Smuzhiyun 'echo time > debug' to enable/disable time log printing.
416*4882a593Smuzhiyun 'echo int > debug' to enable/disable interruppt log printing.
417*4882a593Smuzhiyun 'echo check > debug' to enable/disable check mode.
418*4882a593Smuzhiyun 'echo stop > debug' to enable/disable stop using hardware
419*4882a593Smuzhiyun/# echo msg > debug
420*4882a593Smuzhiyun/# cat debug
421*4882a593SmuzhiyunREG [DIS]
422*4882a593SmuzhiyunMSG [DIS]
423*4882a593SmuzhiyunTIME [DIS]
424*4882a593SmuzhiyunINT [DIS]
425*4882a593SmuzhiyunCHECK [DIS]
426*4882a593SmuzhiyunSTOP [DIS]
427*4882a593Smuzhiyun
428*4882a593Smuzhiyunhelp:
429*4882a593Smuzhiyun 'echo reg > debug' to enable/disable register log printing.
430*4882a593Smuzhiyun 'echo msg > debug' to enable/disable message log printing.
431*4882a593Smuzhiyun 'echo time > debug' to enable/disable time log printing.
432*4882a593Smuzhiyun 'echo int > debug' to enable/disable interruppt log printing.
433*4882a593Smuzhiyun 'echo check > debug' to enable/disable check mode.
434*4882a593Smuzhiyun 'echo stop > debug' to enable/disable stop using hardware
435*4882a593Smuzhiyun```
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun开启/关闭运行日志时,内核日志会有对应的日志。
438*4882a593Smuzhiyun
439*4882a593Smuzhiyun```shell
440*4882a593Smuzhiyun/# echo reg > /sys/kerne/debug/rkrga/debug
441*4882a593Smuzhiyun/# dmesg -c						//For logs opened through nodes, the printing level is KERNEL_DEBUG. You need to run the dmesg command to view the corresponding logs on the serial port or adb.
442*4882a593Smuzhiyun[ 4802.344683] rga2: open rga2 reg!
443*4882a593Smuzhiyun/# echo reg > /sys/kernel/debug/rga2_debug/rga2
444*4882a593Smuzhiyun/# dmesg -c
445*4882a593Smuzhiyun[ 5096.412419] rga2: close rga2 reg!
446*4882a593Smuzhiyun```
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun###### 日志说明
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun对于RGA的问题调试需要借助日志来确认RGA硬件最终执行的工作,当HAL层的参数传入驱动后,以下日志将描述着对应的参数。通常我们调试常用到msg、reg和time三种模式。
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun- msg模式
455*4882a593Smuzhiyun  - RGA Device Driver、RGA2 Device Driver
456*4882a593Smuzhiyun
457*4882a593Smuzhiyun  ```
458*4882a593Smuzhiyun  rga2: open rga2 test MSG!								//msg日志开启打印。
459*4882a593Smuzhiyun  rga2: cmd is RGA2_GET_VERSION							//获取版本号功能,每个进程第一次调用librga时会查询硬件版本。
460*4882a593Smuzhiyun  rga2: cmd is RGA_BLIT_SYNC								//显示当前传入的工作模式。
461*4882a593Smuzhiyun  rga2: render_mode:bitblt,bitblit_mode=0,rotate_mode:0	//render_mode显示调用接口,bitblit_mode为当前混合模式(0:双通道模式——A+B->B, 1:三通道模式A+B->C),rotate_mode为旋转角度。
462*4882a593Smuzhiyun  rga2: src : y=0 uv=b4000072cc8bc040 v=b4000072cc99d040 aw=1280 ah=720 vw=1280 vh=720 xoff=0 yoff=0 format=RGBA8888	//src通道的图像数据参数:y: 如有则为fd的值, uv:如有则为虚拟地址的值, v:vw * vh + uv, aw、ah:实宽实高,即实际操作图像区域,vw、vh:虚宽虚高,即图像本身大小,xoff、yoff:x、y方向的偏移量,format:传入的图像数据格式。
463*4882a593Smuzhiyun  rga2: dst : y=0 uv=b4000072cc535040 v=b4000072cc616040 aw=1280 ah=720 vw=1280 vh=720 xoff=0 yoff=0 format=RGBA8888	//dst通道的图像数据参数。
464*4882a593Smuzhiyun  rga2: mmu : src=01 src1=00 dst=01 els=00				//MMU使能标志,0为关闭,1为开启。
465*4882a593Smuzhiyun  rga2: alpha : flag 0 mode0=0 mode1=0					//blend相关配置
466*4882a593Smuzhiyun  rga2: blend mode is no blend							//blend混合模式
467*4882a593Smuzhiyun  rga2: yuv2rgb mode is 0									//csc模式
468*4882a593Smuzhiyun  rga2: *** rga2_blit_sync proc ***
469*4882a593Smuzhiyun  ```
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun  - RGA multicore Device Driver
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun    - 内存管理器日志
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun    ```
476*4882a593Smuzhiyun    rga: import buffer info:
477*4882a593Smuzhiyun    rga_common: external: memory = 0xb400007458406000, type = virt_addr
478*4882a593Smuzhiyun    													//memory:内存的数值,type:内存类型
479*4882a593Smuzhiyun    rga_common: memory param: w = 1280, h = 720, f = RGBA8888(0x0), size = 0
480*4882a593Smuzhiyun    													//w/h/f:以图像画布的形式描述内存大小,size:内存大小
481*4882a593Smuzhiyun    rga_dma_buf: iova_align size = 3686400				//iova对齐后的大小
482*4882a593Smuzhiyun    ```
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun    - 任务请求日志
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun    ```
487*4882a593Smuzhiyun    rga: Blit mode: request id = 192732					//运行模式以及request id
488*4882a593Smuzhiyun    rga_debugger: render_mode = 0, bitblit_mode=0, rotate_mode = 0
489*4882a593Smuzhiyun        												//render_mode显示调用接口,bitblit_mode为当前混合模式(0:双通道模式——A+B->B, 1:三通道模式A+B->C),rotate_mode为旋转角度。
490*4882a593Smuzhiyun    rga_debugger: src: y = 19 uv = 0 v = e1000 aw = 1280 ah = 720 vw = 1280 vh = 720
491*4882a593Smuzhiyun        												//src通道的图像数据参数:y: 如有则为fd的值, uv:如有则为虚拟地址的值, v:vw * vh + uv, aw、ah:实宽实高,即实际操作图像区域,vw、vh:虚宽虚高,即图像本身大小。
492*4882a593Smuzhiyun    rga_debugger: src: xoff = 0, yoff = 0, format = 0x0, rd_mode = 1
493*4882a593Smuzhiyun        												//xoff、yoff:x、y方向的偏移量,format:传入的图像数据格式,rd_mode:当前通道读/写数据模式(1:raster,2:FBC,3:tile 16*16)
494*4882a593Smuzhiyun    rga_debugger: dst: y=1a uv=0 v=e1000 aw=1280 ah=720 vw=1280 vh=720
495*4882a593Smuzhiyun        												//dst通道的图像数据参数
496*4882a593Smuzhiyun    rga_debugger: dst: xoff = 0, yoff = 0, format = 0x0, rd_mode = 1
497*4882a593Smuzhiyun    rga_debugger: mmu: mmu_flag=0 en=0					//MMU使能标志,0为关闭,1为开启。使用rga_buffer_handle_t调用时禁用该配置,由驱动抉择最优配置。
498*4882a593Smuzhiyun    rga_debugger: alpha: rop_mode = 0					//alpha/ROP模式使能
499*4882a593Smuzhiyun    rga_debugger: yuv2rgb mode is 0						//CSC模式
500*4882a593Smuzhiyun    rga_debugger: set core = 0, priority = 0, in_fence_fd = -1
501*4882a593Smuzhiyun        												//set_core:用户态指定的核心,priority:用户态指定的优先级,in_fence_fd:用户态传递的acquire_fence fd
502*4882a593Smuzhiyun    ```
503*4882a593Smuzhiyun
504*4882a593Smuzhiyun    - 硬件匹配日志
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun    ```
507*4882a593Smuzhiyun    rga_policy: start policy on core = 1
508*4882a593Smuzhiyun    rga_policy: start policy on core = 2
509*4882a593Smuzhiyun    rga_policy: start policy on core = 4				//遍历所有的核心支持情况
510*4882a593Smuzhiyun    rga_policy: RGA2 only support under 4G memory!		//对应核心不支持的原因日志
511*4882a593Smuzhiyun    rga_policy: optional_cores = 3						//当前请求可匹配的硬件核心合集
512*4882a593Smuzhiyun    rga_policy: assign core: 1							//匹配后绑定的硬件核心标识
513*4882a593Smuzhiyun    ```
514*4882a593Smuzhiyun
515*4882a593Smuzhiyun    - 对应硬件参数日志
516*4882a593Smuzhiyun
517*4882a593Smuzhiyun    ```
518*4882a593Smuzhiyun    rga3_reg: render_mode:bitblt, bitblit_mode=0, rotate_mode:0
519*4882a593Smuzhiyun    rga3_reg: win0: y = ffc70000 uv = ffd51000 v = ffd89400 src_w = 1280 src_h = 720
520*4882a593Smuzhiyun    rga3_reg: win0: vw = 1280 vh = 720 xoff = 0 yoff = 0 format = RGBA8888
521*4882a593Smuzhiyun    rga3_reg: win0: dst_w = 1280, dst_h = 720, rd_mode = 0
522*4882a593Smuzhiyun    rga3_reg: win0: rot_mode = 1, en = 1, compact = 1, endian = 0
523*4882a593Smuzhiyun    rga3_reg: wr: y = ff8e0000 uv = ff9c1000 v = ff9f9400 vw = 1280 vh = 720
524*4882a593Smuzhiyun    rga3_reg: wr: ovlp_xoff = 0 ovlp_yoff = 0 format = RGBA8888 rdmode = 0
525*4882a593Smuzhiyun    rga3_reg: mmu: win0 = 00 win1 = 00 wr = 00
526*4882a593Smuzhiyun    rga3_reg: alpha: flag 0 mode0=0 mode1=a0a
527*4882a593Smuzhiyun    rga3_reg: blend mode is no blend
528*4882a593Smuzhiyun    rga3_reg: yuv2rgb mode is 0
529*4882a593Smuzhiyun    ```
530*4882a593Smuzhiyun
531*4882a593Smuzhiyun- reg模式
532*4882a593Smuzhiyun
533*4882a593Smuzhiyun```c++
534*4882a593Smuzhiyunrga2: open rga2 reg!									//reg日志开启打印。
535*4882a593Smuzhiyunrga2: CMD_REG											//功能寄存器配置
536*4882a593Smuzhiyunrga2: 00000000 00000000 00000040 000e1040
537*4882a593Smuzhiyunrga2: 00119440 00000000 00000500 02cf04ff
538*4882a593Smuzhiyunrga2: 00000000 00000000 00000000 00000000
539*4882a593Smuzhiyunrga2: 00000000 00000000 00000000 00000040
540*4882a593Smuzhiyunrga2: 000e1040 00119440 00000500 02cf04ff
541*4882a593Smuzhiyunrga2: 00000000 00000000 0000ff00 ffffffff
542*4882a593Smuzhiyunrga2: 00000007 00000000 00000000 00000101
543*4882a593Smuzhiyunrga2: 07a80000 00000000 07a800e4 00000000
544*4882a593Smuzhiyunrga2: CSC_REG											//full csc寄存器配置
545*4882a593Smuzhiyunrga2: 00000000 00000000 00000000 00000000
546*4882a593Smuzhiyunrga2: 00000000 00000000 00000000 00000000
547*4882a593Smuzhiyunrga2: 00000000 00000000 00000000 00000000
548*4882a593Smuzhiyunrga2: CMD_READ_BACK_REG									//功能寄存器回读值
549*4882a593Smuzhiyunrga2: 00000000 00000000 00000040 000e1040
550*4882a593Smuzhiyunrga2: 00119440 00000000 00000500 02cf04ff
551*4882a593Smuzhiyunrga2: 00000000 00000000 00000000 00000000
552*4882a593Smuzhiyunrga2: 00000000 00000000 00000000 00000040
553*4882a593Smuzhiyunrga2: 000e1040 00119440 00000500 02cf04ff
554*4882a593Smuzhiyunrga2: 00000000 00000000 0000ff00 ffffffff
555*4882a593Smuzhiyunrga2: 00000007 00000000 00000000 00000101
556*4882a593Smuzhiyunrga2: 07a80000 00000000 07a800e4 00000000
557*4882a593Smuzhiyunrga2: CSC_READ_BACK_REG									//full csc寄存器回读值
558*4882a593Smuzhiyunrga2: 00000000 00000000 00000000 00000000
559*4882a593Smuzhiyunrga2: 00000000 00000000 00000000 00000000
560*4882a593Smuzhiyunrga2: 00000000 00000000 00000000 00000000
561*4882a593Smuzhiyun```
562*4882a593Smuzhiyun
563*4882a593Smuzhiyun- time模式
564*4882a593Smuzhiyun
565*4882a593Smuzhiyun  - rga2
566*4882a593Smuzhiyun
567*4882a593Smuzhiyun  ```
568*4882a593Smuzhiyun  rga2: sync one cmd end time 2414					//打印本次工作RGA硬件的耗时,单位为us
569*4882a593Smuzhiyun  ```
570*4882a593Smuzhiyun
571*4882a593Smuzhiyun  - multi
572*4882a593Smuzhiyun
573*4882a593Smuzhiyun  ```
574*4882a593Smuzhiyun  rga3_reg: set cmd use time = 196					//开始处理请求到配置寄存器的耗时
575*4882a593Smuzhiyun  rga_job: hw use time = 554							//硬件启动到硬件中断返回耗时
576*4882a593Smuzhiyun  rga_job: (pid:3197) job done use time = 751			//开始处理请求到请求完成的耗时
577*4882a593Smuzhiyun  rga_job: (pid:3197) job clean use time = 933		//开始处理请求到请求资源处理完毕的耗时
578*4882a593Smuzhiyun  ```
579*4882a593Smuzhiyun
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun
582*4882a593Smuzhiyun##### 版本信息查询
583*4882a593Smuzhiyun
584*4882a593Smuzhiyun通过以下命令查询当前驱动名称以及驱动版本:
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun```
587*4882a593Smuzhiyun/# cat driver_version
588*4882a593SmuzhiyunRGA multicore Device Driver: v1.2.23
589*4882a593Smuzhiyun```
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun
592*4882a593Smuzhiyun
593*4882a593Smuzhiyun##### 负载查询
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun通过以下命令查询RGA负载情况:
596*4882a593Smuzhiyun
597*4882a593Smuzhiyun```
598*4882a593Smuzhiyun/# cat load
599*4882a593Smuzhiyunnum of scheduler = 3									//当前搭载硬件核心数
600*4882a593Smuzhiyun================= load ==================
601*4882a593Smuzhiyunscheduler[0]: rga3_core0
602*4882a593Smuzhiyun         load = 0%										//对应核心负载占比
603*4882a593Smuzhiyun-----------------------------------
604*4882a593Smuzhiyunscheduler[1]: rga3_core1
605*4882a593Smuzhiyun         load = 0%
606*4882a593Smuzhiyun-----------------------------------
607*4882a593Smuzhiyunscheduler[2]: rga2
608*4882a593Smuzhiyun         load = 0%
609*4882a593Smuzhiyun-----------------------------------
610*4882a593Smuzhiyun```
611*4882a593Smuzhiyun
612*4882a593Smuzhiyun
613*4882a593Smuzhiyun
614*4882a593Smuzhiyun##### 内存管理器查询
615*4882a593Smuzhiyun
616*4882a593Smuzhiyun通过以下命令查询内存管理器内内存状态:
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun```
619*4882a593Smuzhiyun/# cat mm_session
620*4882a593Smuzhiyunrga_mm dump:
621*4882a593Smuzhiyunbuffer count = 3										//内存管理器内保存的buffer数量
622*4882a593Smuzhiyun===============================================================
623*4882a593Smuzhiyunhandle = 34 refcount = 1 mm_flag = 0x2  tgid = 3210		//内存句柄、引用计数、内存标识、进程号打印
624*4882a593Smuzhiyunvirtual address:
625*4882a593Smuzhiyun         va = 0xb400007286e1c000, pages = 0x00000000ae081f65, size = 3686400
626*4882a593Smuzhiyun         iova = 0xffc70000, offset = 0x0, sgt = 0x00000000cc976f9e, size = 3686400, map_core = 0x1
627*4882a593Smuzhiyun         												//内存信息
628*4882a593Smuzhiyun---------------------------------------------------------------
629*4882a593Smuzhiyunhandle = 35 refcount = 1 mm_flag = 0x2  tgid = 3210
630*4882a593Smuzhiyunvirtual address:
631*4882a593Smuzhiyun         va = 0xb400007286a95000, pages = 0x000000002f083efc, size = 3686400
632*4882a593Smuzhiyun         iova = 0xff8e0000, offset = 0x0, sgt = 0x0000000062bb1297, size = 3686400, map_core = 0x1
633*4882a593Smuzhiyun---------------------------------------------------------------
634*4882a593Smuzhiyunhandle = 36 refcount = 1 mm_flag = 0x2  tgid = 3210
635*4882a593Smuzhiyunvirtual address:
636*4882a593Smuzhiyun         va = 0xb40000728670e000, pages = 0x00000000785fef63, size = 3686400
637*4882a593Smuzhiyun         iova = 0xff550000, offset = 0x0, sgt = 0x00000000cdd7688d, size = 3686400, map_core = 0x1
638*4882a593Smuzhiyun---------------------------------------------------------------
639*4882a593Smuzhiyun```
640*4882a593Smuzhiyun
641*4882a593Smuzhiyun
642*4882a593Smuzhiyun
643*4882a593Smuzhiyun##### 任务请求查询
644*4882a593Smuzhiyun
645*4882a593Smuzhiyun通过以下命令任务管理器内任务请求状态:
646*4882a593Smuzhiyun
647*4882a593Smuzhiyun```
648*4882a593Smuzhiyun/# cat request_manager
649*4882a593Smuzhiyunrga internal request dump:
650*4882a593Smuzhiyunrequest count = 1										//任务管理器内任务请求数量
651*4882a593Smuzhiyun===============================================================
652*4882a593Smuzhiyun------------------ request: 200073 ------------------
653*4882a593Smuzhiyun         set cmd num: 1, finish job: 0, failed job: 0, flags = 0x0, ref = 2
654*4882a593Smuzhiyun         												//任务请求完成情况
655*4882a593Smuzhiyun         cmd dump:										//任务请求参数
656*4882a593Smuzhiyun                 rotate_mode = 0
657*4882a593Smuzhiyun                 src: y = 25 uv = 0 v = e1000 aw = 1280 ah = 720 vw = 1280 vh = 720
658*4882a593Smuzhiyun                 src: xoff = 0, yoff = 0, format = 0x0, rd_mode = 1
659*4882a593Smuzhiyun                 dst: y=26 uv=0 v=e1000 aw=1280 ah=720 vw=1280 vh=720
660*4882a593Smuzhiyun                 dst: xoff = 0, yoff = 0, format = 0x0, rd_mode = 1
661*4882a593Smuzhiyun                 mmu: mmu_flag=0 en=0
662*4882a593Smuzhiyun                 alpha: rop_mode = 0
663*4882a593Smuzhiyun                 yuv2rgb mode is 0
664*4882a593Smuzhiyun                 set core = 0, priority = 0, in_fence_fd = -1
665*4882a593Smuzhiyun```
666*4882a593Smuzhiyun
667*4882a593Smuzhiyun
668*4882a593Smuzhiyun
669*4882a593Smuzhiyun##### 硬件信息查询
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun通过以下命令查询当前搭载硬件信息:
672*4882a593Smuzhiyun
673*4882a593Smuzhiyun```
674*4882a593Smuzhiyun/# cat hardware
675*4882a593Smuzhiyun===================================
676*4882a593Smuzhiyunrga3_core0, core 1: version: 3.0.76831					//搭载核心的硬件版本、支持的功能选项等参数
677*4882a593Smuzhiyuninput range: 68x2 ~ 8176x8176
678*4882a593Smuzhiyunoutput range: 68x2 ~ 8128x8128
679*4882a593Smuzhiyunscale limit: 1/8 ~ 8
680*4882a593Smuzhiyunbyte_stride_align: 16
681*4882a593Smuzhiyunmax_byte_stride: 32768
682*4882a593Smuzhiyuncsc: RGB2YUV 0xf YUV2RGB 0xf
683*4882a593Smuzhiyunfeature: 0x4
684*4882a593Smuzhiyunmmu: RK_IOMMU
685*4882a593Smuzhiyun-----------------------------------
686*4882a593Smuzhiyunrga3_core1, core 2: version: 3.0.76831
687*4882a593Smuzhiyuninput range: 68x2 ~ 8176x8176
688*4882a593Smuzhiyunoutput range: 68x2 ~ 8128x8128
689*4882a593Smuzhiyunscale limit: 1/8 ~ 8
690*4882a593Smuzhiyunbyte_stride_align: 16
691*4882a593Smuzhiyunmax_byte_stride: 32768
692*4882a593Smuzhiyuncsc: RGB2YUV 0xf YUV2RGB 0xf
693*4882a593Smuzhiyunfeature: 0x4
694*4882a593Smuzhiyunmmu: RK_IOMMU
695*4882a593Smuzhiyun-----------------------------------
696*4882a593Smuzhiyunrga2, core 4: version: 3.2.63318
697*4882a593Smuzhiyuninput range: 2x2 ~ 8192x8192
698*4882a593Smuzhiyunoutput range: 2x2 ~ 4096x4096
699*4882a593Smuzhiyunscale limit: 1/16 ~ 16
700*4882a593Smuzhiyunbyte_stride_align: 4
701*4882a593Smuzhiyunmax_byte_stride: 32768
702*4882a593Smuzhiyuncsc: RGB2YUV 0x7 YUV2RGB 0x7
703*4882a593Smuzhiyunfeature: 0x5f
704*4882a593Smuzhiyunmmu: RGA_MMU
705*4882a593Smuzhiyun-----------------------------------
706*4882a593Smuzhiyun```
707*4882a593Smuzhiyun
708*4882a593Smuzhiyun
709*4882a593Smuzhiyun
710*4882a593Smuzhiyun##### dump运行数据
711*4882a593Smuzhiyun
712*4882a593Smuzhiyun通过以下命令dump运行数据用于调试,可以通过调试节点配置实现将RGA接下来几帧数据写到指定目录下。没有该节点说明当前kernel不支持内核写入写出数据。
713*4882a593Smuzhiyun
714*4882a593Smuzhiyun- 设置dump数据路径,使能dump运行数据时将输出到该文件夹下。
715*4882a593Smuzhiyun
716*4882a593Smuzhiyun```
717*4882a593Smuzhiyun/# echo /data/rga_image > dump_path
718*4882a593Smuzhiyun/# dmesg -c
719*4882a593Smuzhiyunrga_debugger: dump path change to: /data/rga_image
720*4882a593Smuzhiyun```
721*4882a593Smuzhiyun
722*4882a593Smuzhiyun- 设置dump数据帧数。
723*4882a593Smuzhiyun
724*4882a593Smuzhiyun```
725*4882a593Smuzhiyun/# echo 1 > dump_image
726*4882a593Smuzhiyun/# dmesg -c
727*4882a593Smuzhiyunrga_debugger: dump image 1
728*4882a593Smuzhiyun
729*4882a593Smuzhiyun.... RGA运行 ....
730*4882a593Smuzhiyun
731*4882a593Smuzhiyun/# dmesg -c
732*4882a593Smuzhiyunrga_debugger: dump image to: /data/rga_image/1_core1_src_plane0_virt_addr_w1280_h720_RGBA8888.bin
733*4882a593Smuzhiyunrga_debugger: dump image to: /data/rga_image/1_core1_dst_plane0_virt_addr_w1280_h720_RGBA8888.bin
734*4882a593Smuzhiyun
735*4882a593Smuzhiyun/# ls /data/rga_image/
736*4882a593Smuzhiyun1_core1_dst_plane0_virt_addr_w1280_h720_RGBA8888.bin  1_core1_src_plane0_virt_addr_w1280_h720_RGBA8888.bin
737*4882a593Smuzhiyun														//输入(src)、输出(dst)运行图像数据
738*4882a593Smuzhiyun```
739*4882a593Smuzhiyun
740*4882a593Smuzhiyun
741*4882a593Smuzhiyun
742*4882a593Smuzhiyun---
743*4882a593Smuzhiyun
744*4882a593Smuzhiyun## Q & A
745*4882a593Smuzhiyun
746*4882a593Smuzhiyun本节将较为常见的RGA相关问题以Q&A的形式进行分类介绍,如不在本节内的问题请整理相关日志和初步分析的信息提交至redmine平台交由维护RGA模块的工程师处理。
747*4882a593Smuzhiyun
748*4882a593Smuzhiyun### 性能咨询
749*4882a593Smuzhiyun
750*4882a593Smuzhiyun**Q1.1**:RGA效率如何评估?
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun**A1.1**: RGA在执行拷贝时,可以通过以下公式进行计算理论耗时(该功能仅支持数据的拷贝评估):
753*4882a593Smuzhiyun
754*4882a593Smuzhiyun​			单次拷贝图像耗时 = 图像宽 × 图像高 / RGA每秒能处理的像素数量
755*4882a593Smuzhiyun
756*4882a593Smuzhiyun​											= 图像宽 × 图像高 / (RGA每个时钟周期能够处理的像素数量 × RGA频率)
757*4882a593Smuzhiyun
758*4882a593Smuzhiyun​			例如: 一幅1920 × 1080大小的图像用RGA(频率设定为300M)做拷贝的理论耗时是:
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun​						RGA1 : 1920 × 1080 / (1 × 300000000) = 0.006912s
761*4882a593Smuzhiyun
762*4882a593Smuzhiyun​						RGA2 : 1920 × 1080 / (2 × 300000000) = 0.003456s
763*4882a593Smuzhiyun
764*4882a593Smuzhiyun​						RGA3 : 1920 × 1080 / (3 × 300000000) = 0.002304s
765*4882a593Smuzhiyun
766*4882a593Smuzhiyun​			而实际的耗时与使用的内存类型是相关的,不同的传入内存类型效率从高到低是:物理地址 > dma_fd > 虚拟地址。
767*4882a593Smuzhiyun
768*4882a593Smuzhiyun​			在系统空载时,物理地址的实际耗时约为理论耗时的1.1-1.2倍,使用dma_fd的实际耗时约为理论耗时的1.3-1.5倍,而使用虚拟地址的实际耗时约为理论耗时的1.8-2.1倍,并且受CPU影响较大。通常我们比较建议开发者使用dma_fd作为传入的内存类型,在易获取和效率上得到了较好的平衡,虚拟地址仅用于学习阶段了解RGA时,作为简单易上手的内存类型来使用。
769*4882a593Smuzhiyun
770*4882a593Smuzhiyun​			下表为在RK3566上系统空载时不同的RGA频率的实际测试数据。
771*4882a593Smuzhiyun
772*4882a593Smuzhiyun​			**测试环境**:
773*4882a593Smuzhiyun
774*4882a593Smuzhiyun| 芯片平台    | RK3566      |
775*4882a593Smuzhiyun| ----------- | ----------- |
776*4882a593Smuzhiyun| RGA硬件版本 | RGA2-EHANCE |
777*4882a593Smuzhiyun| 系统平台    | Android 11  |
778*4882a593Smuzhiyun| RGA频率     | 300 M       |
779*4882a593Smuzhiyun| CPU频率     | 1.8 Ghz     |
780*4882a593Smuzhiyun| GPU频率     | 800 M       |
781*4882a593Smuzhiyun| DDR频率     | 1056 M      |
782*4882a593Smuzhiyun
783*4882a593Smuzhiyun​			**测试数据**:
784*4882a593Smuzhiyun
785*4882a593Smuzhiyun| 分辨率      | 内存类型                  | 理论耗时(us) | 实际耗时(us) |
786*4882a593Smuzhiyun| ----------- | ------------------------- | -------------- | -------------- |
787*4882a593Smuzhiyun| 1280 × 720  | GraphicBuffer(cache)    | 1,536          | 2,620          |
788*4882a593Smuzhiyun| 1280 × 720  | GraphicBuffer(no cache) | 1,536          | 2,050          |
789*4882a593Smuzhiyun| 1280 × 720  | Drm buffer(cache)       | 1,536          | 2,190          |
790*4882a593Smuzhiyun| 1280 × 720  | Physical address(Drm)   | 1,536          | 2,000          |
791*4882a593Smuzhiyun| 1920 × 1080 | GraphicBuffer(cache)    | 3,456          | 5,500          |
792*4882a593Smuzhiyun| 1920 × 1080 | GraphicBuffer(no cache) | 3,456          | 4,180          |
793*4882a593Smuzhiyun| 1920 × 1080 | Drm buffer(cache)       | 3,456          | 4,420          |
794*4882a593Smuzhiyun| 1920 × 1080 | Physical address(Drm)   | 3,456          | 4,100          |
795*4882a593Smuzhiyun| 3840 × 2160 | GraphicBuffer(cache)    | 13,824         | 21,500         |
796*4882a593Smuzhiyun| 3840 × 2160 | GraphicBuffer(no cache) | 13,824         | 15,850         |
797*4882a593Smuzhiyun| 3840 × 2160 | Drm buffer(cache)       | 13,824         | 16,800         |
798*4882a593Smuzhiyun| 3840 × 2160 | Physical address(Drm)   | 13,824         | 15,600         |
799*4882a593Smuzhiyun
800*4882a593Smuzhiyun
801*4882a593Smuzhiyun
802*4882a593Smuzhiyun**Q1.2**:理论公式仅提供拷贝的评估方法,那么其他模式如何评估?
803*4882a593Smuzhiyun
804*4882a593Smuzhiyun**A1.2**:目前仅有拷贝的公式可供评估使用,其他模式比如缩放、裁剪,可以使用两张图像较大的分辨率带入拷贝公式进行计算得到的耗时进行评估,通常会根据缩放、裁剪的大小有一定的上下浮动,混合等分辨率没有变化的模式耗时约为拷贝模式耗时的1.1-1.2倍。具体实际场景中由于受到DDR带宽影响,建议实际评估时以在目标场景中的实际测试数据为准。
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun
807*4882a593Smuzhiyun
808*4882a593Smuzhiyun**Q1.3**:为什么RGA在一些场景中性能表现很差,与跑demo时耗时最大能到2倍?
809*4882a593Smuzhiyun
810*4882a593Smuzhiyun**A1.3**:因为RGA在目前RK平台中的总线优先级为最低档,当带宽资源较为紧张时,例如ISP运行多路的场景中,RGA由于带宽资源紧张,没有办法及时的读写DDR内的数据,产生了较大的延迟,从而表现为RGA的性能下降。
811*4882a593Smuzhiyun
812*4882a593Smuzhiyun
813*4882a593Smuzhiyun
814*4882a593Smuzhiyun**Q1.4**:RGA的效率不能满足我们产品的需求,有什么办法可以提升么?
815*4882a593Smuzhiyun
816*4882a593Smuzhiyun**A1.4**:部分芯片的出厂固件的RGA频率并不是最高频率,例如3399、1126等芯片RGA的频率最高可以到400M,可以通过以下两种方式实现RGA提频:
817*4882a593Smuzhiyun
818*4882a593Smuzhiyun- 通过命令设置(临时修改,设备重启则恢复频率)
819*4882a593Smuzhiyun
820*4882a593Smuzhiyun> 查询RGA频率
821*4882a593Smuzhiyun
822*4882a593Smuzhiyun```c++
823*4882a593Smuzhiyuncat /sys/kernel/debug/clk/clk_summary | grep rga  				//查询rga频率,其中的aclk的频率
824*4882a593Smuzhiyun```
825*4882a593Smuzhiyun
826*4882a593Smuzhiyun> 修改RGA频率
827*4882a593Smuzhiyun
828*4882a593Smuzhiyun```c++
829*4882a593Smuzhiyunecho 400000000 > /sys/kernel/debug/clk/aclk_rga/clk_rate		//400000000修改为想要修改的频率
830*4882a593Smuzhiyun```
831*4882a593Smuzhiyun
832*4882a593Smuzhiyun- 修改dts实现修改RGA频率(重启后依旧为设置的频率)
833*4882a593Smuzhiyun
834*4882a593Smuzhiyun> 以下示例为RK3288上修改dts中RGA频率的修改方法,其他平台可以在对应的dts中进行修改
835*4882a593Smuzhiyun
836*4882a593Smuzhiyun```
837*4882a593Smuzhiyundiff --git a/arch/arm/boot/dts/rk3288-android.dtsi b/arch/arm/boot/dts/rk3288-android.dtsi
838*4882a593Smuzhiyunindex 02938b0..10a1dc4 100644
839*4882a593Smuzhiyun--- a/arch/arm/boot/dts/rk3288-android.dtsi
840*4882a593Smuzhiyun+++ b/arch/arm/boot/dts/rk3288-android.dtsi
841*4882a593Smuzhiyun@@ -450,6 +450,8 @@
842*4882a593Smuzhiyun        compatible = "rockchip,rga2";
843*4882a593Smuzhiyun        clocks = <&cru ACLK_RGA>, <&cru HCLK_RGA>, <&cru SCLK_RGA>;
844*4882a593Smuzhiyun        clock-names = "aclk_rga", "hclk_rga", "clk_rga";
845*4882a593Smuzhiyun+       assigned-clocks = <&cru ACLK_RGA>, <&cru SCLK_RGA>;
846*4882a593Smuzhiyun+       assigned-clock-rates = <300000000>, <300000000>;
847*4882a593Smuzhiyun        dma-coherent;
848*4882a593Smuzhiyun };
849*4882a593Smuzhiyun```
850*4882a593Smuzhiyun
851*4882a593Smuzhiyun
852*4882a593Smuzhiyun
853*4882a593Smuzhiyun**Q1.5**:RGA是否支持通过命令或接口查询当前的RGA硬件利用率(负载)?
854*4882a593Smuzhiyun
855*4882a593Smuzhiyun**A1.5**:RGA multicore Device Driver支持查看硬件负载,详情可以参考 **调试说明——驱动调试节点——调试节点功能——负载查询**。
856*4882a593Smuzhiyun
857*4882a593Smuzhiyun
858*4882a593Smuzhiyun
859*4882a593Smuzhiyun**Q1.6**:为什么一些场景使用异步模式调用RGA耗时比同步模式还要慢?
860*4882a593Smuzhiyun
861*4882a593Smuzhiyun**A1.6**:RGA Device Driver、RGA2 Device Driver 由于目前librga的异步模式的标识符为打开的设备节点,而单例模式的librga一个进程只会打开一个fd,所以imsync()是等待该进程所有的异步模式均运行结束后才会返回。而RGA multicore Device Driver引入了fence机制,所以是针对单次请求的实时处理,不会存在这种问题。
862*4882a593Smuzhiyun
863*4882a593Smuzhiyun
864*4882a593Smuzhiyun
865*4882a593Smuzhiyun**Q1.7**:有些场景使用虚拟地址调用RGA做拷贝耗时比memcpy还要高,可有办法优化?
866*4882a593Smuzhiyun
867*4882a593Smuzhiyun**A1.7**:通常我们不建议使用虚拟地址调用RGA,因为在CPU负载较高的场景下使用虚拟地址调用RGA的效率会大大下降,这是因为RGA驱动中虚拟地址转换为物理地址页表这一部分是由CPU来计算的,并且本身虚拟地址转换为物理地址页表这个过程本身就很耗时;加之虚拟地址通常没有用户态的接口同步cache,因此驱动内部针对虚拟地址是每一帧都会强制同步cache的。所以通常我们建议使用物理地址或dma_fd来调用librga。
868*4882a593Smuzhiyun
869*4882a593Smuzhiyun
870*4882a593Smuzhiyun
871*4882a593Smuzhiyun**Q1.8**:为什么当搭载8G DDR时,RGA效率较于4G时性能下降严重?
872*4882a593Smuzhiyun
873*4882a593Smuzhiyun**A1.8**:由于部分RGA1/RGA2的IOMMU仅支持最大32位的物理地址,而RGA Device Driver、RGA2 Device Driver中对于不满足硬件内存要求的调用申请,默认是通过swiotlb机制进行访问访问受限制的内存(原理上相当于通过CPU将高位内存拷贝至复合硬件要求的低位内存中,再交由硬件进行处理,处理完毕后再通过CPU将低位内存搬运回目标的高位内存上。)因此效率十分低下,通常在正常耗时的3-4倍之间浮动,并且引入受CPU负载影响。
874*4882a593Smuzhiyun
875*4882a593SmuzhiyunRGA Multicore Device Driver中针对访问受限制的内存会禁用swiotlb机制,直接通过调用失败的方式显示的通知调用者申请合理的内存再调用,来保证RGA的高效。通常伴随着以下日志:
876*4882a593Smuzhiyun
877*4882a593Smuzhiyun> HAL层日志:
878*4882a593Smuzhiyun
879*4882a593Smuzhiyun```
880*4882a593SmuzhiyunRgaBlit(1483) RGA_BLIT fail: Invalid argument
881*4882a593SmuzhiyunFailed to call RockChipRga interface, please use 'dmesg' command to view driver error log.
882*4882a593Smuzhiyun```
883*4882a593Smuzhiyun
884*4882a593Smuzhiyun> 驱动日志:
885*4882a593Smuzhiyun
886*4882a593Smuzhiyun```
887*4882a593Smuzhiyunrga_policy: invalid function policy							//标识存在无效的参数,这里是指没有硬件能够访问当前请求配置的内存。
888*4882a593Smuzhiyunrga_job: job assign failed									//匹配硬件核心失败
889*4882a593Smuzhiyunrga_job: failed to get scheduler, rga_job_commit(403)
890*4882a593Smuzhiyunrga_job: (pid:3524) job clean use time = 19
891*4882a593Smuzhiyunrga_job: request[282567] task[0] job_commit failed.
892*4882a593Smuzhiyunrga_job: rga request commit failed!
893*4882a593Smuzhiyunrga: request[282567] submit failed!
894*4882a593Smuzhiyun```
895*4882a593Smuzhiyun
896*4882a593Smuzhiyun> 驱动运行日志:
897*4882a593Smuzhiyun
898*4882a593Smuzhiyun```
899*4882a593Smuzhiyunrga_policy: start policy on core = 4
900*4882a593Smuzhiyun[82116.782252] rga_policy: RGA2 only support under 4G memory!
901*4882a593Smuzhiyun															//标识当前搭载的RGA2核心仅支持4G以内的内存。
902*4882a593Smuzhiyun[82116.782256] rga_policy: optional_cores = 0
903*4882a593Smuzhiyun[82116.782258] rga_policy: invalid function policy
904*4882a593Smuzhiyun[82116.782260] rga_policy: assign core: -1
905*4882a593Smuzhiyun[82116.782262] rga_job: job assign failed
906*4882a593Smuzhiyun```
907*4882a593Smuzhiyun
908*4882a593Smuzhiyun因此,针对这种场景建议申请4G以内的内存调用librga,常见的分配4G内存方式可以查看以下示例代码:
909*4882a593Smuzhiyun
910*4882a593Smuzhiyun **<librga_souce_path>/samples/allocator_demo/src/rga_allocator_dma32_demo.cpp**
911*4882a593Smuzhiyun
912*4882a593Smuzhiyun **<librga_souce_path>/samples/allocator_demo/src/rga_allocator_graphicbuffer_demo.cpp**
913*4882a593Smuzhiyun
914*4882a593Smuzhiyun
915*4882a593Smuzhiyun
916*4882a593Smuzhiyun### 功能咨询
917*4882a593Smuzhiyun
918*4882a593Smuzhiyun**Q2.1**:如何知道我当前的芯片平台搭载的RGA版本以及可以实现的功能?
919*4882a593Smuzhiyun
920*4882a593Smuzhiyun**A2.1**:可以查看源码目录下docs文件夹内的[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md)中 “概述” 章节了解RGA的版本以及支持信息。
921*4882a593Smuzhiyun
922*4882a593Smuzhiyun​			不同系统的源码路径会有所差异,librga源码目录路径在不同SDK的路径如下:
923*4882a593Smuzhiyun
924*4882a593Smuzhiyun​			Android 7.0即以上SDK :
925*4882a593Smuzhiyun
926*4882a593Smuzhiyunhardware/rockchip/librga
927*4882a593Smuzhiyun
928*4882a593Smuzhiyun​			Android 7.0以下SDK:
929*4882a593Smuzhiyun
930*4882a593Smuzhiyunhardware/rk29/librga
931*4882a593Smuzhiyun
932*4882a593Smuzhiyun​			Linux SDK:
933*4882a593Smuzhiyun
934*4882a593Smuzhiyunexternal/linux-rga
935*4882a593Smuzhiyun
936*4882a593Smuzhiyun
937*4882a593Smuzhiyun
938*4882a593Smuzhiyun**Q2.2**:如何调用RGA实现硬件加速?可有demo可供参考?
939*4882a593Smuzhiyun
940*4882a593Smuzhiyun**A2.2**:1). API调用接口可以查询docs目录下[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md)中 “应用接口说明” 章节。
941*4882a593Smuzhiyun
942*4882a593Smuzhiyun​			2). 演示demo位于samples目录下rga_im2d_demo,该演示demo内部实现了RGA大部分的接口,通过命令配置实现对应的RGA功能,亦可作为一些场景下测试RGA是否正常的工具。建议初次了解RGA的开发者初期可以直接运行demo并查看结果,从而了解RGA的实际功能,再根据自己的需求在demo中修改参数实现对应功能,最终再尝试单独在自己的工程中调用RGA API。
943*4882a593Smuzhiyun
944*4882a593Smuzhiyun​			3). 常见应用常见的示例代码在samples目录下:
945*4882a593Smuzhiyun├── **allocator_demo**:内存分配器相关示例代码<br/>
946*4882a593Smuzhiyun├── **alpha_demo**:alpha混合、叠加相关示例代码<br/>
947*4882a593Smuzhiyun├── **async_demo**:异步模式相关示例代码<br/>
948*4882a593Smuzhiyun├── **config_demo**:线程全局配置相关示例代码<br/>
949*4882a593Smuzhiyun├── **copy_demo**:图像搬运、拷贝相关示例代码<br/>
950*4882a593Smuzhiyun├── **crop_demo**:图像裁剪、拼接相关示例代码<br/>
951*4882a593Smuzhiyun├── **cvtcolor_demo**:图像格式转换、色域转换相关示例代码<br/>
952*4882a593Smuzhiyun├── **fill_demo**:图像填充、画框相关示例代码<br/>
953*4882a593Smuzhiyun├── **mosaic_demo**:马赛克遮盖相关示例代码<br/>
954*4882a593Smuzhiyun├── **padding_demo**:padding相关示例代码<br/>
955*4882a593Smuzhiyun├── **resize_demo**:图像缩放相关示例代码<br/>
956*4882a593Smuzhiyun├── **rop_demo**:ROP运算相关示例代码<br/>
957*4882a593Smuzhiyun└── **transform_demo**:图像变换相关示例代码<br/>
958*4882a593Smuzhiyun
959*4882a593Smuzhiyun
960*4882a593Smuzhiyun
961*4882a593Smuzhiyun**Q2.3**:RGA的支持信息?
962*4882a593Smuzhiyun
963*4882a593Smuzhiyun​			**Q2.3.1**:RGA支持哪些格式?
964*4882a593Smuzhiyun
965*4882a593Smuzhiyun​			**A2.3.1**:具体支持情况可以查看[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md)中 “概述”——“图像格式支持”小节中查询对应的芯片版本搭载的RGA的格式支持情况,也可以在代码中调用**querystring(RGA_INPUT_FORMAT | RGA_OUTPUT_FORMAT);** 接口查询当前硬件的输入输出格式支持情况。
966*4882a593Smuzhiyun
967*4882a593Smuzhiyun​			**Q2.3.2**:RGA支持的缩放倍率是多少?
968*4882a593Smuzhiyun
969*4882a593Smuzhiyun​			**A2.3.2**:具体支持情况可以查看[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md)中 “概述”——“设计指标”小节中查询对应的芯片版本搭载的RGA支持的缩放倍率,也可以在代码中调用**querystring(RGA_SCALE_LIMIT);** 接口查询当前硬件的支持的缩放倍率。
970*4882a593Smuzhiyun
971*4882a593Smuzhiyun​			**Q2.3.3**:RGA支持的最大分辨率是多少?
972*4882a593Smuzhiyun
973*4882a593Smuzhiyun​			**A2.3.3**:具体支持情况可以查看[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md)中 “概述”——“设计指标”小节中查询对应的芯片版本搭载的RGA支持的最大输入输出分辨率,也可以在代码中调用**querystring(RGA_MAX_INPUT | RGA_MAX_OUTPUT);** 接口查询当前硬件的支持的最大输入输出分辨率。
974*4882a593Smuzhiyun
975*4882a593Smuzhiyun​			**Q2.3.4**:RGA对不同的格式对齐要求是什么?
976*4882a593Smuzhiyun
977*4882a593Smuzhiyun​			**A2.3.4**:具体支持情况可以查看[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md)中 “概述”——“图像格式对齐说明”小节中查询对应的芯片版本搭载的RGA对不同格式的对齐要求。
978*4882a593Smuzhiyun
979*4882a593Smuzhiyun**A2.3**:总体来说,对于RGA的支持有疑问可以查看[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md),其中对于RGA的支持信息会有较详细的介绍。
980*4882a593Smuzhiyun
981*4882a593Smuzhiyun
982*4882a593Smuzhiyun
983*4882a593Smuzhiyun**Q2.4**:多个版本的librga有何差异?又该如何分辨?
984*4882a593Smuzhiyun
985*4882a593Smuzhiyun**A2.4**:目前的RK平台所有发布SDK中,主要分配无法获取版本号的旧版本librga,支持查询版本号的新版本librga。
986*4882a593Smuzhiyun
987*4882a593Smuzhiyun​			无法获取版本的旧版本librga目前已经停止支持与维护,主要的表征点为2020年11月前发布的SDK中,搭载的均为旧版本librga,部分芯片平台例如RK3399 Linux SDK 2021年6月前发布的SDK(V2.5即以下)亦为旧版本librga,该版本librga无法完美契合较新的驱动,可能会出现颜色偏差、格式异常等问题,不建议混合使用,如果有需要使用到较新内核时建议更新新版本librga,反之使用到新版本librga亦然,需要更新内核至匹配。
988*4882a593Smuzhiyun
989*4882a593Smuzhiyun​			支持查询版本号新版本librga是目前主要支持与维护的版本,主要表征点为源码目录下增加 **im2d_api** 目录,该版本集成与旧版本librga,并推出简单易用的IM2D API,亦可称呼为IM2D版librga。新版本librga不仅支持新的IM2D API,旧版本的RockchipRga接口和C_XXX接口也是支持的。具体的API调用说明可以查看[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md)了解。
990*4882a593Smuzhiyun
991*4882a593Smuzhiyun​			通常对于一些新旧版本librga功能支持情况一般优先建议更新整体SDK避免出现依赖问题,强烈不建议新版本librga搭配旧驱动或者旧版本librga搭配新内核使用,部分场景会有较明显的错误。
992*4882a593Smuzhiyun
993*4882a593Smuzhiyun
994*4882a593Smuzhiyun
995*4882a593Smuzhiyun**Q2.5**:RGA是否有对齐限制?
996*4882a593Smuzhiyun
997*4882a593Smuzhiyun**A2.5**:不同的格式对齐要求不同,RGA硬件本身是对图像每行的数据是按照字(world)对齐的方式进行取数的,即4个字节32个bit。例如RGBA格式本身单个像素存储大小为32(4 × 8)bit,所以没有对齐要求;RGB565格式存储大小为16(5 + 6 +5)bit,所以需要2对齐;RGB888格式存储大小为24(8 × 3)bit,所以该格式需要4对齐才能满足RGA硬件的32bit取数要求;YUV格式存储相对较为特殊,本身排列要求需要2对齐,Y通道单像素存储大小为8bit,UV通道根据420/422决定每四个像素的存储大小,所以YUV格式Y通道需要4对齐才能满足RGA的硬件取数要求,则YUV格式需要4对齐;其他的未提及的格式对齐要求原理相通。注意,该题中对齐均指width stride的对齐要求,YUV格式本身实际宽高、偏移量由于格式本身特性也是要求2对齐的。具体对齐限制可以查看[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md)中 “概述” —— “图像格式对齐说明”小节。
998*4882a593Smuzhiyun
999*4882a593Smuzhiyun
1000*4882a593Smuzhiyun
1001*4882a593Smuzhiyun**Q2.6**:RGA能否支持一次绘制多个矩形区域,或执行多次操作?RGA的工作原理?
1002*4882a593Smuzhiyun
1003*4882a593Smuzhiyun**A2.6**:RGA 在硬件上只能顺序工作即配置的一个任务工作结束和进行下一个配置的工作。因此不能一次绘制多个矩形区域,可以通过 async 模式把需要 RGA 做的工作往底层驱动配置,RGA 会将工作存储在驱动自己管理的一个工作队列中按顺序完成。当上层需要处理这块 buffer 时再调用 **imsync()** 来确定 RGA 硬件是否已经完成工作。
1004*4882a593Smuzhiyun
1005*4882a593Smuzhiyun​			在librga 1.9.0版本后,增加尾缀为array的接口,支持配置多个矩形区域进行划线、画框、填充矩形等操作,例如imfillArray、imrectangleArray,详细可以查看[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md)中 “应用接口” —— “图像颜色填充、边框绘制”小节。
1006*4882a593Smuzhiyun
1007*4882a593Smuzhiyun
1008*4882a593Smuzhiyun
1009*4882a593Smuzhiyun**Q2.7**:RGA的fill功能可否支持YUV格式?
1010*4882a593Smuzhiyun
1011*4882a593Smuzhiyun**A2.7**:旧版本的librga是不支持的,只有新版本的librga在包含以下提交以后的librga版本是支持的。如若没有该提交请尝试更新SDK至最新版。
1012*4882a593Smuzhiyun
1013*4882a593Smuzhiyun```
1014*4882a593Smuzhiyuncommit 8c526a6bb9d0e43b293b885245bb53a3fa8ed7f9
1015*4882a593SmuzhiyunAuthor: Yu Qiaowei <cerf.yu@rock-chips.com>
1016*4882a593SmuzhiyunDate:   Wed Dec 23 10:57:28 2020 +0800
1017*4882a593Smuzhiyun
1018*4882a593Smuzhiyun    Color fill supports YUV format as input source.
1019*4882a593Smuzhiyun
1020*4882a593Smuzhiyun    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
1021*4882a593Smuzhiyun    Change-Id: I0073c31d770da513f81b9b64e4c27fee2650f30b
1022*4882a593Smuzhiyun```
1023*4882a593Smuzhiyun
1024*4882a593Smuzhiyun​			该功能与RGB颜色填充调用一致,通过配置需要填充色彩的RGB值填充色彩,不同的是输出结果可以设置为YUV格式。
1025*4882a593Smuzhiyun
1026*4882a593Smuzhiyun
1027*4882a593Smuzhiyun
1028*4882a593Smuzhiyun**Q2.8**:RGA支持YUYV格式么?
1029*4882a593Smuzhiyun
1030*4882a593Smuzhiyun**A2.8**:旧版本的librga(此处指2020年10月份前发布的SDK中的librga)是不支持的,只有新版本的librga(源码目录下有 **im2d_api** 目录的版本)在包含以下提交以后的librga版本是支持的。如若没有该提交请尝试更新SDK至最新版。
1031*4882a593Smuzhiyun
1032*4882a593Smuzhiyun```
1033*4882a593Smuzhiyuncommit db278db815d147c0ff7a80faae0ea795ceffd341
1034*4882a593SmuzhiyunAuthor: Yu Qiaowei <cerf.yu@rock-chips.com>
1035*4882a593SmuzhiyunDate:   Tue Nov 24 19:50:17 2020 +0800
1036*4882a593Smuzhiyun
1037*4882a593Smuzhiyun    Add support for Y4/YUV400/YUYV in imcheck().
1038*4882a593Smuzhiyun
1039*4882a593Smuzhiyun    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
1040*4882a593Smuzhiyun    Change-Id: I3cfea7c8bb331b65b5bc741956da47924eeda6e1
1041*4882a593Smuzhiyun```
1042*4882a593Smuzhiyun
1043*4882a593Smuzhiyun
1044*4882a593Smuzhiyun
1045*4882a593Smuzhiyun**Q2.9**:RGA支持灰度图输入输出做缩放么?
1046*4882a593Smuzhiyun
1047*4882a593Smuzhiyun**A2.9**:旧版本的librga(此处指2020年10月份前发布的SDK中的librga)是不支持的,只有新版本的librga(源码目录下有 **im2d_api** 目录的版本)1.2.2版本才支持灰度图输入。如若librga版本低于该版本请尝试更新SDK至最新版。由于RGA硬件本身不支持灰度图格式,这里灰度图使用的格式是 **RK_FORMAT_Y400** ,表征为没有UV通道的YUV格式,仅有Y通道的YUV便是256阶的灰度图。
1048*4882a593Smuzhiyun
1049*4882a593Smuzhiyun​			由于是YUV格式,这里需要注意色域空间的问题,librga中CSC 转YUV格式时默认为BT.601 limit range,而limit range的Y通道并不是0~255,涉及到CSC转换(RGB转YUV)输出为Y400格式时,需要注意色域空间的转换时配置full range的标识。
1050*4882a593Smuzhiyun
1051*4882a593Smuzhiyun
1052*4882a593Smuzhiyun
1053*4882a593Smuzhiyun**Q2.10**:为什么RK3399上ROP的代码放到RV1126上执行却没有对应的效果?
1054*4882a593Smuzhiyun
1055*4882a593Smuzhiyun**A2.10**:虽然RK3399和RV1126上搭载的RGA均为RGA2-ENHANCE,但是他们的小版本是不同的,ROP功能在RV1126上被裁剪掉了,具体功能支持情况可以查看[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md)或者在代码中调用 **querystring(RGA_FEATURE)** 接口实现查询支持功能。
1056*4882a593Smuzhiyun
1057*4882a593Smuzhiyun
1058*4882a593Smuzhiyun
1059*4882a593Smuzhiyun**Q2.11**:使用RGA其他功能正常,仅在RGB与YUV格式转换时出现严重色差(偏粉偏绿)是什么原因?
1060*4882a593Smuzhiyun
1061*4882a593Smuzhiyun​			预期:
1062*4882a593Smuzhiyun
1063*4882a593Smuzhiyun​			![image-20210708171527861](RGA_FAQ.assets/image-normal.png)
1064*4882a593Smuzhiyun
1065*4882a593Smuzhiyun​			结果:
1066*4882a593Smuzhiyun
1067*4882a593Smuzhiyun​			![image-20210708171608076](RGA_FAQ.assets/image-color-abnormal.png)
1068*4882a593Smuzhiyun
1069*4882a593Smuzhiyun**A2.11**:该现象通常是由于librga与内核不匹配导致,详细版本说明可以查看 **A2.4** 。该问题通常是在一些2020年11月前发布的SDK中使用了github上获取的librga之后出现该现象。github上更新librga为新版本librga,与较旧版本的RGA驱动是不匹配的,这里一些关于色域空间的配置有发生改变,所以会出现较明显的色偏现象。
1070*4882a593Smuzhiyun
1071*4882a593Smuzhiyun​			该问题的解决方案有两种,一为更新SDK或RGA驱动,保持librga与驱动是匹配的即可,第二种则是如若无需新版本librga才有的功能,可以使用SDK自带的librga即可。
1072*4882a593Smuzhiyun
1073*4882a593Smuzhiyun​			rga模块源码更新包可以通过百度网盘获取:https://eyun.baidu.com/s/3i6sbsDR
1074*4882a593Smuzhiyun
1075*4882a593Smuzhiyun
1076*4882a593Smuzhiyun
1077*4882a593Smuzhiyun**Q2.12**:RGA如何实现OSD叠加字幕?
1078*4882a593Smuzhiyun
1079*4882a593Smuzhiyun​			预期:
1080*4882a593Smuzhiyun
1081*4882a593Smuzhiyun​			![image-20210708171450243](RGA_FAQ.assets/image-blend.png)
1082*4882a593Smuzhiyun
1083*4882a593Smuzhiyun**A2.12**:如果输出结果为RGB格式,可以通过 **imblend()** 接口实现,通常选择src over模式,将src通道的图像叠加在dst通道的图像上;如果输出结果为YUV格式,可以通过 **imcomposite()** 接口实现,通常选择dst over‘模式,将src1通道的图像叠加在src通道的图像上,再输出到dst通道。
1084*4882a593Smuzhiyun
1085*4882a593Smuzhiyun​			该功能的叠加原理为 **Porter-Duff混合模型** ,详细可以查看[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md)中 “应用接口说明” —— “图像合成” 小节。
1086*4882a593Smuzhiyun
1087*4882a593Smuzhiyun​			RGA针对不同输出格式,需要不同的配置的原因是,RGA2拥有3个图像通道——src、src1/pat、dst。其中src通道支持YUV2RGB转换,src1/pat和dst通道只支持RGB2YUV转换,而RGA内部的叠加均需要在RGB格式下进行,所以为了保证RGB图像叠加在YUV图像上,必须src作为叠加的背景图像YUV,src1作为叠加的前景图像RGB,最终由dst通道将混合后的RGB图像转换为YUV格式输出。
1088*4882a593Smuzhiyun
1089*4882a593Smuzhiyun​			可以查看示例代码:
1090*4882a593Smuzhiyun
1091*4882a593Smuzhiyun**<librga_souce_path>/samples/alpha_demo/src/rga_alpha_osd_demo.cpp**
1092*4882a593Smuzhiyun
1093*4882a593Smuzhiyun**<librga_souce_path>/samples/alpha_demo/src/rga_alpha_yuv_demo.cpp**
1094*4882a593Smuzhiyun
1095*4882a593Smuzhiyun
1096*4882a593Smuzhiyun
1097*4882a593Smuzhiyun**Q2.13**:为什么调用RGA实现YUV格式与RGB格式相互转换输出有亮度或者数值差异?
1098*4882a593Smuzhiyun
1099*4882a593Smuzhiyun**A2.13**:该现象原因大致可分为两种:
1100*4882a593Smuzhiyun
1101*4882a593Smuzhiyun​			1). YUV与RGB互转配置相同时,部分像素数值会有轻微差异(通常相差为1),这是由于RGA硬件实现CSC功能时公式的精度问题导致,RGA1和RGA2的CSC公式的小数位精度均为8bit,RGA3的CSC公式的小数位精度为10bit。这里由于精度会导致一些运算结果四舍五入后会有±1的误差。
1102*4882a593Smuzhiyun
1103*4882a593Smuzhiyun​			2). 当RGB2YUV和YUV2RGB转换时配置的CSC模式不同导致,新版本librga中默认的RGB2YUV、YUV2RGB的CSC模式为BT.601-limit _range,当错误的配置了对应的 **color_space_mode** 成员变量时,色域空间的配置不同,便会导致相互转换时产生较大的变化。而旧版本librga中RGB2YUV默认为BT.601-full_range,YUV2RGB默认为BT.709-limit_range,由于两种转换的色域空间配置不同,所以互转会存在较大的变化。
1104*4882a593Smuzhiyun
1105*4882a593Smuzhiyun
1106*4882a593Smuzhiyun
1107*4882a593Smuzhiyun**Q2.14**:librga中如何配置格式转换时的色域空间呢?
1108*4882a593Smuzhiyun
1109*4882a593Smuzhiyun**A2.14**:两个版本的librga都是支持配置格式转换时的色域空间的。
1110*4882a593Smuzhiyun
1111*4882a593Smuzhiyun​			1). 新版本librga中,可以参考[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md)中 “应用接口说明” —— “图像格式转换” 小节中介绍,重点配置mode参数即可。
1112*4882a593Smuzhiyun
1113*4882a593Smuzhiyun​			2). 旧版本librga中,需要修改librga源码,Normal/NormaRga.cpp中yuvToRgbMode的值,对应的参数如下:
1114*4882a593Smuzhiyun
1115*4882a593Smuzhiyun| 转换格式 | 色域空间           | 参数                     |
1116*4882a593Smuzhiyun| -------- | ------------------ | ------------------------ |
1117*4882a593Smuzhiyun| YUV2RGB  | BT.601-limit_range | yuvToRgbMode = 0x1 << 0; |
1118*4882a593Smuzhiyun| YUV2RGB  | BT.601-full_range  | yuvToRgbMode = 0x2 << 0; |
1119*4882a593Smuzhiyun| YUV2RGB  | BT.709-limit_range | yuvToRgbMode = 0x3 << 0; |
1120*4882a593Smuzhiyun| RGB2YUV  | BT.601-limit_range | yuvToRgbMode = 0x2 << 4; |
1121*4882a593Smuzhiyun| RGB2YUV  | BT.601-full_range  | yuvToRgbMode = 0x1 << 4; |
1122*4882a593Smuzhiyun| RGB2YUV  | BT.709-limit_range | yuvToRgbMode = 0x3 << 4; |
1123*4882a593Smuzhiyun
1124*4882a593Smuzhiyun
1125*4882a593Smuzhiyun
1126*4882a593Smuzhiyun**Q2.15**:调用RGA执行alpha叠加,为什么没有效果?
1127*4882a593Smuzhiyun
1128*4882a593Smuzhiyun**A2.15**:检查输入的两张图像的alpha值是否皆为0xFF,当叠加中的前景图像的alpha值为0xFF时,其结果便是前景图像直接覆盖在背景图像上,看起来的结果看着像是没有效果一般,实际上是正常的结果。
1129*4882a593Smuzhiyun
1130*4882a593Smuzhiyun
1131*4882a593Smuzhiyun
1132*4882a593Smuzhiyun**Q2.16**:调用RGA执行alpha叠加,前景图像的alpha值为0x0,为什么结果不是全透?
1133*4882a593Smuzhiyun
1134*4882a593Smuzhiyun​			前景图:(黑白和rockchip alpha为0x00)
1135*4882a593Smuzhiyun
1136*4882a593Smuzhiyun​			![image-20210708173625438](RGA_FAQ.assets/image-alpha-0x0.png)
1137*4882a593Smuzhiyun
1138*4882a593Smuzhiyun​			预期:
1139*4882a593Smuzhiyun
1140*4882a593Smuzhiyun​			![image-20210708173737882](RGA_FAQ.assets/image-alpha-normal.png)
1141*4882a593Smuzhiyun
1142*4882a593Smuzhiyun​			结果:
1143*4882a593Smuzhiyun
1144*4882a593Smuzhiyun​			![image-20210708173808977](RGA_FAQ.assets/image-alpha-abnormal.png)
1145*4882a593Smuzhiyun
1146*4882a593Smuzhiyun
1147*4882a593Smuzhiyun
1148*4882a593Smuzhiyun**A2.16**:我们正常配置的模式是默认颜色值已经预乘过对应的alpha值的结果,而直接读取的原始图片的颜色值并没有预乘过alpha值,所以需要在调用imblend时额外的增加标志位来标识本次处理中的图像颜色值没有需要预乘alpha值。具体调用方式可以查看[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md)中 “应用接口说明” —— “图像合成“ 小节。
1149*4882a593Smuzhiyun
1150*4882a593Smuzhiyun
1151*4882a593Smuzhiyun
1152*4882a593Smuzhiyun**Q2.17**:IM2D API可以一次RGA调用实现多种功能么?
1153*4882a593Smuzhiyun
1154*4882a593Smuzhiyun**A2.17**:可以的,详细可以查看[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md)中 “应用接口说明” —— “图像处理” 小节,并参考IM2D API其他接口的实现,了解 **improcess()** 的用法。
1155*4882a593Smuzhiyun
1156*4882a593Smuzhiyun
1157*4882a593Smuzhiyun
1158*4882a593Smuzhiyun**Q2.18**:调用RGA执行图像旋转时,结果图像被拉伸?
1159*4882a593Smuzhiyun
1160*4882a593Smuzhiyun​			预期:
1161*4882a593Smuzhiyun
1162*4882a593Smuzhiyun​			![image-20210708174014165](RGA_FAQ.assets/image-rotate-90-normal.png)
1163*4882a593Smuzhiyun
1164*4882a593Smuzhiyun​			结果:
1165*4882a593Smuzhiyun
1166*4882a593Smuzhiyun​			![image-20210708174113366](RGA_FAQ.assets/image-rotate-90-abnormal.png)
1167*4882a593Smuzhiyun
1168*4882a593Smuzhiyun**A2.18**:在旋转90°、270°时,如果不希望RGA执行缩放,应将图像的宽、高交换,否则RGA驱动默认该行为为旋转 + 缩放的行为去执行工作,结果表现便是拉伸的效果了。
1169*4882a593Smuzhiyun
1170*4882a593Smuzhiyun
1171*4882a593Smuzhiyun
1172*4882a593Smuzhiyun**Q2.19**:RGB888输出缩放后结果显示图像是斜的,并且有黑线?
1173*4882a593Smuzhiyun
1174*4882a593Smuzhiyun​			原图(1920 × 1080):
1175*4882a593Smuzhiyun
1176*4882a593Smuzhiyun​			![image-20210708171527861](RGA_FAQ.assets/image-normal.png)
1177*4882a593Smuzhiyun
1178*4882a593Smuzhiyun​			结果(1282 × 720):
1179*4882a593Smuzhiyun
1180*4882a593Smuzhiyun​			![image-20210708174334975](RGA_FAQ.assets/image-resize-abnormal.png)
1181*4882a593Smuzhiyun
1182*4882a593Smuzhiyun**A2.19**:该问题是对齐限制导致的,RGB888格式的虚宽需要4对齐,请检查配置的图像参数,对齐限制可以参考 **Q2.5** 的回答。
1183*4882a593Smuzhiyun
1184*4882a593Smuzhiyun
1185*4882a593Smuzhiyun
1186*4882a593Smuzhiyun**Q2.20**:在一些系统流程中调用RGA输出的结果是花的,这是什么原因导致的?
1187*4882a593Smuzhiyun
1188*4882a593Smuzhiyun**A2.20**:通常RGA的异常不会出现图像花掉的现象,一般遇到这种问题需要先定位问题是否是RGA出现的问题,在一些系统流程中需要先确认输入RGA的源数据是否已经是异常的,可以通过在调用RGA前将内存里的数据调用 **fwrite()** 写文件出来,查看源数据是否正常。写文件的方法如果不太熟悉,可以参考源码目录下 **core/RgaUtils.cpp** 中的 **output_buf_data_to_file()** 函数的实现部分。
1189*4882a593Smuzhiyun
1190*4882a593Smuzhiyun
1191*4882a593Smuzhiyun
1192*4882a593Smuzhiyun**A2.21**:调用RGA处理图像后出现黑色或绿色的小条纹,这是什么原因?
1193*4882a593Smuzhiyun
1194*4882a593Smuzhiyun​			![image-cache-abnormal](RGA_FAQ.assets/image-cache-abnormal.png)
1195*4882a593Smuzhiyun
1196*4882a593Smuzhiyun**Q2.21**:这是使用非虚拟地址调用时,buffer使能了cache,并且在CPU操作前后没有同步cache导致的。如果不了解如何同步cache可以参考samples/allocator_demo/src/rga_allocator_dma_cache_demo.cpp中的用法。
1197*4882a593Smuzhiyun
1198*4882a593Smuzhiyun
1199*4882a593Smuzhiyun
1200*4882a593Smuzhiyun### HAL层报错
1201*4882a593Smuzhiyun
1202*4882a593Smuzhiyun#### IM2D_API报错
1203*4882a593Smuzhiyun
1204*4882a593Smuzhiyun**Q3.1.1**:imcheck()返回报错,该如何处理?
1205*4882a593Smuzhiyun
1206*4882a593Smuzhiyun```
1207*4882a593Smuzhiyuncheck error! Invalid parameters: dst, Error yuv not align to 2, rect[x,y,w,h] = [0, 0, 1281, 720], wstride = 1281, hstride = 720, format = 0xa00(nv12)
1208*4882a593Smuzhiyunoutput support format : RGBA_8888 RGB_888 RGB_565 RGBA_4444 RGBA_5551 YUV420/YUV422 YUV420_10bit/YUV422_10bit YUYV420 YUYV422 YUV400/Y4
1209*4882a593Smuzhiyun```
1210*4882a593Smuzhiyun
1211*4882a593Smuzhiyun**A3.1.1**:imcheck()接口作为调用librga的校验接口,它将判断即将传递到librga内部的数据结构的参数是否正确、功能是否支持、是否触发硬件限制等,可以将imcheck()的返回报错值作为传参传入 **IMStrError()** 返回的字符串则为详细的报错信息,可以根据错误提示确认哪些条件限制被触发,或是参数错误。
1212*4882a593Smuzhiyun
1213*4882a593Smuzhiyun​			如问题中报错,则为YUV格式对齐的限制问题,这里图像的宽1281不是2对齐的,所以校验失败。
1214*4882a593Smuzhiyun
1215*4882a593Smuzhiyun
1216*4882a593Smuzhiyun
1217*4882a593Smuzhiyun**Q3.1.2**:imstrError()错误提示没有具体参数打印说明是什么问题?
1218*4882a593Smuzhiyun
1219*4882a593Smuzhiyun```
1220*4882a593SmuzhiyunFatal error: Failed to call RockChipRga interface, please use 'dmesg' command to view driver error log.
1221*4882a593Smuzhiyun```
1222*4882a593Smuzhiyun
1223*4882a593Smuzhiyun**A3.1.2**:说明配置在im2d api校验已经通过并配置到后级驱动上,可以通过dmesg的方式查看驱动的报错。
1224*4882a593Smuzhiyun
1225*4882a593Smuzhiyun
1226*4882a593Smuzhiyun
1227*4882a593Smuzhiyun#### RockchipRga接口报错
1228*4882a593Smuzhiyun
1229*4882a593Smuzhiyun**Q3.2.1**:“Try to use uninit rgaCtx=(nil)”报错如何处理?
1230*4882a593Smuzhiyun
1231*4882a593Smuzhiyun**A3.2.1**:1). 该报错为调用到的接口发现librga模块并没有得到初始化,所返回报错。目前版本中该报错通常是由于一些较旧的调用RGA的代码中依旧使用RgaInit/RgaDeInit/c_RkRgaInit/c_RkRgaDeInit接口自行管理RGA模块的初始化,而目前的版本接口使用的单例模式,当被异常DeInit后,便会出现该报错,只需要移除调用代码中的Init/DeInit相关的调用即可。
1232*4882a593Smuzhiyun
1233*4882a593Smuzhiyun​				2). 当驱动没有probe成功,或者驱动设备节点(/dev/rga)访问受限制时也会产生这样的报错。
1234*4882a593Smuzhiyun
1235*4882a593Smuzhiyun
1236*4882a593Smuzhiyun
1237*4882a593Smuzhiyun**Q3.2.2**:“RgaBlit(1027) RGA_BLIT fail: ”、“RGA_COLORFILL(1027) RGA_BLIT fail: ”标头的报错是什么原因?
1238*4882a593Smuzhiyun
1239*4882a593Smuzhiyun**A3.2.2**:出现该标头报错说明当前RGA任务在驱动运行失败返回,具体原因需要通过dmesg查看驱动日志。
1240*4882a593Smuzhiyun
1241*4882a593Smuzhiyun​				**Q3.2.2.1**:“RgaBlit(1027) RGA_BLIT fail: Not a typewriter”
1242*4882a593Smuzhiyun
1243*4882a593Smuzhiyun​				**A3.2.2.1**:该报错通常为参数错误导致,建议检查一下缩放倍数、虚宽是否小于实宽与对应方向的偏移的和、对齐是否符合要求。建议新开发项目使用IM2D API,拥有更全面的检测报错机制,方便开发者节省大量的调试时间。
1244*4882a593Smuzhiyun
1245*4882a593Smuzhiyun​				**Q3.2.2.2**:“RgaBlit(1349) RGA_BLIT fail: Bad file descriptor”
1246*4882a593Smuzhiyun
1247*4882a593Smuzhiyun​				**A3.2.2.2**:该报错为ioctl报错,标识当前传入的设备节点的fd无效,请尝试更新librga或确认RGA的初始化流程是否有被修改。
1248*4882a593Smuzhiyun
1249*4882a593Smuzhiyun​				**Q3.2.2.3**:“RgaBlit(1360) RGA_BLIT fail: Bad address”
1250*4882a593Smuzhiyun
1251*4882a593Smuzhiyun​				**A3.2.2.4**:该报错通常为传入内核的src/src1/dst通道的内存地址存在问题导致(常见为越界),可以参照本文档 “日志获取与说明” —— “驱动调试节点” 小节,开启驱动日志,并定位出错的内存。
1252*4882a593Smuzhiyun
1253*4882a593Smuzhiyun​				**Q3.2.2.4**:“RgaBlit(1466) RGA BIIT fail: Invalid argument”
1254*4882a593Smuzhiyun
1255*4882a593Smuzhiyun​				**A3.2.2.4**:该报错为传入参数不满足当前芯片搭载核心功能、限制要求时上报的无效参数报错,建议检查当前配置的任务参数是否满足当前芯片搭载RGA核心的要求。
1256*4882a593Smuzhiyun
1257*4882a593Smuzhiyun
1258*4882a593Smuzhiyun
1259*4882a593Smuzhiyun**Q3.2.3**:日志报错“err ws[100,1280,1280]”、”Error srcRect“ 是什么错误?
1260*4882a593Smuzhiyun
1261*4882a593Smuzhiyun**A3.2.3**:该报错为明显的参数报错,“err ws” 即虚宽(width stride)参数异常,其后“[]”内的参数分别为 [x_offeset, width, width_stride],这里由于X方向的偏移与实际操作区域的宽的和大于了虚宽,所以librga认为虚宽存在问题而返回的报错。这里只要将虚宽改为1380或将实宽(width)改为1180,即可。
1262*4882a593Smuzhiyun
1263*4882a593Smuzhiyun​			通常该类型报错后logcat中会打印对应的一些参数:
1264*4882a593Smuzhiyun
1265*4882a593Smuzhiyun```C++
1266*4882a593SmuzhiyunE librga  : err ws[100,1280,1280]											//标识单签虚宽存在问题
1267*4882a593SmuzhiyunE librga  : [RgaBlit,731]Error srcRect										//标识是src通道报错
1268*4882a593SmuzhiyunE rockchiprga: fd-vir-phy-hnd-format[0, 0xb400006eb6ea9040, 0x0, 0x0, 0]	//对应src通道的输入地址(fd、虚拟地址、物理地址、handle)。
1269*4882a593SmuzhiyunE rockchiprga: rect[100, 0, 1280, 720, 1280, 720, 1, 0]						//对应src通道的图像参数依次为:x方向偏移、y方向偏移、实际操作区域的宽、实际操作区域的高、图像宽(虚高)、图像高(虚高)、图像格式、size(目前没有使用到的参数)。
1270*4882a593SmuzhiyunE rockchiprga: f-blend-size-rotation-col-log-mmu[0, 0, 0, 0, 0, 0, 1]		//标识着本次调用中的模式配置。
1271*4882a593SmuzhiyunE rockchiprga: fd-vir-phy-hnd-format[0, 0xb400006eb2ea6040, 0x0, 0x0, 0]	//对应dst通道的参数
1272*4882a593SmuzhiyunE rockchiprga: rect[0, 0, 1920, 1080, 1920, 1080, 1, 0]
1273*4882a593SmuzhiyunE rockchiprga: f-blend-size-rotation-col-log-mmu[0, 0, 0, 0, 0, 0, 1]
1274*4882a593SmuzhiyunE rockchiprga: This output the user parameters when rga call blit fail		//报错信息
1275*4882a593Smuzhiyun```
1276*4882a593Smuzhiyun
1277*4882a593Smuzhiyun
1278*4882a593Smuzhiyun
1279*4882a593Smuzhiyun### kernel层报错
1280*4882a593Smuzhiyun
1281*4882a593Smuzhiyun**Q4.1**:“RGA2 failed to get vma, result = 32769, pageCount = 65537”报错是什么导致的?
1282*4882a593Smuzhiyun
1283*4882a593Smuzhiyun**A4.1**:该报错通常为使用虚拟地址调用RGA时,虚拟地址的实际内存小于实际需要的内存大小(即根据图像参数计算出当前通道的图像需要多大的内存),只需检查buffer的大小即可,在一些申请和调用不是在同一处的场景下,可以在调用RGA前执行一遍memset对应图像的大小,确认是否为内存大小不足导致的问题。
1284*4882a593Smuzhiyun
1285*4882a593Smuzhiyun​			改报错后,通常便随着 “rga2 map src0 memory failed” 可以确认是哪一个通道的内存出现问题,如该例中所示,src通道由于实际申请的buffer大小仅为图像所需大小的一半,所以触发了这个报错。
1286*4882a593Smuzhiyun
1287*4882a593Smuzhiyun
1288*4882a593Smuzhiyun
1289*4882a593Smuzhiyun**Q4.2**:”rga2_reg_init, [868] set mmu info error“ MMU报错是什么原因?
1290*4882a593Smuzhiyun
1291*4882a593Smuzhiyun**A4.2**:该报错表征为fd/虚拟地址转换为物理地址页表出错,通常是申请的内存大小的问题,与Q4.1相同。
1292*4882a593Smuzhiyun
1293*4882a593Smuzhiyun
1294*4882a593Smuzhiyun
1295*4882a593Smuzhiyun**Q4.3**:“rga:dma_buf_get fail fd[328]” 报这种错误,一般是指buffer出现了什么异常?
1296*4882a593Smuzhiyun
1297*4882a593Smuzhiyun**Q4.3**:该报错为fd在内核经过dma的接口时的报错,建议检查一下申请fd的流程,并在librga外部验证fd可用后再用于调用RGA。
1298*4882a593Smuzhiyun
1299*4882a593Smuzhiyun
1300*4882a593Smuzhiyun
1301*4882a593Smuzhiyun**Q4.4**:“RGA2 failed to get pte, result = -14, pageCount = 112”、”rga2_reg_init, [868] set mmu info error“ 按照 **Q4.1** 、**Q4.2** 方式检查后,还是一样的报错,这里使用的是DRM分配的物理地址,通过mmap映射的虚拟地址传入RGA的,memset均正常,这是什么原因导致的?
1302*4882a593Smuzhiyun
1303*4882a593Smuzhiyun**A4.4**:该问题为分配器DRM本身的问题,DRM本身认为当用户态获取到物理地址后,正常来讲内核态是不需要虚拟地址的了,所以在分配buffer时就会将对应的kmap释放,仅释放kmap也不会影响到用户态中映射虚拟地址和使用,但是当这块buffer用户态的虚拟地址传入RGA驱动,驱动进行物理地址页表的转换查询时,由于该buffer的kmap已经被释放,或是无法查询到对应的页表项,或是直接访问到错误的地址导致内核crash。
1304*4882a593Smuzhiyun
1305*4882a593Smuzhiyun​			针对这种场景,DRM提供了一个接口标志位,用户判断用户态是否希望DRM释放kmap,即是否考虑讲映射的虚拟地址传入内核使用:
1306*4882a593Smuzhiyun
1307*4882a593Smuzhiyun```
1308*4882a593Smuzhiyun(1) drm buffer申请选项增加ROCKCHIP_BO_ALLOC_KMAP定义。
1309*4882a593Smuzhiyun+	/* keep kmap for cma buffer or alloc kmap for other type memory */
1310*4882a593Smuzhiyun+   ROCKCHIP_BO_ALLOC_KMAP  = 1 << 4,
1311*4882a593Smuzhiyun(2) 申请drm内存时,增加新增的drm buffer选项ROCKCHIP_BO_ALLOC_KMAP。
1312*4882a593Smuzhiyun	struct drm_mode_create_dumb arg;
1313*4882a593Smuzhiyun	...
1314*4882a593Smuzhiyun-	arg.flags = ROCKCHIP_BO_CONTIG;
1315*4882a593Smuzhiyun+	arg.flags = ROCKCHIP_BO_CONTIG | ROCKCHIP_BO_ALLOC_KMAP;	//ROCKCHIP_BO_ALLOC_KMAP仅与ROCKCHIP_BO_CONTIG共同使用时有效。
1316*4882a593Smuzhiyun	ret = drmIoctl(drm_fd, DRM_IOCTL_MODE_CREATE_DUMB, &arg);
1317*4882a593Smuzhiyun```
1318*4882a593Smuzhiyun
1319*4882a593Smuzhiyun​			并确认kernel是否包含以下提交,如若没有请更新SDK:
1320*4882a593Smuzhiyun
1321*4882a593Smuzhiyun```
1322*4882a593Smuzhiyuncommit 1a81ee3e2d3726b9382ff2c48d08f4d837bc0143
1323*4882a593SmuzhiyunAuthor: Sandy Huang <hjc@rock-chips.com>
1324*4882a593SmuzhiyunDate:   Mon May 10 16:52:04 2021 +0800
1325*4882a593Smuzhiyun
1326*4882a593Smuzhiyun    drm/rockchip: gem: add flag ROCKCHIP_BO_ALLOC_KMAP to assign kmap
1327*4882a593Smuzhiyun
1328*4882a593Smuzhiyun    RGA need to access CMA buffer at kernel space, so add this flag to keep kernel
1329*4882a593Smuzhiyun    line mapping for RGA.
1330*4882a593Smuzhiyun
1331*4882a593Smuzhiyun    Change-Id: Ia59acee3c904a495792229a80c42f74ae34200e3
1332*4882a593Smuzhiyun    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
1333*4882a593Smuzhiyun```
1334*4882a593Smuzhiyun
1335*4882a593Smuzhiyun
1336*4882a593Smuzhiyun
1337*4882a593Smuzhiyun**Q4.5**:“RGA_MMU unsupported Memory larger than 4G!”报错该如何解决?
1338*4882a593Smuzhiyun
1339*4882a593Smuzhiyun**A4.5**:该报错通常对应HAL层报错:
1340*4882a593Smuzhiyun
1341*4882a593Smuzhiyun```
1342*4882a593SmuzhiyunRgaBlit(1483) RGA_BLIT fail: Invalid argument
1343*4882a593SmuzhiyunFailed to call RockChipRga interface, please use 'dmesg' command to view driver error log.
1344*4882a593Smuzhiyun```
1345*4882a593Smuzhiyun
1346*4882a593Smuzhiyun该报错标识当前配置的图像任务配置的内存无法满足当前匹配到的硬件核心对内存的要求,由于不同的硬件版本的RGA的IOMMU对内存位数的要求不同,当分配的内存超过对应硬件的限制时,则会出现该该报错,详细的不同硬件版本RGA的限制可见[《Rockchip_Developer_Guide_RGA_CN》](./Rockchip_Developer_Guide_RGA_CN.md)中的概述——设计指标小节。
1347*4882a593Smuzhiyun
1348*4882a593Smuzhiyun当出现该报错时,通常有以下几种场景以及对应的解决方案:
1349*4882a593Smuzhiyun
1350*4882a593Smuzhiyun1. 在搭载多种RGA的芯片平台(例如RK3588搭载有2颗RGA3核心、1颗RGA2核心)上,没有使用importbuffer_xx接口获取handle,而是直接使用wrapbuffer_xx接口调用im2d api时:
1351*4882a593Smuzhiyun
1352*4882a593Smuzhiyun   由于没有使用importbuffer_xx来提前映射外部内存到RGA驱动内存,因此在实际任务匹配中无法提前获知内存是否不满足对应核心的限制,因此在高负载场景下可能会出现该报错,建议使用importbuffer_xx提前将外部内存导入到RGA驱动内部,避免该问题。
1353*4882a593Smuzhiyun
1354*4882a593Smuzhiyun2. 在搭载多种RGA的芯片平台(例如RK3588搭载有2颗RGA3核心、1颗RGA2核心)上,使用了importbuffer_xx接口获取handle,但是依旧存在该问题:
1355*4882a593Smuzhiyun
1356*4882a593Smuzhiyun   可以检查一下配置的图像任务的参数,确认是否配置了仅有RGA2核心(内存访问受限制的核心)支持的功能或格式,以RK3588为例,color fill功能和YUV422/420 planar格式均是RGA2核心特有的功能和格式,因此该场景下必须分配4G以内内存空间的内存调用RGA。
1357*4882a593Smuzhiyun
1358*4882a593Smuzhiyun   常见的分配4G内存方式可以查看以下示例代码:
1359*4882a593Smuzhiyun
1360*4882a593Smuzhiyun    **<librga_souce_path>/samples/allocator_demo/src/rga_allocator_dma32_demo.cpp**
1361*4882a593Smuzhiyun
1362*4882a593Smuzhiyun    **<librga_souce_path>/samples/allocator_demo/src/rga_allocator_graphicbuffer_demo.cpp**
1363*4882a593Smuzhiyun
1364*4882a593Smuzhiyun   如果使用的其他分配器,例如mpp_buffer、v4l2_buffer、drm_buffer等,请查询对应分配器是否支持限制分配4G以内内存空间内存,并按照对应方式申请复合RGA硬件要求的内存。
1365*4882a593Smuzhiyun
1366*4882a593Smuzhiyun3. 仅搭载一种RGA的芯片平台(例如仅搭载RGA2的RK3399、RK3568、Rk3566)上:
1367*4882a593Smuzhiyun
1368*4882a593Smuzhiyun   当芯片平台上仅搭载内存访问受限制的核心时,则调用RGA时必须申请符合搭载核心对内存要求的内存,解决方案同上场景2。
1369*4882a593Smuzhiyun
1370*4882a593Smuzhiyun
1371*4882a593Smuzhiyun
1372*4882a593Smuzhiyun**Q4.6**:“rga_policy: invalid function policy”、“rga_job: job assign failed”字样报错是什么导致的?
1373*4882a593Smuzhiyun
1374*4882a593Smuzhiyun**A4.6**:可以开启驱动运行日志查看,具体错误原因
1375*4882a593Smuzhiyun
1376*4882a593Smuzhiyun例如:
1377*4882a593Smuzhiyun
1378*4882a593Smuzhiyun```
1379*4882a593Smuzhiyunrga_policy: start policy on core = 4
1380*4882a593Smuzhiyunrga_policy: RGA2 only support under 4G memory!     //标识当前搭载的RGA2核心仅支持4G以内的内存。
1381*4882a593Smuzhiyunrga_policy: optional_cores = 0
1382*4882a593Smuzhiyunrga_policy: invalid function policy
1383*4882a593Smuzhiyunrga_policy: assign core: -1
1384*4882a593Smuzhiyunrga_job: job assign failed
1385*4882a593Smuzhiyun```
1386*4882a593Smuzhiyun
1387*4882a593Smuzhiyun```
1388*4882a593Smuzhiyunrga_policy: start policy on core = 1
1389*4882a593Smuzhiyunrga_policy: core = 1, break on rga_check_dst      //对应核心不支持的原因日志,这里是dst通道的图像参数不满足当前核心要求(可以查阅文档确认该核心支持情况,这里core 0x1、0x2为RGA3核心,0x4为RGA2核心)
1390*4882a593Smuzhiyunrga_policy: start policy on core = 2
1391*4882a593Smuzhiyunrga_policy: core = 2, break on rga_check_dst      //对应核心不支持的原因日志,同上。
1392*4882a593Smuzhiyunrga_policy: start policy on core = 4
1393*4882a593Smuzhiyunrga_policy: RGA2 only support under 4G memory!    //对应核心不支持的原因日志,标识当前不匹配原因为该核心不支持4G内存空间以外的内存。
1394*4882a593Smuzhiyun rga_policy: optional_cores = 0
1395*4882a593Smuzhiyunrga_policy: invalid function policy
1396*4882a593Smuzhiyunrga_policy: assign core: -1                       //遍历全部核心后,无可匹配核心,则上报匹配失败错误。
1397*4882a593Smuzhiyunrga_job: job assign failed
1398*4882a593Smuzhiyun```
1399*4882a593Smuzhiyun
1400*4882a593Smuzhiyun以上两种情况可以根据对应的日志去确认配置的参数信息,并针对性的进行修改。
1401*4882a593Smuzhiyun
1402*4882a593Smuzhiyun
1403*4882a593Smuzhiyun
1404*4882a593Smuzhiyun**Q4.7**:“rga:Rga err irq! INT[701],STATS[1]” 调用RGA出现中断报错是什么导致的?
1405*4882a593Smuzhiyun
1406*4882a593Smuzhiyun**A4.7**:该问题通常发生在RGA硬件执行过程中遇到问题异常返回,异常原因很多,常见的有内存越界、异常配置。建议遇到该问题优先检查传入的内存是否会发生越界。
1407*4882a593Smuzhiyun
1408*4882a593Smuzhiyun
1409*4882a593Smuzhiyun
1410*4882a593Smuzhiyun**Q4.8**:“rga: Rga sync pid 1001 wait 1 task done timeout” 硬件超时报错一般是什么导致的?
1411*4882a593Smuzhiyun
1412*4882a593Smuzhiyun**A4.8**:硬件超时报错原因有很多种,可以按照以下情形依次排查:
1413*4882a593Smuzhiyun
1414*4882a593Smuzhiyun​			1). 检查整体流程,确认没有其他模块或应用对该块buffer持锁或异常占用中,当同一块buffer被其他模块异常占用时,RGA无法正常读写数据,超过了驱动设计的200ms的阈值后,便会异常返回并打印报错。
1415*4882a593Smuzhiyun
1416*4882a593Smuzhiyun​			2). 检查当前系统的DDR带宽与利用率,由于RGA的总线优先级较低,当DDR负载跑满时,如果RGA在200ms内没有执行完毕,驱动便会异常返回并打印该报错。
1417*4882a593Smuzhiyun
1418*4882a593Smuzhiyun​			3). 确认RGA超时报错前是否已经有其他IP模块的报错,例如ISP、vpu等,当在同一条总线上的硬件出现问题的情况,可能会导致RGA无法正常工作,驱动等待超过200ms后,便异常返回并打印报错。
1419*4882a593Smuzhiyun
1420*4882a593Smuzhiyun​			4). 确认当前RGA频率(可以参考 **Q1.4** 中RGA频率相关操作),某些场景可能会出现同一条总线上的模块降频后影响到RGA的频率,RGA频率下降从而导致整体的性能下降,无法在200ms内完成工作,驱动便会异常返回并打印报错。
1421*4882a593Smuzhiyun
1422*4882a593Smuzhiyun​			5). 部分芯片RGA被超频到一个较高的频率,此时RGA频率上升但是电压没有提升,会导致RGA整体性能显著下降,导致无法在规定阈值内完成工作,从而驱动异常返回并打印报错。该场景建议开发者将RGA频率修改至正常频率,超频对整体芯片的稳定性与使用寿命均有影响,强烈不建议该种行为。
1423*4882a593Smuzhiyun
1424*4882a593Smuzhiyun​			6). 以上场景均没有发现问题,可以尝试在RGA超时报错返回后,将目标内存中的数据写到文件中,查看RGA是否有写入部分数据,如有写入部分数据,请重新确认1-5场景,该现象明显为RGA性能表现不足导致;如果目标内存没有被RGA写入数据,收集对应的日志信息以及相关实验过程,联系维护RGA模块的工程师。
1425*4882a593Smuzhiyun
1426*4882a593Smuzhiyun
1427*4882a593Smuzhiyun
1428*4882a593Smuzhiyun**Q4.9**:当出现timeout报错时,同时伴随着“rga_job: hardware has finished, but the software has timeout!”日志,是什么原因?
1429*4882a593Smuzhiyun
1430*4882a593Smuzhiyun**A4.9**:当出现该日志则说明当前系统环境负责中断的CPU核心被抢占,导致RGA驱动在上半部的硬件中断结束后,等不到下半部的软中断,超过驱动设置的超时阈值后,驱动上报的超时错误。
1431*4882a593Smuzhiyun
1432*4882a593Smuzhiyun​			这种情况常见于应用层存在实时进程抢占了CPU,导致驱动设备无法正常工作,不建议使用实时进程强制抢占CPU资源,出现该问题只能从CPU侧进行优化,避免负责中断的CPU核心被抢占无法执行其他设备驱动的软中断。
1433*4882a593Smuzhiyun
1434*4882a593Smuzhiyun
1435*4882a593Smuzhiyun
1436*4882a593Smuzhiyun
1437*4882a593Smuzhiyun
1438*4882a593Smuzhiyun
1439*4882a593Smuzhiyun
1440*4882a593Smuzhiyun
1441*4882a593Smuzhiyun
1442*4882a593Smuzhiyun
1443*4882a593Smuzhiyun
1444*4882a593Smuzhiyun
1445*4882a593Smuzhiyun
1446*4882a593Smuzhiyun
1447*4882a593Smuzhiyun
1448*4882a593Smuzhiyun
1449*4882a593Smuzhiyun
1450*4882a593Smuzhiyun
1451*4882a593Smuzhiyun
1452*4882a593Smuzhiyun
1453*4882a593Smuzhiyun
1454*4882a593Smuzhiyun
1455*4882a593Smuzhiyun
1456*4882a593Smuzhiyun
1457*4882a593Smuzhiyun
1458*4882a593Smuzhiyun
1459*4882a593Smuzhiyun
1460*4882a593Smuzhiyun
1461*4882a593Smuzhiyun
1462*4882a593Smuzhiyun
1463*4882a593Smuzhiyun
1464*4882a593Smuzhiyun
1465*4882a593Smuzhiyun
1466*4882a593Smuzhiyun
1467*4882a593Smuzhiyun
1468*4882a593Smuzhiyun
1469*4882a593Smuzhiyun
1470*4882a593Smuzhiyun
1471*4882a593Smuzhiyun
1472*4882a593Smuzhiyun
1473*4882a593Smuzhiyun
1474*4882a593Smuzhiyun
1475*4882a593Smuzhiyun
1476*4882a593Smuzhiyun
1477*4882a593Smuzhiyun
1478