#include "fbl_def.h" #include "did.h" #include "eeprom_emul.h" #include "uds.h" #include #define CAL_PART_NUMBER_SIZE ((uint8_t)10) #define CORE_ASSEMBLY_NUMBER_SIZE ((uint8_t)24) #define ECU_SERIAL_NUMBER_SIZE ((uint8_t)16) #define VINID_NUMBER_SIZE ((uint8_t)17) #define SYSTEM_NAME_NUMBER_SIZE ((uint8_t)10) #define VPPS_NUMBER_SIZE ((uint8_t)14) #define DUNS_NAME_NUMBER_SIZE ((uint8_t)9) #define MTC_NAME_NUMBER_SIZE ((uint8_t)16) #define VERSION_CODE_NUMBER_SIZE ((uint8_t)2) #define FIGNER_PRINT_WRITE (9) #define FIGNER_PRINT_READ (10) #define VA_InstallDate (80u) // 4B #define VA_PROGRAM_DATA (84u) // 32B #define VA_PROGRAM_DATE (100u) // 4B #define ProgramBlockLenth (32u) typedef struct ProgrammingDate { uint8_t ProgrammingDate_YY_H; uint8_t ProgrammingDate_YY_L; uint8_t ProgrammingDate_MM; uint8_t ProgrammingDate_DD; } ProgrammingDate_t; // total 32 bytes typedef struct { uint8_t RepairShopCodeOrTesterSerialNumber[16]; /*16 byte*/ ProgrammingDate_t UDS_NS_ProgrammingDate; /*4Byte*/ uint8_t ProgrammingCounter; /*1Byte*/ uint8_t ProgrammingAttempCounter; /*1Byte*/ uint8_t FingerPrint_W[10]; } Program_BLOCK_t; static Program_BLOCK_t NVM_ProgramBLOCK = {0}; uint16_t DIDTable_Entry_Count_u16 = 0; UDS_DIDtableEntry DIDtable[UDS_DID_TABLE_SIZE]; // static uint8_t DID_LoaderWaitTimer = 0; static uint8_t DID_NeedtoSaveFlag = 0; void did_init(void) { DID_NeedtoSaveFlag = 0; UDS_InitDIDMapRW(DID_NS_ProgrammingCounter, VA_PROGRAM_DATA, &NVM_ProgramBLOCK.ProgrammingCounter, 1); UDS_InitDIDMapRW(DID_NS_ProAtpCounter, VA_PROGRAM_DATA, &NVM_ProgramBLOCK.ProgrammingAttempCounter, 1); UDS_InitDIDMapRW(DID_NS_ReadFingerPrint, VA_PROGRAM_DATA, &NVM_ProgramBLOCK.FingerPrint_W, 9); UDS_InitDIDMapRW(DID_NS_RepairShopCodeOrTester, VA_PROGRAM_DATA, &NVM_ProgramBLOCK.RepairShopCodeOrTesterSerialNumber, 16); UDS_InitDIDMapRW(DID_NS_ECUProgtammingDate, VA_PROGRAM_DATA, &NVM_ProgramBLOCK.UDS_NS_ProgrammingDate.ProgrammingDate_YY_H, 4); UDS_InitDIDMapRW(DID_NS_WriteFingerPrint, VA_PROGRAM_DATA, &NVM_ProgramBLOCK.FingerPrint_W, 10); FblReadProgramBlock(); // load program data.must after ee_init() } extern void DID_SetWriteSaveFlag(void) { DID_NeedtoSaveFlag = 1; } extern int8_t DID_SaveProgamDataToNvm(void) { int8_t rtn = OP_STATUS_FAIL; if (DID_NeedtoSaveFlag == 1) { rtn = FblWriteProgramBlock(); } else { rtn = OP_STATUS_OK; } } extern void DID_UpdateProgramCnt(void) { NVM_ProgramBLOCK.ProgrammingCounter += 1; DID_NeedtoSaveFlag = 1; } extern void DID_UpdateAtpProgramCnt(void) { NVM_ProgramBLOCK.ProgrammingAttempCounter += 1; DID_NeedtoSaveFlag = 1; } extern int8_t FblReadProgramBlock(void) { uint32_t *p_dest = (uint32_t *)(&NVM_ProgramBLOCK); uint8_t i = 0; int8_t rtn = OP_STATUS_OK; EE_Status retValue1 = EE_WRITE_ERROR; for (i = 0; i < (ProgramBlockLenth >> 2); i++) { if (EE_OK != EE_ReadVariable32bits(VA_PROGRAM_DATA + i * 4, (p_dest + i))) { rtn = OP_STATUS_FAIL; break; } } return rtn; } extern int8_t FblWriteProgramBlock(void) { uint32_t *p_dest = (uint32_t *)(&NVM_ProgramBLOCK); uint8_t i = 0; int8_t rtn = OP_STATUS_OK; EE_Status retValue1 = EE_WRITE_ERROR; for (i = 0; i < (ProgramBlockLenth >> 2); i++) { if (EE_OK != EE_WriteVariable32bits(VA_PROGRAM_DATA + i * 4, *(p_dest + i))) { rtn = OP_STATUS_FAIL; break; } } return rtn; }