tao_z
2022-05-29 fa8669b0092240642af78e84c0e89f596444fdad
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "fbl_def.h"
#include "did.h"
#include "eeprom_emul.h"
#include "uds.h"
#include <string.h>
 
#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;
}