RK3588 VOP图层分配介绍

2024-06-03 21:36
文章标签 介绍 分配 图层 rk3588 vop

本文主要是介绍RK3588 VOP图层分配介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RK3588 VOP图层分配介绍

RK3588图层介绍

RK3588有8个图层,分别是Custer 0/1/2/3 和Esmart 0/1/2/3,两种图层的能力不一样,具体如下:

  • Custer
  1. 分辨率:最大分辨率包括两种合并集群和单集群,分别为7680x4320和4096x4320。
  2. 数据格式:支持多种数据格式,包括RGBA8888/RGB888/RGB565/RGBA1010102/YUV420(8,10bit)/YUV422(8,10bit)。
  3. 图像支持:支持虚拟宽度、活动偏移、显示偏移、Y镜像、X镜像、旋转90度/270度等。
  4. 集群线缓冲模式:支持三种模式,包括1x4096宽度的模式、2x2048宽度的模式和1x2048宽度的AFBCD旋转层模式。
  5. 集群支持的功能包括:支持高斯滤波、缩放、色彩空间转换等。
  • Esmart
  1. 分辨率:支持分辨率分别为7680x4320和4096x4320。
  2. 数据格式:数据格式包括RGB、YUV、YUYV等,支持多种颜色深度8BPP。
  3. 图像支持: 支持虚拟宽度、活动偏移、显示偏移、Y镜像、颜色交换、YUV剪切等图像功能。
  4. 集群线缓冲模式:支持多区域显示,每个区域最大支持一个像素点,最多支持4个区域。
  5. 支持缩放功能,包括缩放率和缩放模式,支持缩小和放大,缩放率范围为1/8~1,缩放模式包括最近邻插值、双线性插值和三线性插值。
  6. 支持YUV到RGB和RGB到YUV的转换,支持多种色彩空间。

图层分配策略

VOP2 采用统一显示架构,各个独立的 Video Port 共享 VOP 内部的所有图层资源,而且这些图层需要排他性的使用,即某个图层在同一时刻只能为其中一个 Video Port 所独占。

为了充分合理的使用所有图层资源,我们会根据当前产品 dts 配置的接口类型和数量在 U-Boot 中生成了一种默认的图层分配策略,如果有些产品没有开 U-Boot logo 显示或者对图层使用有特殊的需求,可以参考下面的写法在 dts 根据需求自行指定图层分配策略:

rockchip,plane-mask:指定分配给该 VP 的图层 ID 掩码集合,图层 ID 定义在 dt-bindings/display/rockchip_vop.h 中。

rockchip,primary-plane:指定 primary 图层,当前 VP 的 primary 图层一定是 rockchip,plane-mask 中的一个,我们一般选用 Smart 或者 Esmart 图层。

图层分配的基本原则是:把所有图层(rk3568 有 6 个图层,rk3588 有 8 个图层)平均分配给各个使用的 VP,不使用的 VP 一般不分配图层。由于 VOP 内部不同类型(Cluster,Esmart,Smart)的图层,性能,限制不同,一般推荐各种类型的图层平均搭配分配。

如下是一个 RK3568 上的典型图层分配参考, RK3568 VOP 一共有 6 个图层(2 Cluster + 2 Esmart + 2 Smart),该配置支持三屏异显。一般,我们尽量给使用场景最多的屏幕(主屏) 对应的 VP 分配三个以上的图层(在该应用案例下是 VP1),其他接口尽量分配不少于两个图层。

#include <dt-bindings/display/rockchip_vop.h>        // 图层 ID 定义头文件&vp0 {rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER1 | 1 << ROCKCHIP_VOP2_SMART1)>;rockchip,primary-plane = <ROCKCHIP_VOP2_SMART1>;
};&vp1 {rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER0 | 1 << ROCKCHIP_VOP2_ESMART0 | 1 << ROCKCHIP_VOP2_SMART0)>;rockchip,primary-plane = <ROCKCHIP_VOP2_SMART0>;
};&vp2 {rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_ESMART1)>;rockchip,primary-plane = <ROCKCHIP_VOP2_ESMART1>;
};

配置生效后,系统启动的时候可以从 U-Boot 和 Linux kernel 的启动 log 中看到对应的 plane mask 解析信息。

Rockchip UBOOT DRM driver version: v1.0.1
VOP have 3 active VP
vp0 have layer nr:2[1 5 ], primary plane: 5
vp1 have layer nr:3[0 2 4 ], primary plane: 4
vp2 have layer nr:1[3 ], primary plane: 3
Using display timing dts
dsi@fe060000:  detailed mode clock 132000 kHz, flags[8000000a]H: 1080 1095 1097 1127V: 1920 1935 1937 1952
bus_format: 100e
VOP update mode to: 1080x1920p0, type: MIPI0 for VP1
VOP VP1 enable Smart0[654x270->654x270@213x825] fmt[2] addr[0x7df04000]
final DSI-Link bandwidth: 876 Mbps x 4
disp info 0, type:11, id:0
xfer: num: 2, addr: 0x50
xfer: num: 2, addr: 0x50
[2.314574] panel-simple-dsi fe060000.dsi.0: Specify missing connector_type
[2.315764] rockchip-vop2 : [drm:vop2_bind] vp0 assign plane mask: 0x22, primary plane phy id: 5
[2.315807] rockchip-vop2 : [drm:vop2_bind] vp1 assign plane mask: 0x15, primary plane phy id: 4
[2.315828] rockchip-vop2 : [drm:vop2_bind] vp2 assign plane mask: 0x8, primary plane phy id: 3
[2.316713] rockchip-drm display-subsystem: bound fe040000.vop (ops vop2_component_ops)
[2.317966] rockchip-drm display-subsystem: bound fe0c0000.edp (ops rockchip_dp_component_ops)
[2.318378] dwhdmi-rockchip : Detected HDMI TX controller v2.11a with HDCP (DWC HDMI 2.0 TX PHY)
[2.319625] dwhdmi-rockchip : registered DesignWare HDMI I2C bus driver
[2.321857] rockchip-drm display-subsystem: bound fe0a0000.hdmi (ops dw_hdmi_rockchip_ops)
[2.322069] rockchip-drm display-subsystem: bound fe060000.dsi (ops dw_mipi_dsi_rockchip_ops)

RK3566 图层分配策略

RK3566 IC 实现上有主图层和镜像图层的区别,即镜像图层 Cluster1 只能从主图层 Cluster0 对应的地址取数,同理 Esmart1/Smart1 只能从 Esmart0/Smart0 对应的地址取数,所以我们需要保证主图层被优先使用。正常产品的 U-Boot 显示驱动中会根据显示接口的类型设置好 plane-mask 属性,如果有些产品没有开 U-Boot logo 显示,可以在 dts 中按以下规则配置:

  1. 只有一个屏显示,可以使用如下配置:
#include <dt-bindings/display/rockchip_vop.h>	//图层 ID 定义头文件&vpx {	//x 取决于使用的 vp id,如 vp0rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER0 | 1 << ROCKCHIP_VOP2_ESMART0 | 1 << ROCKCHIP_VOP2_SMART0 | 1 << ROCKCHIP_VOP2_CLUSTER1 | 1 << ROCKCHIP_VOP2_ESMART1 | 1 << ROCKCHIP_VOP2_SMART1)>;rockchip,primary-plane = <ROCKCHIP_VOP2_SMART0>;
};
  1. 有两个屏显示【RK3566 目前只有 android 产品支持双显,且要求两个屏刷新帧率一致】,那我们让不支持热插拔设备(即始终连接显示的通路)使用主图层,另一个通路使用镜像图层:
#include <dt-bindings/display/rockchip_vop.h>	//图层 ID 定义头文件&vpx {	//x 取决于使用的 vp id,如 vp0rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER0 | 1 << ROCKCHIP_VOP2_ESMART0 | 1 << ROCKCHIP_VOP2_SMART0)>;rockchip,primary-plane = <ROCKCHIP_VOP2_SMART0>;
};	//单显或者双显时不支持热插拔的主显示设备使用主图层&vpx {	//x 取决于使用的 vp id,如 vp1rockchip,plane-mask = <(1 << ROCKCHIP_VOP2_CLUSTER1 | 1 << ROCKCHIP_VOP2_ESMART1 | 1 << ROCKCHIP_VOP2_SMART1)>;rockchip,primary-plane = <ROCKCHIP_VOP2_SMART1>;
};

把某个图层设置为鼠标层

应用如果使用 Atomic 显示接口,可以不区分图层的类型(primary, overlay, cursor), 只需要根据图层支持的格式,使用任意可以使用的图层做各种类型的显示。

但是在 Linux 系统(非 Android) 下,还有一些应用使用 legacy 的 API,这些 API 对图层类型比较在意,比如使用 primary 图层显示桌面背景,使用 overlay 图层播放视频,使用 cursor 图层显示鼠标。

Rockchip drm 驱动默认只注册 primary 图层和 overlay 图层,不注册 cursor 图层,如果一些特殊的 Linux 系统希望使用 cursor 图层,可以在 dts 中对应的 vp 节点下设置 cursor-win-id 属性,为该 VP 对应的 crtc 分配一个 cursor 图层。

&vp0 {cursor-win-id = <ROCKCHIP_VOP2_CLUSTER0>;
};

图层和 VP 之间的的连接关系

对于 RK356X/RK3588/RK3562 每一个图层和任意 VP 都有连接的,配置上没有特殊要求;对于 RK3528 和 RK3576 并不是每一个图层都可以连接到任意 VP 上,所以配置 VP 的 cursor 图层的时候需要选择能连接到当前 VP 的图层,以下是不同平台图层和 VP 的连接关系:

  1. RK3528
VP图层
VP0Cluster0、Esmart0、Esmart1、Esmart2
VP1Esmart2、Esmart3
  1. RK3576
VP图层
VP0Cluster0、Cluster1、Esmart0、Esmart2
VP1Cluster0、Cluster1、Esmart1、Esmart3
VP2Esmart0、Esmart1、Esmart2、Esmart3
  • 如果是 Linux 系统(buildroot,Debian 等非 Android 系统),指定 Cluster 图层为鼠标层的话,要配合 Linux SDK 提供的 libdrm-cursor 库。具体细节可参考 《Rockchip_Developer_Guide_Debian_CN.pdf》。

esmart 图层分割

RK3528 和 RK3576 几个 esmart 图层共享 linebuffer,可以根据产品形态对 linebuffer 进行分割来支持不同的图层数量和性能:

RK3528 esmart 图层分割

RK3528 平台的 esmart0/1/2/3 共享 linebuffer,默认配置为:VOP3_ESMART_4K_2K_2K_MODE,即此时除了固定的 cluster 图层,还注册 esmart0[4k],esmart2[2k],esmart3[2k],也可以根据产品需求在 dts 中做修改,如要改成 2 个支持 4k 的图层,可以按以下配置:

&vop {esmart_lb_mode = /bits/ 8 <1>;
};

配置说明:

esmart_lb_modeval图层数量和性能
VOP3_ESMART_4K_4K_MODE1注册 cluster[4k],esmart0[4k],esmart2[4k]
VOP3_ESMART_4K_2K_2K_MODE2注册 cluster[4k],esmart0[4k],esmart2[2k],esmart3[2k]
VOP3_ESMART_2K_2K_2K_2K_MODE3注册 cluster[4k],esmart0[2k],esmart1[2k],esmart2[2k],esmart3[2k]

RK3576 esmart 图层分割

RK3576 平台除了 Cluster0/1[4k] 和 esmart0/1[4k] 是固定的配置之外,esmart2[2k] 和 esmart3[2k] 也是共享 linebuffer 的设计,默认配置是 2 个 2k 的图层,如要改成 1 个支持 4k 的图层,可以按以下配置:

&vop {esmart_lb_mode = /bits/ 8 <4>;
};

配置说明:

esmart_lb_modeval图层数量和性能
VOP3_ESMART_4K_4K_4K_MODE4注册 cluster0[4k],cluster1[4k],esmart0[4k],esmart1[4k],esmart2[4k]
VOP3_ESMART_4K_4K_2K_2K_MODE5注册 cluster0[4k],cluster1[4k],esmart0[4k],esmart1[4k],esmart2[2k],esmart3[2k]

禁止图层迁移

某些 Linux 系统可能希望每个 crtc 上的图层都是唯一独占的,不在 crtc 之间做图层迁移,可以在 vop 节点下设置 disable-win-move 打开该功能。

&vop {disable-win-move;
}

这篇关于RK3588 VOP图层分配介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1028177

相关文章

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

nginx upstream六种方式分配小结

《nginxupstream六种方式分配小结》本文主要介绍了nginxupstream六种方式分配小结,包括轮询、加权轮询、IP哈希、公平轮询、URL哈希和备份服务器,具有一定的参考价格,感兴趣的可... 目录1 轮询(默认)2 weight3 ip_hash4 fair(第三方)5 url_hash(第三

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio