/** * @copyright: KUWE technologies Co.,Ltd. 2013-2015. all rights reserved. * @file: calibration.h * @brief: This file contains all the functions prototypes for the calibration. * @author: * @version: V1.0.0 * @date: 2016-03-31 * @history: * 1. * author: * version: * date: * modification: */ #include "error.h" #include "calibration.h" #include "cpu.h" #include "nvm.h" #include "key_app.h" //110078209 #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f182[SYSDID_F182_CK_LEN] @SYSDID_F182_ADDR = #else MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f182[SYSDID_F182_CK_LEN] __attribute__((at(SYSDID_F182_ADDR)))= //const u8 g_sysdid_f182[SYSDID_F182_CK_LEN] __attribute__((at(0x00015BCC)))= #endif { 0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x30,0x30,0x37,0x38,0x32,0x30,0x39,0x00, }; #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f187[SYSDID_F187_CK_LEN] @SYSDID_F187_ADDR = #else MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f187[SYSDID_F187_CK_LEN] __attribute__((at(SYSDID_F187_ADDR)))= #endif { 0x30,0x31,0x31,0x30,0x30,0x37,0x38,0x32,0x30,0x37,0x2fu,0x30,0x30,0x31,0x00 }; #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f188[SYSDID_F188_CK_LEN] @SYSDID_F188_ADDR = #else MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f188[SYSDID_F188_CK_LEN] __attribute__((at(SYSDID_F188_ADDR)))= #endif { 0x30,0x31,0x31,0x30,0x30,0x37,0x38,0x32,0x30,0x38,0x2fu,0x30,0x30,0x31,0x00 }; #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f18a[SYSDID_F18A_CK_LEN] @SYSDID_F18A_ADDR = #else MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f18a[SYSDID_F18A_CK_LEN] __attribute__((at(SYSDID_F18A_ADDR)))= #endif { 0x35,0x30,0x32,0x32,0x30,0x38,0x00, }; #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f18b[SYSDID_F18B_CK_LEN] @SYSDID_F18B_ADDR = #else MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f18b[SYSDID_F18B_CK_LEN] __attribute__((at(SYSDID_F18B_ADDR)))= #endif { 0x20,0x21,0x05,0x08,0x00, }; #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f18c[SYSDID_F18C_CK_LEN] @SYSDID_F18C_ADDR = #else MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f18c[SYSDID_F18C_CK_LEN] __attribute__((at(SYSDID_F18C_ADDR)))= #endif { 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00, }; //656106800A 110008086 0110008086/001 #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f191[SYSDID_F191_CK_LEN] @SYSDID_F191_ADDR = #else MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f191[SYSDID_F191_CK_LEN] __attribute__((at(SYSDID_F191_ADDR)))= #endif { 0x30,0x31,0x31,0x30,0x30,0x30,0x38,0x30,0x38,0x36,0x2fu,0x30,0x30,0x01,0x00 }; #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f192[SYSDID_F192_CK_LEN] @SYSDID_F192_ADDR = #else MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f192[SYSDID_F192_CK_LEN] __attribute__((at(SYSDID_F192_ADDR)))= #endif { 'U','K','E','A','-','7','7','J','S','W','0','4','0','2','_','2','5','0','2','2','8','_','H','1',0x00u }; #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f193[SYSDID_F193_CK_LEN] @SYSDID_F193_ADDR = #else MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f193[SYSDID_F193_CK_LEN] __attribute__((at(SYSDID_F193_ADDR)))= #endif { #if 0 //'V','1','.','0','-',0x32,0x30,0x32,0x31,0x30,0x34,0x31,0x34,0x30,0x00, 0x56u,0x31u,0x2eu,0x30u,0x2du,0x32u,0x30u,0x32u,0x31u,0x30u,0x34u,0x31u,0x34u,0x30u,0x00u #else 1,23,4,14,0,0, #endif }; #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f194[SYSDID_F194_CK_LEN] @SYSDID_F194_ADDR = #else MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f194[SYSDID_F194_CK_LEN] __attribute__((at(SYSDID_F194_ADDR)))= #endif { //0x4Du,0x54u,0x00u,0x11u,0x99u,0x1Eu,0x00u,0x00u,0x02u,0x6B //最后一个字节校验码,方式是全字节累加 0x4Du,0x54u,0x00u,0x10u,0xADu,0x1Eu,0x00u,0x00u,0x01u,0x7Du //最后一个字节校验码,方式是全字节累加--UKEA-C的编码 }; #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f195[SYSDID_F195_CK_LEN] @SYSDID_F195_ADDR = #else MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f195[SYSDID_F195_CK_LEN] __attribute__((at(SYSDID_F195_ADDR)))= #endif { 0x9Cu,0x42u,0x19u,0x02u,0x1Cu,0x00u,0x00u, }; #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f1f1[SYSDID_F1F1_CK_LEN] @SYSDID_F1F1_ADDR = #else MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f1f1[SYSDID_F1F1_CK_LEN] __attribute__((at(SYSDID_F1F1_ADDR)))= #endif { 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00, }; #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f19e[SYSDID_F19E_CK_LEN] @SYSDID_F19E_ADDR= #else MEMORY_MAP_FLAG_NO_OPTIME const u8 g_sysdid_f19e[SYSDID_F19E_CK_LEN] __attribute__((at(SYSDID_F19E_ADDR)))= #endif { 0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x30,0x30,0x37,0x38,0x32,0x31,0x31,0x00, }; #if 1 #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 eeprom_flag_first_reset[4] @(EEPROM_FLAG_FIRST_ADDR) ;//= EEPROM_FLAG_NOT_FIRST_RESET; #else MEMORY_MAP_FLAG_NO_OPTIME const u8 eeprom_flag_first_reset[4] __attribute__((at(EEPROM_FLAG_FIRST_ADDR)))= EEPROM_FLAG_NOT_FIRST_RESET; #endif #endif //當節點丟失後,收到N幀,認為清除DTC #ifdef __ICCARM__ MEMORY_MAP_FLAG_NO_OPTIME const u8 g_dtc_loss_recover_times[DTC_LOSS_RECOVER_TIMES_CK_LEN] @DTC_LOSS_RECOVER_TIMES_ADDR= #else MEMORY_MAP_FLAG_NO_OPTIME const u8 g_dtc_loss_recover_times[DTC_LOSS_RECOVER_TIMES_CK_LEN] __attribute__((at(DTC_LOSS_RECOVER_TIMES_ADDR)))= #endif { 3, //第一个参数是表示节点丢失后,要恢复的满足的次数3次, 10, //第二个参数是checksum错误和恢复的总计数 10, //第三个参数是rolling count错误的总计数 3, //第四个参数是rollingcount相差的个数 0x00 }; //各 DATA ID #if 0 const u16 g_data_id_cfg[E2E_DATA_ID_U16_CK_LEN] @E2E_DATA_ID_ADDR = { CAN_TX_DATAID_SWS_LEFT, CAN_TX_DATAID_SWS_RIGHT, CAN_RX_DATAID_BCM_STA, CAN_RX_DATAID_ADAS_HWA, 0, }; //當節點丟失後,收到N幀,認為清除DTC const u16 g_key_cfg_times1[KEY_TIME_CFG_U16_CK_LEN] @KEY_TIME_CFG_ADDR= { 0u,//KEY_SCAN_DITHERING_TIME,//第一个参数是数字按键的消抖时间,单位是和key app调用周期相关 0u,//KEY_SCAN_STUCK_TIMEOUT,//第二个参数是数字按键的消卡滞时间,单位是和key app调用周期相关 0u,//KEY_SCAN_FAULT_TIMEOUT, //故障检测 0u,//ADC_KEY_TIME_DEBOUNCE,//第三个参数是ad按键的消抖时间,单位是和key adc mid 调用周期相关 0u,//ADC_KEY_TIME_STICKPRESS,//第四个参数是ad按键的卡滞时间,单位是和key adc mid调用周期相关 0u,//ADC_KEY_TIME_FAULT, //故障检测 0u,//ADC_ASIL_KEY_TIME_DEBOUNCE, //预留给ASILA按键 0u,//ADC_ASIL_KEY_TIME_STUCK, //预留给ASILA按键 0u,//ADC_ASIL_KEY_TIME_FAULT, //预留给ASILA按键 0u }; #endif MEMORY_MAP_FLAG_NO_OPTIME const u8 g_cfg_supply_info[CFG_SUPPLY_INFO_CK_LEN] @CFG_SUPPLY_INFO_ADDR= // { 1u, //支持level 写入 01a0 0u }; MEMORY_MAP_FLAG_NO_OPTIME const u8 g_cfg_speed_limit[CFG_SPEED_LIMIT_CK_LEN] @CFG_SPEED_LIMIT_ADDR= { 0u,//APP_COM_VHSPEED_MIN, 0u, }; 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_AND_WRITE, 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, WRITE_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_ONLY, SYSDID_F198_REPAIR_SN_ADDR, SYSDID_F198_REPAIR_SN_CK_LEN}, {0xF199u, DID_TYPE_VOLATILE, READ_ONLY, SYSDID_F199_DATE_ADDR, SYSDID_F199_DATE_CK_LEN}, {0xF100u, DID_TYPE_VOLATILE, READ_ONLY, SYSDID_ATTEMP_ADDR, SYSDID_ATTEMP_LEN+SYSDID_ATTEMP_MAX_LEN} }; 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; } 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; 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; } volatile uint16_t test1; 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; 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; } void cal_did_init(void) { uint8_t i; //u8 j; //u16_swap_t l_buf[8]; //u8 l_data[64]; 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; } CAL_ENTER_CRITICAL(); CAL_EXIT_CRITICAL(); } //cal_did_test(); } //static u8 g_cal_refresh_flag = 0u; /*PRQA S 3207*/ /*讀取數據之後的更新*/ void cal_did_read_refresh(void) { #if 0 u8 j; u16_swap_t l_buf[16]={0}; if(g_cal_refresh_flag ==0) { 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 } /** 判斷數組的值是否都為 value; * @param Pdata內容 * @param * @param * @return */ u8 buf_judge_value_is_same(uc8 *pdata,u8 len ,u8 value) { u8 l_result = TRUE; u8 i; for(i=0;i