tag 标签: iMX8X

相关博文
  • 热度 6
    2021-9-13 10:24
    2389 次阅读|
    0 个评论
    B y Toradex 秦海 1). 简介 ARM 嵌入式平台由于其分散性,不同 SoC 厂商通常都采用互不相同的方式来引导启动系统,这就导致了针对嵌入式 ARM 平台的系统发行版本也需要根据不同硬件 SoC 平台进行针对性定制,而不像 X 86 平台(如 BIOS 或 UEFI )或者 6 4 -bit ARM 服务器平台(如 SBSA 或 SBBR )这样采用标准化的启动引导流程,因此通用桌面级系统发行版本比如 SUSE 、 Redhat 或 Fedora 就很难持续稳定的支持各种嵌入式 ARM 平台,反而趋势是各个硬件供应商自己定制发布针对自己硬件的系统发布版本(如 Raspbian , Bananian , Parabuntu )来绑定用户。 Distro Boot 的标准名称是 Generic Distro Configuration Concept ,项目由 U-boot 开发者始于 2 014 年左右,目标就是试图用一个标准方法去引导启动不同硬件平台。当在 U-boot 中打开 Distro Boot 支持后,只需要将任意支持的系统发布版本镜像文件和一个 符合 Distro Boot 定义的启动配置文件放置于一个分区的可移动设备即可引导设备启动进入系统。 本文就基于 NXP 最新的 iMX 8 SoC (基于 Cortex-A 72 + A53 和 Coretex -M4 架构) ARM 平台来测试使用 Distro Boot 机制来引导系统镜像。演示平台来自于 Toradex 基于 iMX 8 QM 的 Apalis iMX 8 QM ARM 嵌入式模块平台。 需要注意的是,由于不同 U-boot/Linux kernel 版本的兼容性以及 iMX8 ARM 处理器增加的底层 SECO/SCFW 固件的存在,可能导致本文测试的内容在其他 BSP 版本上面无法正常工作,本文仅基于当前测试环境进行 distro boot 的功能演示参考。 2 ) . 准备 a). Apalis iMX8QM 4 GB WB IT ARM 核心版配合 Ioxra 载板 ,连接调试串口 UART1 (载板 X2 2 )到开发主机方便调试。 b ). 参考 这里 更新 Toradex Ycoto Linux BSP V5.3 版本 BSP image , BSP 中包含的 U-boot 默认以及支持 Distro boot 。 c). 需要通过 U-boot distro boot 启动的 BSP image ,需要包含一个启动配置文件,通常为 extlinux.conf 或者 U-boot 专用的 boot.scr/boot.scr.uimg 文件,关于配置文件的说明请参考 这里 。 3). Distro boot 启动顺序 a). 默认情况下, U-boot ( Distro boot 支持)会按照如下顺序扫描启动配置文件 extlinux.conf 或者 boot.scr/boot.scr.uimg ./ 外部 SD 卡设备 ./ 内部 eMMC 存储设备 ./ 外部 USB 存储设备 ./ 外部网络设备 b). 默认扫描顺序和扫描位置由如下 U-boot 环境变量决定,如有需要可以自行修改 ------------------------------------ ### default boot devices sequence boot_targets=mmc1 mmc2 mmc0 usb0 dhcp ### boot partition scanning location boot_prefixes=/ /boot/ boot_script_dhcp=boot.scr boot_scripts=boot.scr boot_syslinux_conf=extlinux/extlinux.conf ------------------------------------ 4 ). 通过外部存储介质加载 Toradex Easy Installer 测试 a). Toradex Easy Installer 是 Toradex 提供的一个基于 Linux/QT 开发的图形界面工具,用于将不同类型的操作系统方便直观的安装到 Toradex 计算机模块的内部 eMMC 存储上面。 b). 在更新了 Linux BSP 之后, Toradex Easy Installer 即被擦除,如果想重新更新 Linux 或者其他操作系统,就需要重新将 Toradex easy installer 加载运行,官方支持的方式是参考 这里 通过恢复模式操作,而基于当前 Toradex Easy Installer V5.3 版本配合 Ycoto Linux V5.x 版本,可以实现通过外部存储介质( SD 卡或者 U 盘)在 U-boot 环境下直接加载 Toradex Easy Installer 运行而无需配置恢复模式。 c ). 测试流程 ./ 从 这里 下载对应 Apalis iMX8 模块的 Toradex Easy Installer V5.3 版本 image 压缩包 ./ 解压压缩包,可以看到里面以及包含 distro boot 所需要的启动文件 boot-tezi.scr ,将其更名为 boot.scr 。然后将文件复制到外部存储介质 / 目录或者 /boot 目录。 ------------------------------------ $ unzip Apalis-iMX8_ToradexEasyInstaller_5.3.0+build.3.zip $ cd Apalis-iMX8_ToradexEasyInstaller_5.3.0+build.3/ $ ls boot-tezi.scr image.json overlays.txt recovery-linux.sh tezi.itb u-boot.bin hdmitxfw.bin imx-boot recovery recovery-windows.bat tezi.png wrapup.sh $ mv boot-tezi.scr boot.scr $ cp * /media/simon/ ------------------------------------ ./ 将上述准备好的外部存储介质连接到 Ixora 载板对应接口, Apalis iMX8 开机从调试串口进入 U-boot 命令行,执行下面命令启动外部存储介质的 Toradex Easy Installer ,启动后即可从调试串口看到启动信息,以及连接的显示器看到 Toradex Easy Installer 应用界面。 ------------------------------------ ### external SD storage depending on corresponding SD slot # run bootcmd_mmc1 or run bootcmd_mmc2 ### external USB stick # run bootcmd_usb0 ------------------------------------ ./ 如上述章节 3 描述的默认启动扫描顺序,如果是外部 SD 卡则即使不中断或改动 U-boot 的启动,只要具备 boot.scr 文件的 SD 卡设备插入,就会优先从外部 SD 卡启动,而对于 U 盘,如果需要自动启动,则需要修改 U-boot 环境变量,将 USB 设备扫描顺序提前。 ------------------------------------ # setenv boot_targets 'usb0 mmc1 mmc2 mmc0 dhcp' && saveen v ------------------------------------ 5 ). 通过外部存储介质加载 Ycoto Linux BSP 测试 a). 首先准备一个足够容量的 SD 卡或者 U 盘,本文测试使用一个 16GB 的 Mciro SD 卡 b). 在 Ubuntu PC 下通过 fdisk 命令在目标 SD 卡上面制作如下两个分区 ------------------------------------ Disk /dev/sdc : 14.9 GiB , 15931539456 字节, 31116288 个扇区 单元:扇区 / 1 * 512 = 512 字节 扇区大小 ( 逻辑 / 物理 ) : 512 字节 / 512 字节 I/O 大小 ( 最小 / 最佳 ) : 512 字节 / 512 字节 磁盘标签类型: dos 磁盘标识符: 0x8a42d42a 设备 启动 起点 末尾 扇区 大小 Id 类型 /dev/sdc1 2048 8390655 8388608 4G c W95 FAT32 (LBA) /dev/sdc2 8390656 31116287 22725632 10.9G 83 Linux ------------------------------------ c). 然后通过如下命令分别格式化两个分区, FAT32 分区用于存放 kernel 、 device tree 等基本 boot 文件, linux ext3 分区用于存放 rootfs 文件 ------------------------------------ $ sudo mkfs.vfat -F 32 -n boot /dev/sdc1 $ sudo mkfs.ext3 -L rootfs /dev/sdc2 ------------------------------------ d). 从 这里 下载适用于 Apalis iMX8 的 Ycoto Linux Multimedia Demo image ,然后解压,并分别将 Image 里面的 boot 文件和 rootfs 解压到刚才制作好的 SD 卡两个分区。 Image boot 文件中已经包含了 boot.scr 文件,无需手动创建。 ------------------------------------ ### 解压缩 image $ tar xvf Apalis-iMX8_Reference-Multimedia-Image-Tezi_5.3.0+build.10.tar ### 解压缩 bootfs 、 rootfs 到 SD 卡 $ cd Apalis-iMX8_Reference-Multimedia-Image-Tezi_5.3.0+build.10/ $ sudo tar xf Reference-Multimedia-Image-apalis-imx8.bootfs.tar.xz --no-same-owner -C /media/simon/boot/ $ sudo tar xf Reference-Multimedia-Image-apalis-imx8.tar.xz -C /media/simon/rootfs/ ------------------------------------ e). 制作完成后将 SD 卡插入 Ixora 载板 X10 插槽,启动模块,进入 uboot 命令行,执行下面命令通过 SD 卡启动 ------------------------------------ ### U-boot boot command from external SD cark Apalis iMX8 # run bootcmd_mmc1 ... ### agter booting, check current boot device is indeed external SD devcie - /dev/mmcblk1 root@apalis-imx8:~# df -h Filesystem Size Used Avail Use% Mounted on /dev/root 11G 1.1G 9.1G 11% / devtmpfs 1.4G 4.0K 1.4G 1% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 6.6M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup tmpfs 1.9G 844K 1.9G 1% /tmp tmpfs 1.9G 24K 1.9G 1% /var/volatile /dev/mmcblk0p1 48M 11M 37M 23% /media/mmcblk0p1 /dev/mmcblk0p2 15G 1.1G 13G 8% /media/mmcblk0p2 /dev/mmcblk1p1 4.0G 11M 4.0G 1% /boot ------------------------------------ f). 另外,如果需要定制 boot 流程,可以参考 这里 说明修改 boot.scr 文件。 G). 类似的思路,也可以通过创建 TFTP/NFS 服务器实现网络启动,具体可以参考这里 说明 。 6 ). 总结 本文测试了 基于 NXP iMX 8 平台通过 Distro Boot 功能实现通过外部存储设备启动的方案 , 另外也可以延申到 TFTP/NFS 网络启动。不过由于 Distro Boot 功能兼容性和底层 firmware 以及 uboot/kernel 版本息息相关,因此本文测试仅限于当前测试平台和版本,不代表未来软件发生变化后相关功能还一定确认完整。 参考文献 https://developer.toradex.cn/knowledge-base/distro-boot-linux https://developer.toradex.cn/knowledge-base/boot-from-sd-usb-sata https://developer.toradex.cn/knowledge-base/boot-from-a-tftpnfs-server
  • 热度 14
    2021-9-9 17:47
    2049 次阅读|
    0 个评论
    B y Toradex 胡珊逢 Colibri iMX8X 计算机模块上的处理器具有 Cortex-A35 和 Cortex-M4F 。在 A35 上运行 Linux 操作系统, M4F 通常运行一个实时擦操作系统例如 FreeRTOS 。 NXP 的 MCUxpresso SDK 提供了 Cortex-M4F 例程 , 能够帮助用户进行开发。 但 在 MCUxpresso SDK 中只提供了少量的外设操作演示 , 本文将介绍如何修改配置文件 , 并调用 FreeRTOS API 创建一个 SPI 例程 , 驱动 SPI 接口的 OLED 屏幕。 首先从 NXP 网站下载 MCUxpresso SDK 。根据所使用的模块 , 分别选择 Select Development Board → Processors → I.MX → 8QuadXPlus → MIMX8QXx → MIMX8QX5xxxDZ/MIMX8QX6xxxDZ , 最后点击 Build MCUXpresso SDK 即可下载。 在 SDK 安装目录的 boards/mekmimx8qx/rtos_examples/ 位置创建一个 freertos_lpspi 文件夹 , 里面工程文件可以从 freertos_lpuart 复制然后进行修改 , 我们也提供修改好的 例程 以便使用。主要修改的内容如下。 l pin_ mux.h 定义使用的引脚,包括输出调试信息的串口, LPSPI 以及两个 GPIO 用于 OLED 的复位和命令 / 数据选择。 --------------------------------------- /* ADC_IN2 (coord V32), M40_UART0_RX */ #define BOARD_INITPINS_M40_UART0_RX_PIN_FUNCTION_ID SC_P_SCU_GPIO0_00 /*!< Pin function id */ /* ADC_IN3 (coord V30), M40_UART0_TX */ #define BOARD_INITPINS_M40_UART0_TX_PIN_FUNCTION_ID SC_P_SCU_GPIO0_01 /*!< Pin function id */ #define BOARD_INITPINS_SPI2_MOSI_PIN_FUNCTION_ID SC_P_SPI2_SDO #define BOARD_INITPINS_SPI2_MISO_PIN_FUNCTION_ID SC_P_SPI2_SDI #define BOARD_INITPINS_SPI2_CLK_PIN_FUNCTION_ID SC_P_SPI2_SCK #define BOARD_INITPINS_SPI2_CS0_PIN_FUNCTION_ID SC_P_SPI2_CS0 #define BOARD_INITPINS_BB_UART2_TX_PIN_FUNCTION_ID SC_P_UART2_TX /* SODIMM21 GPIO1.IO23 OLED COMMAND/DATA SELECT*/ #define BOARD_INITPINS_BB_UART2_RX_PIN_FUNCTION_ID SC_P_UART2_RX /* SODIMM19 GPIO1.IO24 OLED RESET*/ --------------------------------------- l pin_mux.c 初始化上面定义的引脚,并配置复用关系。设置在 BOARD_InitPins 函数中完成。 --------------------------------------- void BOARD_InitPins(sc_ipc_t ipc) /*!< Function assigned for the core: Cortex-M4F */ { sc_err_t err = SC_ERR_NONE; err = sc_pad_set_all(ipc, BOARD_INITPINS_M40_UART0_RX_PIN_FUNCTION_ID, 2U, SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF, 0x0 ,SC_PAD_WAKEUP_OFF);/* IOMUXD_ADC_IN2 register modification value */ if (SC_ERR_NONE != err) { assert(false); } --------------------------------------- l freertos_lpspi.c 这里包括了对 LPSPI 的设置,以及通过 SPI 发送数据。 --------------------------------------- sc_pm_set_resource_power_mode(ipc, SC_R_SPI_2, SC_PM_PW_MODE_ON) --------------------------------------- 配置 LPSPI 的供电。 --------------------------------------- sc_pm_clock_enable(ipc, SC_R_SPI_2, SC_PM_CLK_PER, true, 0); if (CLOCK_SetIpFreq(kCLOCK_DMA_Lpspi2, SC_60MHZ) == 0) --------------------------------------- 设置 LPSPI 时钟源。 --------------------------------------- LPSPI_RTOS_Init(&handle, ADMA__LPSPI2, &lpspi_config, LPUART_CLK_FREQ) --------------------------------------- 完成对 LPSPI 工作状态配置,包括 SPI 时钟频率、相位、采样点、帧长等,这些包含在 lpspi_config 结构体中。 --------------------------------------- lpspi_master_config_t lpspi_config = { .baudRate = 6000000, .bitsPerFrame = 1024, /*!< Bits per frame, minimum 8, maximum 4096.*/ .cpol = kLPSPI_ClockPolarityActiveLow, .cpha = kLPSPI_ClockPhaseSecondEdge, .direction = kLPSPI_MsbFirst, .pcsToSckDelayInNanoSec = 50, .lastSckToPcsDelayInNanoSec = 50, .betweenTransferDelayInNanoSec = 50, .whichPcs = kLPSPI_Pcs0, .pcsActiveHighOrLow = kLPSPI_PcsActiveLow, .pinCfg = kLPSPI_SdiInSdoOut, .dataOutConfig = kLpspiDataOutRetained, }; --------------------------------------- 其中 bitsPerFrame 是指 SPI 的帧长,根据 SPI 设备实际数据输入要求需要做相应的更改,通常指令和数据的长度是不一样。例如在这个例程里多次调用 LPSPI_RTOS_Init 函数对其进行 调整。 --------------------------------------- LPSPI_RTOS_TransferBlocking(&handle, &spi_data) --------------------------------------- 该函数实现 SPI 数据发送。由于采用了阻塞的方式发送,需要等待数据传输完毕才推出函数。数据存储在 lpspi_transfer_t 格式的结构体中。其中也包含了 SPI 一些配置,例如使用哪个 CS 片选,是否连续发送等。 --------------------------------------- lpspi_transfer_t spi_data = { .txData = send_buffer, .rxData = recv_buffer, .dataSize = sizeof(send_buffer), .configFlags = kLPSPI_MasterPcs0 | kLPSPI_MasterPcsContinuous | kLPSPI_MasterByteSwap, }; --------------------------------------- 上面 SPI 相关 API 主要来自 devices/MIMX8QX6/drivers/fsl_lpspi_freertos.c , fsl_lpspi.c 。在默认的 fsl_lpspi_freertos.c 中只有非阻塞方式的 SPI 传输函数 LPSPI_RTOS_Transfer() 。因此在这里我们新构建一个阻塞方式的函数 LPSPI_RTOS_TransferBlocking() 。 --------------------------------------- status_t LPSPI_RTOS_TransferBlocking(lpspi_rtos_handle_t *handle, lpspi_transfer_t *transfer) { status_t status; base, transfer); if (status != kStatus_Success) { return status; } return status; } --------------------------------------- 在 fsl_lpspi_freertos.h 头文件中申明该函数。 --------------------------------------- status_t LPSPI_RTOS_TransferBlocking(lpspi_rtos_handle_t *handle, lpspi_transfer_t *transfer); --------------------------------------- 另外为了支持编译,在 devices/MIMX8QX6/drivers 目录中创建 driver_lpspi_freertos_MIMX8QX6.cmake 和 driver_lpspi_MIMX8QX6.cmake 两个文件。相应地在上面项目工程目录中的 boards/mekmimx8qx/rtos_examples/freertos_lpspi/armgcc/CMakeLists.txt 中将 LPSPI 的驱动添加进来。 --------------------------------------- # include modules include(driver_clock_MIMX8QX6) include(driver_lpspi_MIMX8QX6) include(driver_lpspi_freertos_MIMX8QX6) --------------------------------------- 到此我们已经完成 LPSPI 在 FreeRTOS 的配置以及创建一个工程项目来使用 LPSPI 发送数据。上面的操作 涉及 SDK 中多处修改,为了方便用户测试,我们也提供经修改的 整个 SDK 。 编译好后,在 U-Boot 中通过 tftp 下载 M4 固件并运行。 --------------------------------------- Colibri iMX8X # print m4boot_test m4boot_test=tftp ${loadaddr} m4_0.bin; dcache flush; bootaux ${loadaddr} 0 Colibri iMX8X # run m4boot_test --------------------------------------- OLED 屏幕显示如下。 总结 通过上面的内容介绍了如何在 M4 上使用默认例程之外的外设, SDK 中还提供了诸多外设的 FreeRTOS API 。用户可以使用类似的方法进行开发。
  • 热度 4
    2021-8-31 16:45
    2702 次阅读|
    1 个评论
    B y Toradex 秦海 1). 简介 NXP iMX8 系列 ARM 处理器是 NXP 近几年新发布的产品,架构均升级到了 64bit 的 ARMv8 ,其中包含了 iMX8 , iMX8x , iMX8M Mini , iMX8M Plus 等一系列处理器,其基本参数属性的对比可以参考下面来自于 NXP 官网的表格,而本文就从 CPU 核心、 GPU 核心、内存性能等几个方面对于 iMX8 系列的不同产品做一个简单对比测试供参考。需要注意的是 Benchmark 测试无法做到绝对完整客观,通常和软硬件系统配置以及所采用的 Benchmark 工具有很大的相关性,不同配置或工具可能得出不同结论,因此本文的测试只是基于本文测试环境以及所用 Benchmark 工具的参考数据。 本文 所采用的全部测试平台均来自于 Toradex iMX8 系列 ARM 核心板和对应载板。 2). 准备 a). Apalis iMX8QM 4 GB WB IT ARM 核心版配合 Ioxra 载板 ,连接调试串口 UART1 (载板 X2 2 )到开发主机方便调试。 b). Colibri iMX8QXP 2GB WB IT ARM 核心板配合 Colibri Evaluation Board 载板 ,连接调试串口 UART1 (载板 X2 7 )到开发主机方便调试。 c). Verdin iMX8M Mini Quad 2GB WB IT ARM 核心板配合 Verdin Development Board 载板,连接调试串口 UART1 (载板 X66 )到开发主机方便调试。 d). Verdin iMX8M Plus Quad 4GB WB IT ARM 核心板配合 Verdin Development Board 载板,连接调试串口 UART1 (载板 X66 )到开发主机方便调试。 3). 预设软件测试环境 a). 所有测试模块均更新为 Toradex Ycoto Linux Reference Multimedia Image 5.3.0 Quarterly 版本。 b ). 参考 这里 的说明在 Linux 下将所有测试模块的 CPU 核心工作模式设置为 ” performance ” ,也就是持续运行在最高主频。 ------------------------------- /sys/devices/system/cpu/ /cpufreq/scaling_governor ------------------------------- 4 ). CPU 单核性能对比测试 a ). 测试工具软件 nbench ,测试 Linux BSP 自带 b ). 测试方法 ------------------------------- ### 进入 /usr/bin 目录,因为测试需要 NNET.DAT 这个文件 $ cd /usr/bin ### 对于 Apalis iMX8QM ,分别测试 A72 核心和 A53 核心 $ taskset -c 4,5 nbench && taskset -c 0-3 nbench ### 对于其他模块 $ nbench ------------------------------- c ). 测试结果 ./ Apalis iMX8QM A72 ------------------------------- root@apalis-imx8:/usr/bin# taskset -c 4,5 nbench BYTEmark* Native Mode Benchmark ver. 2 (10/95) Index-split by Andrew D. Balsa (11/97) Linux/Unix* port by Uwe F. Mayer (12/96,11/97) TEST : Iterations/sec. : Old Index : New Index : : Pentium 90* : AMD K6/233* --------------------:------------------:-------------:------------ NUMERIC SORT : 695.3 : 17.83 : 5.86 STRING SORT : 345.36 : 154.32 : 23.89 BITFIELD : 2.2166e+08 : 38.02 : 7.94 FP EMULATION : 198.55 : 95.27 : 21.98 FOURIER : 47074 : 53.54 : 30.07 ASSIGNMENT : 23.827 : 90.67 : 23.52 IDEA : 6381.3 : 97.60 : 28.98 HUFFMAN : 1921.2 : 53.27 : 17.01 NEURAL NET : 19.353 : 31.09 : 13.08 LU DECOMPOSITION : 1125.2 : 58.29 : 42.09 ==========================ORIGINAL BYTEMARK RESULTS========================== INTEGER INDEX : 64.608 FLOATING-POINT INDEX: 45.949 Baseline (MSDOS*) : Pentium* 90, 256 KB L2-cache, Watcom* compiler 10.0 ------------------------------- ./ Apalis iMX8QM A53 ------------------------------- root@apalis-imx8:/usr/bin# taskset -c 0-3 nbench BYTEmark* Native Mode Benchmark ver. 2 (10/95) Index-split by Andrew D. Balsa (11/97) Linux/Unix* port by Uwe F. Mayer (12/96,11/97) TEST : Iterations/sec. : Old Index : New Index : : Pentium 90* : AMD K6/233* --------------------:------------------:-------------:------------ NUMERIC SORT : 432.04 : 11.08 : 3.64 STRING SORT : 142.03 : 63.46 : 9.82 BITFIELD : 1.8588e+08 : 31.88 : 6.66 FP EMULATION : 94.362 : 45.28 : 10.45 FOURIER : 19599 : 22.29 : 12.52 ASSIGNMENT : 11.424 : 43.47 : 11.28 IDEA : 2943.3 : 45.02 : 13.37 HUFFMAN : 998.72 : 27.69 : 8.84 NEURAL NET : 6.9556 : 11.17 : 4.70 LU DECOMPOSITION : 462.88 : 23.98 : 17.32 ==========================ORIGINAL BYTEMARK RESULTS========================== INTEGER INDEX : 34.226 FLOATING-POINT INDEX: 18.143 Baseline (MSDOS*) : Pentium* 90, 256 KB L2-cache, Watcom* compiler 10.0 ------------------------------- ./ Colibri iMX8X A35 ------------------------------- TEST : Iterations/sec. : Old Index : New Index : : Pentium 90* : AMD K6/233* --------------------:------------------:-------------:------------ NUMERIC SORT : 370.76 : 9.51 : 3.12 STRING SORT : 103.29 : 46.15 : 7.14 BITFIELD : 1.3321e+08 : 22.85 : 4.77 FP EMULATION : 70.273 : 33.72 : 7.78 FOURIER : 16962 : 19.29 : 10.83 ASSIGNMENT : 9.5353 : 36.28 : 9.41 IDEA : 2319.5 : 35.48 : 10.53 HUFFMAN : 814.55 : 22.59 : 7.21 NEURAL NET : 5.9326 : 9.53 : 4.01 LU DECOMPOSITION : 408.75 : 21.18 : 15.29 ==========================ORIGINAL BYTEMARK RESULTS========================== INTEGER INDEX : 26.762 FLOATING-POINT INDEX: 15.731 Baseline (MSDOS*) : Pentium* 90, 256 KB L2-cache, Watcom* compiler 10.0 ------------------------------- ./ Verdin iMX8M Mini A53 ------------------------------- TEST : Iterations/sec. : Old Index : New Index : : Pentium 90* : AMD K6/233* --------------------:------------------:-------------:------------ NUMERIC SORT : 576.19 : 14.78 : 4.85 STRING SORT : 189.54 : 84.69 : 13.11 BITFIELD : 2.4316e+08 : 41.71 : 8.71 FP EMULATION : 125.9 : 60.41 : 13.94 FOURIER : 26154 : 29.74 : 16.71 ASSIGNMENT : 15.263 : 58.08 : 15.06 IDEA : 3927 : 60.06 : 17.83 HUFFMAN : 1332.7 : 36.96 : 11.80 NEURAL NET : 9.2744 : 14.90 : 6.27 LU DECOMPOSITION : 621.37 : 32.19 : 23.24 ==========================ORIGINAL BYTEMARK RESULTS========================== INTEGER INDEX : 45.545 FLOATING-POINT INDEX: 24.252 Baseline (MSDOS*) : Pentium* 90, 256 KB L2-cache, Watcom* compiler 10.0 ------------------------------- ./ Verdin iMX8M Plus A53 ------------------------------- TEST : Iterations/sec. : Old Index : New Index : : Pentium 90* : AMD K6/233* --------------------:------------------:-------------:------------ NUMERIC SORT : 576.66 : 14.79 : 4.86 STRING SORT : 189.55 : 84.69 : 13.11 BITFIELD : 2.429e+08 : 41.67 : 8.70 FP EMULATION : 125.89 : 60.41 : 13.94 FOURIER : 26154 : 29.74 : 16.71 ASSIGNMENT : 15.209 : 57.87 : 15.01 IDEA : 3927.1 : 60.06 : 17.83 HUFFMAN : 1332.7 : 36.96 : 11.80 NEURAL NET : 9.2744 : 14.90 : 6.27 LU DECOMPOSITION : 615.61 : 31.89 : 23.03 ==========================ORIGINAL BYTEMARK RESULTS========================== INTEGER INDEX : 45.520 FLOATING-POINT INDEX: 24.177 Baseline (MSDOS*) : Pentium* 90, 256 KB L2-cache, Watcom* compiler 10.0 ------------------------------- d ). 测试结果图表展示 5 ). CPU 多核性能对比测试一 a ). 测试工具软件 7zip ,需通过 Ycoto 环境编译 ------------------------------- ### option-1 IPK package ### ### on compiling server $ bitbake p7zip $ scp deploy/ipk/aarch64/p7zip_16.02-r0_aarch64.ipk root@ :/home/root/ ### on target device $ cd /home/root && opkg install p7zip_16.02-r0_aarch64.ipk ### option-2 modify conf/local.conf to include 7zip into image IMAGE_INSTALL_append = " p7zip " ------------------------------- b ). 测试方法 ------------------------------- ### 为了将多核尽可能满负荷, benchmark threads 数量设置根据 memory 容量 1.5 或者 2 倍于设备 CPU 核心数 ### 对于 Apalis iMX8QM $ 7z b -mmt12 ### 对于其他模块 $ 7z b -mmt6 ------------------------------- c ). 测试结果 ./ Apalis iMX8 2xA72+4xA53 ------------------------------- root@apalis-imx8:~# 7z b -mmt12 7-Zip (a) 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=C,Utf16=off,HugeFiles=on,64 bits,6 CPUs LE) LE CPU Freq: - - - - - - - - - RAM size: 3713 MB, # CPU hardware threads: 6 RAM usage: 2647 MB, # Benchmark threads: 12 Compressing | Decompressing Dict Speed Usage R/U Rating | Speed Usage R/U Rating KiB/s % MIPS MIPS | KiB/s % MIPS MIPS 22: 4431 528 817 4311 | 85954 583 1257 7331 23: 4342 540 819 4424 | 84676 586 1251 7326 24: 4534 576 846 4876 | 83469 588 1246 7326 25: 4478 580 882 5114 | 82760 591 1247 7365 ---------------------------------- | ------------------------------ Avr: 556 841 4681 | 587 1250 7337 Tot: 571 1046 6009 ------------------------------- ./ Colibri iMX8X 4xA35 ------------------------------- root@colibri-imx8x:~# 7z b -mmt6 7-Zip (a) 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=C,Utf16=off,HugeFiles=on,64 bits,4 CPUs LE) LE CPU Freq: 64000000 - - - - - - - - RAM size: 1775 MB, # CPU hardware threads: 4 RAM usage: 1323 MB, # Benchmark threads: 6 Compressing | Decompressing Dict Speed Usage R/U Rating | Speed Usage R/U Rating KiB/s % MIPS MIPS | KiB/s % MIPS MIPS 22: 1885 362 506 1835 | 35207 359 837 3003 23: 1860 364 521 1896 | 36510 377 838 3159 24: 1890 378 538 2033 | 35043 368 836 3076 25: 1870 378 566 2136 | 33807 359 838 3009 ---------------------------------- | ------------------------------ Avr: 371 533 1975 | 366 837 3062 Tot: 368 685 2518 ------------------------------- ./ Verdin iMX8M Mini 4xA53 ------------------------------- root@verdin-imx8mm:~# 7z b -mmt6 7-Zip (a) 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=C,Utf16=off,HugeFiles=on,64 bits,4 CPUs LE) LE CPU Freq: - - - - - - - - - RAM size: 1982 MB, # CPU hardware threads: 4 RAM usage: 1323 MB, # Benchmark threads: 6 Compressing | Decompressing Dict Speed Usage R/U Rating | Speed Usage R/U Rating KiB/s % MIPS MIPS | KiB/s % MIPS MIPS 22: 2587 368 683 2517 | 62071 380 1393 5293 23: 2575 376 698 2624 | 58488 364 1389 5061 24: 2608 384 730 2805 | 56726 360 1384 4979 25: 2547 378 769 2908 | 56061 359 1390 4989 ---------------------------------- | ------------------------------ Avr: 377 720 2713 | 366 1389 5081 Tot: 371 1054 3897 ------------------------------- ./ Verdin iMX8M Plus 4xA53 ------------------------------- root@verdin-imx8mp:~# 7z b -mmt6 7-Zip (a) 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=C,Utf16=off,HugeFiles=on,64 bits,4 CPUs LE) LE CPU Freq: 64000000 - - 64000000 - 256000000 - - - RAM size: 3635 MB, # CPU hardware threads: 4 RAM usage: 1323 MB, # Benchmark threads: 6 Compressing | Decompressing Dict Speed Usage R/U Rating | Speed Usage R/U Rating KiB/s % MIPS MIPS | KiB/s % MIPS MIPS 22: 3100 377 801 3016 | 61989 371 1426 5286 23: 3035 375 824 3093 | 63639 386 1427 5507 24: 3035 379 862 3264 | 63178 389 1427 5545 25: 3004 377 910 3431 | 57788 360 1430 5143 ---------------------------------- | ------------------------------ Avr: 377 849 3201 | 376 1427 5370 Tot: 377 1138 4286 ------------------------------- d ). 测试结果图表展示 6 ). CPU 多核性能对比测试二 a ). 测试工具软件 smallpt ,需下载源码编译,详细的下载编译使用请参考 这里 b ). 测试方法 ------------------------------- ### 对于 Apalis iMX8QM $ taskset -c 0-5 time ./smallpt 100 ### 对于其他模块 $ taskset -c 0-3 time ./smallpt 100 ------------------------------- c ). 测试结果 ./ Apalis iMX8QM 2xA72+4xA53 ------------------------------- root@apalis-imx8:~# taskset -c 0-5 time ./smallpt 100 Rendering (100 spp) 100.00% real 1m 34.80s user 9m 23.44s sys 0m 0.03s ------------------------------- ./ Colibri iMX8X 4xA35 ------------------------------- root@colibri-imx8x-06748681:~# taskset -c 0-3 time ./smallpt 100 Rendering (100 spp) 100.00% real 3m 52.67s user 15m 18.40s sys 0m 0.13s ------------------------------- ./ Verdin iMX8M Mini 4xA53 ------------------------------- root@verdin-imx8mm:~# taskset -c 0-3 time ./smallpt 100 Rendering (100 spp) 100.00% real 2m 30.11s user 9m 56.64s sys 0m 0.06s ------------------------------- ./ Verdin iMX8M Plus A53 ------------------------------- root@verdin-imx8mp:~# taskset -c 0-3 time ./smallpt 100 Rendering (100 spp) 100.00% real 2m 30.05s user 9m 56.26s sys 0m 0.07s ------------------------------- d ). 测试结果图表展示 7 ). 内存性能 测试 a ). 测试工具软件 stream ,测试 Linux BSP 自带。另外 BSP 中还有其他内存测试工具,比如 tinymembench ,有兴趣的读者可以自行测试。 b ). 测试方法 ------------------------------- ### 对于 Apalis iMX8QM ,分别测试 A72 核心和 A53 核心 $ taskset -c 4-5 stream && taskset -c 0-3 stream ### 对于其他模块 $ taskset -c 0-3 stream ------------------------------- c ). 测试结果 ./ Apalis iMX8QM 2xA72 ------------------------------- root@apalis-imx8:~# taskset -c 4-5 stream STREAM copy latency: 2.60 nanoseconds STREAM copy bandwidth: 6159.37 MB/sec STREAM scale latency: 2.57 nanoseconds STREAM scale bandwidth: 6232.96 MB/sec STREAM add latency: 4.52 nanoseconds STREAM add bandwidth: 5312.67 MB/sec STREAM triad latency: 4.52 nanoseconds STREAM triad bandwidth: 5305.04 MB/sec ------------------------------- ./ Apalis iMX8QM 4xA53 ------------------------------- root@apalis-imx8:~# taskset -c 0-3 stream STREAM copy latency: 5.88 nanoseconds STREAM copy bandwidth: 2722.48 MB/sec STREAM scale latency: 7.44 nanoseconds STREAM scale bandwidth: 2149.96 MB/sec STREAM add latency: 13.36 nanoseconds STREAM add bandwidth: 1796.68 MB/sec STREAM triad latency: 15.41 nanoseconds STREAM triad bandwidth: 1557.53 MB/sec ------------------------------- ./ Colibri iMX8X 4xA35 ------------------------------- root@colibri-imx8x-06748681:~# taskset -c 0-3 stream STREAM copy latency: 5.94 nanoseconds STREAM copy bandwidth: 2695.42 MB/sec STREAM scale latency: 8.78 nanoseconds STREAM scale bandwidth: 1821.91 MB/sec STREAM add latency: 13.61 nanoseconds STREAM add bandwidth: 1763.93 MB/sec STREAM triad latency: 15.72 nanoseconds STREAM triad bandwidth: 1526.23 MB/sec ------------------------------- ./ Verdin iMX8M Mini 4xA53 ------------------------------- root@verdin-imx8mm:~# taskset -c 0-3 stream STREAM copy latency: 4.17 nanoseconds STREAM copy bandwidth: 3839.23 MB/sec STREAM scale latency: 5.46 nanoseconds STREAM scale bandwidth: 2928.26 MB/sec STREAM add latency: 9.13 nanoseconds STREAM add bandwidth: 2628.41 MB/sec STREAM triad latency: 10.70 nanoseconds STREAM triad bandwidth: 2242.15 MB/sec ------------------------------- ./ Verdin iMX8M Plus 4xA53 ------------------------------- root@verdin-imx8mp:~# taskset -c 0-3 stream STREAM copy latency: 3.06 nanoseconds STREAM copy bandwidth: 5226.20 MB/sec STREAM scale latency: 5.30 nanoseconds STREAM scale bandwidth: 3020.58 MB/sec STREAM add latency: 8.58 nanoseconds STREAM add bandwidth: 2797.53 MB/sec STREAM triad latency: 10.22 nanoseconds STREAM triad bandwidth: 2348.11 MB/sec ------------------------------- d ). 测试结果图表展示 8 ). GPU 性能 测试 a ). 测试工具软件 glmark2-es2-wayland ,测试 Linux BSP 自带。 Apalis iMX8/Colibr iiMX8X 连接 LVDS 液晶屏,分辨率为 1280x800; Verdin iMX8MM/iMX8MP 连接 HDMI 显示器,分辨率 1920x1080 。 b ). 测试方法 ------------------------------- ### 保证测试输出分辨率统一为 1280x800 ### ### Apalis iMX8/Colibri iMX8X $ glmark2-es2-wayland --fullscreen ### Verdin iMX8MM/iMX8MP $ glmark2-es2-wayland --size 1280x800 ------------------------------- c ). 测试结果 ./ Apalis iMX8QM 2x GC7000XSVX GPU ------------------------------- root@apalis-imx8:~# glmark2-es2-wayland --fullscreen EGL: Warning: No default display support on wayland ======================================================= glmark2 2017.07 ======================================================= OpenGL Information GL_VENDOR: Vivante Corporation GL_RENDERER: Vivante GC7000XSVX GL_VERSION: OpenGL ES 3.2 V6.4.3.p1.305572 ======================================================= ...... ======================================================= glmark2 Score: 1308 ======================================================= ------------------------------- ./ Colibri iMX8X 1x GC7000L GPU ------------------------------- root@colibri-imx8x-06748681:~# glmark2-es2-wayland --fullscreen EGL: Warning: No default display support on wayland ======================================================= glmark2 2017.07 ======================================================= OpenGL Information GL_VENDOR: Vivante Corporation GL_RENDERER: Vivante GC7000L GL_VERSION: OpenGL ES 3.1 V6.4.3.p1.305572 ======================================================= ...... ======================================================= glmark2 Score: 516 ======================================================= ------------------------------- ./ Verdin iMX8M Mini 1x GC7000NanoUltra GPU ------------------------------- root@verdin-imx8mm:~# glmark2-es2-wayland --size 1280x800 EGL: Warning: No default display support on wayland ======================================================= glmark2 2017.07 ======================================================= OpenGL Information GL_VENDOR: Vivante Corporation GL_RENDERER: Vivante GC7000NanoUltra GL_VERSION: OpenGL ES 2.0 V6.4.3.p1.305572 ======================================================= ...... ======================================================= glmark2 Score: 165 ======================================================= ------------------------------- ./ Verdin iMX8M Plus 1x GC7000UL GPU ------------------------------- root@verdin-imx8mp:~# glmark2-es2-wayland --size 1280x800 EGL: Warning: No default display support on wayland ======================================================= glmark2 2017.07 ======================================================= OpenGL Information GL_VENDOR: Vivante Corporation GL_RENDERER: Vivante GC7000UL GL_VERSION: OpenGL ES 3.1 V6.4.3.p1.305572 ======================================================= ...... ======================================================= glmark2 Score: 521 ======================================================= ------------------------------- d ). 测试结果图表展示 9 ). 总结 本文 从 CPU 、 GPU 、内存等几个方面简单对 NXP iMX 8 系列 嵌入式 ARM 处理器家族产品进行了一些 benchmark 测试,从结果可以看到 iMX8QM 各方面性能都是非常领先的; iMX8X 强调功耗性能比,非常均衡; iMX8M Mini 和 iMX8M Plus 在 CPU 方面基本相当, GPU 则是 iMX8M Plus 领先巨大,同时 iMX8M Plus 还拥有一个神经网络算法加速的 NPU 核心,综合下来 iMX8M Plus 性能还是好于 iMX8M Mini 。 参考文献 https://developer.toradex.c n /knowledge-base/board-support-package/openembedded-core https://developer.toradex.cn/knowledge-base/toradex-easy-installer-os-and-demo-images
  • 热度 13
    2021-7-5 17:04
    3136 次阅读|
    0 个评论
    B y Toradex 秦海 1). 简介 NXP iMX8 系列 ARM 处理器是 NXP 目前性能最强劲确也是架构最复杂的 ARM 处理器,和之前的 ARMv7 系列处理器比如 iMX6 系列不同,在 iMX8 系列芯片中 NXP 加入了 SCU 模块来管理芯片的启动和关键外设初始化(如 PMIC 、时钟等), iMX8QM 处理器的简单框图如下: SCU(System Control Unit) 的框图放大如下,其中包含一个基于 Cortex-M4 内核的 SCU CM4 Complex 模块,其运行的固件就是 SCFW ,还有一基于 Cortex-M0 内核的 SECO 模块,运行 SECO 固件,负责安全认证相关的工作。 本文 就简单介绍下 iMX8 处理器的启动流程,然后结合 来自于 Toradex Apalis iMX 8 的 ARM 嵌入式平台, 演示一下包含了 SCFW 以及 SECO 固件等的 boot container image 的编译流程。 2). 准备 a). Apalis iMX8QM 4 GB WB IT ARM 核心版配合 Ioxra 载板 ,连接调试串口 UART1 (载板 X2 2 )到开发主机方便调试。 3). NXP iMX8 启动流程 a). NXP iMX8 启动流程图如下所示,首先 SCU boot rom 代码加载启动,然后通过芯片的 SCU boot mode 相关管脚配置,来选择进入那种启动模式,一般要么是正常启动,要么是进入恢复模式,然后通过 SDP 模式启动。正常启动流程到最后,加载运行 Boot container image 来继续下一阶段启动。 b ). Boot container image 包含如下内容 ./ SCFW - 运行与 SCU M4 核心的 firmware ,用于启动管理和外设初始化等任务,可以进行定制修改。 ./ SECO FW - SECO firmware , NXP 只提供 binary 文件,负责启动过程中的一些 security 认证。 ./ Optional Coretex-M4 firmware, 由上面章节一的 iMX8 芯片框图可以看到 iMX8 支持 2x Cortex-M4 核心,那么运行与这些 M4 核心的固件可以一起集成到 boot container image 里面去,如果不需要或者可以后续通过 U-boot 加载,因此可选添加。 ./ Optional Cortex-A image ,运行于 Cortex-A 核心启动相关的 image ,主要包含 ATF(ARM Trusted Firmware) 和 U-boot image 。 c ). Boot container image 加载流程如下图,最后当 U-boot 运行后,就由 U-boot 控制进行正常的 Linux Kernel 和 Rootfs 加载流程了。 4 ). Boot Container Image 编译组装 a ). 本文以下编译流程都是基于当前 Toradex 最新 Linux BSP V5.3 版本操作,其他版本基本流程都是一致的,版本差异可以参考 这里 说明修改适配 b ). 首先获取 SECO firmware ---------------------------------- $ cd ~/workdir $ wget -c https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/imx-seco-3.8.1.bin $ chmod u+x imx-seco-3.8.1.bin $ ./imx-seco-3.8.1.bin $ ls imx-seco-3.8.1/firmware/seco/ commit-id.txt mx8dxla1-ahab-container.img mx8qxb0-ahab-container.img SECO_FW_release_note.pdf mx8dxla0-ahab-container.img mx8qmb0-ahab-container.img mx8qxc0-ahab-container.img ---------------------------------- 可以看到 SECO firmware binary 已经在 imx-seco-3.8.1/firmware/seco/ 目录下,针对不同的 iMX8 芯片选择不同的文件,本文测试使用的 iMX8QM 处理器对应的是 mx8qmb0-ahab-container.img 这个文件。 c ). 然后编译 SCFW . / 从 NXP 官网 下载 SCFW porting kit (需要有效的 NXP 账号登录),当前适用版本为 SCFW Porting Kit 1.7.3 ./ 解压到 build-scfw 目录 ---------------------------------- # ## create build-scfw folder for building $ cd ~/workdir $ mkdir build-scfw $ cd build-scfw # ## extract package $ tar xf imx-scfw-porting-kit-1.7.3.tar.gz $ cd packages/ $ chmod +x imx-scfw-porting-kit-1.7.3.bin $ ./imx-scfw-porting-kit-1.7.3.bin # ## deploy source code, corresponding to iMX8QM $ cd imx-scfw-porting-kit-1.7.3/src/ $ tar xf scfw_export_mx8qm_b0.tar.gz $ ls scfw_export_mx8qm_b0 bin build_mx8qm_b0 COPYING Makefile makefiles MANIFEST platform SCR-imx-scfw-porting-kit.txt ---------------------------------- ./ 查看当前 SCFW 版本号 /Commit ---------------------------------- $ cd ~/workdir/build-scfw/packages/imx-scfw-porting-kit-1.7.3/ $ $ cat VERSION NXP i.MX System Controller Firmware -------------------------------------------- Git repo: ssh://bitbucket.sw.nxp.com/imxpriv/imx-sc-firmware.git Branch name: imx_scfw_2020q4 Build version: 5222 Commit ID: bc122ee1 Build date: May 27 2021 Build time: 16:27:17 ---------------------------------- . / 将 Toradex Apalis iMX8QM 针对其核心板的相关修改部署到上述下载 NXP imx8qm SCFW 源代码中 ---------------------------------- $ cd build-scfw/ packages/imx-scfw-porting-kit-1.7.3/src $ git clone https://github.com/toradex/i.MX-System-Controller-Firmware.git $ cp -r i.MX-System-Controller-Firmware/src/scfw_export_mx8qm_b0/* /scfw_export_mx8qm_b0/ ---------------------------------- . / 可选 - 根据需要修改 SCFW 源代码 ---------------------------------- ### 参考文档位于 ../imx-scfw-porting-kit-1.7.3/doc/ ,有 HDML 和 PDF 两种格式文档 $ ls pdf/ sc_fw_api_dxl_a0.pdf sc_fw_api.pdf sc_fw_api_qm_b0.pdf sc_fw_api_qx_b0.pdf sc_fw_rn.pdf # ## 针对 Toradex Apalis iMX8 ,核心修改文件位于 ### build-scfw/packages/imx-scfw-porting-kit-1.7.3/src/scfw_export_mx8qm_b0/platform/board/mx8qm_apalis $ ls board.bom board.c board.h dcd Makefile ### dcd 目录主要存放 ram timing 配置文件,主要修改部分在 board.c 这个文件,这个文件的内容和修改请参考上述 sc_fw_port.pdf 文档说明,包含了从底层 CPU/RAM/ 时钟 /PMIC 初始化到外部资源分配的各方面 ### 比如常用的 SOC 资源在 SCU 、 Cortex-A 、 Cortex-M 核心直接的分配,可以参考文档的第六章节,通过 board.c 文件的 board_system_config() 函数来进行配置,当然也有其他 run-time 的 API 函数可用 void board_system_config(sc_bool_t early, sc_rm_pt_t pt_boot) { sc_err_t err = SC_ERR_NONE; /* This function configures the system. It usually partitions resources according to the system design. It must be modified by customers. Partitions should then be specified using the mkimage -p option. */ /* Note the configuration here is for NXP test purposes */ ...... /* Name default partitions */ PARTITION_NAME(SC_PT, "SCU"); PARTITION_NAME(SECO_PT, "SECO"); PARTITION_NAME(pt_boot, "BOOT"); /* Configure initial resource allocation (note additional allocation and assignments can be made by the SCFW clients at run-time */ ...... /* Create M4 0 partition */ if (rm_is_resource_avail(SC_R_M4_0_PID0) != SC_FALSE) { sc_rm_mr_t mr; /* List of resources */ 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 }; ...... ---------------------------------- . / 修改好源代码后,配置 toolchain 准备进行编译 ---------------------------------- ### 使用 GCC ARM 针对 Coretex-M 核心的 GNU-RM 最新版本即可,下载地址如下,当前针对 Linux X86_64 平台的最新版本为 gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads $ cd ~/workdir $ mkdir toolchain $ cd toolchain ### 解压下载的 toolchain 压缩包 $ tar xvf gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 $ ls gcc-arm-none-eabi-10-2020-q4-major arm-none-eabi bin lib share ### export 编译环境变量 $ export ARCH=arm $ export CROSS_COMPILE= ~/workdir /toolchain/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi- $ export PATH=$PATH: ~/workdir /toolchain/gcc-arm-none-eabi-10-2020-q4-major/bin ### 测试 toolchain $ arm-none-eabi-gcc --version arm-none-eabi-gcc (GNU Arm Embedded Toolchain 10-2020-q4-major) 10.2.1 20201103 (release) Copyright (C) 2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. . / SCFW 编译 ---------------------------------- $ cd ~/workdir /build-scfw/packages/imx-scfw-porting-kit-1.7.3/src/scfw_export_mx8qm_b0 $ make clean;make SOC=MX8QM B=apalis D=0 DL=0 R=b0 U=0 V=0 qm Generating platform/board/mx8qm_apalis/dcd/imx8_ramid1_dcd_1.6GHz.h ...... Linking build_mx8qm_b0/scfw_tcm.elf .... Objcopy build_mx8qm_b0/scfw_tcm.bin .... done. ### 关于编译的相关选项含义,可以通过 help 查看,比如 D 配置 debug 选项, U 配置 SCU 调试 UART $ make help Usage: make TARGET OPTIONS Targets: help : display help text clean : remove all build files dxl : build for i.MX8DXL die, output in build_mx8dxl qm : build for i.MX8QM die, output in build_mx8qm ...... Options: V=0 : quite output (default) V=1 : verbose output D=0 : configure for no debug D=1 : configure for debug (default) DL= : configure debug level (0-5) B= : configure board (default=val) U= : configure debug UART (default=0) DDR_CON= : specify DDR config file R= : silicon revision (default=A0) M=0 : no debug monitor (default) M=1 : include debug monitor LTO=0 : build without link-time optimization (default) LTO=1 : build with link-time optimization T= : run tests rather than boot next core ---------------------------------- . / 编译好生成的 SCFW 固件位于如下位置,后面打包 Boot Container Image 会需要 ---------------------------------- $ ls build_mx8qm_b0/scfw_tcm.bin ---------------------------------- 当然,如果你无需修改 Toradex SCFW 的默认配置,也可以从下面 github 上面直接下载 Toradex 编译好的 SCFW binary 固件文件 mx8qm-apalis-scfw-tcm.bin 后重命名为 scfw_tcm.bin ---------------------------------- $ wget https://github.com/toradex/i.MX-System-Controller-Firmware/blob/master/src/scfw_export_mx8qm_b0/build_mx8qm_b0/mx8qm-apalis-scfw-tcm.bin $ mv mx8qm-apalis-scfw-tcm.bin scfw_tcm.bin ---------------------------------- d). 编译 ATF ./ 获取 ATF 源代码 ------------------------------- $ cd ~/workdir $ git clone git://git.toradex.com/imx-atf.git -b toradex_imx_5.4.70_2.3.0 ------------------------------- ./ 参考 这里 说明配置编译 toolchain ,因为 ATF 运行与 Cortex-A 核心,因此和上面 SCFW 不同,需要使用 GCC ARM 针对 Coretx-A 核心的 GNU-A toolchain ,为了和 Ycoto 编译版本 Dunfell 对应,这里使用了 9.2 aarch64 64bit 版本。另外,请注意因为使用编译器和上述 SCFW 编译不同,因此要开一个新的 Terminal 窗口进行配合和后续编译。 ------------------------------- $ cd ~/workdi r/toolchain/ ### 解压下载的 toolchain 压缩包 $ tar xvf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz $ ls gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu 9.2-2019.12-x86_64-aarch64-none-linux-gnu-manifest.txt bin lib libexec aarch64-none-linux-gnu include lib64 share ### export 编译环境变量 $ export ARCH=arm $ export CROSS_COMPILE=aarch64-none-linux-gnu- $ export PATH=$PATH: ~/workdir /toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin ### 测试 toolchain $ aarch64-none-linux-gnu-gcc --version aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10)) 9.2.1 20191025 Copyright © 2019 Free Software Foundation, Inc. ...... ------------------------------- ./ 编译 ATF ------------------------------- $ cd ~/workdir / imx-atf $ make PLAT=imx8qm bl31 CC plat/imx/imx8qm/imx8qm_bl31_setup.c ...... LD build/imx8qm/release/bl31/bl31.elf BIN build/imx8qm/release/bl31.bin Built build/imx8qm/release/bl31.bin successfully OD build/imx8qm/release/bl31/bl31.dump ### 编译出 bl31.bin 再后续组装 Boot Container Image 中会需要 $ ls build/imx8qm/release/bl31.bin build/imx8qm/release/bl31.bin ------------------------------- e ). U-boot 编译 ./ 参考 这里 说明进行 U-boot 源代码下载以及编译,这个就是比较常规的 bootloader 修改编译过程了,针对 iMX8/iMX8X 平台,如果只是需要修改 U-boot ( SCFW 不做修改)的话也需要参考本文流程重新组装 Boot Container Image 文件后再进行部署。 ./ 下载对应 BSP 版本 U-boot 源代码 ------------------------------- $ cd ~/workdir $ git clone -b toradex_imx_v2020.04_5.4.70_2.3.0 git://git.toradex.c n /u-boot-toradex.git ------------------------------- ./ 编译 toolchain 及上一章节编译 ATF 同样 toolchain 配置,这里不再赘述。 ./ 编译,生成 u-boot.bin 用于后续 Boot Container Image 组装 ------------------------------- $ cd ~/workdir/u-boot-toradex $ make apalis-imx8_defconfig $ &1 | tee build.log $ ls u-boot.bin u-boot.bin ------------------------------- f ). Boot Container Image 组装 ./ 首先下载 imx-mkimage 工具 ------------------------------- $ cd ~/workdir/ $ git clone -b imx_5.4.70_2.3.0 https://source.codeaurora.org/external/imx/imx-mkimage/ ------------------------------- ./ 将上述章节准备好的 SECO 、 SCFW 、 ATF 、 U-boot binary 文件复制到 imx-mkimage 对应目录 ------------------------------- $ cd ~/workdir/imx-mkimage/ $ cp ~/workdir/ imx-seco-3.8.1/firmware/seco/mx8qmb0-ahab-container.img iMX8QM $ cp ~/workdir/build-scfw /.. /build_mx8qm_b0/scfw_tcm.bin iMX8QM $ cp ~/workdir/imx-atf/build/imx8qm/release/bl31.bin iMX8QM $ cp ~/workdir/u-boot-toradex/u-boot.bin iMX8QM ------------------------------- ./ 组装 Boot Container Image ,最终生成 flash.bin 文件 ------------------------------- $ make SOC=iMX8QM flash_b0 $ ls iMX8QM/flash.bin iMX8QM/flash.bin ------------------------------- 5 ). 部署 测试 a ). 从 这里 下载 Toradex Ycoto Linux BSP Multimedia Image Quarterly 5.2.0+build.7 版本,默认 image 通过 Toradex Easy Installer 安装后启动通过调试串口可以看到目前的 SCFW Commit ID ------------------------------- U-Boot 2020.04-5.2.0-devel+git.76fd4496a40b (Apr 07 2021 - 07:35:42 +0000) CPU: NXP i.MX8QM RevB A53 at 1200 MHz DRAM: 4 GiB MMC: FSL_SDHC: 0, FSL_SDHC: 1, FSL_SDHC: 2 Loading Environment from MMC... OK In: serial Out: serial Err: serial Model: Toradex Apalis iMX8 QuadMax 4GB Wi-Fi / BT IT V1.1B, Serial# 06738378 BuildInfo: - SCFW 0d54291f , SECO-FW d63fdb21, IMX-MKIMAGE 8947fea3, ATF 7f1187b - U-Boot 2020.04-5.2.0-devel+git.76fd4496a40b ------------------------------- b ). 用上述章节 4 生成的 flash.bin 文件替换掉刚才下载的 BSP 5.2.0 image 压缩包里面的 imx-boot 文件 ------------------------------- $ cd ~/workdir/ $ tar xvf Apalis-iMX8_Reference-Multimedia-Image-Tezi_5.2.0+build.7.tar $ cd Apalis-iMX8_Reference-Multimedia-Image-Tezi_5.2.0+build.7/ $ rm imx-boot $ cp imx-mkimage/ iMX8QM/flash.bin imx-boot ------------------------------- c ). 将上述修改后的 image 重新通过 Toradex Easy Installer 更新到 Apalis iMX8 模块后,启动查看 SCFW Commit ID 是否和之前 SCFW 编译章节查看到的 Commit 一致,如一致说明编译部署成功。 ------------------------------- U-Boot 2020.04-06904-g7f3416a28c (Jul 05 2021 - 15:43:42 +0800) CPU: NXP i.MX8QM RevB A53 at 1200 MHz DRAM: 4 GiB MMC: FSL_SDHC: 0, FSL_SDHC: 1, FSL_SDHC: 2 Loading Environment from MMC... OK In: serial Out: serial Err: serial Model: Toradex Apalis iMX8 QuadMax 4GB Wi-Fi / BT IT V1.1B, Serial# 06738378 BuildInfo: - SCFW bc122ee1 , SECO-FW d63fdb21, IMX-MKIMAGE 8947fea3, ATF - U-Boot 2020.04-06904-g7f3416a28c ------------------------------- 6 ). 总结 本文基于 NXP iMX 8 嵌入式平台 简单介绍了 NXP iMX8/iMX8X 新一代 iMX 处理器的启动流程,以及 SCFW 、 ATF 、 U-boot 的编译和 Boot Container Image 的组装供参考,而 NXP 另外一个 iMX8M Mini/Plus 系列是不包含 SCU 的,但是还是需要一个包含 DDR timing 、 ATF 、 SPL 、 U-boot 等的 Boot Container Image ,详细编译可以参考 这里 说明。 参考文献 https://www.nxp.com.cn/docs/en/application-note/AN13275.pdf https://developer.toradex.com/knowledge-base/build-custom-imx-88x-system-controller-firmware-scfw https://developer.toradex.cn/knowledge-base/build-u-boot-and-linux-kernel-from-source-code
  • 热度 5
    2020-12-31 12:08
    2885 次阅读|
    2 个评论
    By Toradex秦海 1). 简介 随着嵌入式设备的发展,由于部署更灵活应用方便等特性,原本在网络应用中广泛使用的docker技术也慢慢在一些嵌入式设备中应用,因此本文就基于嵌入式ARM平台使用集成docker技术的Liinux系统来测试CAN通信功能。 本文所演示的平台来自于Toradex Colibri iMX8X ARM嵌入式平台,这是一个基于NXP iMX8X ARM处理器,支持Cortex-A35和Coretex-M4架构的计算机模块平台。 2. 准备 a).Colibri iMX8X 2GB WB ITARM核心版配合Colibri Evaluation载板,连接调试串口UART1(载板X27)到开发主机方便调试。 b). Colibri iMX8X通过Toradex Easy Installer安装包含Docker支持的Torizon Linux操作系统,目前最新的monthly发布TorizonCore 5.1.0-devel-202012+build.6 c).Apalis iMX8QM4GB WB IT ARM核心版配合Ioxra载板,连接调试串口UART1(载板X22)到开发主机方便调试。 d). Apalis iMX8QM同样通过Toradex Easy Installer安装标准嵌入式Linux用于CAN接口测试时候对接,系统版本为Linux Reference Multimedia 5.1.0-devel-202012 3). 测试系统配置 a). Colibri iMX8X CAN接口对应管脚说明如下,本文测试使用FlexCAN1接口 ​ b).测试系统如下硬件连接将Colibri iMX8X CAN1和Apalis iMX8QM CAN0接口进行连接 ./ Colibri Eva Board JP4和JP5跳线断开,将X9连接器SODIMM_55和SODIMM_63管脚分别连接到X38连接器TX和RX插座。 ./ Colibri Eva Board X2 Top DB9管脚2和7通过两端均配置120Ohm终端电阻的连线和Ixora载板X20管脚1和2连接。 c). Colibri iMX8X TorizonCore linux系统默认使能的是Colibri Evaluation Board载板上面的MCP2515 SPI CAN接口,需要通过如下device tree overlay配置修改为iMX8X的两个FlexCAN接口 ./ device tree overlay的基本说明请参考这里,编译方法请参考这里。 ./ overlay源文件请参考如下链接 https://gitee.com/simonqin09/colibri_imx8x_flexcan/blob/master/colibri-imx8x_enable_flexcan_overlay.dts ./将上述源文件编译好的overlay文件(可以从这里下载)根据这里的说明部署到Colibri iMX8X上 4). 部署 CAN 测试 Docker image a).首先参考这里的说明在开发PC上面配置Docker编译环境 b).在开发PC创建如下Dockerfile用于进行CAN测试 ------------------------------- ARG IMAGE_ARCH=arm64v8 # Use the parameter below for Arm 32 bits (like iMX6 and iMX7) # ARG IMAGE_ARCH=arm32v7 FROM torizon/$IMAGE_ARCH-debian-shell:1.0 WORKDIR /home/torizon RUN apt-get -y update && apt-get install -y \ nano \ python3 \ python3-pip \ python3-setuptools \ git \ iproute2 \ can-utils \ net-tools \ vim \ python3-can \ && apt-get clean && apt-get autoremove && rm -rf /var/lib/apt/lists/* ------------------------------- c).如下编译并打包成离线Docker image文件,当然也可以上传到dockerhub上面通过在线的方式在设备安装 ------------------------------- $ docker build -t can-test-torizon . $ docker save -o can-test-torizon.tar can-test-torizon ------------------------------- e).将上面打包好的docker image复制到Colibri iMX8x设备上面,并安装并运行 ------------------------------- ### load docker image $ docker load -i can-test-torizon.tar ### check docker image $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE can-test-torizon latest 3f1a2122de1c 10 minutes ago 236MB ### run docker image $ docker run -it --rm --name=can-test-torizon --net=host --cap-add="NET_ADMIN" -v /dev:/dev -v /tmp:/tmp -v /run/udev/:/run/udev/ can-test-torizon ------------------------------- 5). CAN 通讯测试 a).在上述Colibri iMX8x启动的docker image里面使能can1接口 ------------------------------- ### set can1 interface up /home/torizon# ip link set can1 type can bitrate 1000000 /home/torizon# ip link set can1 up ### check can1 interface /home/torizon# ifconfig can1 can1: flags=193 mtu 16 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (UNSPEC) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 69 ------------------------------- b).继续在docker image里面创建如下”can-test.sh”脚本用于间隔50ms连续发送CAN标准包 ------------------------------- #!/bin/bash for ((i=1; i<=20; i++)) do cansend can1 01F#1122334455667788 sleep 0.05 done ------------------------------- c).在Apalis iMX8QM Linux下运行下面命令使能can0接口并准备进行CAN包接收 ------------------------------- root@apalis-imx8:~# ip link set can0 type can bitrate 1000000 root@apalis-imx8:~# ip link set can0 up root@apalis-imx8:~# candump can0 ------------------------------- d).在colibri imx8x docker内执行上面创建的脚本发送CAN包 ------------------------------- /home/torizon# chmod +x can-test.sh /home/torizon# ./can-test.sh ------------------------------- e). Apalis iMX8QM接收到对应的CAN包 ------------------------------- root@apalis-imx8:~# candump can0 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 can0 01F 11 22 33 44 55 66 77 88 ------------------------------- f).将发送和接收互换后测试也同样结果 ------------------------------- ### Apalis iMX8QM发送 root@apalis-imx8:~# ./can-test.sh ### Colibri iMX8x接收 /home/torizon# candump can1 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 can1 01F 11 22 33 44 55 66 77 88 ------------------------------- 6). 总结 本文使用NXP iMX8X嵌入式平台配合嵌入式Linux和Docker平台测试CAN通信,相比原生CAN通信,利用Docker技术可以更灵活的用包管理方式安装所需的组件,同时在不同平台迁移也相对更简单,但需要注意的是在Docker环境下访问主机外设需要对cgroup权限做正确的设置以保证可以顺利加载。