基于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-TypeIdSrcXSrcYSrcWSrcH
HDMI-A-10038401080
HDMI-A-23840019201080
DP-00108038401080
DSI-03840108019201080

根据上面的信息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.log
            Tips:
              Android_SDK_project: mmm external/libdrm/tests/modetest
              output modetest to $OUT/data/nativetest64/modetest/modetest
          The modetest-connector log has the following fields:

            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
            Connectors:
            id      encoder status          name            size (mm)       modes   encoders
            409     408     connected       HDMI-A-1        700x390         26      408
              modes:
                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      418
              modes:
                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      420
              modes:
                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      422
              modes:
                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-1
          Type-TypeId = HDMI-A-2         
          Type-TypeId = DP-1
          Type-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
  • 7
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

loitawu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值