|
|
@@ -5,14 +5,15 @@
|
|
|
#include "fs/diskio.h"
|
|
|
#include <string.h>
|
|
|
|
|
|
-#ifdef CAN_UPDATE
|
|
|
#include "mailbox_message.h"
|
|
|
#include "update.h"
|
|
|
|
|
|
extern int UsbHostInit(void);
|
|
|
+extern void WDT_McuReboot(void);
|
|
|
|
|
|
CanPort_t *ecu_cap = NULL;
|
|
|
CanPort_t *host_cap = NULL;
|
|
|
+static u8 reboot_flg = 0;
|
|
|
|
|
|
static void can_ecudemo_thread(void *pvParameters)
|
|
|
{
|
|
|
@@ -158,6 +159,9 @@ static void can_hostdemo_thread(FIL *fp,u32 filetype,u32 upfileSize)
|
|
|
break;
|
|
|
}
|
|
|
printf("bsc=%d \n", bsc-1);
|
|
|
+ checksum = xcrc32(&pPacketData[1], sendsize, checksum, HARD_CALC_CRC);
|
|
|
+
|
|
|
+ //printf("bsc=%d,checksum = 0x%x \n", bsc-1, checksum);
|
|
|
if(!CAN_UDS_RequestService(0x36, pPacketData, sendsize + 1, &rspData, &rspLen))
|
|
|
break;
|
|
|
|
|
|
@@ -169,6 +173,9 @@ static void can_hostdemo_thread(FIL *fp,u32 filetype,u32 upfileSize)
|
|
|
if (!CAN_UDS_RequestService(0x37, param, 0, &rspData, &rspLen))
|
|
|
goto exit;
|
|
|
|
|
|
+ if (rspLen >= 1 && rspData[0]) {
|
|
|
+ reboot_flg = 1;
|
|
|
+ }
|
|
|
//0x31: 例程控制
|
|
|
//0x01: 启动例程
|
|
|
//0x02 0x02: 例程RID: 检查APP存储区所有数据是否正确
|
|
|
@@ -182,6 +189,14 @@ static void can_hostdemo_thread(FIL *fp,u32 filetype,u32 upfileSize)
|
|
|
plen = 7;
|
|
|
if (!CAN_UDS_RequestService(0x31, param, plen, &rspData, &rspLen))
|
|
|
goto exit;
|
|
|
+ if (filetype == UPFILE_TYPE_MCU_IMAGE || filetype == UPFILE_TYPE_MCU_FB) {
|
|
|
+ if (rspLen >= 4 && !rspData[4]) {
|
|
|
+ printf("Checksum ok\r\n");
|
|
|
+ } else {
|
|
|
+ printf("Checksum fail\r\n");
|
|
|
+ goto exit;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
//0x31: 例程控制
|
|
|
//0x01: 启动例程
|
|
|
@@ -192,11 +207,14 @@ static void can_hostdemo_thread(FIL *fp,u32 filetype,u32 upfileSize)
|
|
|
plen = 3;
|
|
|
if (!CAN_UDS_RequestService(0x31, param, plen, &rspData, &rspLen))
|
|
|
goto exit;
|
|
|
- if (rspLen >= 4 && rspData[3]) {
|
|
|
- printf("Check Programming Dependencies response ok\r\n");
|
|
|
- } else {
|
|
|
- printf("Check Programming Dependencies response fail\r\n");
|
|
|
- goto exit;
|
|
|
+ if (filetype == UPFILE_TYPE_MCU_IMAGE || filetype == UPFILE_TYPE_MCU_FB) {
|
|
|
+ if (rspLen >= 4 && rspData[4]) {
|
|
|
+ reboot_flg = 1;
|
|
|
+ printf("Check Programming Dependencies response ok\r\n");
|
|
|
+ } else {
|
|
|
+ printf("Check Programming Dependencies response fail\r\n");
|
|
|
+ goto exit;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//0x11: ECU复位
|
|
|
@@ -267,7 +285,7 @@ static void update_from_can(void *pvParameters)
|
|
|
goto exit;
|
|
|
}
|
|
|
|
|
|
- for(int i = UPFILE_TYPE_LDR; i < UPFILE_TYPE_MCU_IMAGE; i++){
|
|
|
+ for(int i = UPFILE_TYPE_LDR; i < UPFILE_TYPE_NUM; i++){
|
|
|
sprintf(filename, "%s%s", DRVPATH(DRV_USB), g_upfilename[i]);
|
|
|
fret = f_open(&fp, filename, FA_OPEN_EXISTING | FA_READ);
|
|
|
if(fret != FR_OK) {
|
|
|
@@ -285,6 +303,8 @@ static void update_from_can(void *pvParameters)
|
|
|
can_hostdemo_thread(&fp,i,upfileSize);
|
|
|
}
|
|
|
|
|
|
+ if (reboot_flg)
|
|
|
+ WDT_McuReboot();
|
|
|
exit:
|
|
|
printf("udate from can finish! \n");
|
|
|
vTaskDelay(portMAX_DELAY);
|
|
|
@@ -364,345 +384,3 @@ int can_host_demo(void)
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
-
|
|
|
-#else
|
|
|
-extern int UsbHostInit(void);
|
|
|
-
|
|
|
-CanPort_t *ecu_cap = NULL;
|
|
|
-CanPort_t *host_cap = NULL;
|
|
|
-
|
|
|
-static void can_ecudemo_thread(void *pvParameters)
|
|
|
-{
|
|
|
- for (;;) {
|
|
|
- CanMsg rxmsg[8] = {0};
|
|
|
- int revlen;
|
|
|
- int i;
|
|
|
-
|
|
|
- if ((revlen = iCanRead(ecu_cap, rxmsg, 8, pdMS_TO_TICKS(10))) > 0) {
|
|
|
- for (i = 0; i < revlen; i++) {
|
|
|
- if (rxmsg[i].StdId == PHY_ADDR_ID) {
|
|
|
- CAN_UDS_Process(rxmsg[i].Data, rxmsg[i].DLC);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-static void can_hostdemo_thread(void *pvParameters)
|
|
|
-{
|
|
|
- uint8_t param[16];
|
|
|
- uint32_t plen;
|
|
|
- uint8_t *rspData;
|
|
|
- uint32_t rspLen;
|
|
|
- uint32_t upfileSize = 96 * 1024;
|
|
|
- uint32_t packetSize;
|
|
|
- uint8_t *pPacketData = NULL;
|
|
|
- uint32_t leftsize;
|
|
|
- uint32_t sendsize;
|
|
|
- uint32_t bsc = 1;
|
|
|
- uint32_t checksum = 0xffffffff;
|
|
|
- FRESULT fret;
|
|
|
- FIL fp = {0};
|
|
|
- UINT size;
|
|
|
- FILINFO fileinfo = {0};
|
|
|
- FATFS fs;
|
|
|
-
|
|
|
- //0x10: 会话控制
|
|
|
- //0x03: 切换到扩展会话
|
|
|
- param[0] = 0x03;
|
|
|
- plen = 1;
|
|
|
- if (!CAN_UDS_RequestService(0x10, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
-
|
|
|
- //0x31: 例程控制
|
|
|
- //0x01: 启动例程
|
|
|
- //0x02 0x03: 例程RID:检查刷写条件
|
|
|
- param[0] = 0x01;
|
|
|
- param[1] = 0x02;
|
|
|
- param[2] = 0x03;
|
|
|
- plen = 3;
|
|
|
- if (!CAN_UDS_RequestService(0x31, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
-
|
|
|
- //0x85: 故障码控制设置
|
|
|
- //0x02: 停止故障码存储
|
|
|
- param[0] = 0x02;
|
|
|
- plen = 1;
|
|
|
- if (!CAN_UDS_RequestService(0x85, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
-
|
|
|
- //0x28: 通讯控制
|
|
|
- //0x03: 停止发送报文、接收报文
|
|
|
- //0x03: 应用与网络报文
|
|
|
- param[0] = 0x03;
|
|
|
- param[1] = 0x03;
|
|
|
- plen = 2;
|
|
|
- if (!CAN_UDS_RequestService(0x28, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
-
|
|
|
- //0x10: 会话控制
|
|
|
- //0x02: 切换到编程会话
|
|
|
- param[0] = 0x02;
|
|
|
- plen = 1;
|
|
|
- if (!CAN_UDS_RequestService(0x10, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
-
|
|
|
- //0x27: 安全访问
|
|
|
- //0x01: 请求种子
|
|
|
- param[0] = 0x01;
|
|
|
- plen = 1;
|
|
|
- if (!CAN_UDS_RequestService(0x27, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
-
|
|
|
- //0x27: 安全访问
|
|
|
- //0x02: 发送与验证key
|
|
|
- //4字节key由上面获取到的种子计算生成
|
|
|
- param[0] = 0x02;
|
|
|
- param[1] = ~rspData[2];
|
|
|
- param[2] = ~rspData[3];
|
|
|
- param[3] = ~rspData[4];
|
|
|
- param[4] = ~rspData[5];
|
|
|
- plen = 5;
|
|
|
- if (!CAN_UDS_RequestService(0x27, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
-
|
|
|
- //0x31: 例程控制
|
|
|
- //0x01: 启动例程
|
|
|
- //0xFF 0x00: 例程RID:擦除代码存储区数据
|
|
|
- param[0] = 0x01;
|
|
|
- param[1] = 0xFF;
|
|
|
- param[2] = 0x00;
|
|
|
- plen = 3;
|
|
|
- if (!CAN_UDS_RequestService(0x31, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
-
|
|
|
- if (UsbHostInit() < 0) {
|
|
|
- printf("UsbHostInit fail\n");
|
|
|
- goto exit;
|
|
|
- }
|
|
|
-
|
|
|
- fret = f_mount(&fs, DRVPATH(DRV_USB), 0);
|
|
|
- if(fret == FR_OK) {
|
|
|
- printf("Mount file ok\n");
|
|
|
- } else {
|
|
|
- printf("Mount file fail\n");
|
|
|
- goto exit;
|
|
|
- }
|
|
|
-
|
|
|
- fret = f_open(&fp, DRVPATH(DRV_USB)"image.bin", FA_OPEN_EXISTING | FA_READ);
|
|
|
- if(fret != FR_OK) {
|
|
|
- printf("Open file fail\n");
|
|
|
- goto exit;
|
|
|
- }
|
|
|
-
|
|
|
- fret = f_stat(DRVPATH(DRV_USB)"image.bin", &fileinfo);
|
|
|
- if (fret != FR_OK) {
|
|
|
- printf("Get file info fail\n");
|
|
|
- goto exit;
|
|
|
- }
|
|
|
- upfileSize = fileinfo.fsize;
|
|
|
-
|
|
|
- //0x34: 请求下载
|
|
|
- //0x00: 不采用压缩算法和加密算法
|
|
|
- //0x04: 地址为0个字节,长度为4个字节
|
|
|
- //4个字节长度
|
|
|
- param[0] = 0x00;
|
|
|
- param[1] = 0x04;
|
|
|
- param[2] = (upfileSize >> 24) & 0xff;
|
|
|
- param[3] = (upfileSize >> 16) & 0xff;
|
|
|
- param[4] = (upfileSize >> 8) & 0xff;
|
|
|
- param[5] = upfileSize & 0xff;
|
|
|
- plen = 6;
|
|
|
- if (!CAN_UDS_RequestService(0x34, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
- if ((rspData[1] >> 4) == 2 && rspLen >= 4)
|
|
|
- packetSize = (rspData[2] << 8) | rspData[3];
|
|
|
- else if ((rspData[1] >> 4) == 4 && rspLen >= 6)
|
|
|
- packetSize = (rspData[2] << 24) | (rspData[3] << 16)
|
|
|
- | (rspData[4] << 8) | rspData[5];
|
|
|
- printf("Respond packet_size is %d.\n", packetSize);
|
|
|
-
|
|
|
- pPacketData = pvPortMalloc(packetSize);
|
|
|
- if (!pPacketData) {
|
|
|
- printf("No enough memory to alloc for pPacketData.\n");
|
|
|
- goto exit;
|
|
|
- }
|
|
|
-
|
|
|
- //0x36: 传输数据
|
|
|
- //0xXX: 块序号
|
|
|
- //packetSize - 2字节的数据
|
|
|
- leftsize = upfileSize;
|
|
|
- packetSize -= 2; //除去SID和BSC
|
|
|
- while (leftsize) {
|
|
|
- sendsize = leftsize > packetSize ? packetSize : leftsize;
|
|
|
- pPacketData[0] = bsc++;
|
|
|
- fret = f_read(&fp, &pPacketData[1], sendsize, &size);
|
|
|
- if(fret != FR_OK) {
|
|
|
- printf("Read file fail! fret=%d\n", fret);
|
|
|
- f_close(&fp);
|
|
|
- goto exit;
|
|
|
- }
|
|
|
- checksum = xcrc32(&pPacketData[1], sendsize, checksum, HARD_CALC_CRC);
|
|
|
- printf("bsc=%d, checksum=%08X\n", bsc-1, checksum);
|
|
|
- if (!CAN_UDS_RequestService(0x36, pPacketData, sendsize + 1, &rspData, &rspLen)) {
|
|
|
- f_close(&fp);
|
|
|
- goto exit;
|
|
|
- }
|
|
|
- leftsize -= sendsize;
|
|
|
- }
|
|
|
- f_close(&fp);
|
|
|
-
|
|
|
- //0x37: 请求传输退出
|
|
|
- if (!CAN_UDS_RequestService(0x37, param, 0, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
-
|
|
|
- //0x31: 例程控制
|
|
|
- //0x01: 启动例程
|
|
|
- //0x02 0x02: 例程RID: 检查APP存储区所有数据是否正确
|
|
|
- param[0] = 0x01;
|
|
|
- param[1] = 0x02;
|
|
|
- param[2] = 0x02;
|
|
|
- param[3] = (checksum >> 24) & 0xff;
|
|
|
- param[4] = (checksum >> 16) & 0xff;
|
|
|
- param[5] = (checksum >> 8) & 0xff;
|
|
|
- param[6] = checksum & 0xff;
|
|
|
- plen = 7;
|
|
|
- if (!CAN_UDS_RequestService(0x31, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
-
|
|
|
- //0x31: 例程控制
|
|
|
- //0x01: 启动例程
|
|
|
- //0xFF 0x01: 例程RID: 检查编程依赖性
|
|
|
- param[0] = 0x01;
|
|
|
- param[1] = 0xFF;
|
|
|
- param[2] = 0x01;
|
|
|
- plen = 3;
|
|
|
- if (!CAN_UDS_RequestService(0x31, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
- if (rspLen >= 4 && rspData[3]) {
|
|
|
- printf("Check Programming Dependencies response ok\r\n");
|
|
|
- } else {
|
|
|
- printf("Check Programming Dependencies response fail\r\n");
|
|
|
- goto exit;
|
|
|
- }
|
|
|
-
|
|
|
- //0x11: ECU复位
|
|
|
- //0x01: 硬件复位
|
|
|
- param[0] = 0x01;
|
|
|
- plen = 1;
|
|
|
- if (!CAN_UDS_RequestService(0x11, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
-
|
|
|
- vTaskDelay(pdMS_TO_TICKS(3000));
|
|
|
-
|
|
|
- //0x10: 会话控制
|
|
|
- //0x03: 扩展会话
|
|
|
- param[0] = 0x03;
|
|
|
- plen = 1;
|
|
|
- if (!CAN_UDS_RequestService(0x10, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
-
|
|
|
- //0x28: 通讯控制
|
|
|
- //0x00: 允许发送报文、接收报文
|
|
|
- //0x03: 应用与网络报文
|
|
|
- param[0] = 0x00;
|
|
|
- param[1] = 0x03;
|
|
|
- plen = 2;
|
|
|
- if (!CAN_UDS_RequestService(0x28, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
-
|
|
|
- //0x85: 故障码控制设置
|
|
|
- //0x01: 启用故障码存储
|
|
|
- param[0] = 0x01;
|
|
|
- plen = 1;
|
|
|
- if (!CAN_UDS_RequestService(0x85, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
-
|
|
|
- //0x10: 会话控制
|
|
|
- //0x01: 默认会话
|
|
|
- param[0] = 0x01;
|
|
|
- plen = 1;
|
|
|
- if (!CAN_UDS_RequestService(0x10, param, plen, &rspData, &rspLen))
|
|
|
- goto exit;
|
|
|
-
|
|
|
-exit:
|
|
|
- printf("update is finished!\n");
|
|
|
- if (pPacketData)
|
|
|
- vPortFree(pPacketData);
|
|
|
- vTaskDelete(NULL);
|
|
|
-}
|
|
|
-
|
|
|
-int can_ecu_demo(void)
|
|
|
-{
|
|
|
- CanPort_t *cap = xCanOpen(CAN_ID0);
|
|
|
- CanTimInit_t CanTimInit;
|
|
|
-
|
|
|
- if (!cap) {
|
|
|
- printf("open can %d fail.\n", CAN_ID0);
|
|
|
- vTaskDelete(NULL);
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- CanTimInit.Bps = CAN500kBaud;
|
|
|
- CanTimInit.DatBps = CANFD1MBaud;
|
|
|
- CanTimInit.tdc_en = 0;
|
|
|
- CanTimInit.sspoff = 0;
|
|
|
- CanTimInit.t_presc = 0;
|
|
|
- vCanInit(cap, &CanTimInit, CAN_MODE_NORMAL, 0);
|
|
|
-
|
|
|
- CAN_FilterInitTypeDef canfilter;
|
|
|
- canfilter.IDE_M = STD_OR_EXT;
|
|
|
- canfilter.ID = PHY_ADDR_ID;
|
|
|
- canfilter.IDMASK = 0x0;
|
|
|
- canfilter.FILTERx = 0;
|
|
|
- vCanSetFilter(cap, canfilter);
|
|
|
-
|
|
|
- ecu_cap = cap;
|
|
|
-
|
|
|
- /* 创建ECU工作线程 */
|
|
|
- if (xTaskCreate(can_ecudemo_thread, "canecu", 1024, NULL,
|
|
|
- (tskIDLE_PRIORITY + 1) | portPRIVILEGE_BIT, NULL) != pdPASS) {
|
|
|
- printf("create can hostdemo task fail.\n");
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-int can_host_demo(void)
|
|
|
-{
|
|
|
- CanPort_t *cap = xCanOpen(CAN_ID1);
|
|
|
- CanTimInit_t CanTimInit;
|
|
|
-
|
|
|
- if (!cap) {
|
|
|
- printf("open can %d fail.\n", CAN_ID1);
|
|
|
- vTaskDelete(NULL);
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- CanTimInit.Bps = CAN500kBaud;
|
|
|
- CanTimInit.DatBps = CANFD1MBaud;
|
|
|
- CanTimInit.tdc_en = 0;
|
|
|
- CanTimInit.sspoff = 0;
|
|
|
- CanTimInit.t_presc = 0;
|
|
|
- vCanInit(cap, &CanTimInit, CAN_MODE_NORMAL, 0);
|
|
|
-
|
|
|
- CAN_FilterInitTypeDef canfilter;
|
|
|
- canfilter.IDE_M = STD_OR_EXT;
|
|
|
- canfilter.ID = RSP_ADDR_ID;
|
|
|
- canfilter.IDMASK = 0x0;
|
|
|
- canfilter.FILTERx = 0;
|
|
|
- vCanSetFilter(cap, canfilter);
|
|
|
-
|
|
|
- host_cap = cap;
|
|
|
-
|
|
|
- /* 创建上位机工作线程 */
|
|
|
- if (xTaskCreate(can_hostdemo_thread, "canhost", 1024, NULL,
|
|
|
- (tskIDLE_PRIORITY + 1) | portPRIVILEGE_BIT, NULL) != pdPASS) {
|
|
|
- printf("create can hostdemo task fail.\n");
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-#endif
|