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*4882a593Smuzhiyun https://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*4882a593Smuzhiyun https://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*4882a593Smuzhiyun hardware/rockchip/librga 927*4882a593Smuzhiyun 928*4882a593Smuzhiyun Android 7.0以下SDK: 929*4882a593Smuzhiyun 930*4882a593Smuzhiyun hardware/rk29/librga 931*4882a593Smuzhiyun 932*4882a593Smuzhiyun Linux SDK: 933*4882a593Smuzhiyun 934*4882a593Smuzhiyun external/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  1064*4882a593Smuzhiyun 1065*4882a593Smuzhiyun 结果: 1066*4882a593Smuzhiyun 1067*4882a593Smuzhiyun  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  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  1137*4882a593Smuzhiyun 1138*4882a593Smuzhiyun 预期: 1139*4882a593Smuzhiyun 1140*4882a593Smuzhiyun  1141*4882a593Smuzhiyun 1142*4882a593Smuzhiyun 结果: 1143*4882a593Smuzhiyun 1144*4882a593Smuzhiyun  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  1163*4882a593Smuzhiyun 1164*4882a593Smuzhiyun 结果: 1165*4882a593Smuzhiyun 1166*4882a593Smuzhiyun  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  1177*4882a593Smuzhiyun 1178*4882a593Smuzhiyun 结果(1282 × 720): 1179*4882a593Smuzhiyun 1180*4882a593Smuzhiyun  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  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