1.5wuling_zhuanjietou/UDS/uds_interface.c

540 lines
14 KiB
C
Raw Normal View History

2024-10-17 01:06:51 +00:00
/*!
* @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; //<2F><><EFBFBD><EFBFBD>չ<EFBFBD>Ựģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>̻Ựģʽ<C4A3>£<EFBFBD>S3 <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E1B5BC> ECU <20><><EFBFBD><EFBFBD>
#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;
}