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


#include "sm.h"
#include "lmm.h"
#include <string.h>

/* Внутренний указатель на логическую машину, инициализируется при старте SM */
extern lmm_mnt_t *s_lm; 

void Board_TestM7Update(void)
{
    int32_t status;
    uint32_t m7_cpu_id = 1U; // ID ядра m7p из структуры MONITOR_CmdCpu

    // Адреса согласно вашей новой конфигурации mx95evk.cfg
    uint8_t *src_buffer = (uint8_t *)0x90400000; // Куда загружает U-Boot
    uint8_t *dst_buffer = (uint8_t *)0x80000000; // Память назначения M7
    size_t copy_size = 1024 * 1024;              // Тестовый 1 Мегабайт

    printf("[BOARD_UPDATE] Начинаем тестовое обновление M7...\n");

    /* Шаг 1. Останавливаем логическую машину М7 */
    status = LMM_CpuStop(s_lm, m7_cpu_id);
    if (status != SM_ERR_SUCCESS)
    {
        printf("[BOARD_UPDATE] Ошибка остановки M7: %d\n", status);
        return;
    }
    printf("[BOARD_UPDATE] Логическая машина M7 успешно остановлена.\n");

    /* Шаг 2. Безопасное копирование данных силами M33 */
    // Так как права в XRDC мы уже открыли, стандартный memcpy отработает успешно
    printf("[BOARD_UPDATE] Копируем 1МБ данных из 0x%08X в 0x%08X...\n", 
           (uint32_t)src_buffer, (uint32_t)dst_buffer);
    
    memcpy(dst_buffer, src_buffer, copy_size);

    /* Шаг 3. Очистка кэша данных М33 (если кэш включен для DDR регионов в MPU) */
    // Позволяет гарантировать, что данные физически дошли до шины DDR
    #if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
        SCB_CleanDCache_by_Addr((uint32_t *)dst_buffer, copy_size);
    #endif

    printf("[BOARD_UPDATE] Копирование завершено успешно.\n");

    /* Шаг 4. Перезапуск логической машины М7 */
    status = LMM_CpuStart(s_lm, m7_cpu_id);
    if (status != SM_ERR_SUCCESS)
    {
        printf("[BOARD_UPDATE] Ошибка запуска M7: %d\n", status);
        return;
    }
    printf("[BOARD_UPDATE] Логическая машина M7 успешно запущена с новым кодом!\n");
}