Как загрузить корзину в Cortex-M4 в Google Coral Dev
- Сейчас пытаюсь загрузить
hello_world.bin
в cortex m4 из u-boot в Google coral dev
Что пробовал?
- Поднимите цель разработчиков Coral
- Выполненные шаги в https://coral.ai/docs/dev-board/get-started/
- Возможность получить приглашение ОС Mendel в /dev/ttyUSB0(host)->ttymxc0(target)
- Способен
mdt shell
- Цель готова с помощью u-boot-> kernel image-> rootfs
- SDK для i.MX8MQ
- Загрузите SDK с https://mcuxpresso.nxp.com/
- Для процессора 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- Я поместил свою корзину в папку 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
Вопрос
- Как загрузить прошивку на Cortex M4 на Google Coral Dev?
- Какой порт SDK i.MX использовать для Google Coral Dev?
- Какие UART доступны на micro USB?
- Какой UART используется для Cortex M4 в Google Coral Dev
1 ответ
Решение
Вот инструкции по загрузке 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.
Выходные данные ядра M4 будут видны на втором UART, указанном при подключении последовательного порта через USB.
- Как упоминалось в принятом выше ответе, мы можем использовать
mcuxpresso_sdk
для сборки bin / elf для Coral Dev CM4. - Кроме того, я бы записал детали, чтобы использовать
multicore_example
,rtos_example
из репо Coral. - Также я хотел бы добавить пункты о поддержке rpmsg / remoteproc для imx8mq в ядре linux v4.14, необходимых патчах и поддержке dts для imx8mq.
Пример FreeRTOS SDK - загрузка CM4 из u-boot
- Исходный код SDK для Coral Dev
-
hello_world_tflite
пример работает без изменений.- Почему? в
main.c
тоBOARD_InitPins
вызывается функция, которая настраивает контакты UART для консоли CM4 (в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
Загрузите CM4 elf из Linux Remoteproc
Поддержка ядра Linux
- CM4 можно загрузить со стороны Linux с помощью поддержки remoteproc.
- Я не нашел поддержки remoteproc для imx8mq в https://coral.googlesource.com/linux-imx/
- Но здесь был набор патчей для поддержки imx8mq remoteproc
- И в принципе мы не можем включить
IMX_REMOTEPROC
по той же причине - Для экспериментальной поддержки и обучения я применил только [08/10] remoteproc: imx_rproc: support i.MX8MQ / M patch
- И добавлена поддержка Kconfig для
IMX_REMOTEPROC
добавлениемHAVE_IMX8_SOC
, что позволяет мне включить remoteproc для IMX8MQ
Поддержка 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
- Также здесь можно найти файл readme для rpmsg на стороне приложения CM4
- С перечисленными выше изменениями в ядре linux и примерами приложений CM4 sdk мы можем использовать remoteproc для перехода от elf к CM4 и использовать
pmsg_lite_str_echo_rtos
пример связи между APU и M4
Пример загрузки CM4 elf с использованием remoteproc
- Загрузить сборку ddr
hello_world.elf
используя remoteproc. Файл 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
- Но базовое обучение и эксперимент работают
Пример драйвера rpmsg char на стороне Linux
- Компилировать
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
- Я попытался обновить здесь все, что пытался использовать CM4 в coral dev
- У меня все еще возникают проблемы с remoteproc.
- Я надеюсь, что часть этой информации будет полезна всем, кто наткнулся на этот пост