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


void Board_TestM7Update(size_t custom_size)
{
    int32_t status;
    uint32_t m7_cpu_id = 1U;
    uint32_t m7_reset_line = 49U; // Линия m7mix из вывода rst.r

    uint8_t *src_buffer = (uint8_t *)0x90400000;
    uint8_t *dst_buffer = (uint8_t *)0x80000000;
    size_t copy_size = (custom_size > 0) ? custom_size : 12872; 

    printf("[BOARD_UPDATE] Start update M7 (Size: %u bytes)...\n", copy_size);

    /* Шаг 1. Останавливаем ядро M7 */
    status = LMM_CpuStop(s_lm, m7_cpu_id);
    if (status != SM_ERR_SUCCESS)
    {
        printf("[BOARD_UPDATE] Error stop M7: %d\n", status);
        return;
    }
    printf("[BOARD_UPDATE] M7 stopped.\n");

    /* Шаг 2. Принудительно взводим аппаратный сброс домена M7 (Линия 49) */
    printf("[BOARD_UPDATE] Asserting hardware reset on m7mix (line 49)...\n");
    status = LMM_ResetDomain(s_lm, m7_reset_line, 0U, false, true);
    if (status != SM_ERR_SUCCESS)
    {
        printf("[BOARD_UPDATE] Error asserting reset on line 49: %d\n", status);
        return;
    }

    /* Шаг 3. Копирование данных в DDR, пока ядро гарантированно "заморожено" в сбросе */
    printf("[BOARD_UPDATE] Copying data from 0x%08X to 0x%08X...\n", (uint32_t)src_buffer, (uint32_t)dst_buffer);
    memcpy(dst_buffer, src_buffer, copy_size);

    /* Барьеры памяти: принудительно ждем, пока шина DDR завершит запись */
    __DSB();
    __ISB();
    printf("[BOARD_UPDATE] Copying completed successfully.\n");

    /* Шаг 4. Снимаем аппаратный сброс. В этот момент аппаратный I-Cache M7 очищается */
    printf("[BOARD_UPDATE] Negating hardware reset on m7mix...\n");
    status = LMM_ResetDomain(s_lm, m7_reset_line, 0U, false, false);
    if (status != SM_ERR_SUCCESS)
    {
        printf("[BOARD_UPDATE] Error negating reset on line 49: %d\n", status);
        return;
    }

    /* Небольшая пауза, чтобы аппаратные триггеры M7 стабилизировались после снятия сброса */
    for (volatile uint32_t i = 0; i < 10000; i++);

    /* Шаг 5. Чистый запуск M7 */
    printf("[BOARD_UPDATE] Launching M7 core...\n");
    status = LMM_CpuStart(s_lm, m7_cpu_id);
    if (status != SM_ERR_SUCCESS)
    {
        printf("[BOARD_UPDATE] M7 startup error: %d\n", status);
        return;
    }
    printf("[BOARD_UPDATE] Logical machine M7 successfully launched with clean hardware cache!\n");
}