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


/*--------------------------------------------------------------------------*/
/* Full system wake                                                         */
/*--------------------------------------------------------------------------*/
int32_t LMM_SystemWake(uint32_t lmId, uint32_t agentId)
{
    int32_t status = SM_ERR_SUCCESS;
    lmm_rpc_trigger_t trigger =
    {
        .rpcInst = 0U,
        .event = LMM_TRIGGER_SYSTEM,
        .parm[0] = LMM_TRIGGER_PARM_WAKE,
        .parm[1] = agentId,
        .parm[2] = 0U,
        .parm[3] = 1U
    };

    /* Notify LMs via system */
    for (uint32_t dstLm = 0U; dstLm < SM_NUM_LM; dstLm++)
    {
        (void) LMM_RpcNotificationTrigger(dstLm, &trigger);
    }

    SM_TEST_MODE_ERR(SM_TEST_MODE_LMM_LVL1, SM_ERR_TEST)

    /* Return status */
    return status;
}

/*--------------------------------------------------------------------------*/
/* Return system reset (shutdown/boot) reason                               */
/*--------------------------------------------------------------------------*/
void LM_SystemReason(uint32_t lmId, lmm_rst_rec_t *bootRec,
    lmm_rst_rec_t *shutdownRec)
{
    int32_t status;
    uint32_t flags;

    /* Get system shutdown reason */
    DEV_SM_SystemShutdownRecGet(shutdownRec);

    /* Valid record? */
    if (shutdownRec->valid)
    {
        /* Reset */
        *bootRec = *shutdownRec;
    }
    else
    {
        lmm_rst_rec_t br = DEV_SM_RST_REC_POR;

        /* POR */
        *bootRec = br;
    }

    /* Get BBM status */
    status = SM_BBMGETBOOTSTATUS(&flags);

    /* Update boot record */
    if (status == SM_ERR_SUCCESS)
    {
        /* Added to improve the test coverage */
        SM_TEST_MODE_EXEC(SM_TEST_MODE_EXEC_LVL1,
            flags = DEV_SM_BBM_BOOT_BUTTON);

        if ((flags & (DEV_SM_BBM_BOOT_BUTTON | DEV_SM_BBM_BOOT_ALARM
            | DEV_SM_BBM_BOOT_ROLLOVER)) != 0U)
        {
            lmm_rst_rec_t bbmRec = DEV_SM_RST_REC_BBM;

            *bootRec = bbmRec;
            bootRec->errId = flags;
            bootRec->validErr = true;
        }
    }
}

/*--------------------------------------------------------------------------*/
/* Set system sleep mode                                                    */
/*--------------------------------------------------------------------------*/
int32_t LMM_SystemSleepModeSet(uint32_t lmId, uint32_t sleepMode,
    uint32_t sleepFlags)
{
    int32_t status = SM_ERR_SUCCESS;

    /* Check LM */
    if (lmId >= SM_NUM_LM)
    {
        status = SM_ERR_NOT_FOUND;
    }
    else
    {
        static uint32_t s_sleepMode[SM_NUM_LM] = { 0 };
        static uint32_t s_sleepFlags[SM_NUM_LM] = { 0 };
        uint32_t newMode = 0U;
        uint32_t newFlags = 0U;

        /* Record new sleep mode/flags */
        s_sleepMode[lmId] = sleepMode;
        s_sleepFlags[lmId] = sleepFlags;

        /* Aggregate sleep mode/flags */
        for (uint32_t lm = 0U; lm < SM_NUM_LM; lm++)
        {
            newMode = MAX(newMode, s_sleepMode[lm]);
            newFlags |= s_sleepFlags[lm];
        }

        /* Inform device of sleep mode/flags */
        SM_SYSTEMSLEEPMODESET(newMode, newFlags);
    }

    SM_TEST_MODE_ERR(SM_TEST_MODE_LMM_LVL1, SM_ERR_TEST)

    /* Return status */
    return status;
}