原创 NXP iMX8M Plus M7核心FreeRTOS开发

2022-11-22 11:51 2641 23 23 分类: MCU/ 嵌入式

By Toradex胡珊逢

Toradex 的 Verdin iMX8M Plus 计算机模块采用 NXP 的 iMX8M Plus 处理器。该 CPU 除了有支持 AI 硬件加速单元的 NPU 外,还配置了一个 M7 微控制器。相比于 iMX 8 QuadMax 处理器上时钟频率为 266MHz M4 微控制器, 该M7 的时钟频率为 800MHz。且支持双精度浮点运算。在计算性能上有较大程度的提高。文章将介绍如何在 Verdin iMX8M Plus 计算机模上开发 M7 微控制器以及使用异构核之间的 rpmsg 通信。

 

本次使用到的硬件包括 Verdin iMX8M Plus 计算机模和 Verdin Development BoardBSP  >Linux BSP v5.7.0 multimedia reference image。硬件连线如下分别连接电源、网络和USB 调试串口。Verdin Development Board  USB 调试串口有 ttyUSB0ttyUSB1ttyUSB2  ttyUSB3 其中 ttyUSB3  Verdin iMX8M Plus  A53 调试串口, ttyUSB2  M7 调试串口。默认波特率均为 115200

NXP iMX8M Plus M7核心FreeRTOS开发959.png 

 

Device Tree 配置

 

根据这里的说明下载 Linux 内核源码。在默认的 device tree 配置中尚未加入 rpmsg 节点 M7 预留地址空间的配置。在源码的 arch/arm64/boot/dts/freescale/ 位置创建 imx8mp-verdin-rpmsg.dtsi 文件内容如下

// SPDX-License-Identifier: GPL-2.0-or-later OR MIT

/*

 * Copyright 2022 Toradex

 */

 

#include 

 

// Enable RPMSG support

 

/ {

    reserved-memory {

 

        #address-cells = <2>;

        #size-cells = <2>;

        ranges;

 

        /* use linux config instead */

        /delete-node/ linux,cma;

 

        /* Allocate 16MB DDR RAM memory for cortex M -> check the ram drr linker file for details */

        m7_reserved: m7@0x80000000 {

            no-map;

            reg = <0 0x80000000 0 0x1000000>;

        };

 

        /* Allocate resource table from Cortex-M7 -> check copyResourceTable inside rsc_table.c for details */

        rsc_tablersc_table@550ff000 {

            reg = <0 0x550ff000 0 0x1000>;

            no-map;

        };

 

        /* VDEV0_VRING_BASE 0 comes from FreeRTOS rsc_table.c */

        vdev0vring0vdev0vring0@55000000 {

            reg = <0 0x55000000 0 0x8000>;

            no-map;

        };

 

        /* VDEV0_VRING_BASE 1 comes from FreeRTOS rsc_table.c */

        vdev0vring1vdev0vring1@55008000 {

            reg = <0 0x55008000 0 0x8000>;

            no-map;

        };

 

        /* Buffers to use with RPMSG */

        vdevbuffervdevbuffer@55400000 {

            compatible = "shared-dma-pool";

            reg = <0 0x55400000 0 0x100000>;

            no-map;

        };

 

    };

 

    imx8mp-cm7 {

        compatible = "fsl,imx8mp-cm7";

        rsc-da = <0x55000000>;

        clocks = <&clk IMX8MP_CLK_M7_DIV>;

        mbox-names = "tx""rx""rxdb";

        mboxes = <&mu 0 1

              &mu 1 1

              &mu 3 1>;

        memory-region = <&vdev0vring0>, <&vdev0vring1>, <&vdevbuffer>, <&rsc_table>, <&m7_reserved>;

        status = "okay";

    };

};

 

&rpmsg{

    /*

     * 64K for one rpmsg instance:

     * --0x55000000~0x5500ffff: pingpong

     */

    vdev-nums = <1>;

    reg = <0x0 0x55000000 0x0 0x10000>;

    memory-region = <&vdevbuffer>, <&rsc_table>, <&m7_reserved>;

    status = "disabled";

};

 

 

 

然后在 imx8mp-verdin-wifi-dev.dts 添加

#include "imx8mp-verdin-rpmsg.dtsi"

 

 imx8mp-verdin-wifi.dtsi 中删除 &iomuxc 里的 <&pinctrl_gpio_hog4>

&iomuxc {

    pinctrl-names = "default";

    pinctrl-0 = <&pinctrl_gpio1>, <&pinctrl_gpio2>,

            <&pinctrl_gpio3>, <&pinctrl_gpio4>,

            <&pinctrl_gpio7>, <&pinctrl_gpio8>,

            <&pinctrl_gpio_hog2>, <&pinctrl_gpio_hog3>,

            <&pinctrl_hdmi_hog>;

};

 

SODIMM 151 和 SODIMM 153 对应的 UART4是 M7 的默认调试串口。Verdin iMX8M Plus Quad 4GB WB IT V1.1A 及其以后版本的模块,UART4  被用于连接模块上的蓝牙。默认配置下在 &pinctrl_gpio_hog4  SODIMM 151  SODIMM 153 设置为 GPIO 模式。在Linux 启动后继续使用 M7 的调试串口功能就需要将该节点删除。

    /* Wifi usage only */

    pinctrl_gpio_hog4gpiohog4grp {

        fsl,pins = <

            MX8MP_IOMUXC_UART4_RXD__GPIO5_IO28      0x1c4   /* SODIMM 151 */

            MX8MP_IOMUXC_UART4_TXD__GPIO5_IO29      0x1c4   /* SODIMM 153 */

        >;

    };

 

 

完成 device tree 的修改后,重新编译。并将其复制到开发板的 /boot 目录下,覆盖原文件。

-----------------------------------

make freescale/imx8mp-verdin-wifi-dev.dtb

-----------------------------------

 

MCUxpresso SDK

 

先打开 MCUXpresso SDK Builder 页面点击 Select Development Board。此时需要输入账号如果没有请先注册。

NXP iMX8M Plus M7核心FreeRTOS开发4423.png 

 

 Search for Hardware 栏中输入 MIMX8ML8xxxKZ。点击 Processors 下面的 MIMX8ML8xxxKZ

NXP iMX8M Plus M7核心FreeRTOS开发4500.png 

 

点击右边的 Build MCUXpresso SDK

NXP iMX8M Plus M7核心FreeRTOS开发4531.png 

 

根据需要选择 Host OSToolchian/IDE 以及 SDK 里的组件。通常建议使用 Linux 作为开发电脑。至少勾选 multicore  FreeRTOS 组件。最后点击 DOWNLOAD SDK

NXP iMX8M Plus M7核心FreeRTOS开发4643.png 

 

解压 SDK 压缩包。根据 SDK 压缩包解压目录的文档 SDK_2_12_1_MIMX8ML8xxxKZ/docs/MCUXpresso SDK Release Notes for EVK-MIMX8MP.pdf 中描述的 GCC 版本 这里下载对应的软件。SDK 2.12.1 使用 GCC Arm Embedded 10.3-2021.10

 

 

RPMSG demo 编译

 

进入 SDK 安装目录的SDK_2_12_1_MIMX8ML8xxxKZ/boards/evkmimx8mp/multicore_examples/rpmsg_lite_str_echo_rtos/ 路径。

-----------------------------------

$cd SDK_2_12_1_MIMX8ML8xxxKZ/boards/evkmimx8mp/multicore_examples/rpmsg_lite_str_echo_rtos/

-----------------------------------

 

根据 GCC 编译工具的实际安装路径,配置变量 ARMGCC_DIR

-----------------------------------

export ARMGCC_DIR=gcc-arm-none-eabi-10.3-2021.10

-----------------------------------

 

 armgcc 文件夹里执行编译脚本。

-----------------------------------

$ cd armgcc

$ ./build_all.sh

-----------------------------------

 

编译完成后可以在 debug/releaseddr_debug/ddr_releaseflash_debug/flash_release 文件夹里看到 bin 文件。上面三组文件夹分别对应 bin 的加载位置为 TCMDDR QSPI Flash。在 Verdin 模块上可以使用 TCM  DDR

 

 

运行 RPMSG demo

 

如果 M7 的固件较大无法在 TCM 上执行就需要使用模块的 DDR。将 ddr_release 目录下编译好的 M7 固件重命名为 m7.bin然后复制到模块的 /home/root/ 目录下。在 U-Boot 设置下面参数。

-----------------------------------

setenv m4boot 'ext4load mmc 2:2 0x80000000 /home/root/m7.bin; dcache flush; bootaux 0x80000000'

setenv fdt_high=0xffffffffffffffff

saveenv

-----------------------------------

 

如果 M7 的固件不大,则可以在 TCM 上运行。由于 TCM 是 M7 专用的存储,无需访问 DDR 控制器。这可以降低 M7 运行时 IO 开销。将 release 目录下编译好的 M7 固件重命名为 m7.bin然后复制到模块的 /home/root/ 目录下。在 U-Boot 设置下面参数。

-----------------------------------

setenv m4boot 'ext4load mmc 2:2 ${loadaddr} /home/root/m7.bin; cp.b ${loadaddr} 0x7e0000 ${filesize}; dcache flush; bootaux 0x7e0000'

setenv fdt_high=0xffffffffffffffff

saveenv

-----------------------------------

 

 

打开 M7 的调试串口模块启动后可以看到下面信息。

-----------------------------------

Nameservice sent, ready for incoming messages..

-----------------------------------

 

 Linux 的调试串口里输入下面命令,加载 rpmsg 驱动模块

-----------------------------------

~# modprobe imx_rpmsg_tty

-----------------------------------

 

 M7 的调试串口会打印下面内容表示 M7 已经收到 A53 rmpsg 驱动发送的默认消息。

-----------------------------------

Get Message From Master Side : "hello world!" [len : 12]

-----------------------------------

 

 Linux 的调试串口里输入下面命令,向 M7 发送指定内容。

-----------------------------------

~# echo 'Toradex' > /dev/ttyRPMSG30

-----------------------------------

 

M7 的调试串口会打印所接收到的消息。


-----------------------------------

Get Message From Master Side : "Toradex" [len : 7]

Get New Line From Master Side

-----------------------------------

 

在调试期间,通过 TFTP 传输 M7 固件会更加方面。下面分别是通过 TFTP 将固件下载到 DDR  TCM 运行所需的 U-Boot 设置。注意附件分别来自于 ddr_release  release 两个不同的文件夹。

DDR

-----------------------------------

setenv m4boot 'tftp 0x80000000 m7.bin; dcache flush; bootaux 0x80000000'

setenv fdt_high=0xffffffffffffffff

saveenv

-----------------------------------

 

TCM

-----------------------------------

setenv m4boot 'tftp ${loadaddr} m7.bin; cp.b ${loadaddr} 0x7e0000 ${filesize}; dcache flush; bootaux 0x7e0000'

setenv fdt_high=0xffffffffffffffff

saveenv

-----------------------------------

 

总结

Verdin iMX8M Plus 上的 M7 微处理器非常适合于那些实时或者低功耗任务。MCUxpresso SDK 除了上面介绍的 A53  M7 核心的通信例程还有大量操作外设如 CANGPIOSPI 这些可以加速用户的开发。

作者: hai.qin_651820742, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-1864768.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
我要评论
0
23
关闭 站长推荐上一条 /2 下一条