454 lines
12 KiB
C
454 lines
12 KiB
C
#include "lin_cfg.h"
|
|
#include "diagnostic_service_slave.h"
|
|
#include "diagnostic_DID.h"
|
|
|
|
#include "DMK-BC316-77.h"
|
|
|
|
|
|
|
|
//extern byte LED_value;
|
|
const unsigned long serial_number = SERIAL_NUBER_INT; /* for read & write serial_number services */
|
|
const unsigned char io_control_status = IO_CONTROL_STATUS_INT; /* for read & set io */
|
|
const unsigned int session_control_P3 = SESSION_CONTROL_P3; /* for session control service */
|
|
const unsigned int session_control_P3Ex = SESSION_CONTROL_P3Ex; /* for session control service */
|
|
|
|
const unsigned char DtcStatusByte = DTCSTATUSBTYE_INT ; /* for fault memory */
|
|
const unsigned char DtcFormatIdentifier = DTCFORMATIDENTIFER_INT; /* for fault memory */
|
|
const unsigned char CountDtc = COUNTDTC_INT; /* for fault memory */
|
|
|
|
|
|
const TYPE_DIAGSERVICEARR DiagServiceCheckArr[DEF_DIAGSERVICE_COUNT]={
|
|
{DIAGSRV_READ_DATA_BY_IDENTIFIER_ORDER,&diagsrv_read_data_by_identifier},//22
|
|
{DIAGSRV_WRITE_DATA_BY_IDENTIFIER_ORDER,&diagsrv_write_data_by_identifier},//2E
|
|
{DIAGSRV_SESSION_CONTROL_ORDER,&diagsrv_session_control},//10
|
|
{DIAGSRV_TESTERPRESENT_ORDER,&diagsrv_tester_present},//3E
|
|
{DIAGSRV_ECURESET_ORDER,&diagsrv_ECU_reset},//00
|
|
{DIAGSRV_COMMUNICATIONCONTROL_ORDER,&diagsrv_communication_control},//28
|
|
{DIAGSRV_ROUTINECONTROL_ORDER,&diagsrv_routine_control},//31
|
|
{DIAGSRV_ASSIGN_FRAME_ID_RANGE_ORDER,&diagsrv_B7},//B7
|
|
};
|
|
/**/
|
|
volatile l_u8 master_req_dat[MASTER_REQ_LENGTH_MAX];
|
|
volatile l_u16 master_req_length;
|
|
|
|
volatile l_u8 slave_resp_dat[MASTER_REQ_LENGTH_MAX];
|
|
volatile l_u16 slave_resp_length;
|
|
|
|
l_u8 resetflag=0;
|
|
|
|
void diagsrv_routine_control(void)
|
|
{
|
|
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
|
|
if(master_req_length != 4)
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x13;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
else
|
|
{
|
|
if(master_req_dat[1] == 0x01)
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x31;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
else
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x12;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
}
|
|
|
|
/*clear diagnostic flag */
|
|
diag_clear_flag(DIAGSRV_ROUTINECONTROL_ORDER);
|
|
}
|
|
void diagsrv_communication_control(void)
|
|
{
|
|
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
|
|
if(master_req_length != 3)
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x13;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
else
|
|
{
|
|
if((master_req_dat[1]&0x7f) == 0x00 || (master_req_dat[1]&0x7f) == 0x01)
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = master_req_dat[0] + 0x40;
|
|
slave_resp_dat[1] = master_req_dat[1];
|
|
slave_resp_dat[2] = master_req_dat[2];
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
else
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x31;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
}
|
|
/*clear diagnostic flag */
|
|
diag_clear_flag(DIAGSRV_COMMUNICATIONCONTROL_ORDER);
|
|
}
|
|
void diagsrv_ECU_reset(void)
|
|
{
|
|
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
|
|
if(master_req_length != 2)
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x13;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
else
|
|
{
|
|
if(master_req_dat[1] == 0x01)
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x22;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
else
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x31;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
}
|
|
/*clear diagnostic flag */
|
|
diag_clear_flag(DIAGSRV_ECURESET_ORDER);
|
|
}
|
|
void diagsrv_tester_present(void)
|
|
{
|
|
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
|
|
if(master_req_length != 2)
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x13;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
else
|
|
{
|
|
if(master_req_dat[1] == 0x00)
|
|
{
|
|
slave_resp_length = 2;
|
|
slave_resp_dat[0] = master_req_dat[0] + 0x40;
|
|
slave_resp_dat[1] = master_req_dat[1];
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
else if(master_req_dat[1] == 0x80)
|
|
{
|
|
;//0x80ÎÞÏìÓ¦
|
|
}
|
|
else
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x31;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
}
|
|
|
|
|
|
/*clear diagnostic flag */
|
|
diag_clear_flag(DIAGSRV_TESTERPRESENT_ORDER);
|
|
}
|
|
|
|
void diagsrv_read_data_by_identifier(void)
|
|
{
|
|
/* Implement code of this service here */
|
|
unsigned char i;
|
|
unsigned int DID_id;
|
|
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
|
|
DID_id = master_req_dat[1];
|
|
DID_id <<= 8;
|
|
DID_id |= master_req_dat[2];
|
|
|
|
if(master_req_length != 3)
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x13;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
diag_clear_flag(DIAGSRV_READ_DATA_BY_IDENTIFIER_ORDER);
|
|
return;
|
|
}
|
|
|
|
for(i=0;i<DEF_DID_NUM;i++)
|
|
{
|
|
if(DID_CheckArr[i].DID_id == DID_id)
|
|
{
|
|
DID_CheckArr[i].DID_Func(DID_CheckArr[i].length,(unsigned char *)slave_resp_dat+3);
|
|
slave_resp_length = 3+DID_CheckArr[i].length;
|
|
slave_resp_dat[0] = master_req_dat[0] + 0x40;
|
|
slave_resp_dat[1] = master_req_dat[1];
|
|
slave_resp_dat[2] = master_req_dat[2];
|
|
break;
|
|
}
|
|
}
|
|
if(DEF_DID_NUM == i)
|
|
{
|
|
;/* ·ñ¶¨ÏìÓ¦£¬²»Ö§³ÖÏìÓ¦DID */
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x31;//·ñ¶¨ÏìÓ¦Âë
|
|
}
|
|
/* get data from queue to data */
|
|
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
/*clear diagnostic flag */
|
|
diag_clear_flag(DIAGSRV_READ_DATA_BY_IDENTIFIER_ORDER);
|
|
}
|
|
|
|
#ifdef DIAGSRV_WRITE_DATA_BY_IDENTIFIER_ORDER
|
|
void diagsrv_write_data_by_identifier(void)
|
|
{
|
|
unsigned char conf,i;
|
|
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
|
|
/* process data */
|
|
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x31;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
/*clear diagnostic flag */
|
|
diag_clear_flag(DIAGSRV_WRITE_DATA_BY_IDENTIFIER_ORDER);
|
|
}
|
|
#endif
|
|
|
|
void diagsrv_session_control(void)
|
|
{
|
|
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
|
|
if(master_req_length != 2)
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x13;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
else
|
|
{
|
|
if(master_req_dat[1] == 0x02)
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x22;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
else if(master_req_dat[1] == 0x03)
|
|
{
|
|
slave_resp_length = 6;
|
|
slave_resp_dat[0] = master_req_dat[0] + 0x40;
|
|
slave_resp_dat[1] = master_req_dat[1];
|
|
slave_resp_dat[2] = 0x00;
|
|
slave_resp_dat[3] = 0x32;
|
|
slave_resp_dat[4] = 0x27;
|
|
slave_resp_dat[5] = 0x10;
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
else if(master_req_dat[1] == 0x83)
|
|
{
|
|
;// 0x80 ÎÞÏìÓ¦
|
|
}
|
|
else
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x31;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
}
|
|
/*clear diagnostic flag */
|
|
diag_clear_flag(DIAGSRV_ECURESET_ORDER);
|
|
|
|
|
|
|
|
diag_clear_flag(DIAGSRV_SESSION_CONTROL_ORDER);
|
|
}
|
|
void diagsrv_io_control_by_identifier(void)
|
|
{
|
|
/* process recieved data from master request */
|
|
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
|
|
|
|
diag_clear_flag(DIAGSRV_IO_CONTROL_BY_IDENTIFIER_ORDER);
|
|
}
|
|
void diagsrv_fault_memory_read(void)
|
|
{
|
|
ld_receive_message((l_u16*)&master_req_length,(l_u8*)master_req_dat);
|
|
/* Implement code of this service here */
|
|
slave_resp_dat[0] = master_req_dat[0] + 0x40;
|
|
slave_resp_dat[1] = master_req_dat[1];
|
|
slave_resp_dat[2] = master_req_dat[2];
|
|
slave_resp_dat[3] = DtcStatusByte;
|
|
slave_resp_dat[4] = DtcFormatIdentifier;
|
|
slave_resp_dat[5] = CountDtc;
|
|
slave_resp_length = 0x06;
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length,(l_u8*)slave_resp_dat);
|
|
/*clear diagnostic flag */
|
|
lin_diag_services_flag[DIAGSRV_FAULT_MEMORY_READ_ORDER] = 0;
|
|
}
|
|
void diagsrv_fault_memory_clear(void)
|
|
{
|
|
ld_receive_message((l_u16*)&master_req_length,(l_u8*)master_req_dat);
|
|
/* Implement code of this service here */
|
|
slave_resp_dat[0] = master_req_dat[0] + 0x40;
|
|
slave_resp_dat[1] = master_req_dat[1];
|
|
slave_resp_dat[2] = master_req_dat[2];
|
|
slave_resp_length = 0x03;
|
|
/* Implement code of this service here */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
/*clear diagnostic flag */
|
|
diag_clear_flag(DIAGSRV_FAULT_MEMORY_CLEAR_ORDER);
|
|
//lin_diag_services_flag[DIAGSRV_FAULT_MEMORY_CLEAR_ORDER] = 0;
|
|
}
|
|
|
|
void diagsrv_B7(void)
|
|
{
|
|
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
|
|
|
|
if(master_req_length == 0x06)
|
|
{
|
|
slave_resp_length = 2;
|
|
slave_resp_dat[0] = master_req_dat[0] + 0x40;
|
|
slave_resp_dat[1] = master_req_dat[1];
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
else
|
|
{
|
|
slave_resp_length = 3;
|
|
slave_resp_dat[0] = 0x7F;
|
|
slave_resp_dat[1] = master_req_dat[0];
|
|
slave_resp_dat[2] = 0x13;//·ñ¶¨ÏìÓ¦Âë
|
|
/* send a message to master */
|
|
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
|
|
}
|
|
|
|
diag_clear_flag(DIAGSRV_ASSIGN_FRAME_ID_RANGE_ORDER);
|
|
}
|
|
|
|
void diagsrv_security_access(void)
|
|
{
|
|
|
|
}
|
|
void diagsrv_send_data(void)
|
|
{
|
|
ld_receive_message((l_u16*)&master_req_length,(l_u8*)master_req_dat);
|
|
|
|
}
|
|
void diagsrv_download_request(void)
|
|
{
|
|
|
|
}
|
|
|
|
//extern volatile l_signal_handle slave_signal_handle;
|
|
extern volatile l_u8* slave_sig_data;
|
|
extern volatile unsigned char sw_flag;
|
|
|
|
|
|
void slave_diagnostic_task()
|
|
{
|
|
unsigned char i = 0x00;
|
|
unsigned char data;
|
|
|
|
for (i = 0; i < DEF_DIAGSERVICE_COUNT; i++)
|
|
{
|
|
if (diag_get_flag(DiagServiceCheckArr[i].DiagServiceFlagOrder))
|
|
{
|
|
DiagServiceCheckArr[i].DiagServiceFunc();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void SoftwareRest(void)
|
|
{
|
|
CPMUARMCOP = 0xff;
|
|
while(1);
|
|
}
|
|
|
|
void slave_diagnostic_init(void)
|
|
{
|
|
;
|
|
|
|
}
|
|
|
|
void SaveArray_LINResp(unsigned char * buf)
|
|
{
|
|
unsigned char i;
|
|
|
|
}
|
|
void ReadArray_LINResp(unsigned char * buf)
|
|
{
|
|
unsigned char i;
|
|
}
|
|
|
|
|
|
|
|
void SetConfiguration(unsigned char conf)
|
|
{
|
|
|
|
}
|
|
|
|
void resetDetect(void)
|
|
{
|
|
static resetcnt;
|
|
if(resetflag == 1)
|
|
{
|
|
resetcnt++;
|
|
if(resetcnt>10)
|
|
SoftwareRest();
|
|
}
|
|
else
|
|
{
|
|
resetcnt=0;
|
|
}
|
|
}
|