Загрузка данных


#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."
);