NXP iMX8MP ARM 平台多屏幕克隆显示测试

news2025/7/13 3:09:08

By Toradex秦海

1). 简介

NXP i.MX8MP ARM SoC 支持 3 路 Display Controller 分别提供 DSI/HDMI/LVDS 显示输出,在 Yocto Linux BSP 下采用 Wayland Backend 基于 DRM subsystem 显示驱动,前端默认基于 Weston Compositor。因此在默认情况下连接多个屏幕的显示输出是如下 Extended 模式:

NXP iMX8MP ARM 平台多屏幕克隆显示测试266.png

而为了实现多屏幕 Clone Mode 显示,就需要修改显示 buffer 输出模式如下:

NXP iMX8MP ARM 平台多屏幕克隆显示测试315.png

本文就基于上述显示输出 pipeline 修改测试 i.MX8MP 多屏 Clone Mode,本文所涉及的方法和实际修改代码均来自于如下 NXP 论坛文档,本文仅进行测试演示示例。

https://community.nxp.com/t5/i-MX-Graphics-Knowledge-Base/Weston-clone-mode-on-i-MX8MPlus/ta-p/1791853

本文所演示的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。

2. 准备

a). Verdin i.MX8MP ARM核心版配合Dahlia 载板,并连接调试串口用于测试。

b). Dahlia 载板分别由 DSI-HDMI 转接卡和 native HDMI 两个接口连接两台 HDMI 显示器以便于进行多屏显示测试。

3). 修改部署方法之一:通过 Yocto 编译部署

a). 考虑可维护性和易用性,此方法为推荐方法。

b). 首先参考这里说明创建 Yocto/Openembedded 编译框架,当前最新版本是对应于 Toradex Yocto Linux BSP 7.x 版本的 scarthgap-7.x.y branch。

c). 创建定制化 layer meta-customer-demos ,用于添加 Weston 源码修改相关 patch 文件。

---------------------------------------

$ mkdir -p ../oe_core/layers/meta-customer-demos/conf

$ cd .../oe_core/layers/meta-customer-demos/conf

### create layer.conf file ###

# We have a conf and classes directory, append to BBPATH

BBPATH .= ":${LAYERDIR}"

# We have recipes-* directories, add to BBFILES

BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend"

BBFILE_COLLECTIONS += "customer-demos"

BBFILE_PATTERN_customer-demos = "^${LAYERDIR}/"

BBFILE_PRIORITY_customer-demos = "24"

# Let us add layer-specific bbappends which are only applied when that

# layer is included in our configuration

BBFILES += "${@' '.join('${LAYERDIR}/%s/recipes*/*/*.bbappend' % layer \

               for layer in BBFILE_COLLECTIONS.split())}"

# Add layer-specific bb files too

BBFILES += "${@' '.join('${LAYERDIR}/%s/recipes*/*/*.bb' % layer \

               for layer in BBFILE_COLLECTIONS.split())}"

LAYERDEPENDS_customer-demos = " \

    core \

    yocto \

    openembedded-layer gnome-layer multimedia-layer networking-layer \

"

LAYERSERIES_COMPAT_customer-demos = "hardknott honister kirkstone scarthgap"

---------------------------------------

d). 在定制化 layer meta-customer-demos 下面添加 Weston bbappend 文件,应用相应的 patch 文件

---------------------------------------

$ cd .../oe_core/layers/meta-customer-demos/

$ mkdir -p recipes-graphics/wayland/files

$ cd recipes-graphics/wayland

### cteate weston_12.0.4.imx.bbappend file ###

FILESEXTRAPATHS:prepend := "${THISDIR}/files:"

SRC_URI += " \

    file://0001-weston-imx-12.0.4-LF6.6.52_2.2.0-clone-mode-8MP.patch \

"

---------------------------------------

e). 将如下 0001-weston-imx-12.0.4-LF6.6.52_2.2.0-clone-mode-8MP.patch 补丁文件复制到 “.../oe_core/layers/meta-customer-demos/recipes-graphics/wayland/files” 目录即可。原 NXP 论坛文档 patch 是基于 Weston 12.0.3 版本,这里对于 Yocto 环境配置的 12.0.4 版本做了一定的适配修改。

https://gitee.com/simonqin09/verdin-imx8mp-display-clone-mode/blob/master/0001-weston-imx-12.0.4-LF6.6.52_2.2.0-clone-mode-8MP.patch

f). 最终完整 meta-customer-demos layer 文件结构如下

meta-customer-demos

├── conf

│   └── layer.conf

├── recipes-graphics

│   └── wayland

│       ├── files

│       │   └── 0001-weston-imx-12.0.4-LF6.6.52_2.2.0-clone-mode-8MP.patch

│       └── weston_12.0.4.imx.bbappend

g). 修改 bblayers.conf 和 local.conf 文件

-------------------------------

### modify bblayer.conf ###

--- a/build/conf/bblayers.conf  

+++ b/build/conf/bblayers.conf  

@@ -34,7 +34,7 @@

   ${TOPDIR}/../layers/meta-openembedded/meta-python \

   ${TOPDIR}/../layers/meta-freescale-distro \

   ${TOPDIR}/../layers/meta-toradex-demos \

+  ${TOPDIR}/../layers/meta-customer-demos \

   \

   \

   ${TOPDIR}/../layers/meta-toradex-distro \

### add below to local.conf ###

# add Freescale EULA

ACCEPT_FSL_EULA = "1"

-------------------------------

h). 编译 Yocto Linux image

-------------------------------

### compile Reference-Multimedia image ###

$ MACHINE="verdin-imx8mp" bitbake tdx-reference-multimedia-image

-------------------------------

i). Yocto Linux image部署

参考这里通过Toradex Easy installer将上面编译好的image更新部署到模块

4). 修改部署方法之二:通过直接修改 Weston 源码编译部署

a). 在不具备 Yocto 编译条件下可以考虑此方法。

b). 参考如下下载对应版本 Weston-imx 源码,本文依然使用 12.0.4 版本示例,并进行修改

-------------------------------

### download weston-imx source code ###

$ git clone -b weston-imx-12.0.3 GitHub - nxp-imx/weston-imx: i.MX Graphics Wayland Compositor

### apply patch for clone mode ###

$ cd weston-imx

$ git apply ../../0001-weston-imx-12.0.4-LF6.6.52_2.2.0-clone-mode-8MP.patch

### modify meson.build file to adopt cross compile ###

$ vi protocol/meson.build

--- a/protocol/meson.build

+++ b/protocol/meson.build

@@ -1,5 +1,9 @@

 dep_scanner = dependency('wayland-scanner', native: false)

-prog_scanner = find_program(dep_scanner.get_variable(pkgconfig: 'wayland_scanner'))

+if meson.is_cross_build()

+       prog_scanner = find_program('wayland-scanner', dep_scanner.get_variable(pkgconfig: 'wayland_scanner'))

+else

+       prog_scanner = find_program(dep_scanner.get_variable(pkgconfig: 'wayland_scanner'))

+endif

 dep_wp = dependency('wayland-protocols', version: '>= 1.31',

        fallback: ['wayland-protocols', 'wayland_protocols'])

-------------------------------

c). 参考如下文章编译并 export 交叉编译 toolchain 相关环境变量

https://developer.toradex.cn/linux-bsp/os-development/build-yocto/linux-sdks

d). 编译修改好的 weston-imx 源码

-------------------------------

### export SDK environments ###

$ source <SDK_Install_Path>/environment-setup-armv8a-tdx-linux

### compile ###

$ cd weston-imx

$ meson build/ --prefix=/usr -Ddoc=false -Dbackend-drm-screencast-vaapi=false -Dcolor-management-lcms=false -Dpipewire=false \

-Dbackend-x11=false -Drenderer-g2d=true -Dbackend-pipewire=false -Dbackend-rdp=false -Dbackend-vnc=false -Dxwayland=false

$ DESTDIR=./opt/weston ninja -C build/ install

-------------------------------

e). 将编译好的 weston 相关库文件部署到 Verdin i.MX8MP BSP7.x Linux

-------------------------------

### package ###

$ cd weston-imx/build/opt/weston/

$ tar cjvf ../../../weston_mod.tar.bz2 *

### copy weston_mod.tar.bz2 package to Verdin i.MX8MP Linux ###

### deploy weston binaries ###

root@verdin-imx8mp-06849028:~# tar xvf weston_mod.tar.bz2 /

-------------------------------

5). 多屏显示测试

a). 上述修改部署完成后,不做任何修改,DSI-HDMI 和 native HDMI 屏幕默认启动后是 Extended 显示模式

NXP iMX8MP ARM 平台多屏幕克隆显示测试6544.png

b). 如下修改 /etc/xdg/weston/weston.ini 来使能 clone mode

-------------------------------

--- a/etc/xdg/weston/weston.ini

+++ b/etc/xdg/weston/weston.ini

@@ -3,6 +3,7 @@

 repaint-window=16

 idle-time=0

 #enable-overlay-view=1

+clone-mode=1

 [shell]

-------------------------------

c). 重新启动后 DSI-HDMI 和 native HDMI 屏幕使能为 Clone 显示模式

NXP iMX8MP ARM 平台多屏幕克隆显示测试6874.png

d). 另外,如果是 DSI/native HDMI/native LVDS 同时显示的话,根据 NXP 论坛原文说明,可以在 /etc/xdg/weston/weston.ini 文件中增加如下配置组合,实现两个屏幕 Clone mode 显示,另外一个屏幕 Extented mode 显示。

-------------------------------

...

clone-connector-id=<id_1>

extend-connector-id=<id_2>

[cloneoutput]

conn_id=<id_3>

mode=<display_resolution>

...

-------------------------------

// 其中屏幕 connector-id 通过如下 modetest 命令可以获取

-------------------------------

### get encoders devices ###

# Type DSI - DSI #

# Type TMDS - native HDMI #

root@verdin-imx8mp-06849028:~# modetest -M imx-drm |grep -C 5 Encoders                           

Encoders:

id      crtc    type    possible crtcs  possible clones

37      33      DSI     0x00000001      0x00000001

39      36      TMDS    0x00000002      0x00000002

Connectors:

### get display connector-ids ###

# connector-id 38 - DSI display #

# connector-id 40 - native HDMI display #

root@verdin-imx8mp-06849028:~# modetest -M imx-drm |grep -C 1 connected                          

id      encoder status          name            size (mm)       modes   encoders

38      37      connected       HDMI-A-1        0x0             12      37

  modes:

--

                value:

40      39      connected       HDMI-A-2        0x0             20      39

  modes:

-------------------------------

6). 总结

本文基于 NXP i.MX8MP 处理器平台测试了 Yocto Linux 下多屏幕 Clone 模式显示,不过请注意如 NXP 论坛原文说明,此方法仅限于 NXP i.MX8MP 平台应用。

参考文档

https://community.nxp.com/t5/i-MX-Graphics-Knowledge-Base/Weston-clone-mode-on-i-MX8MPlus/ta-p/1791853

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2372938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】——栈

一、栈的概念和结构 栈其实就是一种特殊的顺序表&#xff0c;其只允许在一端进出&#xff0c;就是栈的数据的插入和删除只能在一端进行&#xff0c;进行数据的插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的元素遵循先进后出LIFO&#xff08;Last InFirst O…

Navicat中保存的数据库密码找回 Java 8

导出数据库连接打开导出的connections.ncx文件找到加密的password放入java程序中解密即可 package com.asia.card.cloud.enterprise.api;import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.cha…

vs code管理员权限启动问题

vs code非管理员启动可以正常启动用管理员启动vs code&#xff0c;会提示 解决办法 找到argv.json文件在argv.json文件中添加 "disable-chromium-sandbox": true重启vs code即可

Spring Cloud与Service Mesh集成:Istio服务网格实践

文章目录 引言一、Spring Cloud与Service Mesh概述二、Istio服务网格架构三、Spring Cloud与Istio集成的基础设施准备四、服务发现与负载均衡五、流量管理与弹性模式六、安全通信与认证授权七、可观测性集成八、配置管理集成总结 引言 微服务架构已成为现代分布式系统的主流设…

React+Taro选择日期组件封装

话不多说&#xff0c;直接上效果 1.页面渲染时间模块 {this.renderCalendarPopup()}2.引入时间组件弹层&#xff0c;state中加入showPopup(控制什么时候展示时间选择弹层)&#xff0c;time(选择后的时间值) private renderCalendarPopup () > {const { showPopup, time…

C++进阶--AVL树的实现续

文章目录 C进阶--AVL树的实现双旋AVL树的查找AVL树的检验结语 很高兴和搭大家见面&#xff0c;给生活加点impetus&#xff0c;开启今天的比编程之路&#xff01;&#xff01; 今天我们来完善AVL树的操作&#xff0c;为后续红黑树奠定基础&#xff01;&#xff01; 作者&#x…

AutoGen+Deepseek+chainlit的简单使用

AutoGen 的应用场景 AutoGen 作为一个强大的多智能体协作框架&#xff0c;可用于多种复杂任务&#xff1a; 自动化工作流&#xff1a;构建由多个智能体组成的流水线&#xff0c;例如数据收集、分析、报告生成复杂问题分解&#xff1a;将难题拆解为子任务&#xff0c;分配给不…

采用SqlSugarClient创建数据库实例引发的异步调用问题

基于SqlSugar编写的多个WebApi接口&#xff0c;项目初始化时采用单例模式注册SqlSugarClient实例对象&#xff0c;前端页面采用layui布局&#xff0c;并在一个按钮事件中通过Ajax连续调用多个WebApi接口获取数据。实际运行时点击按钮会随机报下面几种错误&#xff1a; Execute…

第7次课 栈A

课堂学习 栈&#xff08;stack&#xff09; 是一种遵循先入后出逻辑的线性数据结构。 我们可以将栈类比为桌面上的一摞盘子&#xff0c;如果想取出底部的盘子&#xff0c;则需要先将上面的盘子依次移走。我们将盘子替换为各种类型的元素&#xff08;如整数、字符、对象等&…

软考-软件设计师中级备考 13、刷题 数据结构

倒计时17天时间不多了&#xff0c;数据库、UML、等知识点有基础直接略过&#xff0c;法律全靠考前的一两天刷题&#xff0c;英语直接放弃。 一、数据结构&#xff1a;链表、栈、队列、数组、哈希表、树、图 1、关于链表操作&#xff0c;说法正确的是&#xff1a; A)新增一个头…

centos的根目录占了大量空间怎么办

问题 当根目录磁盘不够时&#xff0c;就必须删除无用的文件了 上面的&#xff0c;如果删除/usr 或/var是可以释放出系统盘的 定位占空间大的文件 经过命令&#xff0c;一层层查哪些是占磁盘的。 du -sh /* | sort -rh | head -n 10 最终排查&#xff0c;是有个系统日志占了20…

电子电器架构 --- 新能源高压上下电那点事一文通

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

每日算法-250510

每日算法学习记录 - 250510 1. LeetCode 2086. 喂食仓鼠的最小食物桶数 题目描述: 解题思路 这是一个典型的贪心问题。我们的目标是用最少的食物桶喂饱所有仓鼠。 解题过程 核心思想是&#xff1a;当遇到一只仓鼠时&#xff0c;如何放置食物桶才能最有效地利用这个桶。 …

渗透测试行业术语1

渗透测试行业术语1 1. 肉鸡 所谓“肉鸡”是一种很形象的比喻&#xff0c;比喻那些可以随意被我们控制的电脑&#xff0c;对方可以是 WINDOWS 系统&#xff0c;也可以是 UNIX/LINUX 系统可以是普通的个人电脑&#xff0c;也可以是大型的服务器我们可以象操作自己的电脑那样来操…

【大模型】使用 LLaMA-Factory 进行大模型微调:从入门到精通

使用 LLaMA-Factory 进行模型微调&#xff1a;从入门到精通 一、环境搭建&#xff1a;奠定微调基础&#xff08;一&#xff09;安装依赖工具&#xff08;二&#xff09;创建 conda 环境&#xff08;三&#xff09;克隆仓库并安装依赖 二、数据准备&#xff1a;微调的基石&#…

使用Python 打造多格式文件预览工具 — 图、PDF、Word、Excel 一站式查看

在日常办公或文件管理场景中&#xff0c;我们经常面临这样的问题&#xff1a;在一个文件夹中短时间内产生了大量不同类型的文件&#xff08;如图片、PDF、Word、Excel&#xff09;&#xff0c;我们需要快速浏览和筛选这些文件的内容&#xff0c;却不希望一个个打开它们。有没有…

[docker基础四]容器虚拟化基础之 LXC

目录 一 认识LXC 二 LXC容器操作实战 1&#xff09;实战目的 2&#xff09;基础知识 lxc-checkconfig lxc-create lxc-start lxc-ls lxc-info lxc-attach lxc-stop lxc-destory 3&#xff09;安装LXC(我的是Ubuntu) 4&#xff09;操作实战 1. 检查 lxc 是否运行…

路由策略和策略路由的区别以及配置案例

区别 路由策略&#xff1a;路由策略是通过ACL等方式控制路由发布&#xff0c;让对方学到适当路由条目&#xff0c;比如有20条路由&#xff0c;只想让某个路由器学到10条&#xff0c;可以通过路由策略进行过滤。 策略路由&#xff1a;策略路由是通过定义策略和应用&#xff0c…

MAD-TD: MODEL-AUGMENTED DATA STABILIZES HIGH UPDATE RATIO RL

ICLR 2025 spotlight paper 构建能够在少量样本下学习出优良策略的深度强化学习&#xff08;RL&#xff09;智能体一直是一个极具挑战性的任务。为了提高样本效率&#xff0c;近期的研究尝试在每获取一个新样本后执行大量的梯度更新。尽管这种高更新-数据比&#xff08;UTD&am…

PyTorch API 10 - benchmark、data、批处理、命名张量

基于 PyTorch 2.7 文章目录 基准测试工具 - torch.utils.benchmarktorch.utils.bottlenecktorch.utils.checkpointtorch.utils.cpp_extensiontorch.utils.data数据集类型映射式数据集可迭代式数据集 数据加载顺序与采样器加载批处理与非批处理数据自动批处理&#xff08;默认情…