热度 16
2020-6-10 16:59
2066 次阅读|
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 核心通讯的示例