基于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开发板实现多屏拼接相关推荐

  1. 【基于NSR3588开发板Android12三屏拼接显示实例】

    基于NSR3588开发板Android12三屏拼接显示实例 1.硬件接口 2路HDMI接口 1路Type-c DP转HDMI 如下图: 2.多屏显示拼接简介 RK3588可以支持如下多种拼接模式: 我 ...

  2. 【Verilog】基于Nexys4DDR开发板实现数字钟

    功能: 基于Nexys4DDR开发板实现的数字钟,六位数码管显示时分秒,可切换24时制/12时制,有整点报时功能(led灯闪烁). Verilog代码: `timescale 1ns / 1ps//数 ...

  3. 基于PYNQ-Z2开发板实现矩阵乘法加速详细流程

    基于PYNQ-Z2开发板实现矩阵乘法加速 主要内容 1.在Vivado HLS中生成矩阵乘法加速的IP核. 2.在Vivado中完成Block Design. 3.在Jupyter Notebook上 ...

  4. Mixly(米思齐)的安装以及基于Arduino开发板实现电容触摸控制灯

    Mixly(米思齐)的安装以及基于Arduino开发板实现电容触摸控制灯 1.Mixly下载 http://mixly.org/bnu-maker/mixly-arduino-win Mixly软件安 ...

  5. 基于STM32开发板实现传感数据采集-DHT11温湿度采集

    基于STM32开发板实现传感数据采集-DHT11温湿度采集 一.项目简介 本次项目是基于STM32开发板实现传感数据采集-DHT11温湿度采集.采用ARM结构中最为代表的Cortex-M4系列的芯片, ...

  6. STM32实例——基于STM32开发板实现传感数据采集-DHT11温湿度采集

    STM32开发板实现传感数据采集-DHT11温湿度采集 一.前言 本项目是基于STM32开发板的温湿度采集,传感器采用DHT11温湿度传感器,软件采用keil5等.本项目采用ARM结构中最为代表的Co ...

  7. 基于Arduino开发板实现触摸式开关

    本篇文章是我的第二篇博客,这一次是课堂实验,老师让我们熟悉Arduino的使用,为大四的实习做好准备,以下是我的实验过程. 实验所需硬件设备: LED指示灯 2根连接导线 触摸板 Arduino开发板 ...

  8. 基于STM32开发板实现温湿度传感数据采集

    一.实验要求 本实验将选用STM32F407ZGT6开发板进行项目开发,选用的传感器为DHT11温湿度传感器.传感器将采集到的数据传输到STM32(MCU)主控进行数据处理,最后通过串口打印出来. 二 ...

  9. 基于STM32开发板实现传感数据采集及wifi上云

    目录 前言 一.实验目的 二.实验环境 三.实验步骤 四.实验代码 五.实验结果 六.实验体会 前言 温度和湿度值是重要的物理参数,例如精密机械加工.实验室.温室大棚.粮库.重要活动场所.会议室.居住 ...

最新文章

  1. 智能音箱自己把自己黑了:随机购物拨号,自主开灯关门,平均成功率达88%
  2. 数据结构——队列(C语言实现)
  3. JAVA从下载到浏览器运行完整篇,写给lewis
  4. Groovy简介和一点资源
  5. java 通过sftp服务器上传下载删除文件
  6. 浅论教材砍压并补联的原则
  7. Conficker蠕虫病毒只是愚人节玩笑吗
  8. 敏捷方法软件开发生命周期: 优点和缺点
  9. SASA: Semantics-Augmented Set Abstraction for Point-based 3D Object Detection
  10. 第一篇:阿里数据中台之数据中台顶层设计
  11. 帆软 finereport FCRA 考试 题库+答案,共收录561题,大部分有答案
  12. BZOJ5394: [Ynoi2016]炸脖龙(欧拉广义降幂)
  13. 何小黑的2019年秋招面经~
  14. C语言/实现MD5加密
  15. unity 移动开发优化二 图形优化,脚本优化概述
  16. 《统计学习方法》——隐马尔可夫模型
  17. Python:类和文件操作
  18. 明翰全日制英国硕士留学攻略V2.7(持续更新)
  19. python中求某一行的和
  20. ODX诊断数据库的由来

热门文章

  1. 【uniapp 开发】手绘签名组件
  2. 什么是web3 | 区块链web3.0人才
  3. vs2017下搭建libuv环境
  4. 00后整顿职场?网传一公司反手成立“专管00后部门”
  5. firefox下载sourceforge的资源非常慢,甚至还要断连
  6. CAS SSO 4.0.x 集成OAuth(微信登陆示例)
  7. [设计]基于ARM9与Linux系统的数控切割机
  8. 关于 Infinity, -Infinity 和 NaN
  9. STM32CubeIDE开发实践案例-专栏总述
  10. Tessent MemoryBIST Overview