如何在Google Coral Dev中将bin加载到Cortex-M4


  • 目前我正试图从Google coral dev中的u-boot将hello_world.bin加载到cortex m4

我试过什么

  • 提出Coral开发目标
    • 遵循中的步骤https://coral.ai/docs/dev-board/get-started/
    • 能够在/dev/ttyUSB0(主机)中得到mendel操作系统提示->ttymxc0(目标)
    • 能够mdt shell
    • u-boot已准备好目标->内核映像->rootfs
  • i.MX8MQ的SDK
    • 从下载SDKhttps://mcuxpresso.nxp.com/
    • 对于处理器"MIMX8MQ6xxxJZ"(自动选择板-EVK-MIMX8MQ)
    • 为Cortex M4构建hello_world.bin(基于TCM)。在BOARD_InitBootPins中使用UART2
$ 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 
  • 从u-boot加载hello_world.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

我观察到的情况

  • In 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
  • Google Coral Dev使用哪个i.MX SDK端口
  • micro-USB上有哪些UART
  • Google Coral Dev中Cortex M4使用了哪个UART

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

您需要同步项目repo并重新构建linuximx和ubootimx。

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

  • 正如上面接受的答案中所提到的,我们可以使用mcuxpresso_sdk为Coral Dev CM4构建bin/elf
  • 此外,我还想从Coral回购中获取使用multicore_examplertos_example的详细信息
  • 此外,我还想补充一些关于linux内核v4.14中对imx8mq的rpmsg/remoteproc支持、对imx8mq所需的补丁和dts支持的要点

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

  • Coral Dev的SDK源代码
    • https://coral.googlesource.com/mcuxpresso_sdk/+/refs/heads/master/boards/evkmimx8mq
  • hello_world_tflite示例在没有任何更改的情况下工作。
    • 为什么?在main.c中调用BOARD_InitPins函数,该函数配置CM4控制台的UART引脚(在pin_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内核支持

  • CM4可以使用remoteproc支持从linux端加载
  • 在中找不到remoteproc对imx8mq的支持https://coral.googlesource.com/linux-imx/
  • 但是这里有一组补丁可用于imx8mq remoteproc支持
    • https://patchwork.kernel.org/project/linux-remoteproc/list/?series=323535
  • 基本上,由于同样的原因,我们无法启用IMX_REMOTEPROC
  • 对于我的实验支持和学习,我只应用了[08/10]remoteproc:imx_rproc:support I.MX8MQ/M补丁
  • 并通过添加HAVE_IMX8_SOC添加了对IMX_REMOTEPROC的Kconfig支持,让我为IMX8MQ启用remoteproc

Linux DTS支持

  • 这是我当前来自arch/arm64/boot/dts/freescale/fsl-imx8mq-phanbell.dts的dts smip。(添加到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 elf的示例

  • 使用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字符驱动程序示例

  • 使用更新板初始化引脚编译multicore_examples/rpmsg_lite_str_echo_rtos/armgcc
  • 从u-boot装载垃圾箱
  • linux引导后,在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

  • 我试着在这里更新我在coral dev中使用CM4的所有尝试
  • 我仍然面临远程进程的问题
  • 我希望这些信息对任何偶然发现这篇文章的人都有帮助

相关内容

  • 没有找到相关文章

最新更新