tag 标签: Rpmsg

相关博文
  • 2025-3-21 10:51
    490 次阅读|
    0 个评论
    B y Toradex 胡珊逢 简介 Apalis iMX8QM 使用了 NXP 的 iMX8 Quad Max 处理器。该 CPU 提供 A72 和 A53 Application Processor 和 M4 MCU。文章将介绍如何在硬件层面上隔离 AP 和 MCU 的资源,从而提高系统的可靠性。 System Controller Unit (SCU)System Controller Unit 是 iMX8 Quad Max 处理器上的一个专用 M4 核,连接 PMIC 和控制处理器上的子系统,为处理器的硬件功能提供抽象接口,供子系统使用。其主要管理以下功能和资源: 系统初始化与启动系统控制器通信电源管理资源管理引脚配置定时器中断处理 默认情况下,AP 核和 M4 核均能够使用 Apalis iMX8QM 的所有资源,包括 DDR RAM。SCU 可以通过分区 partition 的方式,将 AP 和 M4 之间,以及两个 M4 核之间所使用的资源从硬件上隔离开。一个分区中除了处理器核心外,还可以有外设、引脚 Pads 和内存区域。处理器核只能访问位于同一个分区内的资源。如果尝试访问其他分区的资源,则会返回总线错误。 当 AP 核和 M4 核在同一个分区时,AP 上的 Linux 虽然可以通过 reserved memory 方式不去使用相关 RAM 区域,但是直接物理地址访问的方式仍起作用。这对于 M4 端也是如此。使用 SCU 的分区,可以从底层规避该问题。除此之外,AP 和 M4 使用独立 Power Domain,在隔离分区情况下,对于 M4 的实时关键任务和 AP 上基于富操作系统 Linux 的应用独立运行提供可能。 在刚启动时,系统会划分三个分区。 SCU:包含所有运行 SCFW 固件所需的 Pads、外设和内存区域SECO:Security Controller 运行所需的相关资源Boot:系统剩余的所有资源如 Pads、外设和内存区域都将会划分到该分区 当系统继续启动时,如果不做进一步的分区,默认情况下 AP 和 M4 核都将运行在 Boot 分区中,它们之间只能通过软件的方式隔离各自的资源。为了实现 AP 和 M4 之间的硬件隔离,可以采用下面分区。 AP0:拥有运行 U-boot,Linux 的分区MCU0 和 MCU1:两个 Cortex-M4 核各自运行的分区Shared:共享资源的分区,例如将一段用于 rpmsg 通信的 RAM 区域划分到其中,AP 和 M4 就能够相互发送消息 分区的创建和资源划分在 SCU 的固件 SCFW 中调整。 SCU 固件 SCFW SCFW 的下载和编译方法参考 Build Custom i.MX 8/8X System Controller Firmware (SCFW) 。接下来将针对上面使用 AP0、MCU0、MCU1 和 Shared 分区案例进行说明。按照上面方法下载的 SCFW 源码中,mx8qm_apalis/board.c 已经包含上面分区的实现代码,所以无需额外的修改。在组装 Boot Container 时传入特定的 Flags 值可以启用。 在 platform/board/mx8qm_apalis/board.c 中配置分区和资源。宏定义 PARTITION_NAME 命令系统启动时的设置三个分区名字。 PARTITION_NAME (SC_PT, "SCU"); PARTITION_NAME (SECO_PT, "SECO"); PARTITION_NAME (pt_boot, "BOOT"); 检测标志位判断是否需要创建 AP0、MCU0、MCU1 和 Shared 分区。 if (alt_config != SC_FALSE) { 在需要进行分区时,PARTITION_NAME 设置相应分区的名称。 PARTITION_NAME (pt_boot, "AP0"); ... PARTITION_NAME (pt_m4_0, "MCU0"); ... PARTITION_NAME (pt_m4_1, "MCU1"); ... PARTITION_NAME (pt, "Shared"); 这里以 MCU0 分区为例, rsrc_list 中包含了划分到 MCU0 分区的资源,如 M4 中断、Message Unit、定时器等。 static const sc_rsrc_t rsrc_list = { SC_R_SYSTEM, SC_R_IRQSTR_M4_0, SC_R_MU_5B, SC_R_MU_7A, SC_R_MU_8B, SC_R_GPT_4, SC_R_SECO_MU_4 }; pad_list 中包含 MCU0 分区所使用的引脚范围。 static const sc_pad_t pad_list = { RM_RANGE (SC_P_M40_I2C0_SCL, SC_P_M40_GPIO0_01) }; 结合 sc_fw_api_qm_b0.pdf 文档,index 7~10 的引脚都将在划分到 MCU0 分区。 sc_rm_mem_list_t 配置了包括 RAM 在内的可使用存储空间。 static const sc_rm_mem_list_t mem_list = { {0x088000000ULL, 0x0887FFFFFULL}, {0x008081000ULL, 0x008180FFFULL} }; rm_partition_create 使用上面配置的所有资源创建 MCU0 分区。 BRD_ERR (rm_partition_create(pt_boot, pt_m4_0, SC_FALSE, SC_TRUE, SC_FALSE, SC_TRUE, SC_FALSE, SC_R_M4_0_PID0, rsrc_list, ARRAY_SIZE(rsrc_list), pad_list, ARRAY_SIZE (pad_list), mem_list, ARRAY_SIZE (mem_list))); 组装 Boot Container NXP i.MX 8QuadMax 处理器使用前面提到的 SCU 来启动系统。启动时除了加载 SCFW,它还可以加载 ATF 和 U-Boot,以及直接加载 M4 核的固件。Boot Container 组装方法参考 Specifics: Build U-Boot for NXP i.MX 8/8X-based SoMs 。默认情况下,如网页描述,使用下面命令组装 Boot Container。该方法生成的 flash.bin 文件中并不包含 M4 核的固件,并且 AP 和 M4 在同一个分区。M4 的固件在 U-Boot 启动时,使用 bootaux 命令从 eMMC 上加载后运行。 make SOC=iMX8QM flash_b0 为了使用上面 SCFW 中划分的分区,使用下面命令组装 Boot Container。 make SOC=iMX8QM flash_regression_linux_m4 编译目标来自 imx-mkimage/iMX8QM/soc.mak 中的定义。flash_regression_linux_m4: $(MKIMG) $(AHAB_IMG) \ scfw_tcm. bin u-boot-atf. bin m4_image. bin m4_1_image. bin \ ./$( MKIMG ) -soc QM -rev B0 -append $( AHAB_IMG ) \ -c -flags 0x00200000 -scfw scfw_tcm.bin \ -ap u-boot-atf.bin a53 0x80000000 \ -p3 -m4 m4_image. bin 0 0x34FE0000 \ -p4 -m4 m4_1_image. bin 1 0x38FE0000 \ - out flash.bin -flags 0x00200000 向 SCFW 的 board.c 传递,SCU 在启动时将会创建 AP0、MCU0、MCU1 和 Shared 的分区。 if (alt_config != SC_FALSE) { sc_fw_port.pdf 中说明了 Bit 21 SCFW_SC_BD_FLAGS_ALT_CONFIG 为更改 SCFW 配置的位,对应 0x00200000。 上面命令中 m4_image.bin 和 m4_1_image.bin 为两个 M4 各自的固件,从各自的 TCML 运行。因此,在执行上面命令前,需要把两个 M4 的固件复制到 imx-mkimage/iMX8QM 目录下。 如下修改 U-boot 源码中 U-boot/cmd/booti.c,重新编译后将 u-boot.bin 复制到 imx-mkimage/iMX8QM 目录下。 if (dest gd - ram_base || dest gd - ram_top) { puts ( "kernel_comp_addr_r is outside of DRAM range!\n" ); //return -EINVAL; } Linux device tree 更新 接下来的演示中,我们在 M4 上使用 multicore_examples/rpmsg_lite_pingpong_rtos 作为演示,在 AP 上的 Linux 系统中也需要开启 rpmsg 节点并加载驱动。针对 Apalis iMX8 BSP 7 的 imx8qm-apalis-v1.1-ixora-v1.2.dtb 需要打 该补丁 。 更新 Boot Container 文件 上面命令执行成功后生成的 flash.bin,需要更新到 Apalis iMX8 模块上的 eMMC 上。对于使用 Toradex Easy Installer 进行批量烧写或者重装系统,可以将 flash.bin 重名为 imx-boot,替换原来的烧录文件中 imx-boot。在开发期间,使用 U-Boot 直接更新 flash.bin 会更加方便,免于重装整个系统镜像。 将 flash.bin 复制到的一台 TFTP 服务器的下载目录中。然后在 U-Boot 中配置 Apalis iMX8 和 TFTP 服务器 IP 地址。 Apalis iMX8 # setenv ipaddr 192.168.3.181 Apalis iMX8 # setenv serverip 192.168.3.196 Apalis iMX8 # saveenv 使用 tftpboot 和 mmc 命令将 flash.bin 下载并写入到 eMMC 上。 mmc write $loadaddr 0 0x973 中最后的数值是写入的 block 数量。tftpboot 在下载时会显示文件大小,例如这里为 1238016 字节。需要写入的 block = (1238016+511)/512,计算结果向上取整,并转为十六进制数值。 Apalis iMX8 # tftpboot $loadaddr flash.bin Using ethernet @5b040000 device TFTP from server 192.168.3.196 ; our IP address is 192.168.3.181 Filename 'flash.bin' . Load address : 0 x95400000 Loading: ################################################## 1.2 MiB 3.4 MiB/s done Bytes transferred = 1238016 ( 12 e400 hex) Apalis iMX8 # mmc dev 0 1 Apalis iMX8 # mmc write $loadaddr 0 0x973 测试 在 U-Boot 中配置启动时加载的 device tree 文件。 Apalis iMX8 # setenv fdtfile imx8qm-apalis-v1.1-ixora-v1.2.dtbApalis iMX8 # saveenvApalis iMX8 # reset 启动后可以在 Linux 和两个 M4 的调试串口上看到启动内容。 Linux 中进入 kernel modules 驱动目录 kernel/drivers/rpmsg,加载 imx_rpmsg_pingpong.ko。两个 M4 上的固件在发现 rpmsg 通道后,自动向 Linux 发送消息。 # insmod imx_rpmsg_pingpong .ko ... get 91 ( src : 0 x1f) get 101 ( src : 0 x1e) imx_rpmsg_pingpong virtio1 .rpmsg-openamp-demo-channel .-1 .30 : goodbye ! get 93 ( src : 0 x1f) get 95 ( src : 0 x1f) get 97 ( src : 0 x1f) get 99 ( src : 0 x1f) get 101 ( src : 0 x1f) imx_rpmsg_pingpong virtio3 .rpmsg-openamp-demo-channel-1 .-1 .31 : goodbye ! 总结 文章介绍了如何使用 SCU 划分不同的分区,将 AP 和 M4 之间做硬件隔离,并使用 SCFW 直接加载 M4 的固件,不仅提高系统可靠性,也将 M4 运行提前到 U-Boot 之前,加快启动速度。更多关于 SCU 的高级高级功能,可以参考 SCFW 的说明文档。 ​
  • 热度 17
    2020-6-10 16:59
    2342 次阅读|
    0 个评论
    By Toradex 秦海 1). 简介 NXP iMX8 是 NXP 去年底发布的基于 Cortex-A72/A53 和 Coretex-M4 异构多核架构的 ARM 处理器,作为 NXP i.MX 系列最新性能也最为强大的处理器,升级了从 iMX6 SoloX 开始到 iMX7 的异构双核架构(如下框图),使得不同架构核心的使用更加方便稳定,本文就演示 iMX8 Cortex-A 和 Coretx-M 核心之间通过 Rpmsg 来进行通讯的示例。 本文所演示的 ARM 平台来自于 Toradex 基于 NXP iMX8QM ARM 处理器的 Apalis iMX8QM ARM 嵌入式平台。 2). 准备 a).Apalis iMX8QMARM 核心版配合 Apalis Evaluation Board 载板 ,连接调试串口 UART1 (载板 X29 )到开发主机方便调试。 b). Apalis iMX8 M40 和 M41 分别使用独立的调试 UART ,在 Apalis Evaluation Board 进行跳线将 M4 对应的调试 UART 连接到开发主机的方式请参考 这里 。 c). Apalis iMX8 Cortex-A 核心安装 Toradex Ycoto Linux Console image V3.04 版本,详细信息请参考 这里 。 d). 由于 M4s 调试 UART 所用到的管脚和 Cortex-A 核心 Linux 系统 device tree 中管脚配置有冲突,需要修改 device tree 并重新编译部署 ./ device tree 修改 patch 文件请参考如下,下载 Linux kernel 源代码以及编译部署方法请参考 这里 。 https://github.com/simonqin09/Apalis_iMX8_M4_Rpmsg/blob/master/apalis_imx8_m4s_uart.patch 3). M4 FreeRTOS SDK 部署 a). 根据这里的说明从 NXP MCUXpresso 网站下载对应 iMX8QM 的 SDK ,当前的最新版本为 2.5.2 。下载界面如下图所示,在这个页面同时也可以下载到关于 SDK 的一些说明文档。下载好的 SDK 文件为 ”SDK_2.5.2_MIMX8QM6xxxFF.tar.gz” b). 下载 Toolchain ./ 根据 SDK 文档建议使用 gcc-arm 7 2018q2 版本,下载地址如下: https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads/7-2018-q2-update ./ 解压下载好的 Toolchain 文件到 ----------------------------------- # 解压 $ cd $ tar xvf gcc-arm-none-eabi-7-2018-q2-update-linux.tar.bz2 # 测试 $ gcc-arm-none-eabi-7-2018-q2-update/bin/arm-none-eabi-gcc --version arm-none-eabi-gcc (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) Copyright (C) 2017 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. # 可能需要安装额外的工具供后续编译使用,以 Ubuntu 为例 $ sudo apt-get install make cmake ----------------------------------- c). 编译 Helloworld 测试应用 ./ 解压步骤 a 下载的 SDK 文件到 ----------------------------------- $ cd $ tar xvf SDK_2.5.2_MIMX8QM6xxxFF.tar.gz ----------------------------------- ./ 导出 toolchain 路径 ----------------------------------- $ export ARMGCC_DIR= /gcc-arm-none-eabi-7-2018-q2-update/ ----------------------------------- ./ 编译 M40 Helloworld 应用 ----------------------------------- # SDK 中包含的示例代码均在 /boards/mekmimx8qm/ 目录 # M40 Helloworld demo 编译 $ cd /boards/mekmimx8qm/demo_apps/hello_world/cm4_core0 $ armgcc/build_all.sh ----------------------------------- ./ 编译好的二进制文件位于 armgcc 目录下的 debug/release 、 ddr_debug/ddr_release 、 flash_debug/flash_release 目录。默认 M4 应用从 TCM 加载, ddr 和 flash 分别对应 ddr 和 flash 加载模式,本文不做讨论。另外, Apalis iMX8 的 memory 区域分配请参考 这里 。 d). 部署测试 M40 Helloworld 示例应用 ./ 由于目前 Apalis iMX8 uboot 版本( U-Boot 2018.03-toradex_imx_v2018.03_4.14.78_1.0.0_ga-bringup+g92d0497781 )暂时还不支持 ELF 格式镜像,因此我们将生成的二进制文件 m4_image.bin 复制到 FAT32 分区的 SD 卡根目录,然后将 SD 卡连接到 Apalis Evaluation Board X19 4bit SD 卡插槽 ----------------------------------- # Apalis iMX8 上电开机, Cortex-A 核心调试串口 UART1 串口终端按住空格键进入 uboot U-Boot 2018.03-toradex_imx_v2018.03_4.14.98_2.3.0_bringup+gd626574ba1 (Apr 17 2020 - 19:28:04 +0000) CPU: Freescale i.MX8QM revB A53 at 1200 MHz at 25C 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.0B, Serial# 06548514 BuildInfo: - SCFW b929edfe, SECO-FW 27167ff2, IMX-MKIMAGE d7f9440d, ATF bb209a0 - U-Boot 2018.03-toradex_imx_v2018.03_4.14.98_2.3.0_bringup+gd626574ba1 switch to partitions #0, OK mmc0(part 0) is current device flash target is MMC:0 Net: eth0: ethernet@5b040000 Fastboot: Normal Normal Boot Hit any key to stop autoboot: 0 Apalis iMX8 # # 查看 SD 卡 image Apalis iMX8 # ls mmc 2 … # 加载 Helloworld 程序并运行 Apalis iMX8 # fatload mmc 2 ${loadaddr} m4_image.bin && dcache flush && bootaux ${loadaddr} 0 9032 bytes read in 20 ms (440.4 KiB/s) ## Starting auxiliary core at 0x80280000 ... Power on M4 and MU Copy M4 image from 0x80280000 to TCML 0x34fe0000 Start M4 0 bootaux complete ----------------------------------- ./ 运行后,在 M40 调试 UART 对应的串口终端可以看到 ”hello world” 打印输出,然后应用程序可以接收并打印键盘输入,比如这里输入了 ” this is input before linux boot up” 字符串。 ----------------------------------- hello world. this is input before linux boot up ----------------------------------- ./ 此时切换到 UART1 调试串口终端,执行下面命令继续启动 Linux ----------------------------------- Apalis iMX8 # run bootcmd ----------------------------------- ./ 再切换到 M40 调试串口终端,键盘输入测试 ----------------------------------- hello world. this is input before linux boot up this is input after linux boot up ----------------------------------- ./ 对于 M41 ,操作方式类似,只是加载的时候将将命令最后 0 替换为 1 ----------------------------------- Apalis iMX8 # fatload mmc 2 ${loadaddr} m4_1_image.bin && dcache flush && bootaux ${loadaddr} 1 ----------------------------------- 4). M4 FreeRTOS Rpmsg 示例程序测试 a). 根据章节三同样的方法编译 M40/M41 Rpmsg 示例程序,分为两个: ./ rpmsg_lite_str_echo_rtos /boards/mekmimx8qm/multicore_examples/rpmsg_lite_str_echo_rtos ./ rpmsg_lite_pingpong_rtos /boards/mekmimx8qm/multicore_examples/rpmsg_lite_pingpong_rtos/linux_remote ./ 相关 demo 的说明请参考对应项目下的 readme.txt 文件,因为 M40 和 M41 的测试结果都一致,本文下面就只用 M40 做演示示例 b). str_echo 示例程序测试 ./ 使用章节 3 测试中同样方法从 SD 卡加载 str_echo 示例程序 “m4_image.bin” 执行 ----------------------------------- # UART1 调试串口终端 Apalis iMX8 # fatload mmc 2 ${loadaddr} m4_image.bin && dcache flush && bootaux ${loadaddr} 0 20112 bytes read in 21 ms (934.6 KiB/s) ## Starting auxiliary core at 0x80280000 ... Power on M4 and MU Copy M4 image from 0x80280000 to TCML 0x34fe0000 Start M4 0 bootaux complete ----------------------------------- ./ M40 调试串口终端输出 ----------------------------------- RPMSG String Echo FreeRTOS RTOS API Demo... ----------------------------------- ./ 启动 linux ----------------------------------- # UART1 调试串口终端 Apalis iMX8 # run bootcmd ----------------------------------- ./ M40 调试串口终端输出 ----------------------------------- RPMSG String Echo FreeRTOS RTOS API Demo... Nameservice sent, ready for incoming messages... ----------------------------------- ./ 加载 Linux 下 Rpmsg tty 驱动建立 rpmsg 链接 ----------------------------------- # UART1 调试串口终端 root@apalis-imx8:~# modprobe imx_rpmsg_tty 0x1e! Install rpmsg tty driver! ----------------------------------- ./ M40 调试串口终端输出 ----------------------------------- RPMSG String Echo FreeRTOS RTOS API Demo... Nameservice sent, ready for incoming messages... Get Message From Master Side : "hello world!" ----------------------------------- ./ 发送数据测试,如果是 M41 ,则对应虚拟串口为 /dev/ttyRPMSG31 ----------------------------------- /dev/ttyRPMSG30 ----------------------------------- ./ M40 调试串口终端输出 ----------------------------------- RPMSG String Echo FreeRTOS RTOS API Demo... Nameservice sent, ready for incoming messages... Get Message From Master Side : "hello world!" Get Message From Master Side : "this is a test from toradex" Get New Line From Master Side ----------------------------------- c). pingpong 示例程序测试,测试流程和 str_echo 基本一致,这里简单罗列对应串口打印输出 ./ UART1 调试串口终端 ----------------------------------- # 在 M41 上运行 Rpmsg pingpong 示例程序 Apalis iMX8 # fatload mmc 2 ${loadaddr} m4_image_pingpong.bin && dcache flush && bootaux ${loadaddr} 0 20696 bytes read in 21 ms (961.9 KiB/s) ## Starting auxiliary core at 0x80280000 ... Power on M4 and MU Copy M4 image from 0x80280000 to TCML 0x34fe0000 Start M4 0 bootaux complete # 启动 Linux Apalis iMX8 # run bootcmd # 加载 Pinpong 驱动 root@apalis-imx8:~# modprobe imx_rpmsg_pingpong 0x1e! root@apalis-imx8:~# get 1 (src: 0x1e) get 3 (src: 0x1e) get 5 (src: 0x1e) …… get 99 (src: 0x1e) get 101 (src: 0x1e) imx_rpmsg_pingpong virtio1.rpmsg-openamp-demo-channel.-1.30: goodbye! ----------------------------------- ./ M40 调试串口终端输出 ----------------------------------- # pingpong 程序启动后输出 RPMSG Ping-Pong FreeRTOS RTOS API Demo... RPMSG Share Base Addr is 0x90010000 # Linux 启动后输出 Link is up! Nameservice announce sent. # Pingpong 驱动加载后输出 Waiting for ping... Sending pong... …… Waiting for ping... Sending pong... Ping pong done, deinitializing... Looping forever... ----------------------------------- 5). M4s Firmware 配置开机自动加载执行测试 a). 上面的测试都是通过 Uboot 命令从 SD 卡加载 M4 Firmware 进行加载运行,下面我们通过 str_echo 示例程序演示将 M40 和 M41 的固件存放在 Apalis iMX8 eMMC Flash 空间内,并开机自动加载运行 b). 首先进入 Linux 系统,分别将之前编译好的存放在 SD 卡上面的 M40 和 M41 的 str_echo 程序 Firmware 复制到 Flash vfat 分区,也就是存放 Linux kernel 和 device tree 等文件的分区 ----------------------------------- # UART1 调试串口终端 root@apalis-imx8:~# cd /media/mmcblk0p1/ root@apalis-imx8:/media/mmcblk0p1# ls Image dpfw.bin fsl-imx8qm-apalis-eval.dtb.bak fsl-imx8qm-apalis-v1.1-eval.dtb boot.scr fsl-imx8qm-apalis-eval.dtb fsl-imx8qm-apalis-ixora-v1.1.dtb hdmitxfw.bin # 从 SD 卡挂载路径复制 M4s Str_echo 示例程序固件 root@apalis-imx8:/media/mmcblk0p1# cp /media/mmcblk2p1/m4_image.bin . root@apalis-imx8:/media/mmcblk0p1# cp /media/mmcblk2p1/m4_1_image.bin . root@apalis-imx8:/media/mmcblk0p1# ls Image fsl-imx8qm-apalis-eval.dtb fsl-imx8qm-apalis-v1.1-eval.dtb m4_image.bin boot.scr fsl-imx8qm-apalis-eval.dtb.bak hdmitxfw.bin dpfw.bin fsl-imx8qm-apalis-ixora-v1.1.dtb m4_1_image.bin ----------------------------------- c). 重启进入 uboot ,配置环境变量 ----------------------------------- # UART1 调试串口终端 # 分别指定 M4s 固件名称 Apalis iMX8 # setenv m4_0_image 'm4_image.bin' Apalis iMX8 # setenv m4_1_image 'm4_1_image.bin' # 设置启动顺序,分别启动 M40 , M41 以及 Linux Apalis iMX8 # setenv bootcmd 'run m4boot_0 && run m4boot_1 && run distro_bootcmd' Apalis iMX8 # saveenv && reset ----------------------------------- d). 配置好重启后可以看到在 Linux 启动过程中 M40 和 M41 的调试串口都分别打印了相关程序输出 ----------------------------------- # UART1 调试串口终端 U-Boot 2018.03-toradex_imx_v2018.03_4.14.98_2.3.0_bringup+gd626574ba1 (Apr 17 2020 - 19:28:04 +0000) …… Normal Boot Hit any key to stop autoboot: 0 20112 bytes read in 13 ms (1.5 MiB/s) ## Starting auxiliary core at 0x80280000 ... Power on M4 and MU Copy M4 image from 0x80280000 to TCML 0x34fe0000 Start M4 0 bootaux complete 61488 bytes read in 13 ms (4.5 MiB/s) ## Starting auxiliary core at 0x80280000 ... Power on M4 and MU Copy M4 image from 0x80280000 to TCML 0x38fe0000 Start M4 1 bootaux complete …… Scanning mmc 0:1... Found U-Boot script /boot.scr …… Starting kernel ... …… ----------------------------------- ./ M40 调试串口终端 ----------------------------------- RPMSG String Echo FreeRTOS RTOS API Demo... Nameservice sent, ready for incoming messages... ----------------------------------- ./ M41 调试串口终端 ----------------------------------- RPMSG String Echo FreeRTOS RTOS API Demo... Nameservice sent, ready for incoming messages... app_srtm: AUTO and I2C service registered ----------------------------------- e). Linux 端加载 Rpmsg tty 驱动并进行发送测试 ----------------------------------- # UART1 调试串口终端 # 加载驱动 root@apalis-imx8:~# modprobe imx_rpmsg_tty 0x1e! Install rpmsg tty driver! 0x1f! Install rpmsg tty driver! # 发送信息 /dev/ttyRPMSG30 /dev/ttyRPMSG31 ----------------------------------- ./ M40 调试串口终端 ----------------------------------- RPMSG String Echo FreeRTOS RTOS API Demo... Nameservice sent, ready for incoming messages... Get Message From Master Side : "hello world!" Get Message From Master Side : "this is a message from apalis imx8 linux to m4 0" Get New Line From Master Side ----------------------------------- ./ M41 调试串口终端 ----------------------------------- RPMSG String Echo FreeRTOS RTOS API Demo... Namapp_srtm: AUTO and I2C service registered eservice sent, ready for incoming messages... Get Message From Master Side : "hello world!" Get Message From Master Side : "this is a message from apalis imx8 linux to m4 1" Get New Line From Master Side ----------------------------------- 6). 总结 本文基于 NXP iMX8 示例了其多核异构架构下 Cortex-A 核心 Linux 通过 Rpmsg 驱动和 Cortex-M4 核心通讯的示例