/*! * @file uds_interface.c * @brief customized service sequence definition. Here is the demo sequence. Modify the file according to the requirements. * */ #include "uds_config.h" /*! * Demo Macro. Services number in the sequence. */ #define SERVICE_SEQUENCE_NUM (UDS_SERVICE_NUM) /*! * Demo Type. Service Control type. */ _UdsUpData UdsUpData; __UDSService UdsService; const uint8_t UDSsid[] = { UDS_SERVICE_FOREACH(GENERATE_UDS_SERVICE_ID) }; /*! * Demo Type. Service Function type. */ typedef void (*SERVICE_FUNC_T)(void); //static uint8_t UDS_Routine_ID[2]; /*!< Demo Variable. Routine ID buffer for Service 31 */ uint8_t UDS_SeedKeyBuf[8]; /*!< Demo Variable. Seed key buffer for Service 27 */ //static uint8_t UDS_AddrBuf[4]; /*!< Demo Variable. Address buffer for Service 34 */ //static uint8_t UDS_LengthBuf[4]; /*!< Demo Variable. Length buffer for Service 34 */ //static uint8_t UDS_DataBuf[100]; /*!< Demo Variable. Data buffer for Service 36 */ UDS_Demo_Service_Ctrl_T Service_Ctrl; /*!< Demo Variable. Service Control flag */ static void UDS_10_Service_Session_Control(void); static void UDS_11_Service_Ecu_Reset(void); static void UDS_22_Service_Read_Data(void); static void UDS_2E_Service_Write_Data(void); static void UDS_3E_Service_Tester_Present(void); static void UDS_27_Service_Security_Access(void); static void UDS_31_Service_Routine_Ctrl(void); static void UDS_28_Service_Communication_Control(void); static void UDS_85_Service_Control_DTC(void); #if (BOOTLOADER_CODE_FLAG == 1) static void UDS_34_Service_Request_Download(void); static void UDS_36_Service_Transfer_Data(void); static void UDS_37_Service_Transfer_Exit(void); #else static void UDS_14_Service_Clear_DTC(void); static void UDS_19_Service_Read_DTC(void); static void UDS_2F_IO_OutputControl(void); #endif static void UDS_Service_NRC(void); /*! * Demo Variable. Service Sequence table. */ static SERVICE_FUNC_T UDS_Demo_Service_Table[SERVICE_SEQUENCE_NUM]= { UDS_SERVICE_FOREACH(GENERATE_UDS_SERVICE_TABLE) }; #ifdef PRINT_LOG_INFO void print_rx_data(uint8_t code) { // uint8_t i; // Sprintf("\r\n=======>Rx uds 0x%02x code data:",code); // for(i = 0; i< UdsService.RxDlc; i++) { // Sprintf("0x%02x,",UdsService.ReqCmdBuf[i]); // // } // Sprintf("\r\n"); } #endif bool CanRxConStatus(void) { bool xbRst=false; //if((gSystemStatus.EngineStatus)&&(ign1.state=='L')) // if(( true == UdsUpData.UpModleFlg )||((!HsCanError.StartTime)&&(('L' == ign1.state)||('L' == ign3.state)))) { xbRst = true; } return xbRst; } static void UDS_10_Service_Session_Control(void) { if((UdsService.RequestFlg)&&(0x10 == UdsService.Id)) { UDS_Service_10_Response(UdsService.RxSessionDiagModel); UdsService.RequestFlg=0; memset(TP_Buffer,0x0,255); } } static void UDS_11_Service_Ecu_Reset(void) { if((UdsService.RequestFlg)&&(0x11 == UdsService.Id)) { UDS_Service_11(UdsService.ReqCmdBuf); UdsService.RequestFlg=0; } } #if (BOOTLOADER_CODE_FLAG == 0) static void UDS_14_Service_Clear_DTC(void) { if((UdsService.RequestFlg)&&(0x14 == UdsService.Id)) { UDS_Service_14(UdsService.ReqCmdBuf,3); UdsService.RequestFlg=0; memset(TP_Buffer,0x0,255); } return; } static void UDS_19_Service_Read_DTC(void) { if((UdsService.RequestFlg)&&(0x19 == UdsService.Id)) { UDS_Service_0x19_Response(); //memset(TP_Buffer,0x0,255); UdsService.RequestFlg=0; } } static void UDS_2F_IO_OutputControl(void) { if((UdsService.RequestFlg)&&(0x2F == UdsService.Id)) { UDS_Service_0x2F_Response(); UdsService.RequestFlg=0; } } #endif static void UDS_22_Service_Read_Data(void) { if((UdsService.RequestFlg)&&(0x22 == UdsService.Id)) { UDS_Service_0x22_Response(); //memset(TP_Buffer,0x0,255); UdsService.RequestFlg=0; } } static void UDS_2E_Service_Write_Data(void) { if((UdsService.RequestFlg)&&(0x2E == UdsService.Id)) { UDS_Service_0x2E_Response(&TP_Buffer[1],TP_Rx_Index-1); UdsService.MultFrameComp=0; UdsService.RequestFlg=0; //memset(TP_Buffer,0x0,255); } } static void UDS_3E_Service_Tester_Present(void) { if((UdsService.RequestFlg)&&(0x3E == UdsService.Id)) { UDS_Service_0x3E_Response(&UdsService.ReqCmdBuf[0]); UdsService.RequestFlg=0; //memset(TP_Buffer,0x0,255); } } static void UDS_27_Service_Security_Access(void) { if((UdsService.RequestFlg)&&(0x27 == UdsService.Id)) { if (UDS_SERVICE_27_SEND_KEY != UdsService.ReqCmdBuf[0]) { UDS_Service_27(UDS_SERVICE_27_REQUEST_SEED,UdsService.ReqCmdBuf, UDS_SeedKeyBuf); UdsService.RequestFlg=0; //memset(TP_Buffer,0x0,255); } else if (UDS_SERVICE_27_SEND_KEY == UdsService.ReqCmdBuf[0]) { UDS_Service_27(UDS_SERVICE_27_SEND_KEY,UdsService.ReqCmdBuf,UDS_SeedKeyBuf); UdsService.RequestFlg=0; UdsService.MultFrameComp=0; memset(UDS_SeedKeyBuf,0x0,8); //memset(TP_Buffer,0x0,255); } } } //static void UDS_Demo_Service_Request_Seed(void) //{ // if((UdsService.RequestFlg)&&(0x27 == UdsService.Id)) { // UDS_Service_27(UDS_SERVICE_27_REQUEST_SEED,UdsService.ReqCmdBuf, UDS_SeedKeyBuf); // UdsService.RequestFlg=0; // //memset(TP_Buffer,0x0,255); // } //} // //static void UDS_Demo_Service_Send_Key(void) //{ // if((UdsService.RequestFlg)&&(0x27 == UdsService.Id)) { // UDS_Service_27(UDS_SERVICE_27_SEND_KEY,UdsService.ReqCmdBuf,UDS_SeedKeyBuf); // UdsService.RequestFlg=0; // UdsService.MultFrameComp=0; // memset(UDS_SeedKeyBuf,0x0,8); // //memset(TP_Buffer,0x0,255); // } //} static void UDS_31_Service_Routine_Ctrl(void) { if((UdsService.RequestFlg)&&(0x31 == UdsService.Id)) { UDS_Service_31(UdsService.ReqCmdBuf,3); UdsService.RequestFlg=0; memset(TP_Buffer,0x0,255); } } static void UDS_28_Service_Communication_Control(void) { if((UdsService.RequestFlg)&&(0x28 == UdsService.Id)) { #ifdef PRINT_LOG_INFO print_rx_data(0x28); #endif UDS_Service_28(UdsService.ReqCmdBuf,2); UdsService.RequestFlg=0; memset(TP_Buffer,0x0,255); } } //static void UDS_0x29_Service_Diag_Session(void) //{ // if((UdsService.RequestFlg)&&(0x29 == UdsService.Id)) { // UDS_Service_29(UdsService.ReqCmdBuf,1); // UdsService.RequestFlg=0; // memset(TP_Buffer,0x0,255); // } //} //static void UDS_20_Service_Diag_Session(void) //{ // if((UdsService.RequestFlg)&&(0x20 == UdsService.Id)) { // UDS_Service_20(UdsService.ReqCmdBuf,1); // UdsService.RequestFlg=0; // memset(TP_Buffer,0x0,255); // } //} static void UDS_85_Service_Control_DTC(void) { if((UdsService.RequestFlg)&&(0x85 == UdsService.Id)) { #ifdef PRINT_LOG_INFO print_rx_data(0x85); #endif UDS_Service_85(UdsService.ReqCmdBuf,1); UdsService.RequestFlg=0; memset(TP_Buffer,0x0,255); } } void GotoDefaultSession(void) { //INT8U Tmp[10]; static INT16U Timer1sCnt=0; static INT16U Timer10msCnt=0; //if(++Timer1sCnt >= 1000) if(++Timer10msCnt >= 10) { //Timer1sCnt=0; Timer10msCnt = 0; if (UdsService.SessionTimer < (UDS_S3Sever/10)) { UdsService.SessionTimer++; if (UdsService.SessionTimer == (UDS_S3Sever/10)) { UdsService.IsUdsFlg = false; if ((_UDS_EXT_SESSION == UdsService.SessionDiagModel)||(_UDS_PROGRAM_SESSION == UdsService.SessionDiagModel)) { UdsService.RequestFlg=0; UdsService.SessionDiagModel=_UDS_DEFAULT_SESSION; UdsService.SeedKeyIsOK=0; UdsService.AlreadSendSeed = false; UdsService.SessionTimer=0; UdsService.NcmDisRxAndTx = 0; UdsService.NmcmDisRxAndTx = 0; UdsService.DisDTCRecord=0; UdsService.ChkProgPreconditionFlg = false; if(true == UdsUpData.UpModleFlg ) { UdsUpData.CalcCrc=0; UdsUpData.UpModleFlg = false; //EEPROM_write(0,"APP2",4); //Tmp[0]=0x00; //Tmp[1]=0x00; //EEPROM_write(UDS_UPDATE_ADD,Tmp,2); } #if BOOTLOADER_CODE_FLAG == 0 IO_InputOutputRelease(); #else UdsService.ResetMcuFlg = true; //在扩展会话模式或编程会话模式下,S3 定时器超时会导致 ECU 重启 #endif } } } if (++Timer1sCnt < 100) return; Timer1sCnt = 0; if (UdsService.KeyErrLockTimer) { UdsService.KeyErrLockTimer--; if (UdsService.KeyErrLockTimer == 0) { if(true == UdsService.KeyLockFlg ) { UdsService.KeyLockFlg=false; if (UdsService.KeyErrCnt > 0) { UdsService.KeyErrCnt -= 1; } } } } if (UdsService.NcmDisRxAndTx) { udsInfo2Vehicle.NcmRxEnable = false; udsInfo2Vehicle.NcmTxEnable = false; } else { udsInfo2Vehicle.NcmRxEnable = true; udsInfo2Vehicle.NcmTxEnable = true; } if (UdsService.NmcmDisRxAndTx) { udsInfo2Vehicle.NmcmRxEnable = false; udsInfo2Vehicle.NmcmTxEnable = false; } else { udsInfo2Vehicle.NmcmRxEnable = true; udsInfo2Vehicle.NmcmTxEnable = true; } if (UdsService.IsUdsFlg) { udsInfo2Vehicle.UdsOffLine = false; } else { udsInfo2Vehicle.UdsOffLine = true; #if BOOTLOADER_CODE_FLAG == 0 IO_InputOutputRelease(); #endif } } return; } #if (BOOTLOADER_CODE_FLAG == 1) static void UDS_34_Service_Request_Download(void) { if((UdsService.RequestFlg)&&(0x34 == UdsService.Id)) { //UDS_Service_34(0,0x44,UDS_AddrBuf,UDS_LengthBuf); UDS_Service_34_Ack(&TP_Buffer[1],TP_Rx_Index-1); UdsService.RequestFlg=0; UdsService.Id=0; memset(TP_Buffer,0x0,255); } } /*! * @brief Demo Service Function to transfer data * This function is used to transfer data */ static void UDS_36_Service_Transfer_Data(void) { if((UdsService.RequestFlg)&&(0x36 == UdsService.Id)) { UDS_Service_36_Ack(UdsService.ReqCmdBuf,TP_Rx_Index-1); UdsService.RequestFlg=0; UdsService.Id=0; memset(TP_Buffer,0x0,TP_BUFFER_SIZE); } } /*! * @brief Demo Service Function to exit transfer * This function is used to exit transfer */ static void UDS_37_Service_Transfer_Exit(void) { if((UdsService.RequestFlg)&&(0x37 == UdsService.Id)) { UDS_Service_37(&TP_Buffer[1],TP_Rx_Index-1); UdsService.RequestFlg=0; UdsService.Id=0; } } #endif static void UDS_Service_NRC(void) { if(UdsService.RequestFlg) { UDS_Service_NonSupport_Response(UdsService.Id); UdsService.RequestFlg=0; UdsService.Id=0; memset(TP_Buffer,0x0,255); } } /*! * @brief Demo Service Function to start service sequencce * This function is used to start service sequencce */ void UDS_Demo_Services_Start(void) { //Service_Ctrl.index = 0; Service_Ctrl.start = true; UDS_Service_Init(); } /*! * @brief Demo Service Function to call the services in sequencce * This function is used to call the services in sequencce */ void UDS_Demo_Services_Sequence(void) { //the functioni will be called in 10ms task if(Service_Ctrl.start == true) { if(Service_Ctrl.index < SERVICE_SEQUENCE_NUM) { SERVICE_FUNC_T service = UDS_Demo_Service_Table[Service_Ctrl.index]; service(); } else { Service_Ctrl.start = false; } } } /*! * @brief Demo service function to calculate key according to seed. * The function is used to calculate key according to seed. * * @param rsp_buf Response buf pointer */ void UDS_Demo_Calculate_Key(uint8_t* rsp_buf) { //request seed, store seed UDS_SeedKeyBuf[0] = rsp_buf[2]; UDS_SeedKeyBuf[1] = rsp_buf[3]; //calculate key UDS_SeedKeyBuf[0] = UDS_SeedKeyBuf[0]+1; UDS_SeedKeyBuf[1] = UDS_SeedKeyBuf[1]+2; } /*! * @brief Demo Service Function for positive response callback * This function is used for positive response callback */ void UDS_Pos_Response_Callback(void) { Service_Ctrl.index++; } /*! * @brief Demo Service Function for negtive response callback * This function is used for negtive response callback */ void UDS_Neg_Response_Callback(void) { //Service_Ctrl.index = 0; Service_Ctrl.start = false; UDS_Service_Init(); } bool CheckIsBeyonSession(INT8U CurSession,INT8U SelfSession,INT8U Type) { bool bRst=false; if(Type) { if(CurSession!=SelfSession) bRst = true; else bRst = false; } else { if(CurSession == SelfSession) bRst = true; else bRst = false; } return bRst; } bool CheckUdsDlcIsOk(INT16U RxDlc,INT16U rDlc) { bool bRst=false; if( RxDlc == rDlc) bRst = true; return bRst; } bool CheckSubSidNeedPosResp(INT8U SubSID) { bool bRst=false; if(!(SubSID&0x80)) bRst = true; return bRst; } bool CheckIsKeyOk(void) { bool bRst=false; if(1==UdsService.SeedKeyIsOK) bRst = true; return bRst; } bool CheckIsSupportBootloaderRead_Sid22(uint16_t did) { bool cbRst=false; if (did == DIDId[TesterSerialNumber] \ || did == DIDId[ProgrammingDate] \ || did == DIDId[BootSoftware]) { cbRst = true; } return cbRst; } bool CheckIsSupportBootloaderWrite_Sid2E(uint16_t did) { bool cbRst=false; if (did == DIDId[TesterSerialNumber] \ || did == DIDId[ProgrammingDate]) { cbRst = true; } return cbRst; } bool CheckIsSupportAppWrite_Sid2E(uint16_t did) { bool cbRst=false; if (did == DIDId[TesterSerialNumber] \ || did == DIDId[ProgrammingDate] \ || did == DIDId[VehicleIdentificationNumber]) { cbRst = true; } return cbRst; } bool CheckIsSupportSubFunc_Sid19(uint8_t sub) { bool cbRst=false; if (sub == 0x01 || sub == 0x02 || sub == 0x04 || sub == 0x06 || sub == 0x0A) { cbRst = true; } return cbRst; } bool CheckIsSupportSubFunc_Sid11(uint8_t sub) { bool cbRst=false; if (sub == 0x01 || sub == 0x03) { cbRst = true; } return cbRst; }