tag 标签: iMX8MP

相关博文
  • 2025-5-28 12:00
    0 个评论
    B y Toradex 胡珊逢 简介 在 上一篇文章 中我们已经介绍如何使用 meta-toradex-security layer 创建一个单独的分区。接下来我们将说明,如何在该分区上使用加密功能,读写性能测试,如果你还感兴趣,最后部分内容将阐述分区加密背后的原理。技术实现细节隐藏在 meta-toradex-security 的 recipes 里面,用户能够仅使用几行简单的配置即可开启分区加密。 Yocot Project 配置 和之前的文章一样,首先需要搭建 Yocto Project 编译环境。这里我们将以 Verdin iMX8MP 为例进行介绍。在 local.conf 的结尾添加下面两行配置即可。 INHERIT += "tdx-tezi-data-partition tdx-encrypted" TDX_ENC_STORAGE_LOCATION = "/dev/mmcblk2p3" tdx-encrypted 被添加后,所编译的镜像中就能够使用分区加密。'TDX_ENC_STORAGE_LOCATION' 用于配置需要加密的分区。在 Verdin iMX8MP 上 eMMC 会被挂载到 /dev/mmcblk2 下面,mmcblk2p3 是需要新创建的第三个分区。'TDX_ENC_STORAGE_LOCATION' 也可以设置为 /dev/sda1 或者 /dev/mmcblk0p1,分别对应外部的 U 盘、SD 卡等。 为了提供加密的安全性和效率,meta-toradex-security 可以利用加密运算单元,例如 iMX8M Plus SoC 上的 CAAM(Cryptographic Accelerator and Assurance Module)模块。当然也支持外部的 TPM,例如在 Verdin AM62 上由于没有 SoC 内置的加密运算单元,meta-toradex-security 则能够使用底板上的 TPM,如 Mallow 底板。对于使用 TPM 的模块,local.conf 中还需要添加 TDX_ENC_KEY_BACKEND = "tpm"。 然后使用 bitbake 命令编译镜像即可。 bitbake tdx-reference-minimal- image 当安装完系统并重启后,可以看到 /dev/mapper/encdata,这就是 /dev/mmcblk2p3 分区 DATA 对应的加密设备,它被挂载到 /run/encdata 目录下。在 local.conf 文件中 TDX_ENC_STORAGE_MOUNTPOINT 参数可以用来更改挂载路径。 ~# mount -l/dev/mapper/encdata on /run/encdata type ext4 (rw,relatime) Linux 的文件系统 RFS 使用非加密分区,我们将分别往加密的 /run/encdata 和非加密的 /home/root 目录下写入和读取 1GB 的文件,对比加密操作对读写文件的影响。 #write fio --name= test --filename=testfile.tmp --size=1G --bs=256k --iodepth=64 \ --readwrite =write --direct= 1 --ioengine=libaio --gtod_reduce= 1 # read fio --name= test --filename=testfile.tmp --size=1G --bs=256k --iodepth=64 \ --readwrite =read --direct= 1 --ioengine=libaio --gtod_reduce= 1 测试结果如下: /run/encdata /home/root 写入 1GB 文件 32.8MB/s 61.9MB/s 读取 1GB 文件 32.6MB/s 314MB/s 实现原理 如前面介绍,借助 meta-toradex-security 开启和使用加密分区是非常简单的,对于应用程序来讲,底层的加密是透明的。如果你还对实现原理感兴趣,请继续阅读下面的内容。 i.MX8 SoC 上有一个 CAAM 模块可以用于密钥生成、加密和解密运算。通常用户不会直接调用 CAAM API 进行相关操作。为了更好地保护密钥,我们使用 Linux 的一个内核功能 Trusted Keys 。Trusted Keys 能够在内核空间中生成和维护一个密钥,而在用户空间中则是该密钥的加密文件(encrypted blobs),用户空间中无法直接访问到密钥。密钥的加密和解密是在 CAAM 上完成,而 CAAM 就是 Trusted Keys 的 Trust Source。对于没有 CAAM 作为 Trust Source 的平台,例如 Verdin AM62,我们还可以使用外部的 TPM,甚至是 TEE (Trusted Execution Environment)。这些在 meta-toradex-security 中均得到支持。 另外一个内核功能 dm-crypt 实现了透明的分区加密。dm-crypt 会使用一个密钥用于加密需要写入到 /run/encdata 目录下文件。该密钥可以存储在文件系统分区 RFS 的一个目录下,默认配为 / var /local/ private /.keys/tdx-enc-key.blob 。如果 RFS 是只读文件系统,tdx-enc-key.blob 也可以直接存放在 eMMC 上。但 tdx-enc- key .blob 并是直接用于加密和解密的密钥。如前面提到的,密钥的维护是由 Trusted Keys 实现。 在 CAAM 中首先生成一个密钥 encryption key,该密钥不会离开 CAAM。该密钥通过同样位于 CAAM 的 Test key 或者 OTPMK Key 加密后,交给位于 kernel space 的 Trust Keys 维护。Trust Keys 为 dm-crypt 映射一个密钥,并存放在 / var /local/ private /.keys/tdx-enc-key.blob 。当位于 user space 的应用程序需要读写 /run/encdata 的文件时,dm-crypt 将 tdx-enc- key .blob 提交给 Trusted Keys。Trusted Keys 在 kernel space 中找到对应的密钥,然后将该密钥交给 CAAM。在 CAAM 中可以使用 Test key 或者 OTPMK Key 解密出 encryption key。并在 CAAM 中使用 encryption key 完成加密或者解密数据。这个过程中 Test key/OTPMK Key 和 encryption key 始终不会离开 CAAM,并且加密和解密操作也均在 CAAM 中进行。由于 / var /local/ private /.keys/tdx-enc-key.blob 并不是直接用于加密和解密的密钥。因此,即使该密钥泄漏,也不会导致原来位于 /run/encdata 的数据被破解。 对于使用 CAAM 的模块,例如 Verdin iMX8MM、Verdin iMX8MP、Apalis iMX8QM 等,如果没有开启 Secure Boot 功能,如前面提到,CAAM 会使用预制的 Test key 来加密密钥,这是不安全的,也不推荐在生产环境中使用。开启 Secure Boot 功能后,CAAM 则使用 OTPMK Key 来加密密钥。这是一个 256bit 随机生产的密钥,在 fuse 设备的时候烧录到 CAAM 中。因此该密钥必须妥善保管。 总结 借助 meta-toradex-security,用户能够轻松而安全地使用加密分区,保护数据和应用。更多来自 meta-toradex-security 实用功能,我们将在后续文章介绍,敬请关注。
  • 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
  • 热度 1
    2025-3-6 15:17
    916 次阅读|
    0 个评论
    by Toradex Allan Kamimura 边缘计算机视觉 为何选择边缘计算? 嵌入式设备日益智能化,许多机器学习和计算机视觉任务正被推向边缘设备。在此类设备上运行 AI 模型虽具挑战性,却带来诸多优势: 降低延迟: 在设备端处理数据,避免了向云端或中央处理器传输数据的等待时间 增强隐私保护:敏感数据保留在设备内,确保符合严格的隐私法规要求。 节省带宽成本:边缘处理减少了对集中式服务器发送大量数据的需求。 提升可靠性:系统可在无网络连接的情况下独立运作。 为何需要外部 AI 加速器? Toradex 提供多种计算机模块(SoM),其中一些集成了神经网络处理单元(NPU),能够应对不同的 AI 工作负载。例如,Verdin iMX8M Plus, Verdin iMX95和 Aquila AM69 均配备了专为边缘推理加速设计的 NPU,使其适用于众多计算机视觉和机器学习应用。 尽管这些模块提供了强大的 AI 解决方案,但诸如 Hailo-8、EdgeX、MemryX 及 Google Coral 等外部 AI 加速器通过提供模块化、解耦且可扩展的边缘 AI 推理方案来应对挑战。这带来了更高的灵活性和面向未来的 AI 能力。 1. 将 AI 处理与 SoC 供应商软件解耦 在边缘运行机器学习面临的一大挑战是将模型适配到特定硬件或运行库上。无论是 NXP 的 eiQ平台、TI 的 Edge AI Studio 还是 ONNX 导出工具,每种都有其专属的 AI 工具包和优化策略。外部 AI 加速器将 AI 工作负载从其他硬件中分离出来,提供了一个统一的跨多硬件平台的运行环境。 示例: 一个基于 x86 设备并使用 Hailo-8 AI 加速器开发的计算机视觉解决方案,可以无缝迁移至搭载 Hailo-8 的 Aquila AM69 模块上而无需重构整个 AI 堆栈。这种解耦确保了仅需最小调整即可完成迁移,大大缩短了产品上市时间。 2. 模块化与可扩展性 AI 应用具有动态特性,随着工作负载复杂度的增加或新功能的创建,性能需求可能会发生变化。虽然内置的 NPU 能提供坚实的解决方案,但有时它们可能难以适应新的场景。 Hailo简介 Hailo是一家 AI 处理器制造商,其产品旨在边缘端上运行先进的机器学习应用,能够广泛应用于智慧城市、汽车、制造、农业、零售等多个行业和领域。 我们使用 Hailo-8 M.2 模块在多款 Toradex 模块上进行了测试。Hailo-8 M.2 模块是一款具备 26 TOPS 算力及 PCIe Gen-3.0 4通道 M-key 接口的 AI 加速器模块。该 M.2 模块可插入多种 Toradex 载板中,实现实时的深度神经网络推理。 如何 Hailo 充分利用 Toradex 生态系统? 释放预处理和后处理任务 来源:https://hailo.ai/blog/customer-case-study-developing-a-high-performance-application-on-an-embedded-edge-ai-device/ 典型的计算机视觉流程遵循线性模式。从摄像头捕捉源开始,直到应用程序采取行动,图像必须经过每一个处理步骤。这意味着如果任何一个步骤比下一个耗时更长,那就是瓶颈所在。 通常,在比较机器学习模型或硬件时,我们会非常关注推理速度,但这只是问题的一部分。 完整的软件堆栈 Hailo 是一个完整的人工智能解决方案,支持常见机器学习工作流中的大部分步骤。 性能评估 TAPPAS是一个包含应用示例的代码库。 Model Zoo不仅提供了一些模型的基准测试结果,还包括预训练模型。 模型训练 部分预训练模型附带了再训练环境。 编译器和运行库 Hailo Dataflow 编译器 pyHailoRT 和 GStreamer 插件 从 Toradex 方面来看,这一工作流程可以通过使用 Torizon 云平台得到补充。 监控性能 提前识别任何问题,确保系统可靠性。 OTA 更新 轻松更新量产设备。 支持 Toradex 模块硬件 硬件 支持的硬件配置 系列 模块 载板 Hailo Aquila TI AM69 (1+2 x PCIe 3.0) Clover (M.2 key B+M) Hailo-8 Hailo-8L Aquila NXP i.MX 95 (1 x PCIe 3.0) Clover (M.2 key B+M) Hailo-8 Hailo-8L Verdin NXP i.MX 95 (1 x PCIe 3.0) Mallow (M.2 key B) Hailo-8 Hailo-8L Verdin NXP i.MX 8M Plus (1 x PCIe 3.0) Mallow (M.2 key B) Hailo-8 Hailo-8L Verdin NXP i.MX 8M Mini (1 x PCIe 2.0) Mallow (M.2 key B) Hailo-8 Hailo-8L Apalis NXP i.MX8 (2 x PCIe 3.0) Ixora (Mini PCIe) Hailo-8R mPCIe 软件 OS 版本 其他的资源 Torizon OS BSP 7 meta-hailo layer (即将上线) Torizon OS BSP 6 runtime container (即将上线) Torizon OS Minimal BSP 6 meta-hailo kirkstone OpenEmbedded layer for GStreamer 1.0 tdx-reference-multimedia BSP 6 meta-hailo kirkstone YOLOv5 示例 在本例中,我们将运行来自 Tappas 的演示应用程序: 完成此示例后,您应得到类似以下的输出。以 60+ FPS 的速度运行(取决于您的摄像头)。 我们将使用: 摄像头 如果使用 USB 摄像头,由于摄像头的捕捉速度,帧率可能会非常低。 显示器 Verdin i.MX8MP+Mallow Carrier 载板 Verdin iMX8M Plus QuadLite 1GB IT (0065) 不兼容 Framos 摄像头。 Hailo AI Accelerator 步骤: 从源码构建 Torizon OS 构建基础 Torizon OS 添加依赖项 硬件设置 连接Hailo设备 连接摄像头 安装新镜像 检查所有配置 运行示例 从源代码构建 Torizon OS 完整指南 首先,您可能需要检查计算机的 RAM 和磁盘空间 用于 Yocto 项目构建的计算机 构建 Torizon OS 基础镜像 我们将使用 CROPS 容器来构建以下镜像: Torizon OS Disto Machine Torizon OS Image Target 版本 torizon verdin-imx8mp torizon-minimal 6.8.0 创建工作目录 cd ~ mkdir ~/yocto-workdir 运行容器(这将构建基础镜像) 这将占用大量内存,并需要几个小时才能完成。 命令的第二行将主机卷映射到容器的 workdir 目录。请注意,此文件夹 ~/yocto-workdir 是在上一步中创建的。 docker run --rm -it --name=crops \ -v ~/yocto-workdir:/workdir \ --workdir=/workdir \ -e MACHINE="verdin-imx8mp" \ -e IMAGE="torizon-minimal" \ -e DISTRO="torizon" \ -e BRANCH="refs/tags/6.8.0" \ -e MANIFEST="torizoncore/default.xml" \ -e ACCEPT_FSL_EULA="1" \ -e BB_NUMBER_THREADS="2" \ -e PARALLEL_MAKE="-j 2" \ # not sure if I can pass those like this torizon/crops:kirkstone-6.x.y startup-tdx.sh 将依赖项添加到镜像 要添加依赖项,首先进入 ~/yocto-workdir/layers 文件夹。 cd ./layers 我们将添加下面 layers: meta-hailo meta-gstreamer1.0 meta-toradex-framos 更多关于 meta layers 的内容,请参考完整的文档。 在 torizon/crops:kirkstone-6.x.y 容器中, 运行 bitbake add layers 命令。 bitbake-layers add-layer meta-hailo/meta-hailo-accelerator bitbake-layers add-layer meta-hailo/meta-hailo-libhailort bitbake-layers add-layer meta-hailo/meta-hailo-tappas bitbake-layers add-layer meta-hailo/meta-hailo-vpu bitbake-layers add-layer meta-toradex-framos bitbake-layers add-layer meta-gstreamer1.0 在 build-torizon/conf/local.conf 文件中添加 packages。在末尾添加下面内容。 IMAGE_INSTALL:append = " libhailort hailortcli pyhailort libgsthailo hailo-pci hailo-firmware" IMAGE_INSTALL:append = " gstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad" IMAGE_INSTALL:append = " v4l-utils" 使用新的 layers 编译镜像。 bitbake torizon-minimal 你可以在下面位置找到兼容 Toradex Easy Installer 的安装镜像 ~/yocto-workdir/build-torizon/deploy/images/verdin-imx8mp/torizon-minimal-verdin-imx8mp-Tezi_6.8.0-devel-date+build.0.tar. 硬件设置 连接Hailo设备 将 Hailo 设备插入 Mallow 载板的 M.2 插槽中。 连接摄像头 将摄像头连接到 Mallow 载板的 MIPI-CSI 接口上。 安装新的 Torizon OS 镜像 使用 Toradex Easy Installer (Tezi) 将新镜像刷入设备。 下载Tezi 将设备置于恢复模式 安装新编译的镜像 检查安装情况 Hailo 设备 sudo su hailocli scan hailocli device-info 这些命令的输出应能检测到设备已正确连接且驱动程序正常工作。 显示屏 gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink 您应该在屏幕上看到一些彩色图案。 Camera 设备 此步骤可能因使用的相机而异。 v4l2-ctl -d2 -D v4l2-ctl --list-formats-ext -d /dev/video2 对于 Framos 相机,输出如下。 root@verdin-imx8mp-15445736:~# v4l2-ctl --list-formats-ext -d /dev/video2 ioctl: VIDIOC_ENUM_FMT Type: Video Capture : 'YUYV' (YUYV 4:2:2) Size: Stepwise 176x144 - 4096x3072 with step 16/8 : 'NV12' (Y/CbCr 4:2:0) Size: Stepwise 176x144 - 4096x3072 with step 16/8 : 'NV16' (Y/CbCr 4:2:2) Size: Stepwise 176x144 - 4096x3072 with step 16/8 : 'RG12' (12-bit Bayer RGRG/GBGB) Size: Stepwise 176x144 - 4096x3072 with step 16/8 在演示中,我们将使用 YUYV 格式。因此请记住其中的数值。 gst-launch-1.0 -v v4l2src device=/dev/video2 ! video/x-raw ! videoconvert ! autovideosink 运行示例 某些摄像头会指定分辨率和帧数,因此需相应调整这些值。这可以通过修改 PIPELINE变量的 framerate 值来实现。 sudo su cd ~/apps/detection/ ./detection.sh
  • 热度 1
    2025-3-6 12:00
    273 次阅读|
    0 个评论
    B y Toradex 秦海 1). 简介 基于 ARM 平台 Yocto Linux BSP 开发嵌入式设备,开发完成后需要生成用于量产的 Yocto Linux BSP 镜像,本文就基于 Toradex Yocto Linux BSP 镜像进行量产定制做流程说明。 2. 准备 a). Toradex Yocto Linux BSP 提供预编译好的基于 Downstream/Mainline Linux Kernel 版本的 Minimal 或者 Multimedia 镜像供客户测试开发,具体可以从下面地址下载。 https://developer.toradex.cn/software/toradex-embedded-software/toradex-download-links-torizon-linux-bsp-wince-and-partner-demos/#toradex-embedded-linux---yocto-project-reference-images b ). Toradex ARM 核心板 产品出厂预装 Toradex Easy Installer 工具软件,便于进行量产安装,因此对应使用的 Yocto Linux BSP 镜像也是适用于通过 Toradex Easy Installer 安装的镜像,具体关于 Toradex Easy Installer 的更详细介绍请见如下。 https://developer.toradex.cn/easy-installer/toradex-easy-installer/toradex-easy-installer-overview/ c). 如果熟悉 Yocto Project 编译环境,可以参考如下文章通过 Yocto Project 来定制编译用于量产的 BSP 镜像,本文不做赘述。 https://www.toradex.cn/blog/tong-guo-ycoto-project-ding-zhi-qian-ru-shi-ycoto-linux-jing-xiang 3). 定制流程 a). 本文以适用于 Verdin i.MX8M Plus 的 Yocto Linux Mutimedia BSP Reference Image 镜像为例进行示例,其他平台和版本的 BSP 方法思路都一致。 b). 从 这里 下载针对 Verdin i.MX8M Plus 的 Yocto Linux Mutimedia BSP Reference Image V7.x 版本,并解压后包含文件如下。 ------------------------------- $ tar xvf Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3.tar $ cd Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3/ $ tree -L 1 . ├── image.json ├── imx-boot ├── LA_OPT_NXP_SW.html ├── marketing.tar ├── prepare.sh ├── Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz ├── Reference-Multimedia-Image-verdin-imx8mp.rootfs.tar.xz ├── toradexlinux.png ├── u-boot-initial-env-sd └── wrapup.sh 0 directories, 10 files ------------------------------- c). image.json 是 BSP 镜像配置文件, Toradex Easy Installer 软件就是通过读取这个文件来进行 BSP 镜像更新的 ./ image.json 配置文件详细说明请见如下文章,不同的硬件平台具体的文件会有不同,尤其是底层 bootloader 相关的 binary 文件。本文只将和定制量产镜像相关的参数着重说明。 https://developer.toradex.cn/easy-installer/toradex-easy-installer/toradex-easy-installer-configuration-files ./ “ autoinstall ” 参数定义了是否自动安装 BSP 镜像 ------------------------------- false - 不自动安装 (default) true - 自动安装 ------------------------------- ./ “u_boot_env” 参数定义了 U-Boot 启动动态加载的环境变量参数,可以将自定义的 U-Boot 环境变量参数更新到这个文件,刷写 BSP 镜像后启动即可以生效。 ------------------------------- u-boot-initial-env-sd (default) ------------------------------- ./ “ prepare_script ” 参数定义了 Toradex Easy Installer 工具进行分区和烧写镜像操作前需要进行的操作 ------------------------------- prepare.sh (default) ------------------------------- ./ “wrapup_script” 参数定义了 Toradex Easy Installer 工具完成分区和烧写镜像操作后需要进行的操作 ------------------------------- wrapup.sh (default) ------------------------------- ./ “blockdevs” 参数下面就定义了实际需要烧写的镜像以及分区,当然也可以参考上述配置文件说明定制添加自己需要的分区或者只读文件系统等。 // 通常首先是一个 FAT32 分区,用于烧写包括 Linux Kernel Image/Device-Tree Binary/Device-Tree Overlay Binary 等启动文件, ” filename ” 参数定义了写入的文件压缩包, "uncompressed_size" 定义了要写入文件未压缩前的大小 (MB) 。如果定制镜像过程中修改了压缩包文件的名字和文件大小就需要修改对应修改这两个参数。 ------------------------------- "label": "BOOT", "filesystem_type": "FAT", "mkfs_options": "", " filename ": "Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz", " uncompressed_size ": 8.671875 ------------------------------- // 然后是一个 EXT4 分区,用于烧写 Linux Rootfs 文件系统文件, ” filename ” 参数定义了写入的文件压缩包, "uncompressed_size" 定义了要写入文件未压缩前的大小 (MB) 。如果定制镜像过程中修改了 Rootfs 文件系统压缩包文件的名字和文件大小就需要修改对应修改这两个参数。 ------------------------------- "label": "RFS", "filesystem_type": "ext4", "mkfs_options": "-E nodiscard", " filename ": "Reference-Multimedia-Image-verdin-imx8mp.rootfs.tar.xz", " uncompressed_size ": 1272.7109375 ------------------------------- // 最后是 Raw 分区,用于烧写包括 Bootloader Binary 等在内的底层引导固件文件,文件可能是一个文件或者多个文件,根据不同的硬件平台不一致。 ” filename ” 参数定义了写入的 Binary 固件文件,比如 Verdin i.MX8MP 平台对应的是 imx-boot 文件就是一个包含 ATF/DDR Firmware/SPL/U-Boot 等的 Boot Container ,而比如 Verdin AM62 平台则每个固件都是分开的单独文件。 ------------------------------- "filesystem_type": "raw", "rawfiles": ------------------------------- d). “ imx-boot ” 如章节 (c) 说明是 Verdin i.MX8MP 平台对应的 Boot Container 文件,如果需要修改底层 Bootloader ,可以参考如下文章修改编译生成新的 “ imx-boot ” 文件后替换 BSP Image 镜像里面的文件。 https://developer.toradex.cn/linux-bsp/os-development/build-u-boot-and-linux-kernel-from-source-code/build-u-boot/ e). “prepare.sh” 如章节 (c) 说明是烧写镜像前需要进行的操作,通常不需要修改。 f). “ wrapup .sh” 如章节 (c) 说明是烧写镜像后进行的操作,如果使能了 “ autoinstall ” 自动安装可以增加如下内容在完成自动安装后自动重启。 ------------------------------- reboot -f exit 0 ------------------------------- g). “Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz” 压缩包文件如章节 (c) 说明是 FAT32 启动分区文件,请注意不同 Yocto Linux BSP 版本命名方式可能略有不同。 ./ 解压后内容如下 ------------------------------- $ cd Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3/ $ mkdir bootfs $ tar Jxf Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz -C bootfs/ $ cd bootfs $ tree -L 1 . ├── boot.scr ├── Image.gz ├── imx8mp-verdin-nonwifi-dahlia.dtb ├── imx8mp-verdin-nonwifi-dev.dtb ├── imx8mp-verdin-nonwifi-ivy.dtb ├── imx8mp-verdin-nonwifi-mallow.dtb ├── imx8mp-verdin-nonwifi-yavia.dtb ├── imx8mp-verdin-wifi-dahlia.dtb ├── imx8mp-verdin-wifi-dev.dtb ├── imx8mp-verdin-wifi-ivy.dtb ├── imx8mp-verdin-wifi-mallow.dtb ├── imx8mp-verdin-wifi-yavia.dtb ├── overlays └── overlays.txt 1 directory, 13 files ------------------------------- ./ “ boot.scr ” 文件是 Linux U-Boot Distroboot 配置文件,如果定制 BSP 镜像涉及 Linux Kernel 启动参数相关配置,可以参考 这里 修改并重新生成这个文件后替换原有文件。 ./ 其他文件都是包含 Linux Kernel Image / Device-Tree Binary / Device-Tree Overlay Binary 等文件,如果定制 BSP 涉及了相关修改可以在这里替换原有文件。 ./ 修改完成所有要修改的文件后,可以通过如下命令重新压缩,如果命名不变则无需修改 image.json 文件,否则就要对应修改。 ------------------------------- $ cd Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3/bootfs/ $ tar Jcf ../Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz * $ cd .. $ rm -rf bootfs/ ------------------------------- h). “Reference-Multimedia-Image-verdin-imx8mp.rootfs.tar.xz” 压缩包文件如章节 (c) 说明是 EXT4 Linux Rootfs 文件系统分区文件,请注意不同 Yocto Linux BSP 版本命名方式可能略有不同。 ./ 解压后内容如下 ------------------------------- $ cd Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3/ $ mkdir rootfs $ sudo tar Jxf Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz -C rootfs/ $ cd rootfs $ tree -L 1 . ├── bin - usr/bin ├── boot ├── dev ├── etc ├── home ├── lib - usr/lib ├── media - run/media ├── mnt ├── opt ├── proc ├── root ├── run ├── sbin - usr/sbin ├── srv ├── sys ├── tmp ├── unit_tests ├── usr └── var 18 directories, 1 file ------------------------------- ./ 在这里可以进行 Linux Rootfs 相关的修改适配,比如部署应用程序以及相关运行库,配置应用程序开机自启动等,下面是几个简单示例。 ------------------------------- ### modify below default autorun systemd service file to make customized application autorun ### rootfs/lib/systemd/system/wayland-app-launch.service ... ExecStart=/usr/share/cinematicexperience-1.0/Qt5_CinematicExperience --fullscreen ... ### modify below splash picture to adapt customized splash after enabling plymouth in Yocto project ### rootfs/usr/share/plymouth/themes/spinner/watermark.png ### modify weston configuration file if needed, below for example to hide weston normal shell ### rootfs/ etc/xdg/weston/weston.ini ... shell=kiosk-shell.so ... ------------------------------- ./ 修改完成所有要修改的文件后,可以通过如下命令重新压缩,如果命名和大概文件大小不变则无需修改 image.json 文件,否则就要对应修改。 ------------------------------- $ cd Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3/rootfs/ $ sudo tar Jcf ../Reference-Multimedia-Image-verdin-imx8mp.rootfs.tar.xz * $ cd .. $ sudo rm -rf rootfs/ ------------------------------- i). “u-boot-initial-env-sd” 如章节 (c) 说明是 U-Boot 环境变量配置文件,可以将定制需要的环境变量修改或者添加在这个文件。比如这里示例添加为了显示 Plymouth Splash 以及关闭 log 输出的环境变量定义。 ------------------------------- tdxargs = quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:3’ bootdelay = 0 ------------------------------- j). 定制完成后将完整 BSP image 文件复制到 U 盘或者 SD 卡,通过模块 Toradex Easy Installer 工具安装到模块进行量产即可。 4 ). 总结 本文 基于 Toradex i.MX8MP ARM 处理器平台示例了 Yocto Linux 量产 BSP 镜像定制流程,其他平台定制思路都是基本一致的。
  • 热度 1
    2025-1-7 14:52
    617 次阅读|
    0 个评论
    B y Toradex 秦海 1). 简介 嵌入式平台设备基于 Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所 示例 的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台 。 2. 准备 a). Verdin i.MX8MP ARM 核心版配合 Dahlia 载板 并连接 Debug Console 和 HDMI 显示器进行测试。 3). 测试流程 a). 参考 这里 说明下载 Toradex Yocto Linux BSP7 对应 U-Boot 源码,根据如下 patch 文件修改编译配置后重新编译 U-Boot Image 。 ------------------------------- --- a / . config2024-12-27 14:52:26.151705541 +0800 +++ . b/. config2025-01-03 17:41:42.779299312 +0800 @@ -535,9 +535,13 @@ # CONFIG_DISABLE_CONSOLE is not set CONFIG_LOGLEVEL=4 CONFIG_SPL_LOGLEVEL=4 -# CONFIG_SILENT_CONSOLE is not set -# CONFIG_SPL_SILENT_CONSOLE is not set +CONFIG_SILENT_CONSOLE=y +CONFIG_SPL_SILENT_CONSOLE=y # CONFIG_TPL_SILENT_CONSOLE is not set +# CONFIG_SILENT_U_BOOT_ONLY is not set +CONFIG_SILENT_CONSOLE_UPDATE_ON_SET=y +CONFIG_SILENT_CONSOLE_UPDATE_ON_RELOC=y +# CONFIG_SILENT_CONSOLE_UNTIL_ENV is not set # CONFIG_PRE_CONSOLE_BUFFER is not set CONFIG_CONSOLE_FLUSH_SUPPORT=y # CONFIG_CONSOLE_FLUSH_ON_NEWLINE is not set @@ -644,7 +648,7 @@ CONFIG_SPL_HAS_CUSTOM_MALLOC_START=y CONFIG_SPL_CUSTOM_SYS_MALLOC_ADDR=0x42200000 CONFIG_SPL_SYS_MALLOC_SIZE=0x80000 -CONFIG_SPL_BANNER_PRINT=y +# CONFIG_SPL_BANNER_PRINT is not set # CONFIG_SPL_DISPLAY_PRINT is not set CONFIG_SPL_SYS_MMCSD_RAW_MODE=y CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y ------------------------------- b). 参考 这里 说明重新组装 Verdin i.MX8MP Boot Container ,在编译 ATF Image 的时候参考如下命令来关闭 log 输出。 ------------------------------- $ make PLAT=imx8mp IMX_BOOT_UART_BASE=0x30880000 LOG_LEVEL=0 DEBUG=0 bl31 ------------------------------- c). 从下面地址下载 Yocto linux BSP7 Minimal/Multimedia Image 并解压。 https://developer.toradex.cn/software/toradex-embedded-software/toradex-download-links-torizon-linux-bsp-wince-and-partner-demos/#bsp-quarterly-releases d). 用上述步骤 b 生成的 flash.bin binary 文件重命名为 “ imx-boot ” 并替换 BSP Image 里面的 “ imx-boot ” 文件。 ------------------------------- $ tar xvf / Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.0.0+build.1.tar $ $ cd /Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.0.0+build.1/ $ cp /imx-mkimage/iMX8M/flash.bin /Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.0.0+build.1/imx-boot ------------------------------- e). 参考如下 patch 修改编译 BSP Image 中的环境变量定义文件。 ------------------------------- --- a/u-boot-initial-env-sd 2024-10-01 21:50:32.000000000 +0800 +++ b/u-boot-initial-env-sd 2024-12-27 16:28:20.000000000 +0800 @@ -19,7 +19,7 @@ bootcmd_mmc1=devnum=1; run mmc_boot bootcmd_mmc2=devnum=2; run mmc_boot bootdelay=1 -console=ttymxc2 +console=null cpu=armv8 distro_bootcmd=setenv nvme_need_init; for target in ${boot_targets}; do run bootcmd_${target}; done efi_dtb_prefixes=/ /dtb/ /dtb/current/ @@ -45,6 +45,7 @@ scan_dev_for_scripts=for script in ${boot_scripts}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${script}; then echo Found U-Boot script ${prefix}${script}; run boot_a_script; echo SCRIPT FAILED: continuing...; fi; done scriptaddr=0x50280000 soc=imx8m +silent=1 update_uboot=askenv confirm Did you load flash.bin (y/N)?; if test "$confirm" = "y"; then setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200; mmc dev 2 1; mmc write ${loadaddr} 0x0 ${blkcnt}; fi usb_boot=usb start; if usb dev ${devnum}; then devtype=usb; run scan_dev_for_boot_part; fi usb_ignorelist=0x1050:*, ------------------------------- // 当然, U-Boot 环境变量的修改也可以通过修改 U-boot 源代码中 include/configs/verdin-imx8mp.h 文件来修改,本文不做赘述。 // 如果只需要不显示部分 Kernel log 信息,则可以只设置增加如下环境变量即可,无需重新修改编译 U-Boot ------------------------------- # setenv tdxargs '${tdxargs} quiet' # saveenv ------------------------------- f). 参考 这里 说明将修改的 BSP Image 重新更新到 Verdin i.MX8MP 模块,启动后 Debug Console 输出如下,仅剩下 SPL 配合 ARM 处理器 BootRoM 启动的简单 log 信息输出,其他 U-Boot 以及 Linux Kernel/Rootfs 等输出均已经不显示。同时此时测试在不进行任何其他优化的前提下,从按下载板 “ Power ON ” 按键开机,到连接的 HDMI 屏幕出现 Qt Cinama Demo 应用显示,一共是 14s 时间。而正常不做任何修改的 Yocto Linux Multimedia BSP 同样情况启动时间在 17s - 18s 。 ------------------------------- DDRINFO: start DRAM init DDRINFO: DRAM rate 4000MTS Training FAILED DDRINFO: start DRAM init DDRINFO: DRAM rate 4000MTS DDRINFO:ddrphy calibration done DDRINFO: ddrmix config done DDR configured as single rank SEC0: RNG instantiated Normal Boot WDT: Started watchdog@30280000 with servicing every 1000ms (60s timeout) Boot Stage: Primary boot Find img info 0x4802d200, size 888 Need continue download 1024 Failed to find node!, err: -1! Failed to find node!, err: -1! ------------------------------- g). 通常情况上面保留 SPL BootROM 启动相关 log 打印即可满足需求,如果一定要完全去掉,就需要逐项查看对应的源代码,当前打印信息对应( BSP 版本变更可能导致变化)以及修改 patch 请见如下,在对应源码中注释掉相关的 “ printf()/puts() ” 打印 log 输出代码重新编译即可,测试下来这样可以将启动时间缩短到 13.8s 左右。 ./ ddr_init.c - https://git1.toradex.com/cgit/u-boot-toradex.git/tree/drivers/ddr/imx/imx8m/ddr_init.c?h=toradex_imx_lf_v2024.04 ------------------------------- DDRINFO: start DRAM init DDRINFO: DRAM rate 4000MTS DDRINFO: start DRAM init DDRINFO: DRAM rate 4000MTS DDRINFO:ddrphy calibration done DDRINFO: ddrmix config done ------------------------------- ./ ddrphy_utils.c - https://git1.toradex.com/cgit/u-boot-toradex.git/tree/drivers/ddr/imx/phy/ddrphy_utils.c?h=toradex_imx_lf_v2024.04#n101 ------------------------------- Training FAILED ------------------------------- ./ spl.c - https://git1.toradex.com/cgit/u-boot-toradex.git/tree/board/toradex/verdin-imx8mp/spl.c?h=toradex_imx_lf_v2024.04 ------------------------------- DDR configured as single rank Normal Boot ------------------------------- ./ jr.c - https://git1.toradex.com/cgit/u-boot-toradex.git/tree/drivers/crypto/fsl/jr.c?h=toradex_imx_lf_v2024.04#n937 ------------------------------- SEC0: RNG instantiated ------------------------------- ./ wdt-uclass.c - https://git1.toradex.com/cgit/u-boot-toradex.git/tree/drivers/watchdog/wdt-uclass.c?h=toradex_imx_lf_v2024.04#n143 ------------------------------- WDT: Started watchdog@30280000 with servicing every 1000ms (60s timeout) ------------------------------- ./ spl_imx_romapi.c - https://git1.toradex.com/cgit/u-boot-toradex.git/tree/arch/arm/mach-imx/spl_imx_romapi.c?h=toradex_imx_lf_v2024.04 ------------------------------- Boot Stage: Primary boot Find img info 0x4802d200, size 888 Need continue download 1024 ------------------------------- ./ spl.c - https://git1.toradex.com/cgit/u-boot-toradex.git/tree/arch/arm/mach-imx/spl.c?h=toradex_imx_lf_v2024.04#n459 ------------------------------- Failed to find node!, err: -1! Failed to find node!, err: -1! ------------------------------- // 完整修改 patch 请见如下 ------------------------------- diff --git a/arch/arm/mach-imx/spl.c b/arch/arm/mach-imx/spl.c index d6664bf9103..a8ef680593b 100644 --- a/arch/arm/mach-imx/spl.c +++ b/arch/arm/mach-imx/spl.c @@ -456,7 +456,7 @@ int board_handle_rdc_config(void *fdt_addr, const char *config_name, void *dst_a node = fdt_node_offset_by_compatible(fdt_addr, -1, "imx8m,mcu_rdc"); if (node < 0) { -printf("Failed to find node!, err: %d!\n", node); +//printf("Failed to find node!, err: %d!\n", node); ret = -1; goto exit; } diff --git a/arch/arm/mach-imx/spl_imx_romapi.c b/arch/arm/mach-imx/spl_imx_romapi.c index 8b8d16d911f..fea293cb9ca 100644 --- a/arch/arm/mach-imx/spl_imx_romapi.c +++ b/arch/arm/mach-imx/spl_imx_romapi.c @@ -387,7 +387,7 @@ static int spl_romapi_load_image_stream(struct spl_image_info *spl_image, } imagesize = img_info_size(phdr); -printf("Find img info 0x%p, size %d\n", phdr, imagesize); +//printf("Find img info 0x%p, size %d\n", phdr, imagesize); if (p - phdr < imagesize) { imagesize -= p - phdr; @@ -463,11 +463,11 @@ int board_return_to_bootrom(struct spl_image_info *spl_image, if (ret != ROM_API_OKAY) goto err; -printf("Boot Stage: "); +//printf("Boot Stage: "); switch (bstage) { case BT_STAGE_PRIMARY: -printf("Primary boot\n"); +//printf("Primary boot\n"); break; case BT_STAGE_SECONDARY: printf("Secondary boot\n"); diff --git a/board/toradex/verdin-imx8mp/spl.c b/board/toradex/verdin-imx8mp/spl.c index 73729a42b45..f6bf9260527 100644 --- a/board/toradex/verdin-imx8mp/spl.c +++ b/board/toradex/verdin-imx8mp/spl.c @@ -42,7 +42,7 @@ void spl_dram_init(void) lpddr4_single_rank_training_patch(); if (!ddr_init(&dram_timing)) { -puts("DDR configured as single rank\n"); +//puts("DDR configured as single rank\n"); return; } puts("DDR configuration failed\n"); @@ -69,7 +69,7 @@ void spl_board_init(void) clock_set_target_val(GIC_CLK_ROOT, CLK_ROOT_ON | CLK_ROOT_SOURCE_SEL(5)); clock_enable(CCGR_GIC, 1); -puts("Normal Boot\n"); +//puts("Normal Boot\n"); } #define I2C_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_HYS | PAD_CTL_PUE | PAD_CTL_PE) diff --git a/drivers/crypto/fsl/jr.c b/drivers/crypto/fsl/jr.c index 97b0cf83ae7..efb2544de02 100644 --- a/drivers/crypto/fsl/jr.c +++ b/drivers/crypto/fsl/jr.c @@ -934,7 +934,7 @@ init: return -1; } -printf("SEC%u: RNG instantiated\n", sec_idx); +//printf("SEC%u: RNG instantiated\n", sec_idx); } #if CONFIG_IS_ENABLED(OF_CONTROL) if (CONFIG_IS_ENABLED(DM_RNG)) { diff --git a/drivers/ddr/imx/imx8m/ddr_init.c b/drivers/ddr/imx/imx8m/ddr_init.c index 91d963419d6..06ff6feaa09 100644 --- a/drivers/ddr/imx/imx8m/ddr_init.c +++ b/drivers/ddr/imx/imx8m/ddr_init.c @@ -316,7 +316,7 @@ int ddr_init(struct dram_timing_info *dram_timing) unsigned int tmp, initial_drate, target_freq; int ret; -printf("DDRINFO: start DRAM init\n"); +//printf("DDRINFO: start DRAM init\n"); /* Step1: Follow the power up procedure */ if (is_imx8mq()) { @@ -339,7 +339,7 @@ int ddr_init(struct dram_timing_info *dram_timing) fsp_msg .drate; /* default to the frequency point 0 clock */ -printf("DDRINFO: DRAM rate %dMTS\n", initial_drate); +//printf("DDRINFO: DRAM rate %dMTS\n", initial_drate); ddrphy_init_set_dfi_clk(initial_drate); /* D-aasert the presetn */ @@ -409,7 +409,7 @@ int ddr_init(struct dram_timing_info *dram_timing) tmp = reg32_read(DDRPHY_CalBusy(0)); } while ((tmp & 0x1)); -printf("DDRINFO:ddrphy calibration done\n"); +//printf("DDRINFO:ddrphy calibration done\n"); /* Step15: Set SWCTL.sw_done to 0 */ reg32_write(DDRC_SWCTL(0), 0x00000000); @@ -462,7 +462,7 @@ int ddr_init(struct dram_timing_info *dram_timing) /* enable port 0 */ reg32_write(DDRC_PCTRL_0(0), 0x00000001); -printf("DDRINFO: ddrmix config done\n"); +//printf("DDRINFO: ddrmix config done\n"); board_dram_ecc_scrub(); diff --git a/drivers/ddr/imx/phy/ddrphy_utils.c b/drivers/ddr/imx/phy/ddrphy_utils.c index 59a15764526..cddf270e594 100644 --- a/drivers/ddr/imx/phy/ddrphy_utils.c +++ b/drivers/ddr/imx/phy/ddrphy_utils.c @@ -98,7 +98,7 @@ int wait_ddrphy_training_complete(void) debug("Training PASS\n"); return 0; } else if (mail == 0xff) { -printf("Training FAILED\n"); +//printf("Training FAILED\n"); return -1; } } diff --git a/drivers/watchdog/wdt-uclass.c b/drivers/watchdog/wdt-uclass.c index 417e8d7eef9..7e4213858b8 100644 --- a/drivers/watchdog/wdt-uclass.c +++ b/drivers/watchdog/wdt-uclass.c @@ -140,9 +140,9 @@ int wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags) } } -printf("WDT: Started %s with%s servicing %s (%ds timeout)\n", +/*printf("WDT: Started %s with%s servicing %s (%ds timeout)\n", name, IS_ENABLED(CONFIG_WATCHDOG) ? "" : "out", -str, (u32)lldiv(timeout_ms, 1000)); +str, (u32)lldiv(timeout_ms, 1000));*/ } return ret; ------------------------------- h). 另外, U-Boot 默认的 countdown 功能虽然没有打印 log 了,但是还是依然存在,可以通过如下修改 u-boot-initial-env-sd 环境变量配置来忽略这个功能。设置后可以将启动时间缩短为 12s - 13s 。 ------------------------------- bootdelay=-2 // bootdelay variable description from U-Boot documentation bootdelay: After reset, U-Boot will wait this number of seconds before it executes the contents of the bootcmd variable. During this time a countdown is printed, which can be interrupted by pressing any key. Set this variable to 0 boot without delay. Be careful: depending on the contents of your bootcmd variable, this can prevent you from entering interactive commands again forever! Set this variable to -1 to disable autoboot. Set this variable to -2 to boot without delay and not check for abort. ------------------------------- 4 ). 总结 本文 基于 NXP i.MX8MP ARM 处理器平台测试了关闭 Debug Console 来增强安全和提高启动时间的流程。 参考文档 https://developer.toradex.com/software/development-resources/configuring-serial-port-debug-console-linuxu-boot/