222 lines
7.7 KiB
C
222 lines
7.7 KiB
C
|
/*
|
||
|
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
|
||
|
* exclusively with CVA's microcontroller products. This file can be freely
|
||
|
* distributed within development tools that are supporting such microcontroller
|
||
|
* products.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||
|
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||
|
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
|
||
|
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||
|
*/
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* the includes
|
||
|
******************************************************************************/
|
||
|
|
||
|
#include "uds_dtc.h"
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* the defines
|
||
|
******************************************************************************/
|
||
|
|
||
|
#define DTCG_EMISSION_START (0x00000000ul) /* 24Bit DTC define ISO-15031-6 DTC + ISO-15031-6 Failure Type, ISO14229-1 format */
|
||
|
#define DTCG_EMISSION_END (0x000FFFFFul)
|
||
|
#define DTCG_POWERTRAIN_START (0x00100000ul)
|
||
|
#define DTCG_POWERTRAIN_END (0x003FFFFFul)
|
||
|
#define DTCG_CHASSIS_START (0x00400000ul)
|
||
|
#define DTCG_CHASSIS_END (0x007FFFFFul)
|
||
|
#define DTCG_BODY_START (0x00800000ul)
|
||
|
#define DTCG_BODY_END (0x00BFFFFFul)
|
||
|
#define DTCG_NETWORK_START (0x00C00000ul)
|
||
|
#define DTCG_NETWORK_END (0x00FFFFFFul)
|
||
|
|
||
|
#define FAULTDT_MAX (127) /* refers to ISO14229-1 D.6 */
|
||
|
#define FAULTDT_MIN (-128) /* refers to ISO14229-1 D.6 */
|
||
|
#define AGING_MAX (40) /* refers to ISO14229-1 D.7 */
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* the typedefs
|
||
|
******************************************************************************/
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* the globals
|
||
|
******************************************************************************/
|
||
|
|
||
|
/* the meaning of UDS DTC value refers to ISO 15031-6 */
|
||
|
static Uds_DtcType udsDtcTable[DTC_MAX_COUNT] = {
|
||
|
{0x04621A, 0x50, 0x00, 0x00}, /* P0462 fuel level sensor "A" circuit resistance low */
|
||
|
{0x04631B, 0x50, 0x00, 0x00}, /* P0463 fuel level sensor "A" circuit resistance high */
|
||
|
{0xF00316, 0x50, 0x00, 0x00}, /* U3003 battery voltage low */
|
||
|
{0xF00317, 0x50, 0x00, 0x00}, /* U3003 battery voltage high */
|
||
|
{0xC07388, 0x50, 0x00, 0x00}, /* U0073 control module communication bus off */
|
||
|
{0xC10001, 0x50, 0x00, 0x00}, /* U0100 lost communication with ECM/PCM "A" */
|
||
|
{0xC10101, 0x50, 0x00, 0x00}, /* U0101 lost communication with TCM */
|
||
|
{0xC12101, 0x50, 0x00, 0x00}, /* U0121 lost communication with ABS control module */
|
||
|
{0xC12701, 0x50, 0x00, 0x00}, /* U0127 lost communication with tire pressure monitor module */
|
||
|
{0xC12801, 0x50, 0x00, 0x00}, /* U0128 lost communication with park brake control module */
|
||
|
{0xC12901, 0x50, 0x00, 0x00}, /* U0129 lost communication with brake system control module */
|
||
|
{0xC13101, 0x50, 0x00, 0x00}, /* U0131 lost communication with power sterring control module */
|
||
|
{0xC14100, 0x50, 0x00, 0x00}, /* U0141 lost communication with body control module "A" */
|
||
|
{0xC15101, 0x50, 0x00, 0x00}, /* U0151 lost communication with restraints control module */
|
||
|
{0xC16300, 0x50, 0x00, 0x00}, /* U0163 lost communication with navigation control module */
|
||
|
{0xC16900, 0x50, 0x00, 0x00}, /* U0169 lost communication with sunroof control module */
|
||
|
{0xC18101, 0x50, 0x00, 0x00}, /* U0181 lost communication with headlamp leveling control module */
|
||
|
{0xC23601, 0x50, 0x00, 0x00}, /* U0236 lost communication with column lock module */
|
||
|
{0xC16400, 0x50, 0x00, 0x00}, /* U0164 lost communication with HVAC control module */
|
||
|
{0xC16700, 0x50, 0x00, 0x00}, /* U0167 lost communication with vehicle immobilizer control module */
|
||
|
};
|
||
|
|
||
|
static bool dtcOffCtrl = false;
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* the constants
|
||
|
******************************************************************************/
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* the functions
|
||
|
******************************************************************************/
|
||
|
|
||
|
void Uds_SetDtcOffCtrl(bool val)
|
||
|
{
|
||
|
dtcOffCtrl = val;
|
||
|
}
|
||
|
|
||
|
bool Uds_GetDtcOffCtrlState(void)
|
||
|
{
|
||
|
return dtcOffCtrl;
|
||
|
}
|
||
|
|
||
|
void Uds_ClearDtcByDtcIndex(uint16_t dtcIndex)
|
||
|
{
|
||
|
if(dtcIndex >= DTC_MAX_COUNT)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
udsDtcTable[dtcIndex].dtcStatus.all = 0;
|
||
|
udsDtcTable[dtcIndex].dtcStatus.bit.testNcmpSlc = 1;
|
||
|
udsDtcTable[dtcIndex].dtcStatus.bit.testNcmpToc = 1;
|
||
|
|
||
|
udsDtcTable[dtcIndex].faultDtCnt = 0;
|
||
|
udsDtcTable[dtcIndex].AgingCnt = 0;
|
||
|
}
|
||
|
|
||
|
void Uds_LoadDtc(void)
|
||
|
{
|
||
|
/* code implemented by the user */
|
||
|
}
|
||
|
|
||
|
void Uds_SaveDtc(void)
|
||
|
{
|
||
|
/* code implemented by the user */
|
||
|
}
|
||
|
|
||
|
uint16_t Uds_GetDtcNumberByStatusMask(uint8_t mask)
|
||
|
{
|
||
|
uint16_t dtcCnt = 0;
|
||
|
uint8_t dtcState = 0;
|
||
|
uint16_t dtcNum = 0;
|
||
|
|
||
|
for(dtcCnt = 0; dtcCnt < DTC_MAX_COUNT; dtcCnt++)
|
||
|
{
|
||
|
dtcState = (udsDtcTable[dtcCnt].dtcStatus.all & DTC_AVAILABILITY_STATUS_MASK);
|
||
|
if(0 != (dtcState & mask))
|
||
|
{
|
||
|
dtcNum++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return dtcNum;
|
||
|
}
|
||
|
|
||
|
uint16_t Uds_GetDtcByStatusMask(uint8_t *pDtcBuf, uint16_t bufLen, uint8_t mask)
|
||
|
{
|
||
|
uint16_t dtcCnt = 0;
|
||
|
uint8_t dtcState = 0;
|
||
|
uint16_t dtcDlc = 0;
|
||
|
|
||
|
for(dtcCnt = 0; dtcCnt < DTC_MAX_COUNT; dtcCnt++)
|
||
|
{
|
||
|
dtcState = udsDtcTable[dtcCnt].dtcStatus.all;
|
||
|
if(0 != (dtcState & mask))
|
||
|
{
|
||
|
if((dtcDlc + 4) <= bufLen)
|
||
|
{
|
||
|
pDtcBuf[dtcDlc++] = (uint8_t)(udsDtcTable[dtcCnt].dtcCode >> 16);
|
||
|
pDtcBuf[dtcDlc++] = (uint8_t)(udsDtcTable[dtcCnt].dtcCode >> 8);
|
||
|
pDtcBuf[dtcDlc++] = (uint8_t)(udsDtcTable[dtcCnt].dtcCode >> 0);
|
||
|
pDtcBuf[dtcDlc++] = (dtcState & DTC_AVAILABILITY_STATUS_MASK);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return dtcDlc;
|
||
|
}
|
||
|
|
||
|
uint16_t Uds_GetSupportedDtc(uint8_t *pDtcBuf, uint16_t bufLen)
|
||
|
{
|
||
|
uint16_t dtcCnt = 0;
|
||
|
uint8_t dtcState = 0;
|
||
|
uint16_t dtcDlc = 0;
|
||
|
|
||
|
for(dtcCnt = 0; dtcCnt < DTC_MAX_COUNT; dtcCnt++)
|
||
|
{
|
||
|
dtcState = udsDtcTable[dtcCnt].dtcStatus.all;
|
||
|
if((dtcDlc + 4) <= bufLen)
|
||
|
{
|
||
|
pDtcBuf[dtcDlc++] = (uint8_t)(udsDtcTable[dtcCnt].dtcCode >> 16);
|
||
|
pDtcBuf[dtcDlc++] = (uint8_t)(udsDtcTable[dtcCnt].dtcCode >> 8);
|
||
|
pDtcBuf[dtcDlc++] = (uint8_t)(udsDtcTable[dtcCnt].dtcCode >> 0);
|
||
|
pDtcBuf[dtcDlc++] = (dtcState & DTC_AVAILABILITY_STATUS_MASK);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return dtcDlc;
|
||
|
}
|
||
|
|
||
|
void Uds_ClearDtcByGroup(uint32_t group)
|
||
|
{
|
||
|
uint16_t dtcCnt = 0;
|
||
|
|
||
|
switch(group)
|
||
|
{
|
||
|
case EMISSION_SYSTEM_GROUP:
|
||
|
for(dtcCnt = 0; dtcCnt < DTC_MAX_COUNT; dtcCnt++)
|
||
|
{
|
||
|
if(udsDtcTable[dtcCnt].dtcCode <= DTCG_EMISSION_END)
|
||
|
{
|
||
|
Uds_ClearDtcByDtcIndex(dtcCnt);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case SAFETY_SYSTEM_GROUP:
|
||
|
for(dtcCnt = 0; dtcCnt < DTC_MAX_COUNT; dtcCnt++)
|
||
|
{
|
||
|
if((udsDtcTable[dtcCnt].dtcCode >= DTCG_CHASSIS_START) && (udsDtcTable[dtcCnt].dtcCode <= DTCG_CHASSIS_END))
|
||
|
{
|
||
|
Uds_ClearDtcByDtcIndex(dtcCnt);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case ALL_FUNC_SYSTEM_GROUP:
|
||
|
for(dtcCnt = 0; dtcCnt < DTC_MAX_COUNT; dtcCnt++)
|
||
|
{
|
||
|
Uds_ClearDtcByDtcIndex(dtcCnt);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|