| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384 |
- #include <stdio.h>
- #include "amt630hv160_lib.h"
- #include "can_uds.h"
- #include "fs/ff.h"
- #include "fs/diskio.h"
- #include <string.h>
- #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)
- {
- 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(FIL *fp,u32 filetype,u32 upfileSize)
- {
- uint8_t param[16];
- uint32_t plen;
- uint8_t *rspData;
- uint32_t rspLen;
- uint32_t packetSize;
- uint8_t *pPacketData = NULL;
- uint32_t leftsize;
- uint32_t sendsize;
- uint32_t bsc = 1;
- uint32_t checksum = 0xffffffff;
- UINT size;
- FRESULT fret;
- //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;
- //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;
- param[6] = filetype;
- plen = 7;
- 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和filetype
- 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);
- 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;
- leftsize -= sendsize;
- }
- //0x37: 请求传输退出
- 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存储区所有数据是否正确
- 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;
- 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: 启动例程
- //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 (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复位
- //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:
- if (pPacketData)
- vPortFree(pPacketData);
- f_close(fp);
- }
- static void update_from_can(void *pvParameters)
- {
- FRESULT fret;
- FILINFO fileinfo = {0};
- FATFS fs;
- uint32_t upfileSize;
- FIL fp = {0};
- char filename[32];
- 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;
- }
- 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) {
- //printf("Open file fail %s\n", filename);
- continue;
- }
- fret = f_stat(filename, &fileinfo);
- if (fret != FR_OK) {
- printf("Get file info fail\n");
- goto exit;
- }
- upfileSize = fileinfo.fsize;
- can_hostdemo_thread(&fp,i,upfileSize);
- }
- if (reboot_flg)
- WDT_McuReboot();
- exit:
- printf("udate from can finish! \n");
- vTaskDelay(portMAX_DELAY);
- }
- 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 = CANFD500kBaud;
- CanTimInit.DatBps = CANFD1MBaud;
- CanTimInit.tdc_en = 0;
- CanTimInit.sspoff = 0;
- vCanInit(cap, &CanTimInit, CAN_MODE_NORMAL);
- 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 = CANFD500kBaud;
- CanTimInit.DatBps = CANFD1MBaud;
- CanTimInit.tdc_en = 0;
- CanTimInit.sspoff = 0;
- vCanInit(cap, &CanTimInit, CAN_MODE_NORMAL);
- 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;
- //vTaskDelay(1000*20);
- /*创建上位机工作线程 */
- if (xTaskCreate(update_from_can, "canhost", 1024, NULL,
- (tskIDLE_PRIORITY + 1) | portPRIVILEGE_BIT, NULL) != pdPASS) {
- printf("create can hostdemo task fail.\n");
- return -1;
- }
- return 0;
- }
|