LL01/code_boot_out/qm/module/calibration.c
2025-04-26 16:03:23 +08:00

511 lines
15 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/** ##########################################################################
** Filename :
** Project :
** Module :
** Processor :
** Version :
** Compiler :
** Date/Time :
** Abstract :
** Contents :
** Note :
**
** (c) Copyright dmdz Co.,Ltd
** --------------------------------------------------------------------------
** R E V I S I O N H I S T O R Y
** --------------------------------------------------------------------------
** Date Ver Author Description
** -20191106- --V01-- --LYJ--- --初版--
** -20230602- --V1.0-- --mingyea--- --修改--
** #########################################################################*/
/*---------------------------------------------------------------------------
- I N C L U D E F I L E S
----------------------------------------------------------------------------*/
#include "error.h"
#include "calibration.h"
#include "cpu.h"
#include "nvm.h"
//#include "nvm_drive.h"
//#include "EEPROM.h"
/*---------------------------------------------------------------------------
- D E F I N E S / M A C R O S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- T Y P E D E F I N I T I O N S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- S T A T I C V A R I A B L E S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
* G L O B A L V A R I A B L E S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- C O N S T A N T S
----------------------------------------------------------------------------*/
#ifdef __ICCARM__
//110078207 0110078207/001
MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f180[SYSDID_F180_CK_LEN] @SYSDID_F180_ADDR =
#else
MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f180[SYSDID_F180_CK_LEN] __attribute__((at(SYSDID_F180_ADDR))) =
#endif
{
0x18,0x03,0x01,0x01,0x00,0x00,0x18,0x01,0x14,0x00
};
#ifdef __ICCARM__
//110078207 0110078207/001
MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f181[SYSDID_F181_CK_LEN] @SYSDID_F181_ADDR =
#else
MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f181[SYSDID_F181_CK_LEN] __attribute__((at(SYSDID_F181_ADDR))) =
#endif
{
0x01,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x30,0x30,0x37,0x38,0x32,0x30,0x38,0x00,
};
MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f194[SYSDID_F194_CK_LEN] @SYSDID_F194_SELF_ADDR =
{
0x4Du,0x54u,0x00u,0x10u,0xADu,0x1Eu,0x00u,0x00u,0x01u,0x7Du //boot区的F194的校验码必须有等于前面各字节之和
};
#ifdef __ICCARM__
MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f1f2[SYSDID_F1F2_CK_LEN] @SYSDID_F1F2_ADDR =
#else
MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f1f2[SYSDID_F1F2_CK_LEN] __attribute__((at(SYSDID_F1F2_ADDR))) =
#endif
{
//BOOTSW0100-00
//'B','O','O','T','S','W',0x30,0x32,0x30,0x30,'-',0x30,0x30,0x35,0x00,
0xffu,0xffu,0xffu,0xffu,0xffu,0xffu,0xffu,0xffu,0xffu,0xffu,0xffu,0xffu,0xffu,0xffu,0xffu,
};
const did_attribute_t did_attribute_table[DID_ATTRIBUTE_TABLE_LENGTH] =
{
{0xF180u, DID_TYPE_CONST, READ_ONLY, SYSDID_F180_ADDR, SYSDID_F180_CK_LEN},
{0xF181u, DID_TYPE_CONST, READ_ONLY, SYSDID_F181_ADDR, SYSDID_F181_CK_LEN},
{0xF1F2u, DID_TYPE_CONST, READ_ONLY, SYSDID_F1F2_ADDR, SYSDID_F1F2_CK_LEN},
{0xF182u, DID_TYPE_CONST, READ_ONLY, SYSDID_F182_ADDR, SYSDID_F182_CK_LEN},
{0xF187u, DID_TYPE_CONST, READ_ONLY, SYSDID_F187_ADDR, SYSDID_F187_CK_LEN},
{0xF188u, DID_TYPE_CONST, READ_ONLY, SYSDID_F188_ADDR, SYSDID_F188_CK_LEN},
{0xF18Au, DID_TYPE_CONST, READ_ONLY, SYSDID_F18A_ADDR, SYSDID_F18A_CK_LEN},
{0xF18Bu, DID_TYPE_CONST, READ_ONLY, SYSDID_F18B_ADDR, SYSDID_F18B_CK_LEN},
{0xF18Cu, DID_TYPE_VOLATILE, READ_AND_WRITE, SYSDID_ECU_SN_ADDR, SYSDID_ECU_SN_CK_LEN},
{0xF191u, DID_TYPE_CONST, READ_ONLY, SYSDID_F191_ADDR, SYSDID_F191_CK_LEN},
{0xF192u, DID_TYPE_CONST, READ_ONLY, SYSDID_F192_ADDR, SYSDID_F192_CK_LEN},
{0xF193u, DID_TYPE_CONST, READ_ONLY, SYSDID_F193_ADDR, SYSDID_F193_CK_LEN},
{0xF194u, DID_TYPE_CONST, READ_ONLY, SYSDID_F194_ADDR, SYSDID_F194_CK_LEN},
{0xF195u, DID_TYPE_CONST, READ_ONLY, SYSDID_F195_ADDR, SYSDID_F195_CK_LEN}, //(uint32_t)&g_sysdid_f195[0]
{0xF1F1u, DID_TYPE_CONST, READ_ONLY, SYSDID_F1F1_ADDR, SYSDID_F1F1_CK_LEN},
{0xF19eu, DID_TYPE_CONST, READ_ONLY, SYSDID_F19E_ADDR, SYSDID_F19E_CK_LEN},
{0xF1A0u, DID_TYPE_VOLATILE, READ_ONLY, SYSDID_VEHICLE_CONFIG_ADDR, SYSDID_VEHICLE_CONFIG_CK_LEN},
{0x01A0u, DID_TYPE_VOLATILE, READ_AND_WRITE, SYSDID_MANUFAC_LIFECYCLE_COUNT_ADDR, SYSDID_MANUFAC_LIFECYCLE_COUNT_CK_LEN},
{0x01B0u, DID_TYPE_VOLATILE, READ_ONLY, SYSDID_SECURITY_KEY_ADDR, SYSDID_SECURITY_KEY_CK_LEN},
{0xF190u, DID_TYPE_VOLATILE, READ_AND_WRITE, SYSDID_F190_VIN_ADDR, SYSDID_F190_VIN_CK_LEN},
{0xF198u, DID_TYPE_VOLATILE, READ_AND_WRITE, SYSDID_F198_REPAIR_SN_ADDR, SYSDID_F198_REPAIR_SN_CK_LEN},
{0xF199u, DID_TYPE_VOLATILE, READ_AND_WRITE, SYSDID_F199_DATE_ADDR, SYSDID_F199_DATE_CK_LEN},
{0xF100u, DID_TYPE_VOLATILE, READ_AND_WRITE, SYSDID_ATTEMP_ADDR, SYSDID_ATTEMP_LEN+SYSDID_ATTEMP_MAX_LEN}
};
/*---------------------------------------------------------------------------
- F U N C T I O N P R O T O T Y P E
----------------------------------------------------------------------------*/
void cal_did_test(void);
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
static uint8_t get_did_headler(did_t did)
{
uint8_t i;
u8 l_result =0xffu;
for(i = 0; i < DID_ATTRIBUTE_TABLE_LENGTH; i++)
{
if(did == did_attribute_table[i].id)
{
l_result = i;
break;
}
}
return l_result;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
u8 cal_read_did(did_t did, uint8_t *p_buf, uint8_t length)
{
uint8_t headler;
uint8_t opt_length;
u8 l_result = TRUE;
CAL_CPU_SR_ALLOC();
do
{
headler = get_did_headler(did) ;
if( (headler == 0xffu) || (did_attribute_table[headler].rw == WRITE_ONLY) )
{
l_result = FALSE;
break;
}
if(length < did_attribute_table[headler].length)
{
opt_length = length;
}
else
{
opt_length = did_attribute_table[headler].length;
}
CAL_ENTER_CRITICAL();
#if 0
for(i = 0; i < opt_length; i++)
{
p_buf[i] = did_attribute_table[headler].addr[i];
}
#endif
if(did_attribute_table[headler].type == DID_TYPE_CONST)
{
(void)nvm_read_bytes(NVM_TYPE_FLASH,did_attribute_table[headler].phy_addr,p_buf,(u16)opt_length);
}
else
{
(void)nvm_read_bytes(NVM_TYPE_EEPROM,did_attribute_table[headler].phy_addr,p_buf,(u16)opt_length);
}
CAL_EXIT_CRITICAL();
}while(0);
return l_result;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
u8 cal_write_did(did_t did, const uint8_t *p_buf, uint8_t length)
{
uint8_t l_result = FALSE;
uint8_t headler;
uint8_t opt_length;
CAL_CPU_SR_ALLOC(); /*PRQA S 0318,3205*/
do
{
headler = get_did_headler(did) ;
if( (headler == 0xffu) || (did_attribute_table[headler].rw == READ_ONLY))
{
l_result = FALSE;
break;
}
if(length < did_attribute_table[headler].length)
{
opt_length = length;
}
else
{
opt_length = did_attribute_table[headler].length;
}
CAL_ENTER_CRITICAL();
#if 0
for(i = 0; i < opt_length; i++)
{
did_attribute_table[headler].addr[i] = p_buf[i];
}
#endif
if(did_attribute_table[headler].type == DID_TYPE_CONST)
{
l_result = TRUE;
//(void)nvm_write_bytes(NVM_TYPE_FLASH,did_attribute_table[headler].phy_addr,p_buf,opt_length);
}
else
{
l_result = nvm_write_bytes(NVM_TYPE_EEPROM,did_attribute_table[headler].phy_addr,(u8*)&p_buf[0],(u16)opt_length); /*PRQA S 0311*/
if((u8)ERR_OK == l_result)
{
l_result = TRUE;
}
}
CAL_EXIT_CRITICAL();
}while(0);
return l_result;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
void cal_did_init(void)
{
uint8_t i;
//u8 j;
//u16_swap_t l_buf[8];
//u8 l_data[64];
CAL_CPU_SR_ALLOC(); /*PRQA S 0318,3205*/
for(i = 0; i < DID_ATTRIBUTE_TABLE_LENGTH; i++)
{
#ifdef FUN_WDT_ENABLE
wdog_task();
#endif
if(did_attribute_table[ i ].type == DID_TYPE_CONST)
{
continue; /*PRQA S 2005*/
}
CAL_ENTER_CRITICAL();
CAL_EXIT_CRITICAL();
}
//cal_did_test();
}
//static u8 g_cal_refresh_flag = 0u; /*PRQA S 3207*/
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
void cal_did_read_refresh(void)
{
#if 0
u8 j;
u16_swap_t l_buf[16]={0};
if(g_cal_refresh_flag ==0u)
{
g_cal_refresh_flag = 1;
#ifdef FUN_WDT_ENABLE
wdog_task();
#endif
#if 1
/*F180*/
for(j=0;j<8;j++)
{
#ifdef CAL_USE_NVM
(void)eeprom_get_u16((eeprom_addr_t)(EEPROM_DATA_BASE_ADDR+EEPROM_F180_ADDR+2*j), &l_buf[j].w);
#endif
volatile_did.boot_soft_id[2*j] = l_buf[j].w >> 8;
volatile_did.boot_soft_id[2*j+1] = l_buf[j].w;
}
#endif
#if 1
/*F187*/
for(j=0;j<5;j++)
{
l_buf[j].w = (u16)const_did.geely_spare_part_number[2*j] << 8 | const_did.geely_spare_part_number[2*j+1] ;
#ifdef CAL_USE_NVM
(void)eeprom_set_u16((eeprom_addr_t)(EEPROM_DATA_BASE_ADDR+EEPROM_F187_ADDR+2*j), l_buf[j].w);
#endif
}
#endif
#if 1
/*F189*/
for(j=0;j<8;j++)
{
l_buf[j].w = (u16)const_did.ecu_software_version_number[2*j] << 8 | const_did.ecu_software_version_number[2*j+1] ;
#ifdef CAL_USE_NVM
(void)eeprom_set_u16((eeprom_addr_t)(EEPROM_DATA_BASE_ADDR+EEPROM_F189_ADDR+2*j), l_buf[j].w);
#endif
}
#endif
#if 1
/*F193*/
for(j=0;j<8;j++)
{
l_buf[j].w = (u16)const_did.system_supplier_ecu_hardware_version_number[2*j] << 8 | const_did.system_supplier_ecu_hardware_version_number[2*j+1] ;
#ifdef CAL_USE_NVM
(void)eeprom_set_u16((eeprom_addr_t)(EEPROM_DATA_BASE_ADDR+EEPROM_F193_ADDR+2*j), l_buf[j].w);
#endif
}
#endif
}
#endif
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description : 判斷數組的值是否都為 value;
----------------------------------------------------------------------------*/
u8 buf_judge_value_is_same(uc8 *pdata,u8 len ,u8 value)
{
u8 l_result = TRUE;
u8 i;
for(i=0;i<len;i++)
{
if( pdata[i] != value )
{
l_result = FALSE;
break;
}
}
return l_result;
}
#if 0
//u8 *g_cal_paddr;
volatile u8 g_cal_w_buf[50];
volatile u8 g_cal_r_buf[50];
void cal_did_test(void)
{
//g_cal_paddr = (u8*)&g_sysdid_f195[0];
cal_read_did(0xF180u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF100u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF181u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF1F2u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF182u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF187u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF188u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF18au,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF18bu,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF18cu,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF191u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF192u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF193u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF194u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF195u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF1f1u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF19eu,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF190u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF190u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF198u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF199u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF195u,(u8*)&g_cal_w_buf[0],50);
cal_write_did(0xF190u,(u8*)&g_cal_w_buf[0],50);
cal_read_did(0xF190u,(u8*)&g_cal_r_buf[0],50);
cal_read_did(0xF1A0u,(u8*)&g_cal_r_buf[0],50);
g_cal_w_buf[0]= 0x56;
cal_write_did(0x01A0u,(u8*)&g_cal_w_buf[0],50);
cal_read_did(0x01A0u,(u8*)&g_cal_r_buf[0],50);
g_cal_w_buf[0]= 0x77;
cal_write_did(0x01b0u,(u8*)&g_cal_w_buf[0],50);
cal_read_did(0x01b0u,(u8*)&g_cal_r_buf[0],50);
g_cal_w_buf[0]= 0x99;
cal_write_did(0xF198u,(u8*)&g_cal_w_buf[0],50);
cal_read_did(0xF198u,(u8*)&g_cal_r_buf[0],50);
g_cal_w_buf[0]= 0x88;
cal_write_did(0xF199u,(u8*)&g_cal_w_buf[0],50);
cal_read_did(0xF199u,(u8*)&g_cal_r_buf[0],50);
//(void)nvm_read_bytes(NVM_TYPE_FLASH,(u32)&g_cal_paddr,&g_cal_r_buf[0],SYSDID_F195_CK_LEN);
//(void)nvm_read_bytes(NVM_TYPE_FLASH,(u32)&g_sysdid_f195[0],&g_cal_w_buf[0],SYSDID_F195_CK_LEN);
}
#endif
#ifdef CALIBRATION_DISP_ADDR_DEBUG
typedef struct
{
u16 addr;
u8 len;
}cal_disp_s;
MEMORY_MAP_FLAG_NO_OPTIME const cal_disp_s g_cal_eeprom_addr[] =
{
{SYSDID_ATTEMP_ADDR,SYSDID_ATTEMP_LEN},
{SYSDID_ATTEMP_MAX_ADDR,SYSDID_ATTEMP_MAX_LEN},
{SYSDID_ATTEMP_CRC_ADDR,SYSDID_ATTEMP_CK_LEN},
{SYSDID_ECU_SN_ADDR,SYSDID_ECU_SN_CK_LEN},
{SYSDID_F190_VIN_ADDR,SYSDID_F190_VIN_CK_LEN},
{SYSDID_F198_REPAIR_SN_ADDR,SYSDID_F198_REPAIR_SN_CK_LEN},
{SYSDID_F199_DATE_ADDR,SYSDID_F199_DATE_CK_LEN},
{SYSDID_MANUFAC_LIFECYCLE_COUNT_ADDR,SYSDID_MANUFAC_LIFECYCLE_COUNT_CK_LEN},
{SYSDID_SECURITY_KEY_ADDR,SYSDID_SECURITY_KEY_CK_LEN},
{SYSDID_SA_LOCKTIMER_TIME_ADDR,SYSDID_SA_LOCKTIMER_TIME_LEN},
{SYSDID_SA_LOCKTIMER_FLAG_ADDR,SYSDID_SA_LOCKTIMER_FLAG_LEN},
{SYSDID_SA_LV1_ATTEMPT_ADDR,SYSDID_SA_LV1_ATTEMPT_LEN},
{SYSDID_SA_LC_CRC_ADDR,SYSDID_SA_LOCKTIMER_CK_LEN},
{SYSDID_SU_LOCKTIMER_TIME_ADDR,SYSDID_SU_LOCKTIMER_TIME_LEN},
{SYSDID_SU_LOCKTIMER_FLAG_ADDR,SYSDID_SU_LOCKTIMER_FLAG_LEN},
{SYSDID_SU_LV1_ATTEMPT_ADDR,SYSDID_SU_LV1_ATTEMPT_LEN},
{SYSDID_SU_LC_CRC_ADDR,SYSDID_SU_LOCKTIMER_CK_LEN},
{SYSDID_VEHICLE_CONFIG_ADDR,SYSDID_VEHICLE_CONFIG_CK_LEN},
{SYSDID_SW_VERSION_FOR_SG_ADDR,SYSDID_SW_VERSION_FOR_SG_CK_LEN},
{SYSDID_RES1_ADDR,SYSDID_RES1_CK_LEN},
{SYSDID_RES2_ADDR,SYSDID_RES2_CK_LEN},
{SYSDID_RES3_ADDR,SYSDID_RES3_CK_LEN},
{SYSDID_RES4_ADDR,SYSDID_RES4_CK_LEN},
{SYSDID_RES5_ADDR,SYSDID_RES5_CK_LEN},
{SYSDID_RES6_ADDR,SYSDID_RES6_CK_LEN},
{SYSDID_SA_TOTAL_TIMEOUT_ADDR,SYSDID_SA_TOTAL_TIMEOUT_CK_LEN},
{SYSDID_SU_TOTAL_TIMEOUT_ADDR,SYSDID_SU_TOTAL_TIMEOUT_CK_LEN},
};
#endif
/*PRQA S 1503*/