#include <common.h>
#include <command.h>
#include <asm/io.h>
#include <image.h>
/* Объявляем функцию отправки кусков, которую мы спроектировали на предыдущем шаге */
int imx_rproc_flash_firmware(ulong src_image_addr, ulong image_size);
/**
* Обработчик консольной команды U-Boot: rproc_m7_update
* Аргументы из консоли: rproc_m7_update <адрес_образа_в_ram> <размер_образа_в_hex>
*/
static int do_rproc_m7_update(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
{
ulong src_addr;
ulong image_size;
if (argc < 3) {
return CMD_RET_USAGE;
}
/* Парсим адрес в ОЗУ, куда ФС загрузила бинарник М7 */
src_addr = hextoul(argv[1], NULL);
/* Парсим реальный размер файла */
image_size = hextoul(argv[2], NULL);
if (!src_addr || !image_size) {
printf("RPROC_ERR: Invalid address (0x%lx) or size (0x%lx)\n", src_addr, image_size);
return CMD_RET_FAILURE;
}
/* Вызываем наш поцикловый конвейер передачи данных в TCM */
int ret = imx_rproc_flash_firmware(src_addr, image_size);
if (ret == 0) {
return CMD_RET_SUCCESS;
} else {
return CMD_RET_FAILURE;
}
}
/* Регистрация команды в CLI U-Boot с помощью макроса */
U_BOOT_CMD(
rproc_m7_update, 3, 0, do_rproc_m7_update,
"Update Cortex-M7 firmware sequentially via TCM buffer",
"<ram_addr_hex> <size_hex>\n"
" - Splits the bin from ram_addr into 200KB chunks,\n"
" sends them to M7 TCM, triggers M7 DDR copy, and verifies CRC32."
);