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