1
  • 目前我正在尝试hello_world.bin从谷歌珊瑚开发中的 u-boot 加载到 cortex m4

我试过什么?

  • 调出 Coral 开发目标
  • i.MX8MQ SDK
    • 从https://mcuxpresso.nxp.com/下载 SDK
    • 对于处理器“MIMX8MQ6xxxJZ”(自动选择板 - EVK-MIMX8MQ)
    • hello_world.bin为 Cortex M4(基于 TCM)构建。使用 UART2 在BOARD_InitBootPins
$ tar -xzf SDK_2.8.0_MIMX8MQ6xxxJZ.tar.gz
$ cd boards/evkmimx8mq/demo_apps/hello_world/armgcc
$ export ARMGCC_DIR=<path to>/gcc-arm-none-eabi-9-2020-q2-update/
$ export PATH=$PATH:<path to>/gcc-arm-none-eabi-9-2020-q2-update/bin
$ ./build_debug.sh 
$ ls debug/hello_world.bin 
  • hello_world.bin从 u-boot 加载
    • 我已将我的 bin 放在 tftpboot 位置。
Hit any key to stop autoboot:  0 
u-boot=> tftp 0x7e0000 192.168.0.33:/tftpboot/coral/boot/hello_world.bin
Using ethernet@30be0000 device
TFTP from server 192.168.0.33; our IP address is 192.168.0.133
Filename '/tftpboot/coral/boot/hello_world.bin'.
Load address: 0x7e0000
Loading: ####
         2.3 MiB/s
done
Bytes transferred = 16700 (413c hex)
u-boot=> bootaux 0x7e0000
## Starting auxiliary core at 0x007E0000 ...
  • 但我在第二个终端 ttyUSB1 上看不到任何输出
  • 预期输出应Hello World在第二个终端上

我观察到的

  • Coral-Dev-Board-baseboard-schematic.pdf
    • 根据基板框图,UART2/3通过转换器连接到 MicroUSB
      • 但 UART1(ttymxc0) 也可用于 micro USB
      • 内核启动后 UART3(ttymxc0) 在 micro USB 上可用
    • 但是在内核启动之后,我注意到 UART3 在第二个枚举端口上可用
    • 例如,
// On coral dev
root@wishful-zebra:~# ls -las /dev/ttymxc*
0 crw------- 1 mendel tty     207, 16 Aug 20 03:45 /dev/ttymxc0
0 crw-rw---- 1 root   dialout 207, 17 Aug 20 03:05 /dev/ttymxc1
0 crw-rw---- 1 root   dialout 207, 18 Aug 20 03:40 /dev/ttymxc2

root@wishful-zebra:~# stty -echo raw speed 115200 < /dev/ttymxc2
115200
root@wishful-zebra:~# echo "test" > /dev/ttymxc2 

// prints 'test' on /dev/ttyUSB1 host side
Welcome to minicom 2.7.1

OPTIONS: I18n 
Compiled on Aug 13 2017, 15:25:34.
Port /dev/ttyUSB1, 23:55:15

Press CTRL-A Z for help on special keys

test

问题

  • 如何在 Google Coral Dev 上将固件加载到 Cortex M4?
  • 哪个 i.MX SDK 端口用于 Google Coral Dev?
  • 微型 USB 上可用的 UART 有哪些?
  • Google Coral Dev 中哪个 UART 用于 Cortex M4
4

2 回答 2

2

以下是启动 imx8m M4 并在其上运行 TFLite Micro Hello World(输出正弦波)的说明: https ://coral.googlesource.com/mcuxpresso_sdk/+/refs/heads/master/boards/evkmimx8mq/demo_apps /hello_world_tflite/

您需要同步项目 repo 并重建 linux-imx 和 uboot-imx。

M4 内核的输出将在您通过 USB 连接串行端口时枚举的第二个 UART 上可见。

于 2020-08-21T06:12:40.927 回答
1
  • 正如上面接受的答案中提到的,我们可以使用mcuxpresso_sdk为 Coral Dev CM4 构建 bin/elf。
  • 此外,我想从 Coral 回购中捕获使用multicore_example,的详细信息。rtos_example
  • 另外,我想在 rpmsg/remoteproc 对 linux 内核 v4.14 中的 imx8mq 支持上添加几点,imx8mq 所需的补丁和 dts 支持。

FreeRTOS SDK 示例 - 从 u-boot 启动 CM4

  • Coral 开发的 SDK 源
  • hello_world_tflite示例无需任何更改即可工作。
    • 为什么?调用该函数为 CM4 控制台配置 UART 引脚(在main.c中)BOARD_InitPinspin_mux.c
  • 此配置不适用于其他示例。因此,我将文件board.h, board.c, clock_config.c, clock_config.h, pin_mux.c, pin_mux.h从 hello_world_tflite 复制到其他示例项目。
  • 并且BOARD_InitPins()必须调用
  • 示例rtos_examples/freertos_hello
$ cd mcuxpresso_sdk/boards/evkmimx8mq/rtos_examples/freertos_hello/

// copy board files from hello_word_tflite example
$ cp -rf ../../demo_apps/hello_world_tflite/[pin_mux.* board.* clock_config.*] ./

// freertos_hello.c -> main -> BOARD_InitBootPins() -> BOARD_InitPins()
// Update pin_mux.c, BOARD_InitBootPins() call BOARD_InitPins()
void BOARD_InitBootPins(void)
  {
+   BOARD_InitPins();
  }

$ cd armgcc
//compile your project
// copy release/freertos_hello.bin to your SDcard/emmc/tftpboot location 
// I use tftp

u-boot=> tftp 0x7e0000 192.168.0.33:/tftpboot/coral/boot/freertos_hello.bin
u-boot=> bootaux 0x7e0000 

// Open other emulated console and verify output

从 Linux Remoteproc 加载 CM4 elf

Linux 内核支持

Linux DTS 支持

  • 这是我当前的 dts smip 来自arch/arm64/boot/dts/freescale/fsl-imx8mq-phanbell.dts. (在 dts 文件顶部添加)
/ {
  reserved-memory {
    #address-cells = <2>;
    #size-cells = <2>;
    ranges;

    m4_reserved: m4@0x80000000 {
      no-map;
      reg = <0 0x80000000 0 0x1000000>;
    };  
  };  
  imx8mq-cm4 {
         compatible    = "fsl,imx8mq-cm4";
         memory-region = <&m4_reserved>;
         syscon        = <&src>;
         clocks        = <&clk IMX8MQ_CLK_M4_ROOT>;
     };  
};
&rpmsg{
  /*  
   * 64K for one rpmsg instance:
   * --0xb8000000~0xb800ffff: pingpong
   */
  vdev-nums = <1>;
  reg = <0x0 0xb8000000 0x0 0x10000>;
  status = "okay";
};

&uart2{
    status="disabled";
};

&uart3{
    status="disabled";
};

Linux RPMsg 支持

  • 我启用了 imx rpmsg 模块示例IMX_RPMSG_TTY and IMX_RPMSG_PINGPONG
  • 也启用RPMSG_CHAR
  • CM4 应用程序端 rpmsg 自述文件也可以在这里找到

  • 通过上面列出的对 linux 内核和 CM4 sdk 应用示例的更改,我们可以使用 remoteproc 将 elf 加载到 CM4 并使用pmsg_lite_str_echo_rtos示例在 APU 和 M4 之间进行通信

使用 remoteproc 的示例 CM4 精灵加载

  • 使用 remoteproc加载 ddr 构建hello_world.elf。elf 文件应该位于/lib/firmware您的珊瑚根文件系统中。复制到相应位置。
$ cd /path/to/mcuxpresso_sdk/...../hello_world/armgcc
$ ./build_ddr_release.sh 
$ sudo cp ddr_release/hello_world.elf (sdcard/emmc/nfs rootfs)/lib/firmware/

// load firmware using remoteproc
root@coraldev:~# echo hello_world_tflite.elf > /sys/class/remoteproc/remoteproc0/firmware 
root@coraldev:~# echo start > /sys/class/remoteproc/remoteproc0/state 


[  109.365150] remoteproc remoteproc0: powering up imx-rproc
[  109.372949] remoteproc remoteproc0: Booting fw image hello_world_tflite.elf, size 295228
[  109.381399] remoteproc remoteproc0: filesz 0x240 memsz 0x240
[  109.387196] remoteproc remoteproc0: da 0x80000000 mem 0x240
[  109.392959] remoteproc remoteproc0: filesz 0x1ee78 memsz 0x1ee78
[  109.399094] remoteproc remoteproc0: da 0x80000240 mem 0x1ee78
[  109.405366] remoteproc remoteproc0: filesz 0x6f4 memsz 0x6f4
[  109.411181] remoteproc remoteproc0: da 0x8001f0b8 mem 0x6f4
[  109.416945] remoteproc remoteproc0: filesz 0x0 memsz 0x3ba8
[  109.422638] remoteproc remoteproc0: da 0x8001f7c0 mem 0x3ba8
[  109.428501] remoteproc remoteproc0: remote processor imx-rproc is now up

  • 但有时我无法查看 M4 UART 控制台
  • hello_world*加载除我得到的任何其他示例bad phdr da 0x80000000 mem 0x240。这我不知道如何解决
    • 也许应该更新 dts mem reg
    • 也许等待 imx8mq remoteproc 的官方支持
  • 但是基本的学习和实验是有效的

Linux端rpmsg char驱动示例

  • multicore_examples/rpmsg_lite_str_echo_rtos/armgcc使用更新板初始化引脚编译
  • 从 u-boot 加载 bin
  • linux启动后,up insmod imx_rpmsg_tty.ko(需要在menuconfig中启用)
// Load cm4 
u-boot=> tftp 0x7e0000 192.168.0.33:/tftpboot/coral/boot/rpmsg_lite_str_echo_rtos_imxcm4.bin
u-boot=> bootaux 0x7e0000 

// on linux side
root@coraldev:~# insmod /lib/modules/4.14.98+/kernel/drivers/rpmsg/imx_rpmsg_tty.ko 
root@coraldev:~# ls -las /dev/ttyRPMSG30 
     0 crw-rw----    1 root     dialout   235,   0 Jan  1 04:52 /dev/ttyRPMSG30

root@coraldev:~# echo "hello from linux" > /dev/ttyRPMSG30 

// on CM4 console, other emulated ttyUSB1 
RPMSG String Echo FreeRTOS RTOS API Demo...

Nameservice sent, ready for incoming messages...
Get Message From Master Side : "hello world!" [len : 12]
Get Message From Master Side : "hello from linux" [len : 16]
Get New Line From Master Side

  • 我已经尝试在这里更新我尝试在珊瑚开发中使用 CM4 的所有内容
  • 我仍然面临remoteproc的问题。
  • 我希望其中一些信息对偶然发现这篇文章的人有所帮助
于 2020-09-06T11:55:38.603 回答