#include <string.h>
#include "stm32f4xx_rtc.h"
#include "UDS_Download.h"
#include "bsp.h"
#include "spi_nand.h"
#include "WRlog.h"
#include "md5.h"
#include "Global.h"
u8 uds_window_checkupdate = 0;
u8 uds_Window_timer_ok_flag = DISABLE;
u8 uds_WindowOver_timer_ok_flag = DISABLE;
u8 S3_server_timer_ok_flag = DISABLE;
u8 command_strengthen_timer_ok_flag = DISABLE;
u8 safe_access_timer_ok_flag = DISABLE;
u8 STmin_timer_ok_flag = DISABLE;
u8 STmin_timer_ok_zero = DISABLE;
CanTxMsg UDS_Txmsgt;
//UDS数据收发服务变量
u16 UDSCommandLen = 0; //命令总长度
u16 UDSCommandSurplusLen = 0; //命令剩余长度
u16 UDSResponseLen = 0; //命令返回长度
u16 UDSResponseStayLen = 0; //命令等待返回长度
u8 UDSFrameNub = 0; //帧序号
u8 UDS_STmin = 0; //流控时间
u8 UDS_BlockSize = 0; //流控块大小
u8 UDS_BS_Flag = DISABLE;
u8 UDS_functional_buf[4096];
u8 UDS_UpdateData_buf[2048];
//UDS命令诊断服务变量
u16 UDS_diagnose_pattern; //诊断回话状态,1为默认会话状态,2为编程会话状态,3为扩展会话状态
u8 UDS_Safe_access_one; //0为level1锁定,1为level1解锁
u8 UDS_Safe_access_two; //0为level2锁定,1为level2解锁
u8 UDS_Safe_access_flow; //0为未获取种子,1为已获取种子状态
u8 Update_Tcv;
u32 Block_Count = 0;
u32 Stream_Count = 0;
u8 STREAM_CONTROL_UPDATESTmin = 5;
u8 xor_key_tempbuf[4]; //安全访问临时种子缓冲区
OS_TMR uds_Window_timer1; //时间窗口定时器
OS_TMR uds_WindowOver_timer2; //窗口超时计时器
OS_TMR uds_S3_server_timer6; //S3定时器
OS_TMR uds_command_strengthen_timer7; //增强型定时器
OS_TMR uds_safe_access_timer8; //安全访问定时器
OS_TMR uds_STmin_timer9; //流控定时器
//CAN接收
CanRxMsg UDS_rxmsg[CANRXBUFSIZE];
u32 UDS_Can_rx_Pop;
u32 UDS_Can_rx_Tail;
u32 UDS_Can_rx_Len;
void UDS_Init(void);
/**
* @brief This function handles CAN1 interrupt request.
* @param None
* @retval None
*/
void CAN1_RX0_IRQHandler(void)
{
//循环队列已满 不应该发生
if(UDS_Can_rx_Len>(CANRXBUFSIZE-1))
{
//数据入列
CAN_Receive(CAN1, CAN_FIFO0, &(UDS_rxmsg[UDS_Can_rx_Tail]));
return;
}
//数据入列
CAN_Receive(CAN1, CAN_FIFO0, &(UDS_rxmsg[UDS_Can_rx_Tail]));
if((ENABLE==uds_Window_timer1.State)&&((UDS_rxmsg[UDS_Can_rx_Tail].StdId == UDSONCAN_FUNCTIONAL_ADDR)||(UDS_rxmsg[UDS_Can_rx_Tail].StdId == UDSONCAN_TBOX_ADDR)||(UDS_rxmsg[UDS_Can_rx_Tail].StdId == UDSONCAN_PHYSICAL_ADDR))&&(UDS_rxmsg[UDS_Can_rx_Tail].IDE == CAN_Id_Standard))
{
if((UDS_rxmsg[UDS_Can_rx_Tail].Data[0] == 0x03)&&\
(UDS_rxmsg[UDS_Can_rx_Tail].Data[1] == 0x22)&&\
(UDS_rxmsg[UDS_Can_rx_Tail].Data[2] == 0x13)&&\
(UDS_rxmsg[UDS_Can_rx_Tail].Data[3] == 0x16))
{
uds_window_checkupdate = ENABLE;
}
}
UDS_Can_rx_Tail++;
//调整尾指针
UDS_Can_rx_Tail = UDS_Can_rx_Tail % CANRXBUFSIZE;
//调整长度
UDS_Can_rx_Len++;
}
/**
* @brief This function handles CAN2 RX0 interrupts.
* @param None
* @retval None
*/
void CAN2_RX1_IRQHandler(void)
{
//循环队列已满 不应该发生
if(UDS_Can_rx_Len>(CANRXBUFSIZE-1))
{
//数据入列
CAN_Receive(CAN2, CAN_FIFO1, &(UDS_rxmsg[UDS_Can_rx_Tail]));
return;
}
//数据入列
CAN_Receive(CAN2, CAN_FIFO1, &(UDS_rxmsg[UDS_Can_rx_Tail]));
if((ENABLE==uds_Window_timer1.State)&&((UDS_rxmsg[UDS_Can_rx_Tail].StdId == UDSONCAN_FUNCTIONAL_ADDR)||(UDS_rxmsg[UDS_Can_rx_Tail].StdId == UDSONCAN_PHYSICAL_ADDR)||(UDS_rxmsg[UDS_Can_rx_Tail].StdId == UDSONCAN_TBOX_ADDR))&&(UDS_rxmsg[UDS_Can_rx_Tail].IDE == CAN_Id_Standard))
{
if((UDS_rxmsg[UDS_Can_rx_Tail].Data[0] == 0x03)&&\
(UDS_rxmsg[UDS_Can_rx_Tail].Data[1] == 0x22)&&\
(UDS_rxmsg[UDS_Can_rx_Tail].Data[2] == 0x13)&&\
(UDS_rxmsg[UDS_Can_rx_Tail].Data[3] == 0x16))
{
uds_window_checkupdate = ENABLE;
}
}
UDS_Can_rx_Tail++;
//调整尾指针
UDS_Can_rx_Tail = UDS_Can_rx_Tail % CANRXBUFSIZE;
//调整长度;
UDS_Can_rx_Len++;
}
//ucos系统的timer输出
void ucos_timerdeal (void *p_tmr, void *p_arg)
{
*((u8 *)p_arg )= 1;
return;
}
void OSTmrDel (OS_TMR *p_tmr,
OS_ERR *p_err)
{
p_tmr->State = 0;
return;
}
void OSTmrCreate (OS_TMR *p_tmr,
char *p_name,
u32 dly,
u32 period,
u32 opt,
OS_TMR_CALLBACK_PTR p_callback,
u8 *p_callback_arg,
OS_ERR *p_err)
{
p_tmr->NamePtr = p_name;
if(dly)
p_tmr->Dly = dly;
else
p_tmr->Dly = 1;
p_tmr->Period = period;
p_tmr->Opt = opt;
p_tmr->CallbackPtr = p_callback;
p_tmr->CallbackPtrArg = p_callback_arg;
p_tmr->Match = 0;
p_tmr->Remain = 0;
p_tmr->State = 0;
return;
}
void OSTmrStart (OS_TMR *p_tmr,
OS_ERR *p_err)
{
p_tmr->State = 1;
return;
}
/**
* @brief This function is location update UDS_Download.
* @param None
* @retval None
*/
void UDS_Download(void)
{
OS_ERR err;
UDS_Init();
//如果没有本地升级和checkfail的标记,则判断时间窗口内是否有请求升级的CAN帧
if((bootpSectionInfoWrite.UDS_DoUpdateFlag != 2)&&(App_Check_Fail != 1))
{
uds_Window_timer_ok_flag = DISABLE;
OSTmrCreate(&uds_Window_timer1,"lk1tr",UDSONCAN_WINDOW_OVERTIME,UDSONCAN_WINDOW_OVERTIME,OS_OPT_TMR_ONE_SHOT,ucos_timerdeal,&uds_Window_timer_ok_flag,&err);
OSTmrStart(&uds_Window_timer1,&err);
while((ENABLE != uds_Window_timer_ok_flag)&&(ENABLE != uds_window_checkupdate));
}
//App安全校验不过,或者要求进行本地升级,或者在时间窗口内收到升级标记
while((bootpSectionInfoWrite.UDS_DoUpdateFlag == 2)||(App_Check_Fail == 1)||(ENABLE == uds_window_checkupdate))
{
IWDG_ReloadCounter();
UDS_Diagnosis_server();
//离线恢复
if(CAN_GetFlagStatus(CAN1, CAN_FLAG_BOF))
{
BSP_CAN_Init(CAN1_ID,CAN1_BAUDRATE);
}
else if(CAN_GetFlagStatus(CAN2, CAN_FLAG_BOF))
{
BSP_CAN_Init(CAN2_ID,CAN2_BAUDRATE);
}
if((ENABLE==uds_WindowOver_timer_ok_flag)&&(App_Check_Fail != 1))
{
break;
}
}
}
/**
* @brief 用于初始化UDS所有变量
* @param None
* @retval None
*/
void UDS_Init(void)
{
OS_ERR err;
//UDS发送变量初始化
UDS_Txmsgt.StdId = UDSONCAN_TBOX_ADDR;
UDS_Txmsgt.DLC = UDSONCAN_FRAME_LEN;
//UDS服务变量初始化
UDS_Safe_access_one = 0;
if(bootpSectionInfoWrite.UDS_DoUpdateFlag == 2)
{
UDS_diagnose_pattern = UDSONCAN_Programming;
UDS_Safe_access_two = 1;
Update_Tcv = 1;
}
else
{
UDS_diagnose_pattern = UDSONCAN_Default;
UDS_Safe_access_two = 0;
Update_Tcv = 0;
}
UDS_Safe_access_flow = 0;
//UDS计算当前blocksize的长度
if(bootpSectionInfoWrite.UDS_DoUpdateFlag == 2)
{
if(bootpSectionInfoWrite.UDS_Tsv_Len%UPDATE_BLOCK_SIZE)
Block_Count = bootpSectionInfoWrite.UDS_Tsv_Len/UPDATE_BLOCK_SIZE + 1;
else
Block_Count = bootpSectionInfoWrite.UDS_Tsv_Len/UPDATE_BLOCK_SIZE;
}
uds_WindowOver_timer_ok_flag = DISABLE;
OSTmrCreate(&uds_WindowOver_timer2,"lk2tr",UDSONCAN_WINDOWOVER_OVERTIME,UDSONCAN_WINDOWOVER_OVERTIME,OS_OPT_TMR_ONE_SHOT,ucos_timerdeal,&uds_WindowOver_timer_ok_flag,&err);
OSTmrStart(&uds_WindowOver_timer2,&err);
return;
}
/**
* @brief 用于诊断命令解析、服务、反馈数据
* @param None
* @retval None
*/
void UDS_Diagnosis_server(void)
{
OS_ERR err;
u8 UDS_data_type;
//S3定时器超时判断
if(ENABLE==S3_server_timer_ok_flag)
{
OSTmrDel(&uds_S3_server_timer6, &err);
S3_server_timer_ok_flag=DISABLE;
UDS_diagnose_pattern = UDSONCAN_Default;
//安全访问权限关闭
UDS_Safe_access_one = 0;
UDS_Safe_access_two = 0;
UDS_Safe_access_flow = 0;
}
//安全访问定时器判断
if(ENABLE==safe_access_timer_ok_flag)
{
OSTmrDel(&uds_safe_access_ti