K74B/87400/usr/common/pdsTask.c
2024-01-25 14:22:18 +08:00

163 lines
4.7 KiB
C

/**
* @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 <pdsTask.h>
#include <crc32.h>
#include <meta.h>
#include <flash_sfrs.h>
#include <linsNodeCfgIdentify.h>
#include <linStackTask.h>
#include <linSlaveTask.h>
#include <crc_sfr.h>
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 *)&param->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 *)&param->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;
}
}