#ifndef _UDS_FBL_SERVICE_22_SOURCE #define _UDS_FBL_SERVICE_22_SOURCE /******************************************************************************* ** Include Section ** *******************************************************************************/ #include "uds_fbl_mgr.h" #include "uds_fbl_service22.h" #include "uds_fbl_service10.h" #include #include "uds_commonInfo.h" /******************************************************************************* ** Version Information ** *******************************************************************************/ /******************************************************************************* ** Version Check ** *******************************************************************************/ /******************************************************************************* ** Macro definition ** *******************************************************************************/ #define SOFT_VERSION_NUM (33) #define FBLVersionAddr 0x00023FEFU #define FBLReqSpecAddr 0x00023FF4U /*Software Number: Occupy 0x14 = 20 Bytes*/ #define AppSoftwareNumberAddr 0x00040540U /*AVATR defined ECU Software Version Number Data Identifier: Occupy 0x0F = 15 Bytes*/ #define AvatrECUSWVerNumberDataIdAddr 0x00040554U /******************************************************************************* ** Global Data ** *******************************************************************************/ const uds_nrc nrc_22f18a[3] = { UDSincorrectMessageLengthOrInvalidFormat,\ UDSconditionNotCorrect,\ UDSrequestOutOfRange }; const uds_nrc nrc_22f089[3] = { UDSincorrectMessageLengthOrInvalidFormat,\ UDSconditionNotCorrect,\ UDSrequestOutOfRange }; const uds_nrc nrc_22f189[3] = { UDSincorrectMessageLengthOrInvalidFormat,\ UDSconditionNotCorrect,\ UDSrequestOutOfRange }; const uds_nrc nrc_22f187[3] = { UDSincorrectMessageLengthOrInvalidFormat,\ UDSconditionNotCorrect,\ UDSrequestOutOfRange }; const uds_nrc nrc_22f188[3] = { UDSincorrectMessageLengthOrInvalidFormat,\ UDSconditionNotCorrect,\ UDSrequestOutOfRange }; const uds_nrc nrc_22f170[3] = { UDSincorrectMessageLengthOrInvalidFormat,\ UDSconditionNotCorrect,\ UDSrequestOutOfRange }; const uds_nrc nrc_22f171[3] = { UDSincorrectMessageLengthOrInvalidFormat,\ UDSconditionNotCorrect,\ UDSrequestOutOfRange }; const uds_nrc nrc_22f010[3] = { UDSincorrectMessageLengthOrInvalidFormat,\ UDSconditionNotCorrect,\ UDSrequestOutOfRange }; const uds_nrc nrc_22f184[3] = { UDSincorrectMessageLengthOrInvalidFormat,\ UDSconditionNotCorrect,\ UDSrequestOutOfRange }; const uds_nrc nrc_22f186[3] = { UDSincorrectMessageLengthOrInvalidFormat,\ UDSconditionNotCorrect,\ UDSrequestOutOfRange }; /*--------- <0x22> sub function config start-------------*/ /*All 22 services can be supported in all sessions:Default session | program session | Extend session = 0x07*/ static const DIAG_sunfunction_t SessionSubfunction[] = { { 0xF18A,7,false,3,ReadSysSupplierIdLen+3, vd_s_ReadServerSysSupplierId, {nrc_22f18a, 3}}, /* Read Server's system supplier Id */ { 0xF089,7,false,3,ReadECUHWVerNumDataIdLen+3, vd_s_ReadECUHWVerNumberDataId, {nrc_22f089, 3}}, /* Read Server's ECU HW VersionNumberData ID */ { 0xF189,7,false,3,ReadECUSWVerNumDataIdLen+3, vd_s_ReadECUSWVerNumberDataId, {nrc_22f189, 3}}, /* Read Server's ECU SW VersionNumberData ID */ { 0xF187,7,false,3,ReadHWPartNumberLen+3, vd_s_ReadHWPartNumber, {nrc_22f187, 3}}, /* Read HW Part Number */ { 0xF188,7,false,3,ReadSWPartNumberLen+3, vd_s_ReadSWPartNumber, {nrc_22f188, 3}}, /* Read SW Part Number */ { 0xF170,7,false,3,ReadFBLVerLen+3, vd_s_ReadFBLVersionNumber, {nrc_22f170, 3}}, /* Read FBL Version Info */ { 0xF171,7,false,3,ReadFBLReqSpecVerLen+3, vd_s_ReadFBLReqSpecVersionInfo, {nrc_22f171, 3}}, /* Read FBL requirement spec version Info */ { 0xF010,7,false,3,ReadFBLSwapAreaLen+3, vd_s_ReadFBLSwapArea, {nrc_22f010, 3}}, /* Read swap area,return with all 0xFF */ { 0xF184,7,false,3,10, vd_s_ReadFunctionFingerPrint, {nrc_22f184, 3}}, /* Read Fingerprint */ { 0xF186,7,false,3,4 , vd_s_ReadActiveDiagnosticSession, {nrc_22f186, 3}} /* Get Active Diagnostic Session */ }; /*--------- <0x22> sub function config end---------------*/ /*-------------------------------------------------------*/ /******************************************************************************* ** Function Definitions ** *******************************************************************************/ static bool Check_Nrc_13_Of_Service22(uint16_t sourceLength, uint16_t targetLength); static bool Check_Nrc_22_Of_Service22(uint16_t did, const DIAG_sunfunction_t* funcList, uint16_t listSize); static void vd_s_StringToAscii(char* s8_ap_stringData, U8* u8_ap_asciiData); /*uint32_t Big-endian and Little-endian conversion*/ uint32_t bswap_32(uint32_t swapdata) { swapdata = ((swapdata << 8) &0xFF00FF00) | ((swapdata >> 8) &0x00FF00FF); return (swapdata >> 16) | (swapdata << 16); } /*==============================================================================================================*/ /* static bool Check_Nrc_13_Of_Service22(uint16_t sourceLength, uint16_t targetLength) */ /* -------------------------------------------------------------------------------------------------------------*/ /* Function: Check if the length of the service request is wrong */ /* Arguments: sourceLength : Actual service request length */ /* targetLength : Expected service request length */ /* Return: Yes or No */ /*==============================================================================================================*/ static bool Check_Nrc_13_Of_Service22(uint16_t sourceLength, uint16_t targetLength) { if (sourceLength != targetLength) { return true; } else { return false; } } /*==============================================================================================================*/ /* static bool Check_Nrc_22_Of_Service22(uint16_t did, const DIAG_sunfunction_t* funcList, uint16_t listSize) */ /* -------------------------------------------------------------------------------------------------------------*/ /* Function: Check whether the operating conditions of the server are met to perform the required action or not*/ /* Arguments: did : data identifier */ /* funcList : $22 service info table */ /* listSize : $22 service info table size */ /* Return: Yes or No */ /*==============================================================================================================*/ static bool Check_Nrc_22_Of_Service22(uint16_t did, const DIAG_sunfunction_t* funcList, uint16_t listSize) { uint8_t index = 0; uint8_t currSession = udsFbl_GetCurrentSessionMode(); bool nrcFlag = false; for(index = 0;index < listSize;index ++) { if(did == funcList[index].sub_requestsid) { if (0 == (currSession & funcList[index].session_mask )) { nrcFlag = true; break; } else { break; } } } if(index == listSize) { nrcFlag = true; } return nrcFlag; } /********************************************************************************************* * Prototype * uds_nrc service22_nrc_check(UDSpacket_t* qUDSpacket) * Parameter * parameter [in] : * * Return code * return * * Functional Description * * Particularities and Limitations * * Expected Caller Context * *********************************************************************************************/ uds_nrc service22_nrc_check(UDSpacket_t* qUDSpacket) { uds_nrc returnType = 0; uint8_t const kwpdiag_num = (sizeof(SessionSubfunction)/sizeof(DIAG_sunfunction_t)); uint8_t index = 0; uint16_t did = 0; uint8_t index_nrc = 0; nrc_table_t nrc_table; uint16_t length; did = (((uint16_t)qUDSpacket->Data.Byte[1])<<8); did |= ((uint16_t)qUDSpacket->Data.Byte[2]); for (index = 0; index < kwpdiag_num; index++) { if(did == SessionSubfunction[index].sub_requestsid) { break; } } if(index != kwpdiag_num) { nrc_table = SessionSubfunction[index].nrc_table; length = SessionSubfunction[index].rx_dataLen; for (index_nrc = 0; (index_nrc < nrc_table.nrc_cnt) && (returnType == 0); index_nrc++) { switch (nrc_table.nrc_list[index_nrc]) { case UDSincorrectMessageLengthOrInvalidFormat: if (Check_Nrc_13_Of_Service22(qUDSpacket->size, length)) { returnType = UDSincorrectMessageLengthOrInvalidFormat; } break; case UDSconditionNotCorrect: if (Check_Nrc_22_Of_Service22(did, SessionSubfunction, kwpdiag_num)) { returnType = UDSconditionNotCorrect; } break; case UDSsecurityAccessDenied: if (Uds_Nrc33_Occur(did, SessionSubfunction, kwpdiag_num)) { returnType = UDSsecurityAccessDenied; } break; default: break; } } } else { returnType = UDSrequestOutOfRange; } return returnType; } /********************************************************************************************* * Prototype * uint8_t ApplDiagReadDataByCommonId_22(UDSpacket_t* qUDSpacket) * Parameter * pdiagdata [in] : * diagrequestlength [in] : * * Functional Description * * Particularities and Limitations * * Expected Caller Context * *********************************************************************************************/ uint8_t ApplDiagReadDataByCommonId_22(UDSpacket_t* qUDSpacket) { uds_nrc returnType = 0; uint8_t index = 0; uint8_t const kwpdiag_num = (sizeof(SessionSubfunction)/sizeof(DIAG_sunfunction_t)); uint16_t did = 0; did = (((uint16_t)qUDSpacket->Data.Byte[1])<<8); did |= ((uint16_t)qUDSpacket->Data.Byte[2]); returnType = service22_nrc_check(qUDSpacket); if (UDSpositiveResp == returnType) { for(index = 0;index < kwpdiag_num;index ++) { if(did == SessionSubfunction[index].sub_requestsid) { returnType = SessionSubfunction[index].diag_subfunc(&qUDSpacket->Data.Byte[3]); qUDSpacket->size = SessionSubfunction[index].tx_dataLen; qUDSpacket->Data.Byte[0] = UDS_GET_POSITIVE_RSP(qUDSpacket->Data.Byte[0]); } } } else { /* returnType = UDSconditionNotCorrect; */ } return returnType; } /*==============================================================================================================*/ /* uint8_t vd_s_ReadServerSysSupplierId(uint8* pdidData) */ /* -------------------------------------------------------------------------------------------------------------*/ /* Function: read Server's System Supplier Identifier --- 22 F1 8A */ /* Arguments: pdidData : the Id read from Data flash */ /* Return: read status */ /*==============================================================================================================*/ uint8_t vd_s_ReadServerSysSupplierId(uint8_t* pdidData) { uds_nrc returnType; uint8_t readstaus; uint8_t u8Index; readstaus = Dataflash_Common_Read(DID_SUPPORT_MAX,pdidData); for(u8Index = VALUE_0;u8Index < ReadSysSupplierIdLen; u8Index++) { pdidData[u8Index] = 0xFF; } if(readstaus == 0) { returnType = UDSpositiveResp; } else { returnType = UDSconditionNotCorrect; } return returnType; } /*==============================================================================================================*/ /* uint8_t vd_s_ReadECUHWVerNumberDataId(uint8* pdidData) */ /* -------------------------------------------------------------------------------------------------------------*/ /* Function: read Server's System ECU HW Version Number Data Identifier --- 22 F0 89 */ /* Arguments: pdidData : the Id read from Data flash */ /* Return: read status */ /*==============================================================================================================*/ uint8_t vd_s_ReadECUHWVerNumberDataId(uint8_t* pdidData) { uds_nrc returnType; uint8_t readstaus; uint8_t u8Index; readstaus = Dataflash_Common_Read(DID_SUPPORT_MAX,pdidData); for(u8Index = VALUE_0;u8Index < ReadECUHWVerNumDataIdLen; u8Index++) { pdidData[u8Index] = 0xFF; } if(readstaus == 0) { returnType = UDSpositiveResp; } else { returnType = UDSconditionNotCorrect; } return returnType; } /*==============================================================================================================*/ /* uint8_t vd_s_ReadECUSWVerNumberDataId(uint8* pdidData) */ /* -------------------------------------------------------------------------------------------------------------*/ /* Function: read Server's System ECU SW Version Number Data Identifier --- 22 F1 89 */ /* Arguments: pdidData : the Id read from Data flash */ /* Return: read status */ /*==============================================================================================================*/ uint8_t vd_s_ReadECUSWVerNumberDataId(uint8_t* pdidData) { uds_nrc returnType; uint8_t u8Index; uint32_t u32AvatrECUSWVerNumberDataIdAddr = AvatrECUSWVerNumberDataIdAddr; for(u8Index = VALUE_0;u8Index < ReadECUSWVerNumDataIdLen; u8Index++) { pdidData[u8Index] = *((uint8_t*)(u32AvatrECUSWVerNumberDataIdAddr++)); } returnType = UDSpositiveResp; return returnType; } /*==============================================================================================================*/ /* uint8_t vd_s_ReadHWPartNumber(uint8* pdidData) */ /* -------------------------------------------------------------------------------------------------------------*/ /* Function: read HW Part Number --- 22 F1 87 */ /* Arguments: pdidData : the Id read from Data flash */ /* Return: read status */ /*==============================================================================================================*/ uint8_t vd_s_ReadHWPartNumber(uint8_t* pdidData) { uds_nrc returnType; uint8_t readstaus; uint8_t u8Index; readstaus = Dataflash_Common_Read(DID_SUPPORT_MAX,pdidData); for(u8Index = VALUE_0;u8Index < ReadHWPartNumberLen; u8Index++) { pdidData[u8Index] = 0xFF; } if(readstaus == 0) { returnType = UDSpositiveResp; } else { returnType = UDSconditionNotCorrect; } return returnType; } /*==============================================================================================================*/ /* uint8_t vd_s_ReadSWPartNumber(uint8* pdidData) */ /* -------------------------------------------------------------------------------------------------------------*/ /* Function: read SW Part Number --- 22 F1 88 */ /* Arguments: pdidData : the Id read from Data flash */ /* Return: read status */ /*==============================================================================================================*/ uint8_t vd_s_ReadSWPartNumber(uint8_t* pdidData) { uds_nrc returnType; uint8_t u8Index; uint32_t u32AppSoftwareNumberAddr = AppSoftwareNumberAddr; for(u8Index = VALUE_0;u8Index < ReadSWPartNumberLen; u8Index++) { pdidData[u8Index] = *((uint8_t*)(u32AppSoftwareNumberAddr++)); } returnType = UDSpositiveResp; return returnType; } /*==============================================================================================================*/ /* uint8_t vd_s_ReadFBLReqSpecVersionInfo(uint8* pdidData) */ /* -------------------------------------------------------------------------------------------------------------*/ /* Function: read FBL Requirement Spec Version Info --- 22 F1 71 */ /* Arguments: pdidData : the Id read from Data flash */ /* Return: read status */ /*==============================================================================================================*/ uint8_t vd_s_ReadFBLReqSpecVersionInfo(uint8_t* pdidData) { uds_nrc returnType; uint32_t FBLSpecVersion = *((uint32_t*)(FBLReqSpecAddr)); returnType = UDSpositiveResp; /* Big-endian and Little-endian conversion */ FBLSpecVersion = bswap_32(FBLSpecVersion); pdidData[VALUE_0] = (uint8_t)((FBLSpecVersion >> 24)& 0xFF); pdidData[VALUE_1] = (uint8_t)((FBLSpecVersion >> 16)& 0xFF); pdidData[VALUE_2] = (uint8_t)((FBLSpecVersion >> 8)& 0xFF); pdidData[VALUE_3] = (uint8_t)((FBLSpecVersion >> 0)& 0xFF); return returnType; } /*==============================================================================================================*/ /* uint8_t vd_s_ReadFBLSwapArea(uint8* pdidData) */ /* -------------------------------------------------------------------------------------------------------------*/ /* Function: read FBL Swap Info --- 22 F0 10 */ /* Arguments: pdidData : the Id read from Data flash */ /* Return: read status */ /*==============================================================================================================*/ uint8_t vd_s_ReadFBLSwapArea(uint8_t* pdidData) { uds_nrc returnType; uint8_t readstaus; uint8_t u8Index; readstaus = Dataflash_Common_Read(DID_SUPPORT_MAX,pdidData); for(u8Index = VALUE_0;u8Index < ReadFBLSwapAreaLen; u8Index++) { pdidData[u8Index] = 0xFF; } if(readstaus == 0) { returnType = UDSpositiveResp; } else { returnType = UDSconditionNotCorrect; } return returnType; } /*==============================================================================================================*/ /* uint8_t vd_s_ReadFunctionVehicleManufacturerHardwarePartNumber(uint8* pdidData) */ /* -------------------------------------------------------------------------------------------------------------*/ /* Function: read vehicle manufacture hardware part number */ /* Arguments: pdidData : the read manufacture hardware part number */ /* Return: read status */ /*==============================================================================================================*/ uint8_t vd_s_ReadFunctionVehicleManufacturerHardwarePartNumber(uint8_t* pdidData) { uds_nrc returnType = 0; vd_s_StringToAscii("P0276879 AA", &pdidData[VALUE_0]); return returnType; } /*==============================================================================================================*/ /* static void vd_s_StringToAscii(char* s8_ap_stringData, U8* u8_ap_asciiData) */ /* -------------------------------------------------------------------------------------------------------------*/ /* Function: transfer string to char array */ /* Arguments: s8_ap_stringData : the string to be transferred */ /* u8_ap_asciiData : the target char array */ /* Return: - */ /*==============================================================================================================*/ static void vd_s_StringToAscii(char* s8_ap_stringData, U8* u8_ap_asciiData) { U8 u8_t_index = VALUE_0; for (u8_t_index = VALUE_0; u8_t_index < strlen(s8_ap_stringData); u8_t_index++) { u8_ap_asciiData[u8_t_index] = s8_ap_stringData[u8_t_index]; } } /*==============================================================================================================*/ /* uint8_t vd_s_ReadFunctionFingerPrint(uint8* pdidData) */ /* -------------------------------------------------------------------------------------------------------------*/ /* Function: read finger print --- 22 F1 84 */ /* Arguments: pdidData : the finger print read from work flash */ /* Return: read status */ /*==============================================================================================================*/ uint8_t vd_s_ReadFunctionFingerPrint(uint8_t* pdidData) { uds_nrc returnType; uint8_t readstaus; readstaus = Dataflash_Common_Read(DID_FINGERPRINTF,pdidData); if(readstaus == 0) { returnType = UDSpositiveResp; } else { returnType = UDSconditionNotCorrect; } return returnType; } /*==============================================================================================================*/ /* uint8_t vd_s_ReadActiveDiagnosticSession(uint8* pdidData) */ /* -------------------------------------------------------------------------------------------------------------*/ /* Function: read current session mode --- 22 F1 86 */ /* Arguments: pdidData : the read session mode */ /* Return: read status */ /*==============================================================================================================*/ uint8_t vd_s_ReadActiveDiagnosticSession(uint8_t* pdidData) { uds_nrc returnType; uint8_t active_session; active_session = udsFbl_GetCurrentSessionMode(); if(active_session == KWPDIAG_EXTEND_SESS_ID) { active_session = 0x03; } else { /* do nothing */ } returnType = UDSpositiveResp; pdidData[0] = active_session; return returnType; } /*==============================================================================================================*/ /* uint8_t vd_s_ReadFBLVersionNumber(uint8* pdidData) */ /* -------------------------------------------------------------------------------------------------------------*/ /* Function: read bootloader version number --- 22 F1 70 */ /* Arguments: pdidData : the read bootloader version number */ /* Return: read status */ /*==============================================================================================================*/ uint8_t vd_s_ReadFBLVersionNumber(uint8_t* pdidData) { uds_nrc returnType; uint32_t FBLVersion = *((uint32_t*)(FBLVersionAddr)); returnType = UDSpositiveResp; /* Big-endian and Little-endian conversion */ FBLVersion = bswap_32(FBLVersion); pdidData[VALUE_0] = (uint8_t)((FBLVersion >> 24)& 0xFF); pdidData[VALUE_1] = (uint8_t)((FBLVersion >> 16)& 0xFF); pdidData[VALUE_2] = (uint8_t)((FBLVersion >> 8)& 0xFF); pdidData[VALUE_3] = (uint8_t)((FBLVersion >> 0)& 0xFF); return returnType; } /******************************************************************************* ** End of File ** *******************************************************************************/ #endif /*_UDS_FBL_SERVICE_22_SOURCE*/