163 lines
4.7 KiB
C
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 *)¶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;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|