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


#include "sm.h"
#include "s_cpu.h"
#include "s_lmm.h"

/**
 * @brief Полный, чистый и безопасный сброс всей Логической Машины М7 с установкой нового вектора.
 *        Код предназначен строго для интеграции внутрь imx-system-manager (M33).
 * 
 * @param boot_vector Физический адрес старта (0x00D00000 для ITCM, 0x80000000 для DDR и т.д.)
 * @return int32_t SM_ERR_SUCCESS в случае успеха
 */
int32_t sm_test_clean_lmm_m7_reset(uint32_t boot_vector)
{
    int32_t status = SM_ERR_SUCCESS;
    
    /* 1. Определяем ID Логической Машины (LM) для М7.
     *    В NXP SM это обычно макрос или индекс, привязанный к m7_lm в YAML конфигурации.
     *    Замените 'SM_LM_M7' на реальный ID вашей LM из вашей сборки SM. */
    uint32_t m7_lm_id = SM_LM_M7; 
    uint32_t m7_core_id = SM_NUM_CORE;

    /* 2. Переводим Логическую Машину в состояние полной остановки (SHUTDOWN).
     *    Это штатно гасит все шины, отключает кэши на уровне SoC и сбрасывает TRDC. */
    status = s_lmm_shutdown(m7_lm_id, false); // false = не переводить в standby, а выключить
    if (status != SM_ERR_SUCCESS) {
        return status;
    }

    /* 3. Пока машина полностью остановлена и изолирована, безопасно меняем аппаратный
     *    вектор сброса для ядра Cortex-M7. */
    status = s_cpu_reset_vector_set(m7_core_id, boot_vector, true);
    if (status != SM_ERR_SUCCESS) {
        return status;
    }

    /* 4. Производим чистый запуск (BOOT) всей Логической Машины.
     *    System Manager заново накатит чистую аппаратную конфигурацию TRDC для М7,
     *    включит тактирование шин с нуля и подаст сигнал старта на ядро. */
    status = s_lmm_boot(m7_lm_id, &boot_vector);

    return status;
}