tag 标签: iMX8MP

相关博文
  • 2025-3-6 15:17
    57 次阅读|
    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
  • 2025-3-6 12:00
    3 次阅读|
    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
    465 次阅读|
    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/
  • 2024-12-24 09:26
    0 个评论
    为了切实满足更多客户的基础应用及项目降本需求,飞凌嵌入式现推出FETMX8MPL-C核心板。相较于先前已成功推向市场的FETMX8MP-C核心板,FETMX8MPL-C核心板在硬件配置上进行了巧妙的精简。 众所周知,并非所有应用场景都需要用到高性能的硬件配置,如音视频处理单元(VPU)、神经网络处理单元(NPU)、图像信号处理单元(ISP)以及高性能数字信号处理器(HiFi-4 DSP)等。因此,为了切实满足更多客户的基础应用及项目降本需求,FETMX8MPL-C在保留核心处理能力以及主流功能接口的基础上,精简了这些芯片单元,从而实现了成本的有效控制。 同时,FETMX8MPL-C核心板与已经上市的FETMX8MP-C核心板软硬件兼容,不仅确保了FETMX8MPL-C核心板能够轻松融入客户的现有系统中,还大大提升了产品在使用过程中的稳定性和可靠性。不过需要注意的是,FETMX8MPL-C核心板目前仅支持Linux5.4.70系统。 飞凌嵌入式FE TMX8MPL-C核心板2GB+16GB配置将于12月13日现货发售,1GB+8GB配置将于2025年1月15日发售,敬请期待。
  • 热度 3
    2024-3-8 11:37
    930 次阅读|
    1 个评论
    B y Toradex 胡珊逢 简介 Verdin iMX8M Plus 具有四个串口,其中 UART3 是用于 A53 核心上的系统如 Linux 的默认调试串口,出于设计需要可能需要将调试口换到其他串口,文章将介绍如何使用 UART1 作调试串口。 硬件介绍 Verdin iMX8M Plus 的四个串口 UART1 ~ UART4 中, UART3 为默认的 A53 调试串口, UART4 为 M7 调试串口,其余两个作为通用 UART 使用。 Verdin 系列的模块均使用 1.8V TTL 电平,在连接外部设备时请先检查电压。本次测试使用的是 Dahlia 底板,在 X20 扩展接口 Pin12 和 Pin13 分别将模块的 UART1_RXD 和 UART1_TXD 引出。四个串口的物理地址如下: UART 起始地址 结束地址 UART1 0x3086_0000 0x3086_FFFF UART2 0x3089_0000 0x3089_FFFF UART3 0x3088_0000 0x3088_FFFF UART4 0x30A6_0000 0x30A6_FFFF 软件修改 调试串口更改的软件涉及到三个部分, ATF 、 U-Boot 和 Linux 。 ATF 会和 U-Boot 等其他文件如 DDR 固件一起打包成用于 NXP i.MX 8M Plus 处理器的启动文件。这些文件的下载和编译请参考 该网页 。文章使用到的完整补丁请从 这里下载 。 ATF ATF 代码的 imx8mp_bl31_setup.c 中,把 RDC_PDAP_UART1 划分到 A53 所在的 D0 域。 --------------------------- --- a/plat/imx/imx8m/imx8mp/imx8mp_bl31_setup.c +++ b/plat/imx/imx8m/imx8mp/imx8mp_bl31_setup.c @@ -53,7 +53,7 @@ static const struct imx_rdc_cfg rdc = { - MX8MP_PAD_UART3_RXD__UART3_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL), - MX8MP_PAD_UART3_TXD__UART3_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL), + MX8MP_PAD_UART1_RXD__UART1_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL), + MX8MP_PAD_UART1_TXD__UART1_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL), }; imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads)); - init_uart_clk(2); + init_uart_clk(0); return 0; } --------------------------- 在 include/configs/verdin-imx8mp.h 将 CONFIG_MXC_UART_BASE 的地址也设置为 UART1 。同时修改 console 。 --------------------------- --- a/include/configs/verdin-imx8mp.h +++ b/include/configs/verdin-imx8mp.h "boot_script_dhcp=" BOOT_SCRIPT "\0" \ - "console=ttymxc2\0" \ + "console=ttymxc0\0" \ "fdt_board=dev\0" \ @@ -111,7 +111,7 @@ #define PHYS_SDRAM_2_SIZE (SZ_4G + SZ_1G) /* UART */ -#define CONFIG_MXC_UART_BASE UART3_BASE_ADDR +#define CONFIG_MXC_UART_BASE UART1_BASE_ADDR /* Monitor Command Prompt */ #define CONFIG_SYS_CBSIZE SZ_2K --------------------------- Linux Linux 的 device tree 同样也需要做修改。在 freescale/imx8mp-verdin-dev.dtsi 中取消 UART1 默认配置下的 RS485 功能。 --------------------------- --- a/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi +++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi /* Verdin UART_1, connector X50 through RS485 transceiver */ &uart1 { + /* linux,rs485-enabled-at-boot-time; rs485-rts-active-low; rs485-rx-during-tx; + */ status = "okay"; }; --------------------------- imx8mp-verdin.dtsi 中更改 stdout-path 调试串口输出至 UART1 ,并删除 RTS 和 CTS 功能引脚。 --------------------------- --- a/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi +++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi @@ -8,7 +8,7 @@ / { chosen { - stdout-path = &uart3; + stdout-path = &uart1; }; aliases { @@ -891,7 +891,7 @@ &snvs_pwrkey { &uart1 { pinctrl-names = "default"; pinctrl-0 = ; - uart-has-rtscts; + /* uart-has-rtscts; */ }; /* Verdin UART_2 */ @@ -1331,8 +1331,8 @@ pinctrl_sai3: sai3grp { pinctrl_uart1: uart1grp { fsl,pins = - , /* SODIMM 135 */ - , /* SODIMM 133 */ + /* , SODIMM 135 */ + /* , SODIMM 133 */ --------------------------- 修改完毕上述文件后重新编译 flash.bin ( imx-boot )和 device tree 文件,并将其放入支持 Toradex Easy Installer 烧录的镜像文件中。同时也需要修改镜像文件中的 u-boot-initial-env-sd ,将 console 改为 console=ttymxc0 。该文件会在烧录系统时配置 U-Boot 环境变量。安装完镜像后,在 UART1 即可看到启动日志。 总结 通过上述几个文件的修改,可以切换 A53 调试串口。对于 Linux 系统通常建议保留一个调试串口,这将有利于调试和后期其他问题排查。