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


#include "sm.h"
#include "rpc_scmi.h"
#include "dev_sm.h"

/* Внешняя ссылка на конфигурацию логических машин из вашего файла */
extern const lmm_config_t g_lmmConfig[SM_NUM_LM];

/**
 * @brief Функция полного сброса логической машины М7 с подменой вектора.
 *        Интегрируется напрямую в ваш код imx-system-manager (M33).
 * 
 * @param lm_id        ID логической машины для M7 (индекс из g_lmmConfig)
 * @param boot_vector  Целевой адрес старта (например, 0x80000000 для DDR)
 * @return int32_t     SM_ERR_SUCCESS в случае успеха
 */
int32_t sm_cli_test_m7_vector_reboot(uint32_t lm_id, uint32_t boot_vector)
{
    int32_t status = SM_ERR_SUCCESS;

    /* 1. Проверяем валидность индекса машины */
    if (lm_id >= SM_NUM_LM)
    {
        return SM_ERR_INVALID_PARAMETERS;
    }

    /* 2. Сбрасываем RPC-контекст, чтобы избежать зависания SCMI-каналов связи 
     *    между U-Boot/Linux и M33 при перезапуске ядра. */
    status = LMM_RpcReset(lm_id);
    if (status != SM_ERR_SUCCESS)
    {
        return status;
    }

    /* 3. Записываем новый вектор старта в аппаратные регистры.
     *    Поскольку LMM_Handler вызывает LMM_SystemLmBoot, который считывает 
     *    вектор из настроек устройства, эта функция запишет адрес в регистры SRC/GPC, 
     *    и при следующем старте М7 проснется по новому адресу. */
    status = DEV_SM_CpuResetVectorSet(lm_id, boot_vector, true);
    if (status != SM_ERR_SUCCESS)
    {
        return status;
    }

    /* 4. Запускаем штатный конвейер загрузки.
     *    Функция выставит статические переменные s_bootLm, s_bootSkip 
     *    и вызовет SWI_Trigger(). Внутри прерывания отработает присланный вами 
     *    LMM_Handler, который через LMM_SystemLmBoot поднимет М7 с новым вектором. */
    status = LMM_Boot_core(lm_id);

    return status;
}