如何在 Google Coral Dev 中将 bin 加载到 Cortex-M4
How to load bin to Cortex-M4 in Google Coral Dev
- 目前我正在尝试从 Google coral dev
中的 u-boot 加载 hello_world.bin
到 cortex m4
我尝试了什么?
- 调出 Coral 开发目标
- 已执行 https://coral.ai/docs/dev-board/get-started/
中的步骤
- 能够在 /dev/ttyUSB0(host)->ttymxc0(target)
中获得 mendel OS 提示符
- 能够
mdt shell
- 使用 u-boot->kernel image->rootfs 准备好目标
- 用于 i.MX8MQ 的 SDK
- 从https://mcuxpresso.nxp.com/
下载SDK
- 对于处理器 'MIMX8MQ6xxxJZ'(自动选择板 - EVK-MIMX8MQ)
- 为 Cortex M4(基于 TCM)构建
hello_world.bin
。在 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
- 我已将我的 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) 也可以在微型 USB 上使用
- 内核启动后 UART3(ttymxc0) 在微型 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
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/.
您需要同步项目回购并重建 linux-imx 和 uboot-imx。
当您通过 USB 连接串行端口时,M4 内核的输出将在枚举的第二个 UART 上可见。
- 正如上面接受的答案中提到的,我们可以使用
mcuxpresso_sdk
为 Coral Dev CM4 构建 bin/elf。
- 此外,我会捕获详细信息以使用 Coral 存储库中的
multicore_example
、rtos_example
。
- 我还想在 linux 内核 v4.14 中添加 rpmsg/remoteproc 对 imx8mq 的支持,所需的补丁和对 imx8mq 的 dts 支持。
FreeRTOS SDK 示例 - 从 u-boot
启动 CM4
- Coral Dev 的 SDK 源代码
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 内核支持
- 可以使用 remoteproc 支持从 linux 端加载 CM4
- 我在 https://coral.googlesource.com/linux-imx/
中没有找到对 imx8mq 的 remoteproc 支持
- 但是这里有一组可用于 imx8mq remoteproc 支持的补丁
- 基本上我们不能启用
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 自述文件 here
- 上面列出的对linux内核和CM4 sdk应用示例的更改,我们可以使用remoteproc将elf加载到CM4并使用
pmsg_lite_str_echo_rtos
示例在APU和M4之间进行通信
使用 remoteproc 的 CM4 elf 加载示例
- 使用 remoteproc 加载 ddr build
hello_world.elf
。 elf 文件应该在你的珊瑚 rootfs 的 /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
加载 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 的问题。
- 我希望其中一些信息对遇到此问题的任何人有所帮助 post
- 目前我正在尝试从 Google coral dev 中的 u-boot 加载
hello_world.bin
到 cortex m4
我尝试了什么?
- 调出 Coral 开发目标
- 已执行 https://coral.ai/docs/dev-board/get-started/ 中的步骤
- 能够在 /dev/ttyUSB0(host)->ttymxc0(target) 中获得 mendel OS 提示符
- 能够
mdt shell
- 使用 u-boot->kernel image->rootfs 准备好目标
- 用于 i.MX8MQ 的 SDK
- 从https://mcuxpresso.nxp.com/ 下载SDK
- 对于处理器 'MIMX8MQ6xxxJZ'(自动选择板 - EVK-MIMX8MQ)
- 为 Cortex M4(基于 TCM)构建
hello_world.bin
。在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
- 我已将我的 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) 也可以在微型 USB 上使用
- 内核启动后 UART3(ttymxc0) 在微型 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 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/.
您需要同步项目回购并重建 linux-imx 和 uboot-imx。
当您通过 USB 连接串行端口时,M4 内核的输出将在枚举的第二个 UART 上可见。
- 正如上面接受的答案中提到的,我们可以使用
mcuxpresso_sdk
为 Coral Dev CM4 构建 bin/elf。 - 此外,我会捕获详细信息以使用 Coral 存储库中的
multicore_example
、rtos_example
。 - 我还想在 linux 内核 v4.14 中添加 rpmsg/remoteproc 对 imx8mq 的支持,所需的补丁和对 imx8mq 的 dts 支持。
FreeRTOS SDK 示例 - 从 u-boot
启动 CM4- Coral Dev 的 SDK 源代码
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 elfLinux 内核支持
- 可以使用 remoteproc 支持从 linux 端加载 CM4
- 我在 https://coral.googlesource.com/linux-imx/ 中没有找到对 imx8mq 的 remoteproc 支持
- 但是这里有一组可用于 imx8mq remoteproc 支持的补丁
- 基本上我们不能启用
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 自述文件 here
- 上面列出的对linux内核和CM4 sdk应用示例的更改,我们可以使用remoteproc将elf加载到CM4并使用
pmsg_lite_str_echo_rtos
示例在APU和M4之间进行通信
使用 remoteproc 的 CM4 elf 加载示例
- 使用 remoteproc 加载 ddr build
hello_world.elf
。 elf 文件应该在你的珊瑚 rootfs 的/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 字符驱动程序示例
- 使用更新板初始化引脚 编译
- 从 u-boot 加载 bin
- 在linux启动后,up insmod
imx_rpmsg_tty.ko
(需要在menuconfig中启用)
multicore_examples/rpmsg_lite_str_echo_rtos/armgcc
// 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 的问题。
- 我希望其中一些信息对遇到此问题的任何人有所帮助 post