Преглед на файлове

更新CPU和MCU工程(iram版本)
1.优化加解密数据超过512KB时加密异常的问题(数据在DDR中必须512KB对齐,且单次计算数据量不得超过512KB)
2.添加can升级中对MCU的镜像和快速启动文件的升级
3.添加MCU中对efuse失效某个块的功能
4.优化DCIC中检测时间过长的问题
5.修改CPU端mailbox应答错误的问题

helen преди 6 месеца
родител
ревизия
2c53b4e98f

+ 1 - 1
amt630hv160-freertos-beta/demo/mailbox_update/can_update_demo.c

@@ -23,7 +23,7 @@ static int upfile_type;
 static int CanUpdateSendstatus(mb_msg_type_t msg_type, MailboxUpdateFrameRespondStatus status)
 {
 	MailboxUpdateFrame frame = {0};
-	frame.FrameStatus = status;
+	frame.FrameRspStatus = status;
 	return MailboxUpdateSendFrame(msg_type, &frame);
 }
 

+ 1 - 0
amt630hv160-mcu/amt630hv160-mcu-iram/amt630hv160.icf

@@ -87,6 +87,7 @@ define exported symbol __syscalls_flash_end__           = __reigon_ROM_system_ca
 
 /* Placements. */
 place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+place at address mem:__ICFEDIT_region_RAM_start__ { section SEC_DDT };
 
 place in ROM_region_privileged      { readonly section privileged_functions };
 place in ROM_region_system_calls    { readonly section freertos_system_calls };

+ 27 - 349
amt630hv160-mcu/amt630hv160-mcu-iram/src/App/can_demo.c

@@ -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

+ 73 - 49
amt630hv160-mcu/amt630hv160-mcu-iram/src/App/can_uds.c

@@ -8,7 +8,6 @@
 
 extern CanPort_t *ecu_cap;
 
-#ifdef CAN_UPDATE
 #define CAN_UPDADE_DDR_ADDR_SIZE		(DDR_CAN_UPDATE_SIZE / 2)
 #define CAN_UPDADE_DDR_ADDR				DDR_CAN_USE_ADDR
 #define CAN_UPDADE_DDR_ADDRB			(DDR_CAN_USE_ADDR + CAN_UPDADE_DDR_ADDR_SIZE)
@@ -21,7 +20,6 @@ static u32 file_size, left_size = 0;
 static u8 file_type = 0;
 static u8 new_file = 0;
 static u8 tx_status = 0;	//1:tfr err,0:tfr nor
-#endif
 
 /**
  * @brief  发送CAN消息
@@ -252,13 +250,12 @@ uint8_t CAN_UDS_ServiceRespond(uint8_t RSID, uint8_t *pData, uint32_t DataLen)
  */
 uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
 {
-#ifndef CAN_UPDATE
 	static uint32_t MemoryAddress;
-	static uint32_t MemorySize;
-#endif
 	static uint32_t AppCRC32 = 0xFFFFFFFF;
 	const uint32_t BlockSize = UDS_PACK_SIZE + 2; //Max Number Of Block Length,需要加上SID和BSC
 	static uint8_t BSC =1 ; //Block Sequence Counter
+	static header_offset_t *hoff;
+	static u32 file_crc;
 
 	switch (SID) {
 	case 0x10:
@@ -269,9 +266,6 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
 			AppCRC32 = 0xFFFFFFFF;
 			printf("Programming Mode\r\n");
 			CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
-			//CAN_BOOT_SetProgRequest();
-			//printf("ECU Reset\r\n");
-			//CAN_BOOT_Reset();
 		} else if (DataLen >= 1 && pData[0] == 0x01) {
 			printf("Default Session\r\n");
 			CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
@@ -281,8 +275,6 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
 		if (DataLen >= 1 && pData[0] == 0x01) { //ECU Reset
 			printf("ECU Reset\r\n");
 			CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
-			//CAN_BOOT_ResetProgRequest(); //清除进入编程模式标志
-			//CAN_BOOT_Reset();
 		}
 		break;
 	case 0x31:
@@ -290,19 +282,31 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
 			printf("Erase Flash Memory...\r\n");
 			uint8_t res[2] = {SID, 0x78}; //Request Correctly Received Response Pending
 			CAN_UDS_ServiceRespond(0x7F, res, 2);
-#ifndef CAN_UPDATE
-			pData[3] = UPDATE_EraseUpfile(UPFILE_TYPE_MCU_IMAGE);
-#endif
 			CAN_UDS_ServiceRespond(SID | 0x40, pData, 4);
 		} else if (DataLen >= 3 && pData[0] == 0x01 && pData[1] == 0xFF && pData[2]==0x01) { //Check Programming Dependencies,验证APP的合法性
 			printf("Check Programming Dependencies...\r\n");
 			uint8_t res[2] = {SID, 0x78}; //Request Correctly Received Response Pending
 			CAN_UDS_ServiceRespond(0x7F, res, 2);
-#ifndef CAN_UPDATE
-			pData[3] = UPDATE_CheckApp(1, 0);
-			if (pData[3])
-				UPDATE_SetAppValid();
-#endif
+			if (file_type == UPFILE_TYPE_MCU_IMAGE) {
+				pData[3] = UPDATE_CheckApp(1, 0);
+				if (pData[3])
+					UPDATE_SetAppValid();
+			} else if (file_type == UPFILE_TYPE_MCU_FB) {
+				u8 *code = pvPortMalloc(file_size);
+				UPDATE_ReadData(MemoryAddress, code, file_size);
+				*(u32 *)(code + 0x20) = 0;
+				if (xcrc32(code, file_size, AppCRC32, HARD_CALC_CRC) == file_crc) {
+					hoff = GetHeaderOff();
+					hoff->fboffset = MemoryAddress;
+					SaveHeaderOff();
+					pData[3] = 1;
+				}
+
+				AppCRC32 = 0xFFFFFFFF;
+				if (code)
+					vPortFree(code);
+			}
+
 			CAN_UDS_ServiceRespond(SID | 0x40, pData, 4);
 			printf("Check Programming Dependencies res=%d\r\n",pData[3]);
 		} else if (DataLen >= 7 && pData[0] == 0x01 && pData[1] == 0x02 && pData[2] == 0x02) { //Check Programming Integrity,通过CRC32验证
@@ -327,17 +331,18 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
 	case 0x34:
 		if (DataLen >= 10 && pData[0] == 0x00 && pData[1] == 0x44) { //Request Download
 			BSC = 1;
-#ifdef CAN_UPDATE
 			file_size = left_size = (pData[6] << 24) | (pData[7] << 16) | (pData[8] << 8) | pData[9];
 			file_type = pData[10];
 			new_file = 1;
 			tx_status = 0;
 			mailbox_frame_size = 0;
-			break;
-#else
-			MemoryAddress = (pData[2] << 24) | (pData[3] << 16) | (pData[4] << 8) | pData[5];
-			MemorySize = (pData[6] << 24) | (pData[7] << 16) | (pData[8] << 8) | pData[9];
-			printf("Request Download MemoryAddress = 0x%08X MemorySize = %d Byte\r\n", MemoryAddress, MemorySize);
+			if (file_type == UPFILE_TYPE_MCU_IMAGE) {
+				MemoryAddress = UPDATE_GetUpfileAddr(UPFILE_TYPE_MCU_IMAGE);
+				UPDATE_EraseData(MemoryAddress, IMAGE_MAX_SIZE);
+			} else if (file_type == UPFILE_TYPE_MCU_FB) {
+				MemoryAddress = UPDATE_GetUpfileAddr(UPFILE_TYPE_MCU_FB);
+				UPDATE_EraseData(MemoryAddress, FASTBOOT_MAX_SIZE);
+			}
 
 			pData[0] = 0x40;
 			pData[1] = BlockSize >> 24;
@@ -345,20 +350,21 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
 			pData[3] = BlockSize >> 8;
 			pData[4] = BlockSize;
 			CAN_UDS_ServiceRespond(SID | 0x40, pData, 5);
-#endif
 		} else if (DataLen >= 6 && pData[0] == 0x00 && pData[1] == 0x04) { //Request Download
 			BSC = 1;
-#ifdef CAN_UPDATE
 			file_size = left_size = (pData[2] << 24) | (pData[3] << 16) | (pData[4] << 8) | pData[5];
 			file_type = pData[6];
 			new_file = 1;
 			tx_status = 0;
 			mailbox_frame_size = 0;
-#else
-			MemoryAddress = UPDATE_GetUpfileAddr(UPFILE_TYPE_MCU_IMAGE);
-			MemorySize = (pData[2] << 24) | (pData[3] << 16) | (pData[4] << 8) | pData[5];
-			printf("Request Download MemorySize = %d Byte\r\n", MemorySize);
-#endif
+			if (file_type == UPFILE_TYPE_MCU_IMAGE) {
+				MemoryAddress = UPDATE_GetUpfileAddr(UPFILE_TYPE_MCU_IMAGE);
+				UPDATE_EraseData(MemoryAddress, IMAGE_MAX_SIZE);
+			} else if (file_type == UPFILE_TYPE_MCU_FB) {
+				MemoryAddress = UPDATE_GetUpfileAddr(UPFILE_TYPE_MCU_FB);
+				UPDATE_EraseData(MemoryAddress, FASTBOOT_MAX_SIZE);
+			}
+
 			pData[0] = 0x20;
 			pData[1] = BlockSize >> 8;
 			pData[2] = BlockSize;
@@ -376,10 +382,24 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
 			if (pData[0] == BSC) {
 				uint8_t res[2] = {SID, 0x78}; //Request Correctly Received Response Pending
 				CAN_UDS_ServiceRespond(0x7F, res, 2);
-
-#ifdef CAN_UPDATE
 				uint16_t DataNum = DataLen - 1;
 				uint8_t *pGotData = &pData[1];
+				if (file_type == UPFILE_TYPE_MCU_IMAGE || file_type == UPFILE_TYPE_MCU_FB) {
+					u32 alignsize = (DataNum + 3) & ~3;
+					uint32_t AddrOffset = (BSC - 1) * UDS_PACK_SIZE;
+					UPDATE_WriteData(MemoryAddress + AddrOffset, pGotData, alignsize);
+					CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
+					if (file_type == UPFILE_TYPE_MCU_FB && BSC == 1) {
+						file_crc = *(u32 *)(pGotData + 0x20);
+					}
+
+					//AppCRC32 = UPDATE_CalcCrc(MemoryAddress + AddrOffset, DataNum, AppCRC32);
+					AppCRC32 = xcrc32(pGotData, DataNum, AppCRC32, HARD_CALC_CRC);
+					BSC++;
+					break;
+				}
+
+				AppCRC32 = xcrc32(pGotData, DataNum, AppCRC32, HARD_CALC_CRC);
 				if (mailbox_frame_addr == 0)
 					mailbox_frame_addr = CAN_UPDADE_DDR_ADDR;
 
@@ -418,6 +438,20 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
 
 					if (!left_size || new_file) {	//wait start/last frame status
 						new_file = 0;
+						if (file_size == DataNum) {
+							if (!MailboxUpdateReceiveFrame(MB_MSG_T_CAN_UPDATE, &rx_msg, pdMS_TO_TICKS(30000))) {
+								rx_need = 0;
+								pData[0] = SID;
+								pData[1] = 0x13;
+								CAN_UDS_ServiceRespond(0x7F, pData, 2);
+								tx_status = 1;
+								break;
+							}
+
+							send_packet.FrameStatus = MUFS_TFR;
+							MailboxUpdateSendFrame(MB_MSG_T_CAN_UPDATE, &send_packet);
+						}
+
 						if (!MailboxUpdateReceiveFrame(MB_MSG_T_CAN_UPDATE, &rx_msg, pdMS_TO_TICKS(30000))) {
 							rx_need = 0;
 							pData[0] = SID;
@@ -431,18 +465,6 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
 
 				}
 				CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
-#else
-				uint16_t DataNum = DataLen - 1;
-				uint8_t *pGotData = &pData[1];
-				uint32_t AddrOffset = (BSC - 1) * UDS_PACK_SIZE;
-
-				printf("Write Data To Flash Addr=%08X\r\n", MemoryAddress + AddrOffset);
-				UPDATE_WriteData(MemoryAddress + AddrOffset, pGotData, DataNum);
-				CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
-				//计算实际写入Flash中的数据CRC值
-				AppCRC32 = UPDATE_CalcCrc(MemoryAddress + AddrOffset, DataNum, AppCRC32);
-				printf("Transfer Data BSC=%d AppCRC=%08X\r\n",BSC, AppCRC32);
-#endif
 				BSC++;
 			} else {
 				pData[0] = SID;
@@ -494,8 +516,10 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
 		break;
 	case 0x37: //Request Transfer Exit
 		printf("Request Transfer Exit\r\n");
-#ifdef CAN_UPDATE
-		if (!tx_status) {
+		if (file_type == UPFILE_TYPE_MCU_IMAGE || file_type == UPFILE_TYPE_MCU_FB) {
+			CAN_UDS_ServiceRespond(SID | 0x40, pData, 0);
+			break;
+		} else if (!tx_status) {
 			send_packet.DataSize = 0;
 			send_packet.DataAddr = 0;
 			send_packet.FrameStatus = MUFS_END;
@@ -512,8 +536,8 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
 			tx_status = 0;
 		}
 		printf("Transfer Exit success\r\n");
-#endif
-		CAN_UDS_ServiceRespond(SID | 0x40, pData, 0);
+		pData[0] = 1;
+		CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
 		break;
 	default:
 		break;

+ 1 - 1
amt630hv160-mcu/amt630hv160-mcu-iram/src/App/dcic_detect.c

@@ -312,7 +312,7 @@ void fault_detect(void)
 	osd_err_timer[0] = xTimerCreate("osderr", pdMS_TO_TICKS(1000), pdFALSE, NULL,
 								osderr_timeout_handler);
 
-	his_err_timer = xTimerCreate("hiserr", pdMS_TO_TICKS(1000), pdTRUE, NULL,
+	his_err_timer = xTimerCreate("hiserr", pdMS_TO_TICKS(100), pdTRUE, NULL,
 								hiserr_timeout_handler);
 
 	registerFaultHandler(FAULT_STA, hvDetHandler, NULL);

+ 0 - 1
amt630hv160-mcu/amt630hv160-mcu-iram/src/App/mailbox_update/mailbox_update_demo.c

@@ -27,7 +27,6 @@ static MailboxUpdateFrame *MailboxUpdateHandleMsg(mb_rxmsg_t *msg)
 		return rx_frame;
 	} else if (rx_frame->FrameRspStatus == MUFRS_ACK_FSAME) {
 		printf("checksum is the same as now, don't update.\n");
-		return rx_frame;
 	} else if (rx_frame->FrameRspStatus == MUFRS_ACK_FNOSPACE) {
 		printf("%s, The file is too large, not enough space to save.\n", __func__);
 	} else if (rx_frame->FrameRspStatus == MUFRS_ACK_FNOSUP) {

+ 1 - 0
amt630hv160-mcu/amt630hv160-mcu-iram/src/ArkmicroFiles/libcpu-amt630hv160/include/amt630hv160_efuse.h

@@ -80,4 +80,5 @@ u32 EFUSE_CalcCntNum(u32 ahbfreq_mhz);
 
 void EFUSE_WriteBootcfgParity(void);
 
+u32 EFUSE_Disable_Word(u32 addr);
 #endif /* __AMT630HV160_EFUSE_H */

+ 0 - 8
amt630hv160-mcu/amt630hv160-mcu-iram/src/ArkmicroFiles/libcpu-amt630hv160/source/amt630hv160_dcic.c

@@ -208,14 +208,6 @@ void DCIC_SwitchToOSD(void)
 	DCIC->CFG73 |= 1 << 18;
 }
 
-/* DCIC RX软复位 */
-void DCIC_RxSoftReset(void)
-{
-	/*SYSCTRL->RST_CTL_REG &= ~(0x1 << 13);
-	TIMER_Udelay(10);
-	SYSCTRL->RST_CTL_REG |= 0x1 << 13;
-	TIMER_Udelay(10);*/
-}
 
 void DCIC_SetTiming(void)
 {

+ 17 - 1
amt630hv160-mcu/amt630hv160-mcu-iram/src/ArkmicroFiles/libcpu-amt630hv160/source/amt630hv160_efuse.c

@@ -11,6 +11,7 @@
 /* Includes ------------------------------------------------------------------*/
 #include "amt630hv160_efuse.h"
 #include "amt630hv160_timer.h"
+#include "amt630hv160_lib.h"
 
 #define EFUSE_CTL_SECRD_LITTLE		(1 << 3)
 #define EFUSE_CTL_SECRD_EN			(1 << 2)
@@ -22,6 +23,8 @@
 #define EFUSE_STAT_BUSY				(1 << 1)
 #define EFUSE_STAT_OP_DONE			(1 << 0)
 
+#define EFUSE_AESKEY				(1 << 9)
+#define EFUSE_ROTK					(1 << 10)
 static u32 efuse_cached_bootcfg = (u32)-1;
 
 static const EfuseFieldDesc efuseField[] = {
@@ -228,4 +231,17 @@ u32 EFUSE_CalcCntNum(u32 ahbfreq_mhz)
 	}
 
 	return cntnum;
-}
+}
+
+//addr一共有64块,最后一个块EFUSE_CTLCELL_ADDR每一个bit控制两个块。
+u32 EFUSE_DisableWord(u32 addr)
+{
+	if(addr > EFUSE_CTLCELL_ADDR)
+		return 0;
+
+	EFUSE_WriteBits(EFUSE_CTLCELL_ADDR, addr / 2, 1, 1);
+	if(EFUSE_ReadBits(EFUSE_CTLCELL_ADDR, addr / 2, 1))
+		return 1;
+
+	return 0;
+}

+ 1 - 2
amt630hv160-mcu/amt630hv160-mcu-iram/src/amt630hv160_conf.h

@@ -109,7 +109,6 @@
 #define _CANFD1
 #define CANFD1_FREQ	40000000
 #define	CAN_DEMO	0
-#define CAN_UPDATE
 /************************************* MAILBOX ************************************/
 #define _MAILBOX
 #ifdef _MAILBOX
@@ -124,7 +123,7 @@
 
 /************************************* DCIC ************************************/
 #define _DCIC
-//#define DCIC_FAULT_DETECT
+#define DCIC_FAULT_DETECT
 #define PALETTE_DATA_SIZE	0x400
 #define MAX_OSDDATA_SIZE	0x80000
 #define OSD_DATA_RAM_ADDR	0x20280000

BIN
amt630hv160-mcu/amt630hv160-mcu-iram/src/lib/hsm/libhsm.a


+ 10 - 0
amt630hv160-mcu/amt630hv160-mcu-iram/src/lib/hsm/libhsm.h

@@ -12,6 +12,7 @@
 /* Define to prevent recursive inclusion -------------------------------------*/
 #ifndef _LIBHSM_H
 #define _LIBHSM_H
+#include "amt630hv160_lib.h"
 
 /* Includes ------------------------------------------------------------------*/
 
@@ -168,6 +169,15 @@ void HSM_Logout(int debug_on);
  */
 int EHSE_Init(void);
 
+/*
+ * EHSE模块DDT初始化
+ * param [in] pddt DDT表地址,要求8字节对齐
+ * param [in] size DDT表大小,整个pddt内存不能跨越512K地址
+ * return
+ *   - HSM_XXX
+ */
+int EHSE_DDT_Init(void *pddt, uint32_t size);
+
 /*
  * HASH计算
  * param [in] in 输入数据