基于RK3588开发板实现多屏拼接
基于RK3588开发板实现多屏拼接
多屏拼接功能说明
将一组完整的画面分割为若干子画面分别送给不同的屏幕显示,可以支持下图的多种模式
硬件环境
基于RK3588 EVB开发板实现4屏拼接,RK3588 EVB开发有多个显示接口:
- 2个HDMI接口
- 1个type-c接口的DP
- 1个DP转VGA的接口
- 2个MIPI DSI接口
通过vop的split 模式可以实现6个屏同时异显输出1080P的分辨率,vop的split 介绍可以看专门的介绍文章《RK3588 VOP-SPLIT分屏模式介绍》。
这里选用2个HDMI+1个type-c接口的DP+1个MIPI DSI 四个接口来实现4屏拼接功能,如下图:
这四个显示接口的dts配置可以看文章《Rockchip RK3588 kernel dts解析之显示模块》
drmhwc2多屏拼接配置
多屏拼接的代码实现在drmhwc2,根据配置文件来配置对应的拼接模式,具体配置如下:
配置文件位于:hardware/rockchip/hwcomposer/drmhwc2/HwComposerEnv.xml
完整编译后会安装到设备 /vendor/etc/HwComposerEnv.xml 位置
下面是按水平2x2模式拼接4个屏幕:
系统渲染的分辨率设置为 5760x2160,那么对应Connector 显示的图像区域如下图:
根据上图,就能够很容易的得出4个 Connector 的 Src Info坐标:
ConnectorType-TypeId | SrcX | SrcY | SrcW | SrcH |
---|---|---|---|---|
HDMI-A-1 | 0 | 0 | 3840 | 1080 |
HDMI-A-2 | 3840 | 0 | 1920 | 1080 |
DP-0 | 0 | 1080 | 3840 | 1080 |
DSI-0 | 3840 | 1080 | 1920 | 1080 |
根据上面的信息hardware/rockchip/hwcomposer/drmhwc2/HwComposerEnv.xml的配置如下
<?xml version="1.0" encoding="utf-8"?>
<!-- HwComposerEnv module xml -->
<HwComposerEnv Version="1.1.1" ><DsiplayMode Mode="1" FbWidth="5760" FbHeight="2160" ConnectorCnt="4"><Connector><!--Example 1 - Slicing-6x1 1920x1080:Type-TypeId can be obtained through the following process:adb shell modetest -c > modetest-connector.logTips:Android_SDK_project: mmm external/libdrm/tests/modetestoutput modetest to $OUT/data/nativetest64/modetest/modetestThe modetest-connector log has the following fields:- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Connectors:id encoder status name size (mm) modes encoders409 408 connected HDMI-A-1 700x390 26 408modes:index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot#0 3840x1080 60.00 3840 4016 4104 4400 1080 1084 1089 1125 297000 flags: phsync, pvsync; type: preferred(...)419 418 connected HDMI-A-2 510x290 10 418modes:index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot#0 1920x1080 60.00 1920 2008 2052 2200 1080 1084 1089 1125 148500 flags: phsync, pvsync; type: driver(...)421 420 connected HDMI-A-3 510x290 10 420modes:index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot#0 1920x1080 60.00 1920 2008 2052 2200 1080 1084 1089 1125 148500 flags: phsync, pvsync; type: driver(...)423 422 connected DP-1 1020x290 12 422modes:index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot#1 3840x1080 60.00 3840 4016 4104 4400 1080 1084 1089 1125 297000 flags: phsync, pvsync; type: driver- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Type-TypeId = HDMI-A-1Type-TypeId = HDMI-A-2 Type-TypeId = DP-1Type-TypeId = DSI-1--><Type>HDMI-A</Type><TypeId>1</TypeId><SrcX>0</SrcX> <!-- Framebuffer x 0ffset --><SrcY>0</SrcY> <!-- Framebuffer y 0ffset --><SrcW>3840</SrcW> <!-- Framebuffer Width --><SrcH>1080</SrcH> <!-- Framebuffer Height--><DstX>0</DstX> <!-- unuse , reserved --><DstY>0</DstY> <!-- unuse , reserved --><DstW>0</DstW> <!-- unuse , reserved --><DstH>0</DstH> <!-- unuse , reserved --></Connector><Connector><Type>HDMI-A</Type><TypeId>2</TypeId><SrcX>3840</SrcX> <!-- Framebuffer x 0ffset --><SrcY>0</SrcY> <!-- Framebuffer y 0ffset --><SrcW>1920</SrcW> <!-- Framebuffer Width --><SrcH>1080</SrcH> <!-- Framebuffer Height--><DstX>0</DstX> <!-- unuse , reserved--><DstY>0</DstY> <!-- unuse , reserved--><DstW>0</DstW> <!-- unuse , reserved--><DstH>0</DstH> <!-- unuse , reserved--></Connector><Connector><Type>DP</Type><TypeId>1</TypeId><SrcX>0</SrcX> <!-- Framebuffer x 0ffset --><SrcY>1080</SrcY> <!-- Framebuffer y 0ffset --><SrcW>3840</SrcW> <!-- Framebuffer Width --><SrcH>1080</SrcH> <!-- Framebuffer Height--><DstX>0</DstX> <!-- unuse , reserved--><DstY>0</DstY> <!-- unuse , reserved--><DstW>0</DstW> <!-- unuse , reserved--><DstH>0</DstH> <!-- unuse , reserved--></Connector><Connector><Type>DSI</Type><TypeId>1</TypeId><SrcX>3840</SrcX> <!-- Framebuffer x 0ffset --><SrcY>1080</SrcY> <!-- Framebuffer y 0ffset --><SrcW>1920</SrcW> <!-- Framebuffer Width --><SrcH>1080</SrcH> <!-- Framebuffer Height--><DstX>0</DstX> <!-- unuse , reserved--><DstY>0</DstY> <!-- unuse , reserved--><DstW>0</DstW> <!-- unuse , reserved--><DstH>0</DstH> <!-- unuse , reserved--></Connector></DsiplayMode>
</HwComposerEnv>
HwComposerEnv.xml配置说明
DsiplayMode
<DsiplayMode Mode="1" FbWidth="5760" FbHeight="2160" ConnectorCnt="4">
Mode 设置为1=Slicing,拼接模式
FbWidth / FbHeight,系统渲染分辨率,完整的图像尺寸,具体数值通过以下方式计算得来:
FbWidth = 3840 + 1920 = 5760 // 2x2 布局的拼接屏幕
FbHeight= 1080 + 1080 = 2160 // 2x2 布局的拼接屏幕
ConnectorCnt = 4 // 为系统内部注册的Connector数量
Connector
<Connector><Type>HDMI-A</Type><TypeId>1</TypeId><SrcX>0</SrcX> <!-- Framebuffer x 0ffset --><SrcY>0</SrcY> <!-- Framebuffer y 0ffset --><SrcW>3840</SrcW> <!-- Framebuffer Width --><SrcH>1080</SrcH> <!-- Framebuffer Height--><DstX>0</DstX> <!-- unuse , reserved --><DstY>0</DstY> <!-- unuse , reserved --><DstW>0</DstW> <!-- unuse , reserved --><DstH>0</DstH> <!-- unuse , reserved --></Connector>
Connector Type 与 TypeId 信息可通过 modetest 工具获得,modetest工具可以通过源码编译获得的具体操作如下:
#modetest 编译
mmm external/libdrm/tests/modetest
#modetest 输出目录
$OUT/data/nativetest64/modetest/modetest # 64位
$OUT/data/nativetest/modetest/modetest # 32位
#获取Drm Driver注册的所有Connector信息
adb shell modetest -c > modetest-connector.log
在设备里面执行modetest - c获取ConnectorType 与 TypeId 信息
rk3588_s:/ # modetest - c
.
.
.Connectors:
id encoder status name size (mm) modes encoders
411 0 disconnected HDMI-A-1 0x0 0 410
.
.
.
421 0 disconnected HDMI-A-2 0x0 0 420
.
.
.
431 430 connected DSI-1 0x0 1 430
.
.
.
434 0 disconnected DP-1 0x0 0 433
.
.
.
440 0 disconnected DP-2 0x0 0 439
.
.
.
# ConnectorType 与 TypeId 从 Connector name 描述中获取:HDMI-A-1 / HDMI-A-2 /DP-1/DSI-1
# 对应关系如下:
# HDMI-A-1:ConnectorType = HDMI-A , TypeId = 1
# HDMI-A-2:ConnectorType = HDMI-A , TypeId = 2
# DSI-1:ConnectorType = DSI , TypeId = 1
# DP-1 :ConnectorType = DP , TypeId = 1
基于RK3588开发板实现多屏拼接相关推荐
- 【基于NSR3588开发板Android12三屏拼接显示实例】
基于NSR3588开发板Android12三屏拼接显示实例 1.硬件接口 2路HDMI接口 1路Type-c DP转HDMI 如下图: 2.多屏显示拼接简介 RK3588可以支持如下多种拼接模式: 我 ...
- 【Verilog】基于Nexys4DDR开发板实现数字钟
功能: 基于Nexys4DDR开发板实现的数字钟,六位数码管显示时分秒,可切换24时制/12时制,有整点报时功能(led灯闪烁). Verilog代码: `timescale 1ns / 1ps//数 ...
- 基于PYNQ-Z2开发板实现矩阵乘法加速详细流程
基于PYNQ-Z2开发板实现矩阵乘法加速 主要内容 1.在Vivado HLS中生成矩阵乘法加速的IP核. 2.在Vivado中完成Block Design. 3.在Jupyter Notebook上 ...
- Mixly(米思齐)的安装以及基于Arduino开发板实现电容触摸控制灯
Mixly(米思齐)的安装以及基于Arduino开发板实现电容触摸控制灯 1.Mixly下载 http://mixly.org/bnu-maker/mixly-arduino-win Mixly软件安 ...
- 基于STM32开发板实现传感数据采集-DHT11温湿度采集
基于STM32开发板实现传感数据采集-DHT11温湿度采集 一.项目简介 本次项目是基于STM32开发板实现传感数据采集-DHT11温湿度采集.采用ARM结构中最为代表的Cortex-M4系列的芯片, ...
- STM32实例——基于STM32开发板实现传感数据采集-DHT11温湿度采集
STM32开发板实现传感数据采集-DHT11温湿度采集 一.前言 本项目是基于STM32开发板的温湿度采集,传感器采用DHT11温湿度传感器,软件采用keil5等.本项目采用ARM结构中最为代表的Co ...
- 基于Arduino开发板实现触摸式开关
本篇文章是我的第二篇博客,这一次是课堂实验,老师让我们熟悉Arduino的使用,为大四的实习做好准备,以下是我的实验过程. 实验所需硬件设备: LED指示灯 2根连接导线 触摸板 Arduino开发板 ...
- 基于STM32开发板实现温湿度传感数据采集
一.实验要求 本实验将选用STM32F407ZGT6开发板进行项目开发,选用的传感器为DHT11温湿度传感器.传感器将采集到的数据传输到STM32(MCU)主控进行数据处理,最后通过串口打印出来. 二 ...
- 基于STM32开发板实现传感数据采集及wifi上云
目录 前言 一.实验目的 二.实验环境 三.实验步骤 四.实验代码 五.实验结果 六.实验体会 前言 温度和湿度值是重要的物理参数,例如精密机械加工.实验室.温室大棚.粮库.重要活动场所.会议室.居住 ...
最新文章
- 智能音箱自己把自己黑了:随机购物拨号,自主开灯关门,平均成功率达88%
- 数据结构——队列(C语言实现)
- JAVA从下载到浏览器运行完整篇,写给lewis
- Groovy简介和一点资源
- java 通过sftp服务器上传下载删除文件
- 浅论教材砍压并补联的原则
- Conficker蠕虫病毒只是愚人节玩笑吗
- 敏捷方法软件开发生命周期: 优点和缺点
- SASA: Semantics-Augmented Set Abstraction for Point-based 3D Object Detection
- 第一篇:阿里数据中台之数据中台顶层设计
- 帆软 finereport FCRA 考试 题库+答案,共收录561题,大部分有答案
- BZOJ5394: [Ynoi2016]炸脖龙(欧拉广义降幂)
- 何小黑的2019年秋招面经~
- C语言/实现MD5加密
- unity 移动开发优化二 图形优化,脚本优化概述
- 《统计学习方法》——隐马尔可夫模型
- Python:类和文件操作
- 明翰全日制英国硕士留学攻略V2.7(持续更新)
- python中求某一行的和
- ODX诊断数据库的由来
热门文章
- 【uniapp 开发】手绘签名组件
- 什么是web3 | 区块链web3.0人才
- vs2017下搭建libuv环境
- 00后整顿职场?网传一公司反手成立“专管00后部门”
- firefox下载sourceforge的资源非常慢,甚至还要断连
- CAS SSO 4.0.x 集成OAuth(微信登陆示例)
- [设计]基于ARM9与Linux系统的数控切割机
- 关于 Infinity, -Infinity 和 NaN
- STM32CubeIDE开发实践案例-专栏总述
- Tessent MemoryBIST Overview