• NXP iMX8M Plus M7核心FreeRTOS开发


    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 Board。BSP 为 Linux BSP v5.7.0 multimedia reference image。硬件连线如下,分别连接电源、网络和USB 调试串口。Verdin Development Board 的 USB 调试串口有 ttyUSB0、ttyUSB1、ttyUSB2 和 ttyUSB3。 其中 ttyUSB3 是 Verdin iMX8M Plus 的 A53 调试串口, ttyUSB2 是 M7 调试串口。默认波特率均为 115200。

    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_table: rsc_table@550ff000 {

                reg = <0 0x550ff000 0 0x1000>;

                no-map;

            };

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

            vdev0vring0: vdev0vring0@55000000 {

                reg = <0 0x55000000 0 0x8000>;

                no-map;

            };

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

            vdev0vring1: vdev0vring1@55008000 {

                reg = <0 0x55008000 0 0x8000>;

                no-map;

            };

            /* Buffers to use with RPMSG */

            vdevbuffer: vdevbuffer@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_hog4: gpiohog4grp {

            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。此时需要输入账号,如果没有请先注册。

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

    点击右边的 Build MCUXpresso SDK。

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

    解压 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/release、ddr_debug/ddr_release、flash_debug/flash_release 文件夹里看到 bin 文件。上面三组文件夹分别对应 bin 的加载位置为 TCM、DDR和 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 两个不同的文件夹。

    l DDR

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

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

    setenv fdt_high=0xffffffffffffffff

    saveenv

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

    l 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 核心的通信例程,还有大量操作外设如 CAN、GPIO、SPI 等,这些可以加速用户的开发。

  • 相关阅读:
    2024 泛娱乐企业出海音视频选型攻略
    京东(天猫)数据分析:2023下半年茶饮料市场高速增长,东方树叶一骑绝尘
    基于Java SSM仓库管理系统
    TS的class 继承 类型约束
    基于孤立森林的信用卡欺诈 Python 实战案例,最佳参数选择、可视化等
    Python Flask教程学习02
    web前端三大主流框架指的是什么
    php错误/异常/日志及常见调试和排错
    学习Android的第十九天
    PostgreSQL之SQL高级特性
  • 原文地址:https://blog.csdn.net/toradexsh/article/details/127980001