1307 lines
36 KiB
C
1307 lines
36 KiB
C
#include "uds_config.h"
|
||
#include "uds_nvm.h"
|
||
#include "BSP_CAN.h"
|
||
#if BOOTLOADER_CODE_FLAG == 0
|
||
|
||
#else
|
||
|
||
#endif
|
||
|
||
|
||
//INT32U g_ulRand=0;
|
||
DIDs gDIDCache;
|
||
|
||
|
||
//uint8_t g_testerprogramdateflag = false;
|
||
//uint8_t g_testerserialnubnerflag = false;
|
||
|
||
//extern INT8U strMcuAppst[4];
|
||
//extern INT8U strMcuAppDate[4];
|
||
extern INT32U ParseCanRxCnt;
|
||
extern uint32_t FBL_AppSize;
|
||
|
||
|
||
//_HSCANERROR HsCanError;
|
||
uint32_t g_ulCanStatus;
|
||
|
||
VehicleInfo2UdsType vehicleInfo2uds;
|
||
|
||
UdsInfo2VehicleType udsInfo2Vehicle={true,true,true,true,true};
|
||
|
||
//UdsInfo2VehicleType udsInfo2Vehicle = {
|
||
// .NcmRxEnable = true,
|
||
// .NcmTxEnable = true,
|
||
// .NmcmRxEnable = true,
|
||
// .NmcmTxEnable = true,
|
||
// .UdsOffLine = true,
|
||
//};
|
||
|
||
|
||
uint8_t diagStart_InitTimer = 0;
|
||
uint8_t diagStart_Timer = 0;
|
||
DTC_STRUCT dtcComm;
|
||
DTC_StatusType dtcStatusBak;
|
||
DTC_Fault_Flags faultInfo; //¹ÊÕÏÐÅÏ¢
|
||
DTC_Options dtcOptions;
|
||
const uint32_t DTC_LIST_TABLE[DTC_ID_NUM] = {
|
||
DTC_FOREACH(GENERATE_DTC_VALUE_ARRAY)
|
||
};
|
||
|
||
|
||
void DID_SignalInit(void)
|
||
{
|
||
uint8_t i;
|
||
uint8_t index;
|
||
uint16_t size;
|
||
uint8_t *cachePtr, *didPtr;
|
||
uint8_t *nvmDidPtr;
|
||
DIDS_NvmType *dids;
|
||
|
||
EE_Read(NVM_IMAGE_DID_ADDR, (uint8_t **)&dids);
|
||
cachePtr = (uint8_t *)&gDIDCache;
|
||
|
||
for (i = 0; i < DID_StoreInFlash_NUM; i++) {
|
||
index = GetDIDIndexByID(DIDStoreInFlashId[i]);
|
||
|
||
if (index != 0xff) {
|
||
didPtr = cachePtr + DIDOffset[index];
|
||
size = DIDStoreInFlashSize[i];
|
||
nvmDidPtr = (uint8_t *)dids + DIDStoreInFlashOffset[i];
|
||
|
||
if (CRC16_DataCheck(nvmDidPtr, size) == 0) {
|
||
memcpy(didPtr, nvmDidPtr, size);
|
||
}
|
||
}
|
||
}
|
||
|
||
#if BOOTLOADER_CODE_FLAG == 0
|
||
memcpy(gDIDCache.DID_BootSoftware, (uint8_t *)GetBootloaderSwVersionAddress(), \
|
||
DIDSize[BootSoftware]);
|
||
#endif
|
||
}
|
||
|
||
void DTC_SignalInit(void)
|
||
{
|
||
#if BOOTLOADER_CODE_FLAG == 0
|
||
uint8_t index;
|
||
uint8_t size;
|
||
DTCS_NvmType *dtc, *dtcBak;
|
||
|
||
EE_Read(NVM_IMAGE_DTC_ADDR, (uint8_t **)&dtc);
|
||
size = sizeof(DTC_RecordDataBufType);
|
||
|
||
for (index = 0; index < DTC_ID_NUM; index++) {
|
||
if (CRC16_DataCheck((uint8_t *)&dtc->DTC_Status.recordData[index], size - 2) == 0) {
|
||
memcpy((uint8_t *)&dtcComm.DTCStatus.recordData[index], (uint8_t *)&dtc->DTC_Status.recordData[index], size);
|
||
memcpy((uint8_t *)&dtcStatusBak.recordData[index], (uint8_t *)&dtc->DTC_Status.recordData[index], size);
|
||
}
|
||
|
||
if (dtcComm.DTCStatus.recordData[index].status == ((1 << DTC_STATUS_Test_Failed) | (1 << DTC_STATUS_Confirmed_DTC))) {
|
||
faultInfo.w |= 1 << index;
|
||
}
|
||
}
|
||
|
||
diagStart_InitTimer = DIAG_START_INIT_TIME;
|
||
diagStart_Timer = DIAG_START_TIME;
|
||
dtcOptions.w = 0xffffffff;
|
||
#endif
|
||
}
|
||
|
||
void UDS_ServiceInit(void)
|
||
{
|
||
//ECU Éϵç»ò¸´Î»ºóĬÈÏ´¦ÓÚ±ÕËø״̬£¬ÇÒÐèÆô¶¯ 10s µÄ°²È«·ÃÎÊÑÓʱʱ¼ä£¬Í¬Ê±´íÎó¼ÆÊýÆ÷ÖØÖÃΪÁã¡£
|
||
UdsService.KeyErrLockTimer = 10;
|
||
UdsService.KeyLockFlg = true;
|
||
UdsService.KeyErrCnt = 0;
|
||
|
||
UdsService.SessionDiagModel = _UDS_DEFAULT_SESSION;
|
||
UdsService.SeedKeyIsOK = 0;
|
||
UdsService.AlreadSendSeed = false;
|
||
UdsService.SessionTimer = 0;
|
||
UdsService.NcmDisRxAndTx = 0;
|
||
UdsService.NmcmDisRxAndTx = 0;
|
||
UdsService.DisDTCRecord = 0;
|
||
|
||
|
||
|
||
}
|
||
|
||
void DTC_SignalRecover(void)
|
||
{
|
||
|
||
}
|
||
|
||
|
||
void GenRand(void)
|
||
{
|
||
|
||
}
|
||
|
||
|
||
#if BOOTLOADER_CODE_FLAG == 0
|
||
|
||
void SnapshotRecordLoad(DTC_RecordDataBufType *record)
|
||
{
|
||
record->snapshot = vehicleInfo2uds.Snapshot;
|
||
}
|
||
|
||
uint8_t SnapshotRecordFill(uint8_t *data, DTC_SnapshotType *snapshot)
|
||
{
|
||
uint8_t j = 0;
|
||
|
||
data[j++] = (uint8_t)(0x4703 >> 8);
|
||
data[j++] = (uint8_t)(0x4703 & 0x00ff);
|
||
data[j++] = snapshot->PowerMode;
|
||
data[j++] = (uint8_t)(0x4706 >> 8);
|
||
data[j++] = (uint8_t)(0x4706 & 0x00ff);
|
||
data[j++] = snapshot->TolOdometerH;
|
||
data[j++] = snapshot->TolOdometerM;
|
||
data[j++] = snapshot->TolOdometerL;
|
||
data[j++] = (uint8_t)(0x470A >> 8);
|
||
data[j++] = (uint8_t)(0x470A & 0x00ff);
|
||
data[j++] = snapshot->DateSec & 0x3f;
|
||
data[j++] = snapshot->DateMin & 0x3f;
|
||
data[j++] = snapshot->DateHour & 0x1f;
|
||
data[j++] = snapshot->DateDay & 0x1f;
|
||
data[j++] = snapshot->DateMonth & 0x1f;
|
||
data[j++] = snapshot->DateYear & 0x3f;
|
||
data[j++] = (uint8_t)(0x470E >> 8);
|
||
data[j++] = (uint8_t)(0x470E & 0x00ff);
|
||
data[j++] = snapshot->VehSpeedH;
|
||
data[j++] = snapshot->VehSpeedL;
|
||
data[j++] = (uint8_t)(0x470F >> 8);
|
||
data[j++] = (uint8_t)(0x470F & 0x00ff);
|
||
data[j++] = snapshot->BatVolt;
|
||
data[j++] = (uint8_t)(0x4710 >> 8);
|
||
data[j++] = (uint8_t)(0x4710 & 0x00ff);
|
||
data[j++] = (uint8_t)(snapshot->SOC >> 8);
|
||
data[j++] = (uint8_t)(snapshot->SOC >> 0);
|
||
|
||
return j;
|
||
}
|
||
|
||
uint8_t DiagDtcSnapshotRecordFill(uint8_t sub_func, DTC_MaskRecordTpye mask_record,
|
||
uint8_t snap_record_num, DTC_RecordDataBufType *record_data, uint8_t *data_buf, uint8_t *length)
|
||
{
|
||
uint8_t ii = 0;
|
||
uint8_t ret = 1;
|
||
|
||
if (snap_record_num == 1 || snap_record_num == 0xff) {
|
||
data_buf[(*length)++] = DIAG_SERVE_READ_DTC|0x40;
|
||
data_buf[(*length)++] = sub_func;
|
||
|
||
for (ii=0; ii<DTC_ID_NUM; ii++) {
|
||
if ((mask_record.dtc & 0x00ffffff) == DTC_LIST_TABLE[ii]) {
|
||
ret = 0;
|
||
data_buf[(*length)++] = mask_record.DTCHightByte;
|
||
data_buf[(*length)++] = mask_record.DTCMiddleByte;
|
||
data_buf[(*length)++] = mask_record.DTCLowByte;
|
||
data_buf[(*length)++] = record_data[ii].status;
|
||
|
||
switch (snap_record_num) {
|
||
case 0x01:
|
||
case 0xff:
|
||
if (record_data[ii].extended.FaultCounter == 0) {
|
||
break;
|
||
}
|
||
data_buf[(*length)++] = 1;
|
||
data_buf[(*length)++] = 6;
|
||
*length += SnapshotRecordFill(&data_buf[*length], &record_data[ii].snapshot);
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
uint8_t DiagDtcExtendedDataRecordFill(uint8_t subFunc, DTC_MaskRecordTpye mask_record,
|
||
uint8_t extended_record_num, DTC_RecordDataBufType *record_data, uint8_t *data_buf, uint8_t *length)
|
||
{
|
||
uint8_t ii = 0;
|
||
uint8_t ret = 1;
|
||
|
||
if (extended_record_num == 0x01 \
|
||
|| extended_record_num == 0xff) {
|
||
data_buf[(*length)++] = DIAG_SERVE_READ_DTC|0x40;
|
||
data_buf[(*length)++] = subFunc;
|
||
|
||
for (ii=0; ii<DTC_ID_NUM; ii++) {
|
||
if ((mask_record.dtc & 0x00ffffff) == DTC_LIST_TABLE[ii]) {
|
||
ret = 0;
|
||
data_buf[(*length)++] = mask_record.DTCHightByte;
|
||
data_buf[(*length)++] = mask_record.DTCMiddleByte;
|
||
data_buf[(*length)++] = mask_record.DTCLowByte;
|
||
data_buf[(*length)++] = record_data[ii].status;
|
||
|
||
switch (extended_record_num) {
|
||
case 0x01:
|
||
case 0xff:
|
||
data_buf[(*length)++] = 0x01;
|
||
data_buf[(*length)++] = record_data[ii].extended.FaultCounter;
|
||
data_buf[(*length)++] = record_data[ii].extended.FaultCounterOfAge;
|
||
data_buf[(*length)++] = record_data[ii].extended.FaultAgingCounter;
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
void IO_InputOutputRelease(void)
|
||
{
|
||
|
||
}
|
||
|
||
void DiagUpdateDtcValue(uint8_t index, uint8_t status)
|
||
{
|
||
DTC_RecordDataBufType *dtc_record_data;
|
||
|
||
dtc_record_data = &dtcComm.DTCStatus.recordData[index];
|
||
|
||
if (index >= DTC_ID_NUM) {
|
||
return;
|
||
}
|
||
if (dtc_record_data->status != status) {
|
||
if (status == ((1<<DTC_STATUS_Test_Failed) | (1<<DTC_STATUS_Confirmed_DTC))) {
|
||
SnapshotRecordLoad(dtc_record_data);
|
||
|
||
if (dtc_record_data->extended.FaultCounter != 0xff) {
|
||
dtc_record_data->extended.FaultCounter ++;
|
||
}
|
||
}
|
||
dtc_record_data->extended.FaultAgingCounter = 0;
|
||
}
|
||
|
||
dtc_record_data->status = status;
|
||
}
|
||
|
||
|
||
//µçѹÕýÇÒ·Çbusoff¡¢µçÔ´ONÏÂ
|
||
void DiagFaultsMonitor(void)
|
||
{
|
||
|
||
if (faultInfo.b.fECU_VOLTAGE_HIGH)return;
|
||
|
||
if (faultInfo.b.fECU_VOLTAGE_LOW)return;
|
||
|
||
if (CheckIsIgnON()) {
|
||
|
||
if (vehicleInfo2uds.InOverVoltFault) {
|
||
faultInfo.b.fINPUT_OVERVOLTAGE = 1;
|
||
} else {
|
||
faultInfo.b.fINPUT_OVERVOLTAGE = 0;
|
||
}
|
||
|
||
if (vehicleInfo2uds.InUnderVoltFault) {
|
||
faultInfo.b.fINPUT_UNDERVOLTAGE = 1;
|
||
} else {
|
||
faultInfo.b.fINPUT_UNDERVOLTAGE = 0;
|
||
}
|
||
|
||
if (vehicleInfo2uds.OutOverVoltFault) {
|
||
faultInfo.b.fOUTPUT_OVERVOLTAGE = 1;
|
||
} else {
|
||
faultInfo.b.fOUTPUT_OVERVOLTAGE = 0;
|
||
}
|
||
|
||
if (vehicleInfo2uds.OutUnderVoltFault) {
|
||
faultInfo.b.fOUTPUT_UNDERVOLTAGE = 1;
|
||
} else {
|
||
faultInfo.b.fOUTPUT_UNDERVOLTAGE = 0;
|
||
}
|
||
|
||
if (vehicleInfo2uds.InOverCurFault) {
|
||
faultInfo.b.fINPUT_OVERCURRENT = 1;
|
||
} else {
|
||
faultInfo.b.fINPUT_OVERCURRENT = 0;
|
||
}
|
||
|
||
if (vehicleInfo2uds.OutOverCurFault) {
|
||
faultInfo.b.fOUTPUT_OVERCURRENT = 1;
|
||
} else {
|
||
faultInfo.b.fOUTPUT_OVERCURRENT = 0;
|
||
}
|
||
|
||
if (vehicleInfo2uds.OverTemperture) {
|
||
faultInfo.b.fOVERTEMPERTURE = 1;
|
||
} else {
|
||
faultInfo.b.fOVERTEMPERTURE = 0;
|
||
}
|
||
|
||
if (CheckIsCanBusoff()) {
|
||
if (vehicleInfo2uds.BusoffCnt >= 8)
|
||
{
|
||
faultInfo.b.fECU_ENTER_BUSOFF = 1;
|
||
}
|
||
} else {
|
||
faultInfo.b.fECU_ENTER_BUSOFF = 0;
|
||
}
|
||
|
||
if (CheckIsCanBusoff())return;
|
||
}
|
||
|
||
}
|
||
|
||
void GetBatteryStatus(void)
|
||
{
|
||
|
||
if (CheckIsBatteryHigh()) {
|
||
faultInfo.b.fECU_VOLTAGE_HIGH = 1;
|
||
} else {
|
||
faultInfo.b.fECU_VOLTAGE_HIGH = 0;
|
||
}
|
||
|
||
if (CheckIsBatteryLow()) {
|
||
faultInfo.b.fECU_VOLTAGE_LOW = 1;
|
||
} else {
|
||
faultInfo.b.fECU_VOLTAGE_LOW = 0;
|
||
}
|
||
|
||
}
|
||
|
||
void DtcAging_Process(void)
|
||
{
|
||
uint8_t index;
|
||
DTC_RecordDataBufType *dtc_record_data;
|
||
static uint8_t ignStsBak = 1;
|
||
|
||
if (ignStsBak != vehicleInfo2uds.IgnSts) {
|
||
ignStsBak = vehicleInfo2uds.IgnSts;
|
||
|
||
if (vehicleInfo2uds.IgnSts) {
|
||
for (index = 0; index < DTC_ID_NUM; index++) {
|
||
dtc_record_data = &dtcComm.DTCStatus.recordData[index];
|
||
if (dtc_record_data->status == (1 << DTC_STATUS_Confirmed_DTC)) {
|
||
dtc_record_data->extended.FaultAgingCounter++;
|
||
if (dtc_record_data->extended.FaultAgingCounter >= 40) {
|
||
dtc_record_data->extended.FaultAgingCounter = 0;
|
||
dtc_record_data->status = 0;
|
||
if (dtc_record_data->extended.FaultCounterOfAge != 0xff) {
|
||
dtc_record_data->extended.FaultCounterOfAge++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void ClearHardwareFault(void)
|
||
{
|
||
UdsApi_HardwareFault_ForceClear();
|
||
}
|
||
|
||
void GetFaultInfo(void)
|
||
{
|
||
uint8_t shift, status;
|
||
uint8_t size;
|
||
uint16_t crc16;
|
||
DTC_Fault_Flags littleFault;
|
||
DTC_RecordDataBufType *pDtcRecordData;
|
||
static uint32_t timer_500ms = 0;
|
||
|
||
GetBatteryStatus();
|
||
|
||
if (diagStart_InitTimer > 0) { //µçѹÕý³£ºó²Å¼ÆÊý
|
||
diagStart_InitTimer --;
|
||
|
||
return;
|
||
}
|
||
|
||
DiagFaultsMonitor();
|
||
|
||
if (UdsService.DisDTCRecord) {
|
||
return;
|
||
}
|
||
|
||
DtcAging_Process();
|
||
|
||
if (DTC_ID_NUM <= 32) {
|
||
//littleFault.w= BigLittleSwap32(faultInfo.w);
|
||
littleFault.w = faultInfo.w;
|
||
|
||
for (shift = 0; shift < DTC_ID_NUM; shift++) {
|
||
|
||
if ((littleFault.w >> shift) & 0x00000001) {
|
||
status = (1 << DTC_STATUS_Test_Failed) | (1 << DTC_STATUS_Confirmed_DTC); //µ±Ç°¹ÊÕÏ
|
||
} else {
|
||
status = dtcComm.DTCStatus.recordData[shift].status & (~(1 << DTC_STATUS_Test_Failed));
|
||
}
|
||
|
||
DiagUpdateDtcValue(shift, status);
|
||
}
|
||
} else {
|
||
//³¬³ö32¸öµÄ£¬ÐèÒªÌØÊâ´¦Àí
|
||
}
|
||
|
||
if (++timer_500ms > 50) {
|
||
timer_500ms = 0;
|
||
size = sizeof(DTC_RecordDataBufType);
|
||
|
||
for (shift = 0; shift < DTC_ID_NUM; shift++) {
|
||
pDtcRecordData = &dtcComm.DTCStatus.recordData[shift];
|
||
|
||
if (pDtcRecordData->status != dtcStatusBak.recordData[shift].status \
|
||
/*|| dtcComm.DTCStatus.recordData[shift].extended.FaultCounterOfAge != dtcStatusBak.recordData[shift].extended.FaultCounterOfAge*/) {
|
||
crc16 = CRC_Cal16_WithCfg((uint8_t *)pDtcRecordData, size - 2);
|
||
pDtcRecordData->crc16[0] = (uint8_t)crc16;
|
||
pDtcRecordData->crc16[1] = (uint8_t)(crc16 >> 8);
|
||
|
||
dtcStatusBak.recordData[shift].status = pDtcRecordData->status;
|
||
EE_Write(NVM_IMAGE_DTC_ADDR + (size * shift), (uint8_t *)pDtcRecordData, size, NULL);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
void ClearDtc(void)
|
||
{
|
||
uint8_t shift;
|
||
uint16_t crc16;
|
||
DTC_RecordDataBufType *pDtcRecordData;
|
||
|
||
faultInfo.w = 0;
|
||
|
||
for (shift = 0; shift < DTC_ID_NUM; shift++) {
|
||
pDtcRecordData = &dtcComm.DTCStatus.recordData[shift];
|
||
|
||
memset((uint8_t *)pDtcRecordData, 0x00, sizeof(DTC_RecordDataBufType) - 2);
|
||
crc16 = CRC_Cal16_WithCfg((uint8_t *)pDtcRecordData, sizeof(DTC_RecordDataBufType) - 2);
|
||
pDtcRecordData->crc16[0] = (uint8_t)crc16;
|
||
pDtcRecordData->crc16[1] = (uint8_t)(crc16 >> 8);
|
||
}
|
||
|
||
memcpy((uint8_t *)&dtcStatusBak, (uint8_t *)&dtcComm.DTCStatus, sizeof(DTC_StatusType));
|
||
EE_Write(NVM_IMAGE_DTC_ADDR, (uint8_t *)&dtcComm.DTCStatus, sizeof(DTC_StatusType), NULL);
|
||
ClearHardwareFault();
|
||
}
|
||
|
||
|
||
bool GetDtcStatusMask(uint8_t *pOut, uint8_t *len, uint8_t subFunc, uint8_t mask)
|
||
{
|
||
bool retValue = FALSE;
|
||
uint8_t ii = 0;
|
||
uint8_t j = 0;
|
||
|
||
dtcComm.DTCcount.map = 0;
|
||
pOut[j++] = DIAG_SERVE_READ_DTC | 0x40;
|
||
pOut[j++] = subFunc;
|
||
pOut[j++] = DTC_STATUS_Support_Bit_Status;
|
||
|
||
//×¢Òâ ÒòΪûÓÐECU¸ßµÍѹDTC£¬¹Ê´Óindex2¿ªÊ¼¶ÁÈ¡
|
||
for (ii = 2; ii < DTC_ID_NUM; ii++) {
|
||
/*if (((dtcComm.DTCStatus[ii]&DTC_STATUS_Support_Bit_Status) == (mask&DTC_STATUS_Support_Bit_Status))\
|
||
||(subFunc == DTC_ReportSupportedDTCs))*/
|
||
if ((dtcComm.DTCStatus.recordData[ii].status & mask) \
|
||
|| (dtcComm.DTCStatus.recordData[ii].status == mask)\
|
||
|| (subFunc == DTC_ReportSupportedDTCs)) {
|
||
if ((dtcOptions.w >> ii) & 0x00000001) {
|
||
retValue = TRUE;
|
||
dtcComm.DTCcount.map++;
|
||
pOut[j++] = (uint8_t)(DTC_LIST_TABLE[ii] >> 16);
|
||
pOut[j++] = (uint8_t)(DTC_LIST_TABLE[ii] >> 8);
|
||
pOut[j++] = (uint8_t)(DTC_LIST_TABLE[ii] >> 0);
|
||
pOut[j++] = dtcComm.DTCStatus.recordData[ii].status;
|
||
}
|
||
}
|
||
}
|
||
|
||
*len = j;
|
||
return retValue;
|
||
}
|
||
#endif
|
||
|
||
void DiagDIDStoreFlash(uint16_t id)
|
||
{
|
||
uint8_t didIndex, nvmDidIndex;
|
||
//uint16_t offset;
|
||
uint16_t size;
|
||
uint8_t *cachePtr, *didPtr, *nvmDidPtr = NULL;
|
||
uint16_t crc16;
|
||
bool storage_flag = false;
|
||
|
||
nvmDidIndex = GetDIDStoreInFlashIndexByID(id);
|
||
|
||
if (nvmDidIndex != 0xFF) {
|
||
didIndex = GetDIDIndexByID(id);
|
||
|
||
if (didIndex != 0xFF) {
|
||
size = DIDSize[didIndex];
|
||
cachePtr = (uint8_t *)&gDIDCache;
|
||
didPtr = cachePtr + DIDOffset[didIndex];
|
||
crc16 = CRC_Cal16_WithCfg(didPtr, size);
|
||
didPtr[size] = (uint8_t)crc16;
|
||
size++;
|
||
didPtr[size] = (uint8_t)(crc16 >> 8);
|
||
size++;
|
||
nvmDidPtr = (uint8_t *)NVM_IMAGE_DID_ADDR + DIDStoreInFlashOffset[nvmDidIndex];
|
||
|
||
if (nvmDidPtr != NULL) {
|
||
EE_Write(nvmDidPtr, didPtr, size, NULL);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void IgnChangeProcess(void)
|
||
{
|
||
static uint8_t ignStsBak = 1;
|
||
|
||
if (ignStsBak != vehicleInfo2uds.IgnSts) {
|
||
ignStsBak = vehicleInfo2uds.IgnSts;
|
||
|
||
if (vehicleInfo2uds.IgnSts) {
|
||
UdsService.KeyErrLockTimer = 10;
|
||
UdsService.KeyLockFlg = true;
|
||
UdsService.KeyErrCnt = 0;
|
||
UdsService.SeedKeyIsOK = 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CheckDtcHsCanError(void)
|
||
{
|
||
#if BOOTLOADER_CODE_FLAG == 0
|
||
static uint16_t Timer10msCnt = 0;
|
||
|
||
#endif
|
||
|
||
|
||
#if BOOTLOADER_CODE_FLAG == 0
|
||
|
||
if (++Timer10msCnt >= 10) {
|
||
Timer10msCnt = 0;
|
||
GetFaultInfo();
|
||
IgnChangeProcess();
|
||
}
|
||
gDIDCache.DID_ActiveDiagnosticSession[0] = UdsService.SessionDiagModel;
|
||
|
||
#endif
|
||
|
||
if ((UdsService.UdsTxFlg == true) && (UdsService.UdsTxCompFlg == true)) {
|
||
UdsService.UdsTxFlg = false;
|
||
UdsService.UdsTxCompFlg = false;
|
||
HAL_UDS_Tx_Callback();
|
||
//UdsQueueCanOut();
|
||
UdsService.TxCompFlg = true;
|
||
//Debug("HAL_UDS_Tx_Callback \r\n"); //
|
||
}
|
||
}
|
||
|
||
#if BOOTLOADER_CODE_FLAG == 0
|
||
INT8U Get0x19SerDiagData(INT8U *pOut, INT8U Type, INT8U *pdata)
|
||
{
|
||
INT8U RstLen = 0;
|
||
// INT16U i=0;
|
||
// INT32U dtc_code = 0;
|
||
// INT8U num = 0;
|
||
uint8_t dtcReportSubFunction;
|
||
uint8_t dtcRecordNumber;
|
||
uint8_t dtcStatusMask;
|
||
DTC_MaskRecordTpye dtcMaskRecord;
|
||
|
||
dtcReportSubFunction = Type;
|
||
dtcStatusMask = pdata[1];
|
||
|
||
switch (dtcReportSubFunction) {
|
||
case DTC_ReportNumberOfDTCByStatusMask:
|
||
case DTC_ReportDTCByStatusMask:
|
||
case DTC_ReportSupportedDTCs:
|
||
if (GetDtcStatusMask(pOut, &RstLen, dtcReportSubFunction, dtcStatusMask) == FALSE) {
|
||
RstLen = 0;
|
||
pOut[RstLen++] = DIAG_SERVE_READ_DTC | 0x40; //0x59;
|
||
pOut[RstLen++] = dtcReportSubFunction;
|
||
pOut[RstLen++] = DTC_STATUS_Support_Bit_Status;
|
||
}
|
||
|
||
if (dtcReportSubFunction == DTC_ReportNumberOfDTCByStatusMask) {
|
||
RstLen = 0;
|
||
pOut[RstLen++] = DIAG_SERVE_READ_DTC | 0x40; //0x59;
|
||
pOut[RstLen++] = dtcReportSubFunction;
|
||
pOut[RstLen++] = DTC_STATUS_Support_Bit_Status;
|
||
pOut[RstLen++] = ISO15031_6_DTCformat;
|
||
pOut[RstLen++] = dtcComm.DTCcount.b.DTCcountHighByte;
|
||
pOut[RstLen++] = dtcComm.DTCcount.b.DTCcountLowByte;
|
||
}
|
||
|
||
break;
|
||
|
||
case DTC_ReportDTCSnapshotRecordByDTCNumber:
|
||
dtcMaskRecord.DTCHightByte = pdata[1];
|
||
dtcMaskRecord.DTCMiddleByte = pdata[2];
|
||
dtcMaskRecord.DTCLowByte = pdata[3];
|
||
dtcRecordNumber = pdata[4];
|
||
if (DiagDtcSnapshotRecordFill(dtcReportSubFunction, dtcMaskRecord, dtcRecordNumber,
|
||
dtcComm.DTCStatus.recordData, pOut, &RstLen) == 0) {
|
||
|
||
}
|
||
break;
|
||
case DTC_ReportDTCExtendedDataRecordByDTCNumber:
|
||
dtcMaskRecord.DTCHightByte = pdata[1];
|
||
dtcMaskRecord.DTCMiddleByte = pdata[2];
|
||
dtcMaskRecord.DTCLowByte = pdata[3];
|
||
dtcRecordNumber = pdata[4];
|
||
if (DiagDtcExtendedDataRecordFill(dtcReportSubFunction, dtcMaskRecord, dtcRecordNumber,
|
||
dtcComm.DTCStatus.recordData, pOut, &RstLen) == 0) {
|
||
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return RstLen;
|
||
}
|
||
#endif
|
||
|
||
|
||
|
||
INT16U Get0x22SerDiagData(INT8U *pOut)
|
||
{
|
||
INT16U RstLen = 0;
|
||
INT16U ReqId = 0;
|
||
// INT16U length = 0;
|
||
uint8_t i;
|
||
uint8_t *cachePtr;
|
||
uint8_t size;
|
||
|
||
ReqId = ((UdsService.ReqCmdBuf[0] << 8) + UdsService.ReqCmdBuf[1]);
|
||
|
||
pOut[RstLen++] = 0x62;
|
||
pOut[RstLen++] = ((ReqId >> 8) & 0xFF);
|
||
pOut[RstLen++] = (ReqId & 0xFF);
|
||
|
||
cachePtr = (uint8_t *)&gDIDCache;
|
||
|
||
for (i = 0; i < DID_NUM; i++) {
|
||
if (ReqId == DIDId[i]) {
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (i == DID_NUM) {
|
||
RstLen = 2;
|
||
} else {
|
||
#if BOOTLOADER_CODE_FLAG
|
||
|
||
if (!CheckIsSupportBootloaderRead_Sid22(ReqId)) {
|
||
RstLen = 2;
|
||
}
|
||
|
||
#endif
|
||
}
|
||
|
||
if (RstLen != 2) {
|
||
size = DIDSize[i];
|
||
|
||
memcpy(&pOut[RstLen], (cachePtr + DIDOffset[i]), size);
|
||
RstLen += size;
|
||
}
|
||
|
||
return RstLen;
|
||
}
|
||
|
||
#if BOOTLOADER_CODE_FLAG
|
||
|
||
INT8U Set0x36DiagData(INT8U *pIn, INT16U PLen, INT8U *pOut, INT16U *RLen)
|
||
{
|
||
uint8_t /*i=0,*/ucErrCode = 0;
|
||
uint8_t sn = 0;
|
||
|
||
|
||
sn = pIn[0];
|
||
UdsUpData.totalRecvLength += (UdsService.RxDlc - 2);
|
||
|
||
if (CheckIsBatteryHigh()) {
|
||
ucErrCode = 0x92;
|
||
} else if (CheckIsBatteryLow()) {
|
||
ucErrCode = 0x93;
|
||
} else if (UdsService.RxDlc > (FMC_PAGE_SIZE + 2)) {
|
||
ucErrCode = 0x13;
|
||
} else if ((UdsUpData.DownloadSeq != DOWNLOAD_SEQUENCE_34) && (UdsUpData.DownloadSeq != DOWNLOAD_SEQUENCE_36)) {
|
||
ucErrCode = 0x24;
|
||
} else if (sn != UdsUpData.Sn) {
|
||
ucErrCode = 0x73;
|
||
} else if (UdsUpData.totalRecvLength > FBL_AppSize) {
|
||
ucErrCode = 0x71;
|
||
} else {
|
||
UdsUpData.RxProgramFlag = true;
|
||
UdsUpData.DownloadSeq = DOWNLOAD_SEQUENCE_36;
|
||
memcpy(UdsUpData.Buf, &TP_Buffer[2], (UdsService.RxDlc - 2));
|
||
ucErrCode = 0x78;
|
||
}
|
||
|
||
return ucErrCode;
|
||
|
||
}
|
||
#endif
|
||
|
||
INT8U Set0x31DiagData(INT8U *pIn, INT16U PLen, INT8U *pOut, INT16U *RLen)
|
||
{
|
||
|
||
uint8_t service_buf[50];
|
||
uint8_t /*i=0,*/ucErrCode = 0, ucRsp = 0;
|
||
uint16_t ReqId = 0;
|
||
uint16_t dlen = 0;
|
||
uint8_t result = 0;
|
||
static bool routineStartFlg = false;
|
||
|
||
if (UdsService.RxDlc < 4) {
|
||
return 0x13;
|
||
}
|
||
|
||
ucRsp = pIn[0];
|
||
ReqId = pIn[1] << 8 | pIn[2];
|
||
|
||
service_buf[dlen++] = 0x71;
|
||
service_buf[dlen++] = pIn[0];
|
||
service_buf[dlen++] = pIn[1];
|
||
service_buf[dlen++] = pIn[2];
|
||
#if BOOTLOADER_CODE_FLAG == 0
|
||
|
||
// static bool routineStartFlg = false;
|
||
|
||
if ((0x01 == ucRsp) || (0x02 == ucRsp) || (0x03 == ucRsp)) {
|
||
ucErrCode = 0x31;
|
||
} else {
|
||
if (true == UdsService.PhyFlg) {
|
||
UdsService.PhyFlg = false;
|
||
ucErrCode = 0x12;
|
||
}
|
||
}
|
||
#else
|
||
static uint32_t mem_addr, mem_size;
|
||
static uint16_t checksum;
|
||
if (0x01 == ucRsp) {
|
||
if ((true == CheckUdsDlcIsOk(UdsService.RxDlc, 6) && (ReqId == 0xDA04))\
|
||
|| (true == CheckUdsDlcIsOk(UdsService.RxDlc, 12) && (ReqId == 0xFF00)) \
|
||
|| (true == CheckUdsDlcIsOk(UdsService.RxDlc, 14) && (ReqId == 0xFF01))) {
|
||
if (UdsService.SeedKeyIsOK) {
|
||
switch (ReqId) {
|
||
case 0xDA04://Check application program validation
|
||
if (UdsUpData.DownloadSeq == DOWNLOAD_SEQUENCE_37) {
|
||
UdsUpData.GetCrc = (pIn[3] << 8) + pIn[4];
|
||
result = 0x01;
|
||
service_buf[dlen++] = result;
|
||
} else {
|
||
ucErrCode = 0x22;
|
||
}
|
||
break;
|
||
|
||
case 0xFF00://²Á³ýÄÚ´æ
|
||
UdsUpData.EraseAddress = (pIn[3] << 24) + (pIn[4] << 16) + (pIn[5] << 8) + pIn[6];
|
||
UdsUpData.EraseLength = (pIn[7] << 24) + (pIn[8] << 16) + (pIn[9] << 8) + pIn[10];
|
||
|
||
if (UdsUpData.EraseAddress != APP_FlashBaseAddress) {
|
||
ucErrCode = 0x72;
|
||
UdsUpData.RoutineEraseMemoryErr = true;
|
||
} else {
|
||
ucErrCode = 0x78;
|
||
UdsUpData.RxEraseFlg = true;
|
||
UdsUpData.RoutineEraseMemoryFlg = true;
|
||
}
|
||
|
||
break;
|
||
|
||
case 0xFF01://¼ì²é±à³ÌÒÀÀµÐÔ
|
||
mem_addr = (pIn[3] << 24) + (pIn[4] << 16) + (pIn[5] << 8) + pIn[6];
|
||
mem_size = (pIn[7] << 24) + (pIn[8] << 16) + (pIn[9] << 8) + pIn[10];
|
||
checksum = (pIn[11] << 8) + pIn[12];
|
||
|
||
result = 0x01;
|
||
service_buf[dlen++] = result;
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
} else {
|
||
ucErrCode = 0x33;
|
||
}
|
||
} else if ((ReqId == 0xDA04) || (ReqId == 0xFF00) || (ReqId == 0xFF01)) {
|
||
ucErrCode = 0x13;
|
||
} else {
|
||
ucErrCode = 0x31;
|
||
}
|
||
} else if (0x03 == ucRsp) {
|
||
if ((true == CheckUdsDlcIsOk(UdsService.RxDlc, 4) && (ReqId == 0xDA04))\
|
||
|| (true == CheckUdsDlcIsOk(UdsService.RxDlc, 4) && (ReqId == 0xFF00)) \
|
||
|| (true == CheckUdsDlcIsOk(UdsService.RxDlc, 4) && (ReqId == 0xFF01))) {
|
||
if (UdsService.SeedKeyIsOK) {
|
||
switch (ReqId) {
|
||
case 0xDA04:
|
||
case 0xFF01:
|
||
result = 0x02;
|
||
service_buf[dlen++] = result;
|
||
break;
|
||
case 0xFF00:
|
||
if (UdsUpData.EraseMemorySts == ERASE_MEMORY_STS_COMPLETED) {
|
||
result = 0x02;
|
||
} else if (UdsUpData.EraseMemorySts == ERASE_MEMORY_STS_IN_PROGRESS) {
|
||
result = 0x03;
|
||
} else {
|
||
result = 0x05;
|
||
}
|
||
service_buf[dlen++] = result;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
} else {
|
||
ucErrCode = 0x33;
|
||
}
|
||
} else if ((ReqId == 0xDA04) || (ReqId == 0xFF00) || (ReqId == 0xFF01)) {
|
||
ucErrCode = 0x13;
|
||
} else {
|
||
ucErrCode = 0x31;
|
||
}
|
||
} else if (0x02 == ucRsp) {
|
||
if ((true == CheckUdsDlcIsOk(UdsService.RxDlc, 4) && (ReqId == 0xDA04))\
|
||
|| (true == CheckUdsDlcIsOk(UdsService.RxDlc, 4) && (ReqId == 0xFF00)) \
|
||
|| (true == CheckUdsDlcIsOk(UdsService.RxDlc, 4) && (ReqId == 0xFF01))) {
|
||
if (UdsService.SeedKeyIsOK) {
|
||
switch (ReqId) {
|
||
case 0xDA04:
|
||
if(UdsUpData.CalcCrc==UdsUpData.GetCrc) {
|
||
if ((UdsUpData.StackTopAdr & 0x2FFE0000 ) == MCU_RAM_StartAddress) {
|
||
if (STATUS_SUCCESS == ProgramApplicationSoftware(APP_FlashBaseAddress, (uint8_t*)&UdsUpData.StackTopAdr, 4)) {
|
||
result = 0x01;
|
||
} else {
|
||
result = 0x02;
|
||
}
|
||
}
|
||
}
|
||
service_buf[dlen++] = result;
|
||
break;
|
||
case 0xFF00:
|
||
UdsUpData.EraseMemoryFlg = false;
|
||
result = 0x04;
|
||
service_buf[dlen++] = result;
|
||
break;
|
||
case 0xFF01:
|
||
if ((UdsUpData.EraseAddress == mem_addr) \
|
||
|| (UdsUpData.EraseLength == mem_size) \
|
||
|| (UdsUpData.CalcCrc == checksum)) {
|
||
result = 0x01;
|
||
} else {
|
||
result = 0x02;
|
||
}
|
||
service_buf[dlen++] = result;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
} else {
|
||
ucErrCode = 0x33;
|
||
}
|
||
} else if ((ReqId == 0xDA04) || (ReqId == 0xFF00) || (ReqId == 0xFF01)) {
|
||
ucErrCode = 0x13;
|
||
} else {
|
||
ucErrCode = 0x31;
|
||
}
|
||
} else {
|
||
if (true == UdsService.PhyFlg) {
|
||
UdsService.PhyFlg = false;
|
||
ucErrCode = 0x12;
|
||
}
|
||
}
|
||
|
||
#endif
|
||
*RLen = dlen;
|
||
|
||
if (ucErrCode == 0) {
|
||
memcpy(pOut, service_buf, dlen);
|
||
}
|
||
|
||
return ucErrCode;
|
||
|
||
}
|
||
|
||
INT8U Set0x2EDidDiagData(INT8U *pIn, INT16U PLen)
|
||
{
|
||
INT8U Rst = 0;
|
||
INT16U ReqId = 0;
|
||
|
||
ReqId = ((pIn[0] << 8) + pIn[1]);
|
||
|
||
#if BOOTLOADER_CODE_FLAG == 0
|
||
if (ReqId == DIDId[VehicleIdentificationNumber]) {
|
||
if(PLen == DIDSize[VehicleIdentificationNumber]) {
|
||
if (UdsService.SeedKeyIsOK) {
|
||
if (CheckVechileStatus()) {
|
||
memcpy(gDIDCache.DID_VehicleIdentificationNumber,&pIn[2],PLen);
|
||
} else {
|
||
Rst = 0x22;
|
||
}
|
||
} else {
|
||
Rst = 0x33;
|
||
}
|
||
} else {
|
||
Rst = 0x13;
|
||
}
|
||
} else if (ReqId == DIDId[InputOvervoltageValue]) {
|
||
if(PLen == DIDSize[InputOvervoltageValue]) {
|
||
if (UdsService.SeedKeyIsOK) {
|
||
if (CheckVechileStatus()) {
|
||
memcpy(gDIDCache.DID_InputOvervoltageValue,&pIn[2],PLen);
|
||
} else {
|
||
Rst = 0x22;
|
||
}
|
||
} else {
|
||
Rst = 0x33;
|
||
}
|
||
} else {
|
||
Rst = 0x13;
|
||
}
|
||
} else if (ReqId == DIDId[InputUndervoltageValue]) {
|
||
if(PLen == DIDSize[InputUndervoltageValue]) {
|
||
if (UdsService.SeedKeyIsOK) {
|
||
if (CheckVechileStatus()) {
|
||
memcpy(gDIDCache.DID_InputUndervoltageValue,&pIn[2],PLen);
|
||
} else {
|
||
Rst = 0x22;
|
||
}
|
||
} else {
|
||
Rst = 0x33;
|
||
}
|
||
} else {
|
||
Rst = 0x13;
|
||
}
|
||
} else if (ReqId == DIDId[OutputOvervoltageValue]) {
|
||
if(PLen == DIDSize[OutputOvervoltageValue]) {
|
||
if (UdsService.SeedKeyIsOK) {
|
||
if (CheckVechileStatus()) {
|
||
memcpy(gDIDCache.DID_OutputOvervoltageValue,&pIn[2],PLen);
|
||
} else {
|
||
Rst = 0x22;
|
||
}
|
||
} else {
|
||
Rst = 0x33;
|
||
}
|
||
} else {
|
||
Rst = 0x13;
|
||
}
|
||
} else if (ReqId == DIDId[OutputUndervoltageValue]) {
|
||
if(PLen == DIDSize[OutputUndervoltageValue]) {
|
||
if (UdsService.SeedKeyIsOK) {
|
||
if (CheckVechileStatus()) {
|
||
memcpy(gDIDCache.DID_OutputUndervoltageValue,&pIn[2],PLen);
|
||
} else {
|
||
Rst = 0x22;
|
||
}
|
||
} else {
|
||
Rst = 0x33;
|
||
}
|
||
} else {
|
||
Rst = 0x13;
|
||
}
|
||
} else if (ReqId == DIDId[OutputOvercurrentFaultValue]) {
|
||
if(PLen == DIDSize[OutputOvercurrentFaultValue]) {
|
||
if (UdsService.SeedKeyIsOK) {
|
||
if (CheckVechileStatus()) {
|
||
memcpy(gDIDCache.DID_OutputOvercurrentFaultValue,&pIn[2],PLen);
|
||
} else {
|
||
Rst = 0x22;
|
||
}
|
||
} else {
|
||
Rst = 0x33;
|
||
}
|
||
} else {
|
||
Rst = 0x13;
|
||
}
|
||
} else if (ReqId == DIDId[InputOvercurrentFaultValue]) {
|
||
if(PLen == DIDSize[InputOvercurrentFaultValue]) {
|
||
if (UdsService.SeedKeyIsOK) {
|
||
if (CheckVechileStatus()) {
|
||
memcpy(gDIDCache.DID_InputOvercurrentFaultValue,&pIn[2],PLen);
|
||
} else {
|
||
Rst = 0x22;
|
||
}
|
||
} else {
|
||
Rst = 0x33;
|
||
}
|
||
} else {
|
||
Rst = 0x13;
|
||
}
|
||
} else if (ReqId == DIDId[OverTempertureProtectValue]) {
|
||
if(PLen == DIDSize[OverTempertureProtectValue]) {
|
||
if (UdsService.SeedKeyIsOK) {
|
||
if (CheckVechileStatus()) {
|
||
memcpy(gDIDCache.DID_OverTempertureProtectValue,&pIn[2],PLen);
|
||
} else {
|
||
Rst = 0x22;
|
||
}
|
||
} else {
|
||
Rst = 0x33;
|
||
}
|
||
} else {
|
||
Rst = 0x13;
|
||
}
|
||
} else {
|
||
Rst = 0x31;
|
||
}
|
||
|
||
#else
|
||
if (ReqId == DIDId[TesterSerialNumber]) {
|
||
if(PLen == DIDSize[TesterSerialNumber]) {
|
||
if (UdsService.SeedKeyIsOK) {
|
||
memcpy(gDIDCache.DID_TesterSerialNumber,&pIn[2],PLen);
|
||
} else {
|
||
Rst = 0x33;
|
||
}
|
||
} else {
|
||
Rst = 0x13;
|
||
}
|
||
} else if (ReqId == DIDId[ProgrammingDate]) {
|
||
if(PLen == DIDSize[ProgrammingDate]) {
|
||
if (UdsService.SeedKeyIsOK) {
|
||
memcpy(gDIDCache.DID_ProgrammingDate,&pIn[2],PLen);
|
||
} else {
|
||
Rst = 0x33;
|
||
}
|
||
} else {
|
||
Rst = 0x13;
|
||
}
|
||
} else {
|
||
Rst = 0x31;
|
||
}
|
||
|
||
#endif
|
||
|
||
if (Rst == 0) {
|
||
DiagDIDStoreFlash(ReqId);
|
||
}
|
||
|
||
return Rst;
|
||
}
|
||
|
||
#if BOOTLOADER_CODE_FLAG == 0
|
||
INT8U Set0x2FDiagData(INT8U *pIn, INT16U PLen, INT8U *pOut, INT16U *RLen)
|
||
{
|
||
INT8U ucErrCode = 0;
|
||
|
||
return ucErrCode;
|
||
}
|
||
#endif
|
||
|
||
uint8_t seed_value[2] = {0};
|
||
uint8_t key_value[2] = {0};
|
||
|
||
void UdsQueueCanOut(void)
|
||
{
|
||
//if(Frame_Tx_Complete != false) return;
|
||
//if(TP_Tx_Message_DLC) return;
|
||
while ((UdsQueueData.In != UdsQueueData.Out)) {
|
||
if (UdsQueueData.Out >= CAN0_MAX_RX) {
|
||
UdsQueueData.Out = 0;
|
||
}
|
||
|
||
gUdsBusOffCanOutBak = UdsQueueData.Out;
|
||
ParseUdsCan(UdsQueueData.CanMsg[UdsQueueData.Out]);
|
||
UdsQueueData.Out++;
|
||
ParseCanRxCnt++;
|
||
// break;
|
||
}
|
||
|
||
//return;
|
||
}
|
||
|
||
|
||
uint8_t GenerateSID27SeedValue(uint8_t *seed)
|
||
{
|
||
uint32_t random;
|
||
|
||
random *= UdsApi_GetRandom();
|
||
seed[0] = (uint8_t)(random >> 0);
|
||
seed[1] = (uint8_t)(random >> 16);
|
||
// seed[2] = (uint8_t)(random >> 8);
|
||
// seed[3] = (uint8_t)(random >> 0);
|
||
return 0;
|
||
}
|
||
|
||
#if BOOTLOADER_CODE_FLAG
|
||
extern void RAMFLASHInit(void);
|
||
#endif
|
||
|
||
uint16_t GenerateSID27KeyValue(uint16_t seed)
|
||
{
|
||
#define TOPBIT 0x8000
|
||
#define POLYNOM_1 0x8408
|
||
#define POLYNOM_2 0x8025
|
||
#define BITMASK 0x0080
|
||
#define INITIAL_REMINDER 0xFFFE
|
||
#define MSG_LEN 2 /* seed length in bytes */
|
||
uint8_t bSeed[2];
|
||
uint16_t remainder;
|
||
uint8_t n;
|
||
uint8_t i;
|
||
bSeed[0] = (uint8_t)(seed >> 8); /* MSB */
|
||
bSeed[1] = (uint8_t)seed; /* LSB */
|
||
remainder = INITIAL_REMINDER;
|
||
for (n = 0; n < MSG_LEN; n++) {
|
||
/* Bring the next byte into the remainder. */
|
||
remainder ^= ((bSeed[n]) << 8);
|
||
/* Perform modulo-2 division, a bit at a time. */
|
||
for (i = 0; i < 8; i++) {
|
||
/* Try to divide the current data bit. */
|
||
if (remainder & TOPBIT) {
|
||
if(remainder & BITMASK) {
|
||
remainder = (remainder << 1) ^ POLYNOM_1;
|
||
} else {
|
||
remainder = (remainder << 1) ^ POLYNOM_2;
|
||
}
|
||
} else {
|
||
remainder = (remainder << 1);
|
||
}
|
||
}
|
||
}
|
||
/* The final remainder is the key */
|
||
return remainder;
|
||
}
|
||
|
||
//extern EReturnMsg bsp_flash_erase_sector(INT32U nFlashAddr);
|
||
//extern EReturnMsg bsp_flash_write_buff(INT32U nFlashAddr, INT8U *pBuff, INT32U nLen);
|
||
//extern EReturnMsg bsp_flash_read_buff(INT32U nFlashAddr, INT8U *pBuff, INT32U nLen);
|
||
|
||
uint8_t EE_Write(uint8_t *pImage, const uint8_t *pData, uint32_t Len, void (*pCbFn)(uint32_t))
|
||
{
|
||
uds_service_nvm_write(pImage, pData, Len, pCbFn);
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
uint8_t EE_Read(uint8_t *pImage, uint8_t **pData)
|
||
{
|
||
if (NVM_IMAGE_DTC_ADDR == pImage) {
|
||
*pData = (uint8_t *)NVM_IMAGE_DTC_ADDR;
|
||
} else if (NVM_IMAGE_DID_ADDR == pImage) {
|
||
*pData = (uint8_t *)NVM_IMAGE_DID_ADDR;
|
||
} else {
|
||
return FALSE;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
void SetUdsUpdataFlag(void)
|
||
{
|
||
#if (BOOTLOADER_CODE_FLAG == 0)
|
||
SetExternProgrammingRequest();
|
||
#endif
|
||
|
||
}
|
||
|
||
#if BOOTLOADER_CODE_FLAG
|
||
#if APP_DATA_ENCRYPT_ENABLE
|
||
|
||
const unsigned char tea_key_table[]= {
|
||
0xF0,0xD6,0x28,0xCC,0xBA,0x39,0x4E,0x30,
|
||
0x8F,0x77,0x35,0xF6,0xCA,0x3E,0x99,0xBA,
|
||
};
|
||
|
||
void UdsEncryptDate_Crc32Cal_Init(void)
|
||
{
|
||
CRC32_HwCal_04C11DB7_SegInit();
|
||
}
|
||
|
||
void UdsEncryptDate_Crc32Cal_Update(const u8 *pData, u32 size)
|
||
{
|
||
CRC32_HwCal_04C11DB7_SegUpdata(pData, size);
|
||
}
|
||
|
||
uint32_t UdsEncryptDate_Crc32Cal_Final(void)
|
||
{
|
||
return CRC32_HwCal_04C11DB7_SegFinal();
|
||
}
|
||
|
||
uint16_t UdsEncryptDate_Decrypt(uint8_t *src,uint16_t size_src)
|
||
{
|
||
return decrypt(src, size_src, (uint8_t*)tea_key_table);
|
||
}
|
||
|
||
void UdsEncryptDate_Xor(uint8_t *src,uint16_t size_src)
|
||
{
|
||
Xor_Opeartion(src, 0x20, size_src);
|
||
}
|
||
|
||
#endif
|
||
#endif
|
||
|
||
bool CheckVechileStatus(void)
|
||
{
|
||
bool cbRst = false;
|
||
uint16_t speed = WORD(vehicleInfo2uds.Snapshot.VehSpeedH, vehicleInfo2uds.Snapshot.VehSpeedL);
|
||
|
||
if (speed <= 80) {
|
||
cbRst = true;
|
||
}
|
||
|
||
return cbRst;
|
||
}
|
||
|
||
bool CheckIsBatteryLow(void)
|
||
{
|
||
bool bRst = false;
|
||
|
||
if (vehicleInfo2uds.BattLow) {
|
||
bRst = true;
|
||
}
|
||
|
||
return bRst;
|
||
}
|
||
|
||
bool CheckIsBatteryHigh(void)
|
||
{
|
||
bool bRst = false;
|
||
|
||
if (vehicleInfo2uds.BattHigh) {
|
||
bRst = true;
|
||
}
|
||
|
||
return bRst;
|
||
}
|
||
|
||
bool CheckIsIgnON(void)
|
||
{
|
||
bool bRst = false;
|
||
|
||
if (vehicleInfo2uds.IgnSts) {
|
||
bRst = true;
|
||
}
|
||
|
||
return bRst;
|
||
}
|
||
|
||
//bool CheckIsIgnOff2ON(void)
|
||
//{
|
||
// bool bRst=false;
|
||
//
|
||
// if (vehicleInfo2uds.IgnOff2On) {
|
||
// bRst = true;
|
||
// }
|
||
// return bRst;
|
||
//}
|
||
#if BOOTLOADER_CODE_FLAG == 0
|
||
|
||
|
||
bool CheckIsCanBusoff(void)
|
||
{
|
||
bool bRst = false;
|
||
|
||
if (vehicleInfo2uds.BusoffCnt) {
|
||
bRst = true;
|
||
}
|
||
|
||
return bRst;
|
||
}
|
||
|
||
#endif
|
||
|