tag 标签: arm

相关博文
  • 2025-5-9 16:56
    0 个评论
    NXP iMX8MP ARM 平台多屏幕克隆显示测试
    B y Toradex 秦海 1). 简介 NXP i.MX8MP ARM SoC 支持 3 路 Display Controller 分别提供 DSI/HDMI/LVDS 显示输出,在 Yocto Linux BSP 下采用 Wayland Backend 基于 DRM subsystem 显示驱动,前端默认基于 Weston Compositor 。因此在默认情况下连接多个屏幕的显示输出是如下 Extended 模式: 而为了实现多屏幕 Clone Mode 显示,就需要修改显示 buffer 输出模式如下: 本文就基于上述显示输出 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 https://github.com/nxp-imx/weston-imx.git ### 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: ) ------------------------------- 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 显示模式 b). 如下修改 /etc/xdg/weston/weston.ini 来使能 clone mode ------------------------------- --- a /etc/xdg/weston/weston.in i +++ b /etc/xdg/weston/weston.ini @@ -3,6 +3,7 @@ repaint-window=16 idle-time=0 #enable-overlay-view=1 +clone-mode=1 ------------------------------- c ). 重新启动后 DSI-HDMI 和 native HDMI 屏幕使能为 Clone 显示模式 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 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
  • 2025-4-24 14:33
    0 个评论
    B y Toradex 胡珊逢 简介 Toradex 为其产品使用的软件系统如 Linux 提供了诸多的安全功能,例如 Secure Boot、分区加密、OP-TEE 等,帮助用户应对安全合规。这些功能可以通过在 Yocto Project 中添加由 Toradex 开发的 meta-toradex-security layer 被轻松使用。我们将在接下的几篇文章中介绍如何使用这些功能。本次我们首先介绍如何在使用 Yocto Project 生成安装镜像时创建一个独立的分区,这为后面的分区加密做好准备。 Yocot Project 环境搭建和配置 参考 Build a Reference Image with Yocto Project/OpenEmbedded 页面的说明,我们使用最新的 Linux BSP 7 版本。除了使用默认的 repo 外,我们还可以使用国内站点的 repo 工具,便于下载。 $curl-Lhttps://mirrors.tuna.tsinghua.edu.cn/git/git-repo-orepo $chmod+xrepo $exportREPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo' 下载编译 BSP 7 镜像所使用的 mainifest 文件。 $ repo init -u git://git.toradex.cn/toradex-manifest.git -b scarthgap-7.x.y -m tdxref/default.xml $ repo sync $ . export 执行完 `repo sync` 命令后,可以在 layers 目录下发现 Yocto Project 使用的 recipes 文件。在 layers 目录下需要添加 meta-toradex-security 以及其依赖的 meta-security layers。 $ cd layers $ git clone -b scarthgap-7.x.y https://github.com/toradex/meta-toradex-security.git $ git clone -b scarthgap git://git.yoctoproject.org/meta-security 在 build/conf/bblayers.conf 的末尾增加 meta-toradex-security 和 meta-security。这样在稍后的 bitbake 编译时才能够使用这些 recipes。 ${TOPDIR}/../layers/openembedded-core/meta \ ${TOPDIR}/../layers/meta-toradex-security \ ${TOPDIR}/../layers/meta-security \ 在 build/conf/local.conf 的末尾添加下面内容。 INHERIT += "tdx-tezi-data-partition" 在创建和挂载分区时, local.conf 可以使用下面变量改变分区名字、挂载路径、是否自动挂载以及使用其他的挂载参数等,可以根据需要使用。 变量 描述 默认值 TDX_TEZI_DATA_PARTITION_TYPE 数据分区文件系统类型。可用的值为 ext2 、 ext3 、 ext4 、 fat 和 ubifs 。 支持的值仅限于 Toradex Easy Installer 所支持的范围 ext4 TDX_TEZI_DATA_PARTITION_LABEL 用于格式化和挂载数据分区的标签 DATA TDX_TEZI_DATA_PARTITION_AUTOMOUNT 设置为 1 以在启动时自动挂载数据分区,或设为 0 禁用自动挂载; 当设置为 -1 时,该分区甚至不会出现在 fstab 中(需通过其他方式挂载) 如果使用了 tdx-encrypted 类为 -1 ,否则为 1 TDX_TEZI_DATA_PARTITION_MOUNTPOINT 数据分区应挂载的目录 /data TDX_TEZI_DATA_PARTITION_MOUNT_FLAGS 用于挂载数据分区的标志。有关可用挂载标志的更多信息, 请参阅 mount 手册页。 rw,nosuid,nodev,noatime, errors=remount-ro 模块情况下将在 /data 目录挂载一个 EXT4 格式的分区,在该分区上可以存放用户的数据。 编译镜像 完成上面的配置后,即可使用 bitbake 命令编译镜像。例如本次测试将编译用于 Verdn AM62 模块的 minimal image。 $ MACHINE=verdin-am62 bitbake tdx-reference-minimal-image 安装镜像 虽然在 Yocto Project 中规划了一个 /data 下的分区,但该分区还是需要在模块上安装镜像时,由 Toradex Easy Installer 在模块的 eMMC 上创建。在生成镜像的安装文件 image.json 可以看到如下内容。在 RFS 系统分区后会创建一个 DATA 分区。 { "partition_size_nominal": "512", "partition_type": "83", "want_maximised": true, "content": { "label": "DATA", "filesystem_type": "ext4", "mkfs_options": "-E nodiscard", "filename": "" } } 检查分区情况 安装完毕重启进入系统后,使用 mount 命令可以看到 /dev/mmcblk0p3 被挂载到了 /data 目录下。 /dev/mmcblk0p3 on /data type ext4 (rw,nosuid,nodev,noatime,errors=remount-ro) 在 /etc/fstab 中,将 LABEL 为 DATA 的分区在启动时自动挂载。LABEL 名字是前面表格中 TDX_TEZI_DATA_PARTITION_LABEL 参数的默认值。 root@verdin-am62-15415684:/data# cat /etc/fstab ... LABEL=DATA /data auto rw,nosuid,nodev,noatime,errors=remount-ro,auto 0 0 在 image.json 中,RFS 和 DATA 分区都设置了 "want_maximised": true,所以这两个分区会平分 eMMC 上剩余的空间,这里基本约为 3GB。 root@verdin-am62-15415684:/data# df -h Filesystem Size Used Available Use% Mounted on /dev/root 3.4G 207.0M 3.0G 6% / ... /dev/mmcblk0p3 3.4G 28.0K 3.2G 0% /data 总结 通过 meta-toradex-security,用户可以在编译镜像时轻松规划分区,并在运行时将其自动挂载。更多来自 meta-toradex-security 实用功能,我们将在后续文章介绍。
  • 2025-4-2 16:39
    73 次阅读|
    0 个评论
    近日,飞凌嵌入式FET3576-C核心板正式发布了新系统Forlinx Desktop 24.04。至此,FET3576-C核心板已完成Linux 6.1、Android 14、Forlinx Desktop 24.04等多种操作系统的适配,充分展现了其在系统丰富性方面的卓越实力。 1、多系统适配,满足多样化需求 飞凌嵌入式FET3576-C核心板基于Rockchip RK3576处理器开发设计,该处理器集成了4个ARM Cortex-A72和4个ARM Cortex-A53高性能核,内置6TOPS超强算力NPU,为AI应用赋能,多种操作系统的适配,则进一步拓宽了其应用场景。 Linux 6.1系统的加入,使得飞凌嵌入式FET3576-C核心板在开源、稳定、高效等方面表现出色;Android 14系统的适配,则让飞凌嵌入式FET3576-C核心板在智能移动终端、边缘计算等领域大放异彩。 此次新发布的Forlinx Desktop 24.04系统,针对嵌入式设备进行了深度优化,提供了更加直观、易用的用户界面和丰富的应用生态,满足用户在工业控制、智能家居、数字多媒体等多个领域的需求。 2、多重测试,确保稳定运行 飞凌嵌入式深知稳定性对于用户的重要意义,因此对FET3576-C核心板进行了多重测试。这些测试涵盖了硬件可靠性、系统稳定性、性能表现等多个方面,确保核心板在各种复杂环境下都能稳定运行。 3、广泛应用,助力产品快速上市 得益于其卓越的系统丰富性和稳定性,飞凌嵌入式FET3576-C核心板在工业、AIoT、边缘计算、智能移动终端以及其他多种数字多媒体相关的应用领域都展现出了广泛的应用前景。无论是需要高性能计算能力的工业控制设备,还是需要智能交互功能的智能家居产品,FET3576-C核心板都能提供更具优势的解决方案。 此外,飞凌嵌入式还拥有强大的技术支持服务能力,助力客户快速完成产品开发、测试和上市。 总结来说,飞凌嵌入式FET3576-C核心板与多种操作系统的深度适配,不仅充分发挥了核心板硬件的卓越性能,还通过系统的优化与升级,为用户带来了更加流畅、智能、安全的使用体验。对于工业、AIoT、边缘计算、智能移动终端以及其他多种数字多媒体相关的应用领域的专业用户而言,飞凌嵌入式FET3576-C核心板都是一个值得信赖的选择。
  • 2025-4-2 11:12
    210 次阅读|
    0 个评论
    NXP iMX8MP ARM 平台 EMQX 部署测试
    B y Toradex 秦海 1). 简介 EMQX 是一款基于 Erlang/OTP 平台开发的开源 MQTT 消息服务器,广泛应用于物联网( IoT )领域,以实现设备到服务器以及服务器到设备的消息传递与控制 , 文本就基于 NXP i.MX8M Plus ARM 处理器平台,通过在 Yocto Linux BSP 中集成 Docker 环境来部署测试 EMQX 。 本文所演示的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台 。 2. 准备 a). Verdin i.MX8MP ARM 核心版配合 Dahlia 载板, 并连接调试串口用于测试 。 3). Verdin i.MX8MP Yocto Linux 编译部署 a). 首先 参考 这里 说明创建 Yocto /Openembedded 编译 框架 , 当前最新版本是对应于 Toradex Yocto Linux BSP 7.x 版本的 scarthgap-7.x.y branch 。 b). 增加包含 Docker 支持的 meta-virtualization layer 。 ------------------------------- ### add meta-virtualization ### $ cd OE_ROOT_PATH/layers $ git clone -b scarthgap git://git.yoctoproject.org/meta-virtualization ### add meta-clang layer for PySide6 ### $ git clone -b kirkstone https://github.com/kraj/meta-clang.git ------------------------------- c). 创建定制化 layer meta-customer-demos ,用于添加 Docker 需要的额外修改和配置,首先添加 layer 配置文件 --------------------------------------- $ 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 下面添加 Docker bbapend 文件,配置 Docker 可以启动自动加载 --------------------------------------- $ cd .../oe_core/layers/meta-customer-demos/ $ mkdir -p recipes-containers/docker $ cd recipes-containers/docker ### cteate docker-moby_git.bbappend file ### FILES:${PN} += "${sysconfdir}/systemd/system/docker.service" SYSTEMD_SERVICE:${PN} = "docker.service" SYSTEMD_AUTO_ENABLE:${PN} = "enable" --------------------------------------- e). Docker daemon 启动需要额外比如 IPSec/Netfilter/NF_table 等网络相关的 Kernel Modules ,因此如下增加额外的 Linux Kernel 配置。 --------------------------------------- $ cd .../oe_core/layers/meta-customer-demos/ $ mkdir -p recipes-kernel/linux/ $ cd recipes-kernel/linux ### cteate linux-toradex%.bbappend file ### SRCREV_meta-custom = "1e293f75e7e5569f0d86d752fbf4180dd3fac6eb" SRCREV_meta-custom:use-head-next = "${AUTOREV}" KMETABRANCH = "scarthgap-7.x.y" KMETAVIRTUALITION = "kernel-meta-custom" KMETAREPOSITORY="github.com/toradex/toradex-kernel-cache.git" KMETAPROTOCOL="https" SRC_URI += "git://${KMETAREPOSITORY};protocol=${KMETAPROTOCOL};type=kmeta;name=meta-custom;branch=${KMETABRANCH};destsuffix=${KMETAVIRTUALITION}" ## Compose additional .scc file including docker requirement and include it to our build. KERNEL_FEATURES += "bsp/${MACHINE}-${LINUX_KERNEL_TYPE}-torizon.scc" --------------------------------------- f). 最终完整 meta-customer-demos layer 文件结构如下 meta-customer-demos ├── conf │ └── layer.conf ├── recipes-containers │ └── docker │ └── docker-moby_git.bbappend └── recipes-kernel └── linux └── linux-toradex % .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- virtualization \ + ${TOPDIR}/../layers/meta- customer-demos \ \ \ ${TOPDIR}/../layers/meta-toradex-distro \ ### add below to local.conf ### # enable meta-virtualization DISTRO_FEATURES:append = " virtualization" # enable docker support IMAGE_INSTALL:append = " docker docker-compose" # 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 ). EMQX 部署测试 a ). 关于 EMQX 的更多说明和介绍可以参考如下 https://docs.emqx.com/en/emqx/latest/getting-started/getting-started.html b ). 在 Verdin i.MX8MP 设备上面通过如下命令确认 Docker daemon 已经成功运行 ------------------------------- root@verdin-imx8mp-06849028:~# systemctl is-enabled docker.service enabled root@verdin-imx8mp-06849028:~# systemctl status docker.service * docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled) Active: active (running) since Fri 2025-03-28 01:54:37 UTC; 5h 16min ago TriggeredBy: * docker.socket Docs: https://docs.docker.com Main PID: 685 (dockerd) Tasks: 19 Memory: 99.6M (peak: 146.5M) CPU: 14.376s CGroup: /system.slice/docker.service `-685 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ... Mar 28 01:54:37 verdin-imx8mp-06849028 dockerd : time="2025-03-28T01:54:37.583078000Z" level=info msg="Daemon has completed initialization" Mar 28 01:54:37 verdin-imx8mp-06849028 dockerd : time="2025-03-28T01:54:37.684308375Z" level=info msg="API listen on /run/docker.sock" Mar 28 01:54:37 verdin-imx8mp-06849028 systemd : Started Docker Application Container Engine. ------------------------------- c). 参考 这里 通过如下命令安装并运行 EMQX ARM64 Docker Image ,本文采用 offline 方式,如果网络条件允许也可以 online 方式安装。 ------------------------------- ### download $ wget https://www.emqx.com/en/downloads/broker/5.8.6/emqx-5.8.6-docker-arm64.tar.gz ### install $ docker load emqx-5.8.6-docker-arm64.tar.gz ### $ docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.8.6 ------------------------------- d ). 此时在开发主机,通过浏览器通过如下网址可以查看已经运行的 EMQX 控制台页面,默认登录信息为 admin/public ,可以后续自行更改密码。 ------------------------------- http:// verdin_imx8mp_ip_address :18083/ ------------------------------- e). 通过如下自带的基于 Websocket 的 MQTT 客户端进行测试 ./ 进入客户端后,首先连接 Verdin i.MX8MP 核心节点设备 ./ 然后再订阅默认的 “ testtopic ” 主题 ./ 最后可以修改 payload 内容后,点击发布,可以看到核心节点可以正常接收数据 5 ). 总结 本文 基于 NXP i.MX8MP 处理器简单演示了通过 Docker 环境部署运行 EMQX MQTT 消息服务器。
  • 2025-3-21 10:51
    499 次阅读|
    0 个评论
    B y Toradex 胡珊逢 简介 Apalis iMX8QM 使用了 NXP 的 iMX8 Quad Max 处理器。该 CPU 提供 A72 和 A53 Application Processor 和 M4 MCU。文章将介绍如何在硬件层面上隔离 AP 和 MCU 的资源,从而提高系统的可靠性。 System Controller Unit (SCU)System Controller Unit 是 iMX8 Quad Max 处理器上的一个专用 M4 核,连接 PMIC 和控制处理器上的子系统,为处理器的硬件功能提供抽象接口,供子系统使用。其主要管理以下功能和资源: 系统初始化与启动系统控制器通信电源管理资源管理引脚配置定时器中断处理 默认情况下,AP 核和 M4 核均能够使用 Apalis iMX8QM 的所有资源,包括 DDR RAM。SCU 可以通过分区 partition 的方式,将 AP 和 M4 之间,以及两个 M4 核之间所使用的资源从硬件上隔离开。一个分区中除了处理器核心外,还可以有外设、引脚 Pads 和内存区域。处理器核只能访问位于同一个分区内的资源。如果尝试访问其他分区的资源,则会返回总线错误。 当 AP 核和 M4 核在同一个分区时,AP 上的 Linux 虽然可以通过 reserved memory 方式不去使用相关 RAM 区域,但是直接物理地址访问的方式仍起作用。这对于 M4 端也是如此。使用 SCU 的分区,可以从底层规避该问题。除此之外,AP 和 M4 使用独立 Power Domain,在隔离分区情况下,对于 M4 的实时关键任务和 AP 上基于富操作系统 Linux 的应用独立运行提供可能。 在刚启动时,系统会划分三个分区。 SCU:包含所有运行 SCFW 固件所需的 Pads、外设和内存区域SECO:Security Controller 运行所需的相关资源Boot:系统剩余的所有资源如 Pads、外设和内存区域都将会划分到该分区 当系统继续启动时,如果不做进一步的分区,默认情况下 AP 和 M4 核都将运行在 Boot 分区中,它们之间只能通过软件的方式隔离各自的资源。为了实现 AP 和 M4 之间的硬件隔离,可以采用下面分区。 AP0:拥有运行 U-boot,Linux 的分区MCU0 和 MCU1:两个 Cortex-M4 核各自运行的分区Shared:共享资源的分区,例如将一段用于 rpmsg 通信的 RAM 区域划分到其中,AP 和 M4 就能够相互发送消息 分区的创建和资源划分在 SCU 的固件 SCFW 中调整。 SCU 固件 SCFW SCFW 的下载和编译方法参考 Build Custom i.MX 8/8X System Controller Firmware (SCFW) 。接下来将针对上面使用 AP0、MCU0、MCU1 和 Shared 分区案例进行说明。按照上面方法下载的 SCFW 源码中,mx8qm_apalis/board.c 已经包含上面分区的实现代码,所以无需额外的修改。在组装 Boot Container 时传入特定的 Flags 值可以启用。 在 platform/board/mx8qm_apalis/board.c 中配置分区和资源。宏定义 PARTITION_NAME 命令系统启动时的设置三个分区名字。 PARTITION_NAME (SC_PT, "SCU"); PARTITION_NAME (SECO_PT, "SECO"); PARTITION_NAME (pt_boot, "BOOT"); 检测标志位判断是否需要创建 AP0、MCU0、MCU1 和 Shared 分区。 if (alt_config != SC_FALSE) { 在需要进行分区时,PARTITION_NAME 设置相应分区的名称。 PARTITION_NAME (pt_boot, "AP0"); ... PARTITION_NAME (pt_m4_0, "MCU0"); ... PARTITION_NAME (pt_m4_1, "MCU1"); ... PARTITION_NAME (pt, "Shared"); 这里以 MCU0 分区为例, rsrc_list 中包含了划分到 MCU0 分区的资源,如 M4 中断、Message Unit、定时器等。 static const sc_rsrc_t rsrc_list = { SC_R_SYSTEM, SC_R_IRQSTR_M4_0, SC_R_MU_5B, SC_R_MU_7A, SC_R_MU_8B, SC_R_GPT_4, SC_R_SECO_MU_4 }; pad_list 中包含 MCU0 分区所使用的引脚范围。 static const sc_pad_t pad_list = { RM_RANGE (SC_P_M40_I2C0_SCL, SC_P_M40_GPIO0_01) }; 结合 sc_fw_api_qm_b0.pdf 文档,index 7~10 的引脚都将在划分到 MCU0 分区。 sc_rm_mem_list_t 配置了包括 RAM 在内的可使用存储空间。 static const sc_rm_mem_list_t mem_list = { {0x088000000ULL, 0x0887FFFFFULL}, {0x008081000ULL, 0x008180FFFULL} }; rm_partition_create 使用上面配置的所有资源创建 MCU0 分区。 BRD_ERR (rm_partition_create(pt_boot, pt_m4_0, SC_FALSE, SC_TRUE, SC_FALSE, SC_TRUE, SC_FALSE, SC_R_M4_0_PID0, rsrc_list, ARRAY_SIZE(rsrc_list), pad_list, ARRAY_SIZE (pad_list), mem_list, ARRAY_SIZE (mem_list))); 组装 Boot Container NXP i.MX 8QuadMax 处理器使用前面提到的 SCU 来启动系统。启动时除了加载 SCFW,它还可以加载 ATF 和 U-Boot,以及直接加载 M4 核的固件。Boot Container 组装方法参考 Specifics: Build U-Boot for NXP i.MX 8/8X-based SoMs 。默认情况下,如网页描述,使用下面命令组装 Boot Container。该方法生成的 flash.bin 文件中并不包含 M4 核的固件,并且 AP 和 M4 在同一个分区。M4 的固件在 U-Boot 启动时,使用 bootaux 命令从 eMMC 上加载后运行。 make SOC=iMX8QM flash_b0 为了使用上面 SCFW 中划分的分区,使用下面命令组装 Boot Container。 make SOC=iMX8QM flash_regression_linux_m4 编译目标来自 imx-mkimage/iMX8QM/soc.mak 中的定义。flash_regression_linux_m4: $(MKIMG) $(AHAB_IMG) \ scfw_tcm. bin u-boot-atf. bin m4_image. bin m4_1_image. bin \ ./$( MKIMG ) -soc QM -rev B0 -append $( AHAB_IMG ) \ -c -flags 0x00200000 -scfw scfw_tcm.bin \ -ap u-boot-atf.bin a53 0x80000000 \ -p3 -m4 m4_image. bin 0 0x34FE0000 \ -p4 -m4 m4_1_image. bin 1 0x38FE0000 \ - out flash.bin -flags 0x00200000 向 SCFW 的 board.c 传递,SCU 在启动时将会创建 AP0、MCU0、MCU1 和 Shared 的分区。 if (alt_config != SC_FALSE) { sc_fw_port.pdf 中说明了 Bit 21 SCFW_SC_BD_FLAGS_ALT_CONFIG 为更改 SCFW 配置的位,对应 0x00200000。 上面命令中 m4_image.bin 和 m4_1_image.bin 为两个 M4 各自的固件,从各自的 TCML 运行。因此,在执行上面命令前,需要把两个 M4 的固件复制到 imx-mkimage/iMX8QM 目录下。 如下修改 U-boot 源码中 U-boot/cmd/booti.c,重新编译后将 u-boot.bin 复制到 imx-mkimage/iMX8QM 目录下。 if (dest gd - ram_base || dest gd - ram_top) { puts ( "kernel_comp_addr_r is outside of DRAM range!\n" ); //return -EINVAL; } Linux device tree 更新 接下来的演示中,我们在 M4 上使用 multicore_examples/rpmsg_lite_pingpong_rtos 作为演示,在 AP 上的 Linux 系统中也需要开启 rpmsg 节点并加载驱动。针对 Apalis iMX8 BSP 7 的 imx8qm-apalis-v1.1-ixora-v1.2.dtb 需要打 该补丁 。 更新 Boot Container 文件 上面命令执行成功后生成的 flash.bin,需要更新到 Apalis iMX8 模块上的 eMMC 上。对于使用 Toradex Easy Installer 进行批量烧写或者重装系统,可以将 flash.bin 重名为 imx-boot,替换原来的烧录文件中 imx-boot。在开发期间,使用 U-Boot 直接更新 flash.bin 会更加方便,免于重装整个系统镜像。 将 flash.bin 复制到的一台 TFTP 服务器的下载目录中。然后在 U-Boot 中配置 Apalis iMX8 和 TFTP 服务器 IP 地址。 Apalis iMX8 # setenv ipaddr 192.168.3.181 Apalis iMX8 # setenv serverip 192.168.3.196 Apalis iMX8 # saveenv 使用 tftpboot 和 mmc 命令将 flash.bin 下载并写入到 eMMC 上。 mmc write $loadaddr 0 0x973 中最后的数值是写入的 block 数量。tftpboot 在下载时会显示文件大小,例如这里为 1238016 字节。需要写入的 block = (1238016+511)/512,计算结果向上取整,并转为十六进制数值。 Apalis iMX8 # tftpboot $loadaddr flash.bin Using ethernet @5b040000 device TFTP from server 192.168.3.196 ; our IP address is 192.168.3.181 Filename 'flash.bin' . Load address : 0 x95400000 Loading: ################################################## 1.2 MiB 3.4 MiB/s done Bytes transferred = 1238016 ( 12 e400 hex) Apalis iMX8 # mmc dev 0 1 Apalis iMX8 # mmc write $loadaddr 0 0x973 测试 在 U-Boot 中配置启动时加载的 device tree 文件。 Apalis iMX8 # setenv fdtfile imx8qm-apalis-v1.1-ixora-v1.2.dtbApalis iMX8 # saveenvApalis iMX8 # reset 启动后可以在 Linux 和两个 M4 的调试串口上看到启动内容。 Linux 中进入 kernel modules 驱动目录 kernel/drivers/rpmsg,加载 imx_rpmsg_pingpong.ko。两个 M4 上的固件在发现 rpmsg 通道后,自动向 Linux 发送消息。 # insmod imx_rpmsg_pingpong .ko ... get 91 ( src : 0 x1f) get 101 ( src : 0 x1e) imx_rpmsg_pingpong virtio1 .rpmsg-openamp-demo-channel .-1 .30 : goodbye ! get 93 ( src : 0 x1f) get 95 ( src : 0 x1f) get 97 ( src : 0 x1f) get 99 ( src : 0 x1f) get 101 ( src : 0 x1f) imx_rpmsg_pingpong virtio3 .rpmsg-openamp-demo-channel-1 .-1 .31 : goodbye ! 总结 文章介绍了如何使用 SCU 划分不同的分区,将 AP 和 M4 之间做硬件隔离,并使用 SCFW 直接加载 M4 的固件,不仅提高系统可靠性,也将 M4 运行提前到 U-Boot 之前,加快启动速度。更多关于 SCU 的高级高级功能,可以参考 SCFW 的说明文档。 ​
相关资源