工控網首頁
>

應用設計

>

NXP iMX8M Plus M7核心FreeRTOS開發

NXP iMX8M Plus M7核心FreeRTOS開發

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。

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 OS,Toolchian/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/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 兩個不同的文件夾。

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 核心的通信例程,還有大量操作外設如 CAN、GPIO、SPI ,這些可以加速用戶的開發。

審核編輯(
王靜
)
投訴建議

提交

查看更多評論
其他資訊

查看更多

嵌入式Linux上使用Ramoops

使用容器編譯Yocto鏡像

基于NXP iMX8測試Secure Boot功能部署

UBI只讀文件系統

通過Ycoto Project定制嵌入式Ycoto Linux鏡像