/** * @copyright 2015 Indie Semiconductor. * * This file is proprietary to Indie Semiconductor. * All rights reserved. Reproduction or distribution, in whole * or in part, is forbidden except by express written permission * of Indie Semiconductor. * * @file pdsTask.c * @Author: Jack.Pan * @E-mail:jack.pan@indiemicro.com * @Date: 2020/09/10 */ #include #include #include #include #include #include #include #include uint8_t pds_store(uint8_t index); static SystemParams_t systemParam; static TaskState_t pdsState = TASK_STATE_INIT; static PdsStatus_t pdsStatus = PDS_STATUS_USING_NORMAL; #define PDS_ACTIVE_DATA_INDEX (0U) #define PDS_ACTIVE_DATA_BACKUP_INDEX (1U) void PDS_Init(void) { CRC32_Init(); SystemParams_t *param = (SystemParams_t *)FLASH_START_ADDRESS_SYSTEM_DATA; uint32_t crcValue = CRC32_GetRunTimeCRC32((uint8_t *)(void *)¶m->info ,(uint16_t)sizeof(param->info)); if (crcValue == param->head.crc32){ systemParam = *param; pdsStatus = PDS_STATUS_USING_NORMAL; }else{ param = (SystemParams_t *)FLASH_START_ADDRESS_SYSTEM_DATA_BACK_UP; crcValue = CRC32_GetRunTimeCRC32((uint8_t *)¶m->info ,(uint16_t)sizeof(param->info)); if (crcValue == param->head.crc32){ systemParam = *param; pdsStatus = PDS_STATUS_USING_BACKUP; }else{ pdsStatus = PDS_STATUS_USING_DEFAULT; } } if (pdsStatus == PDS_STATUS_USING_DEFAULT){ /* **********************fix LIN configuration default value ************************************/ systemParam.head.index = 0U; systemParam.info.linParams.nad = INIT_LINS_NAD_ADDR; systemParam.info.linParams.supplierID = LINS_SUPPLIER_ID; systemParam.info.linParams.functionID = LINS_FUNCTION_ID; systemParam.info.linParams.variant = LINS_VARIANT; systemParam.info.linParams.serialNo = LINS_SERIAL_NO; systemParam.info.linParams.fwVersion = LINS_FW_VERSION; systemParam.info.linParams.hwVersion = LINS_HW_VERSION; LIN_Device_Frame_t volatile *frame = LINS_GetUcndFramesTable(&systemParam.info.linParams.frameIDSize); for (uint8_t i = 0; i < systemParam.info.linParams.frameIDSize; i++){ systemParam.info.linParams.frameInfo[i].frameId = frame[i].frame_id; systemParam.info.linParams.frameInfo[i].frameIsValid = TRUE; } } ls_set_initialNad(INIT_LINS_NAD_ADDR); ls_set_nad(INIT_LINS_NAD_ADDR); /* must be call here for init LIN param */ LNCI_Init(); } uint8_t pds_store(uint8_t index) { /****************************************************************************************************************/ uint16_t wordLength; uint32_t *pWord = (uint32_t *)((void *)&systemParam); uint32_t crcValue = CRC32_GetRunTimeCRC32((uint8_t *)(&systemParam.info) ,(uint16_t)sizeof(systemParam.info)); systemParam.head.crc32 = crcValue; systemParam.head.index ++; /* sizeof(SystemParams_t) is the timers of word */ wordLength = ((uint16_t)sizeof(SystemParams_t) >> 2U); pdsStatus = PDS_STATUS_USING_NORMAL; if (index == PDS_ACTIVE_DATA_INDEX){ /*write sys data normal*/ f_FLASH_EraseSector(FLASH_START_ADDRESS_SYSTEM_DATA); for (uint16_t i = 0U; i < wordLength; i+=2U){ if ((i+1U) < wordLength){ f_FLASH_Write2WordsWithECC(FLASH_START_ADDRESS_SYSTEM_DATA +(uint32_t)i*4U, pWord[i],pWord[i+1U]); } } }else{ /*write sys data back up*/ f_FLASH_EraseSector(FLASH_START_ADDRESS_SYSTEM_DATA_BACK_UP); for (uint16_t i = 0U; i < wordLength; i+=2U){ if ((i+1U) < wordLength){ f_FLASH_Write2WordsWithECC(FLASH_START_ADDRESS_SYSTEM_DATA_BACK_UP +(uint32_t)i*4U, pWord[i],pWord[i+1U]); } } } return 0U; } LINClusterParams_t *PDS_GetLINParam(void) { return &systemParam.info.linParams; } PdsStatus_t PDS_GetPdsStatus(void) { return pdsStatus; } void PDS_TaskHandler(void) { switch(pdsState){ case TASK_STATE_INIT: pdsState = TASK_STATE_ACTIVE; break; case TASK_STATE_ACTIVE: /* storage system parameters */ (void)pds_store(PDS_ACTIVE_DATA_INDEX); pdsState = TASK_STATE_PROCESSING; TM_PostTask(TASK_ID_PDS); break; case TASK_STATE_PROCESSING: /* storage system parameters backup*/ (void)pds_store(PDS_ACTIVE_DATA_BACKUP_INDEX); /* set save parameters flag for lin stack*/ (void)ls_save_configuration(); pdsState = TASK_STATE_ACTIVE; break; default: break; } }