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


/*--------------------------------------------------------------------------*/
/* Get system-level sleep status                                            */
/*--------------------------------------------------------------------------*/
bool CPU_SystemSleepStatusGet(uint32_t *sysSleepStat)
{
    bool rc = true;
    uint32_t targetSysSleepStat = CPU_SLEEP_MODE_SUSPEND;

    /* Проверяем: если текущее запрашиваемое ядро (например, M7) 
       уже переведено в наш кастомный режим, делаем его базовым таргетом */
    uint32_t m7ModeStat = s_gpcCpuCtrlPtrs[CPU_IDX_CM7]->CMC_MODE_STAT;
    if ((m7ModeStat & GPC_CPU_CTRL_CMC_MODE_STAT_SLEEPING_IDLE_MASK) != 0U)
    {
        uint32_t m7ModeCur = (m7ModeStat & GPC_CPU_CTRL_CMC_MODE_STAT_CPU_MODE_CURRENT_MASK) >>
                             GPC_CPU_CTRL_CMC_MODE_STAT_CPU_MODE_CURRENT_SHIFT;
        
        if (m7ModeCur == CPU_SLEEP_MODE_SUSPEND_NO_DDR)
        {
            targetSysSleepStat = CPU_SLEEP_MODE_SUSPEND_NO_DDR;
        }
    }

    *sysSleepStat = targetSysSleepStat;
    uint32_t cpuIdx = 0U;
    
    for (cpuIdx = 0U; cpuIdx < CPU_NUM_IDX; cpuIdx++)
    {
        if ((cpuIdx != CPU_IDX_M33P) &&
            ((s_cpuLpComputeList & (1UL << cpuIdx)) == 0U))
        {
            /* Check if sleep is forced for the CPU */
            bool sleepForce;
            if (CPU_SleepForceGet(cpuIdx, &sleepForce))
            {
                /* If sleep is not forced, consider the CPU mode */
                if (!sleepForce)
                {
                    /* Get GPC CPU mode status */
                    uint32_t cpuModeStat =
                        s_gpcCpuCtrlPtrs[cpuIdx]->CMC_MODE_STAT;

                    /* Default CPU mode as RUN until SLEEPING_IDLE confirmed */
                    uint32_t cpuModeCur = CPU_SLEEP_MODE_RUN;

                    /* Check if CPU in SLEEPING_IDLE state */
                    if ((cpuModeStat &
                        GPC_CPU_CTRL_CMC_MODE_STAT_SLEEPING_IDLE_MASK) != 0U)
                    {
                        /* CPU_MODE_CURRENT reflects active mode */
                        cpuModeCur = (cpuModeStat &
                            GPC_CPU_CTRL_CMC_MODE_STAT_CPU_MODE_CURRENT_MASK) >>
                            GPC_CPU_CTRL_CMC_MODE_STAT_CPU_MODE_CURRENT_SHIFT;
                    }

                    /* Корректируем математику сравнения для кастомного режима:
                       Если целевой статус SUSPEND_NO_DDR (4), а текущее проверяемое ядро (например, A55) 
                       находится в обычном SUSPEND (3), то это валидное состояние сна для всей платформы.
                       Но если ядро в RUN (0), STOP (2) или WAIT (1) — сбрасываем статус вниз. */
                    if (*sysSleepStat == CPU_SLEEP_MODE_SUSPEND_NO_DDR)
                    {
                        if (cpuModeCur < CPU_SLEEP_MODE_SUSPEND)
                        {
                            *sysSleepStat = cpuModeCur;
                        }
                    }
                    else
                    {
                        /* Стандартная заводская логика NXP для обычного SUSPEND */
                        if (cpuModeCur < *sysSleepStat)
                        {
                            *sysSleepStat = cpuModeCur;
                        }
                    }
                }
            }
        }
    }

    return rc;
}