本文主要是介绍RK3588 VOP图层分配介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
RK3588 VOP图层分配介绍
RK3588图层介绍
RK3588有8个图层,分别是Custer 0/1/2/3 和Esmart 0/1/2/3,两种图层的能力不一样,具体如下:
- Custer
- 分辨率:最大分辨率包括两种合并集群和单集群,分别为7680x4320和4096x4320。
- 数据格式:支持多种数据格式,包括RGBA8888/RGB888/RGB565/RGBA1010102/YUV420(8,10bit)/YUV422(8,10bit)。
- 图像支持:支持虚拟宽度、活动偏移、显示偏移、Y镜像、X镜像、旋转90度/270度等。
- 集群线缓冲模式:支持三种模式,包括1x4096宽度的模式、2x2048宽度的模式和1x2048宽度的AFBCD旋转层模式。
- 集群支持的功能包括:支持高斯滤波、缩放、色彩空间转换等。
- Esmart
- 分辨率:支持分辨率分别为7680x4320和4096x4320。
- 数据格式:数据格式包括RGB、YUV、YUYV等,支持多种颜色深度8BPP。
- 图像支持: 支持虚拟宽度、活动偏移、显示偏移、Y镜像、颜色交换、YUV剪切等图像功能。
- 集群线缓冲模式:支持多区域显示,每个区域最大支持一个像素点,最多支持4个区域。
- 支持缩放功能,包括缩放率和缩放模式,支持缩小和放大,缩放率范围为1/8~1,缩放模式包括最近邻插值、双线性插值和三线性插值。
- 支持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 中按以下规则配置:
- 只有一个屏显示,可以使用如下配置:
#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>;
};
- 有两个屏显示【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 的连接关系:
- RK3528
VP | 图层 |
---|---|
VP0 | Cluster0、Esmart0、Esmart1、Esmart2 |
VP1 | Esmart2、Esmart3 |
- RK3576
VP | 图层 |
---|---|
VP0 | Cluster0、Cluster1、Esmart0、Esmart2 |
VP1 | Cluster0、Cluster1、Esmart1、Esmart3 |
VP2 | Esmart0、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_mode | val | 图层数量和性能 |
---|---|---|
VOP3_ESMART_4K_4K_MODE | 1 | 注册 cluster[4k],esmart0[4k],esmart2[4k] |
VOP3_ESMART_4K_2K_2K_MODE | 2 | 注册 cluster[4k],esmart0[4k],esmart2[2k],esmart3[2k] |
VOP3_ESMART_2K_2K_2K_2K_MODE | 3 | 注册 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_mode | val | 图层数量和性能 |
---|---|---|
VOP3_ESMART_4K_4K_4K_MODE | 4 | 注册 cluster0[4k],cluster1[4k],esmart0[4k],esmart1[4k],esmart2[4k] |
VOP3_ESMART_4K_4K_2K_2K_MODE | 5 | 注册 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图层分配介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!