From f03cf3ae7a36954e64fc014e6bb7afd20c5a5247 Mon Sep 17 00:00:00 2001
From: jinlicong <493886250@qq.com>
Date: Wed, 12 Jun 2024 17:22:08 +0800
Subject: [PATCH] 增加IAP功能,准备测试上位机升级

---
 Function/BOOTLOADER_IAP/bootloader_iap.c |  111 ++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 72 insertions(+), 39 deletions(-)

diff --git a/Function/BOOTLOADER_IAP/bootloader_iap.c b/Function/BOOTLOADER_IAP/bootloader_iap.c
index 5a640a9..d6ce187 100644
--- a/Function/BOOTLOADER_IAP/bootloader_iap.c
+++ b/Function/BOOTLOADER_IAP/bootloader_iap.c
@@ -1,9 +1,9 @@
 #include "bootloader_iap.h"
 #include "flash.h"
-
 #include "off_chip_flash.h"
 #include "delay.h"
 #include "mbcrc1.h"
+#include "system_general_para.h"
 
 BOOTLOAD_PARA_STRUCT __attribute__ ((aligned (4))) bootload_para_g = {0};
 
@@ -19,19 +19,29 @@
 	if(temp_boot_para.boot_update_flag == IAP_UPDATA_FLAG)
 	{
 		/*�ر�ȫ������*/
-		
-		delay_ms(500);
+		__disable_irq();//�ر�ȫ���ж�ʹ��
+		delay_ms(100);
 		RMU->SOFTRST = 0x5C5CAABB; //�����λ
 	}
 }
 
+uint8_t lzma_flag = 0; // ����Ϊ�˱���ԭ�����������õģ�
+	// ����йصĽ�Ϊ����;������Ҫ����ԭ����ʱӦɾȥ
 
 
 ErrorStatus_STM32 IapBootload_WriteCfgFlash_Handler(void)
 {
 	if(Flash_AppPageErase(BOOTLOAD_CONFIG_START_ADDRESS) != SUCCESS_0)
 		return ERROR_1;
-	bootload_para_g.boot_update_flag = IAP_UPDATA_FLAG;//У��ͨ����־
+	if(lzma_flag == 0)
+	{
+		bootload_para_g.boot_update_flag = IAP_UPDATA_FLAG;//У��ͨ����־
+	}else if(lzma_flag == 1){
+		bootload_para_g.boot_update_flag = 0x87654321;
+		// lzma_flag = 0;
+	}else{
+		bootload_para_g.boot_update_flag = 0x55555555; // �����Ӧ�÷���
+	}
 	//�flash	
 	if(Flash_App_Write_String(BOOTLOAD_CONFIG_START_ADDRESS,(uint32_t *)&bootload_para_g, BOOTLOAT_PARA_SIZE)!= SUCCESS_0)//��cfg�flash
 		return ERROR_1;
@@ -51,7 +61,7 @@
 	ErrorStatus_STM32 result = SUCCESS_0; 
 	uint16_t crc_16 = 0;
 	uint32_t crc_crc = 0,offset = 0;
-	if(data_len != (BOOTLOAT_PARA_SIZE - sizeof(bootload_para_g.boot_update_flag)))
+	if(data_len != (BOOTLOAT_PARA_SIZE - SIZEOF_OF(BOOTLOAD_PARA_STRUCT,boot_update_flag)))
 		return (ErrorStatus_STM32)1;
 	memcpy(&bootload_para_g,pInputData,data_len);
 	/*��֤CFG����ȷ��*/
@@ -75,23 +85,29 @@
 	if (crc_crc != bootload_para_g.user_prog_crc16)//�������ļ��еij���CRCֵ���бȶ�
 		return (ErrorStatus_STM32)8;
 	
-	E2P_PWR_ON;	
+	OUT_FLASH_CTRL_ENABLE;	
 	//����������ʼ��ַ�ʹ�С��Flash��Ƭ��flash
 	for (offset = 0; offset < bootload_para_g.diff_prog_length; offset += OUT_FLASH_SECTOR_SIZE)
 	{
 		Flash_OUT_Erase_Sector((BOOTLOAD_DIFF_PROG_START_ADDRESS + offset)/OUT_FLASH_SECTOR_SIZE);
 		IWDT_Clr();             //��ϵͳ���Ź�	
 	}
-	E2P_PWR_OFF;
+	OUT_FLASH_CTRL_DISABLE;
 	//�����������map��Ƭ��flash
 	for (offset = 0; offset < bootload_para_g.diff_prog_map_length; offset += BOOTLOAD_PAGE_SIZE)
 	{
 		if(Flash_AppPageErase(BOOTLOAD_DIFF_SECTOR_MAP_ADDRESS + offset)!= SUCCESS_0)
 			return (ErrorStatus_STM32)9;
-	}	
+	}
+	lzma_flag = 1;
 	return result;
 }
 
+ErrorStatus_STM32 BootLoader_IapConfigLzmaSetHander(uint8_t *pInputData,uint32_t data_len)
+{
+	lzma_flag = 1;
+	return BootLoader_IapConfigSetHander(pInputData, data_len);
+}
 /******************************************
  * func: BootLoader_IapDiffDataHandler
  * desc: ��ʽд��������ݣ��洢��Ƭ��Flash��
@@ -103,22 +119,29 @@
  *****************************************/
 ErrorStatus_STM32 BootLoader_IapDiffDataHandler(uint8_t *pInputData,uint32_t offset_addr,uint16_t data_len)
 {
+	int i=0;
 	ErrorStatus_STM32 result = SUCCESS_0; 
 	//д�볤���ܴ���ҳ����,����Ӧ�ò��ܴ���OUT_FLASH_SECTOR_SIZE��������Ȼ����һ�����512�ֽڣ�Ƭ�ڵ�һ��ҳ����С��
 	if(data_len > BOOTLOAD_PAGE_SIZE)	
 		return (ErrorStatus_STM32)2;
 	
-	if(offset_addr>=BOOTLOAD_DIFF_PROG_LEN_MAX)//���벻�ܳ�����󳤶�
+	if(offset_addr>=BOOTLOAD_DIFF_PROG_LEN_MAX || offset_addr + data_len >= BOOTLOAD_DIFF_PROG_LEN_MAX)//���벻�ܳ�����󳤶�
 		return (ErrorStatus_STM32)3;
 	
 	if((bootload_para_g.diff_prog_start_addr+offset_addr)<BOOTLOAD_DIFF_PROG_START_ADDRESS)
 		return (ErrorStatus_STM32)4;	
+	if((bootload_para_g.diff_prog_start_addr+offset_addr+data_len)>(BOOTLOAD_DIFF_PROG_START_ADDRESS+BOOTLOAD_DIFF_PROG_LEN_MAX))
+		return (ErrorStatus_STM32)5;
 	//�flash	
 	memcpy(FlashWrBuf, pInputData, data_len);//�������� 4�ֽڶ���
 	//д��Ƭ��flash
-	E2P_PWR_ON;
+	OUT_FLASH_CTRL_ENABLE;
+	if(offset_addr == 0){ // ��λ���ƺ�����Ļ���512�ֽڶ���ij��ȣ��ȴ���λ���޸����ɾ
+		bootload_para_g.diff_prog_length = 0;
+	}
 	Out_Flash_MultipleWrite(FlashWrBuf,BOOTLOAD_DIFF_PROG_START_ADDRESS + offset_addr,data_len);
-	E2P_PWR_OFF;	
+	OUT_FLASH_CTRL_DISABLE;	
+	bootload_para_g.diff_prog_length += data_len;
 	return result;
 }
 
@@ -136,19 +159,25 @@
 	uint32_t crc16 = 0xFFFF;
 	uint16_t page_len = 0,i = 0,j = 0;
 	uint8_t dataBuf[512],map;
-	E2P_PWR_ON;
-	//�������У��,����Ƭflash��ȡ,�ݶ�һ�ζ�ȡ512�ֽڣ�Ӧ�ÿ��Զ�ȡ����
-	page_len = bootload_para_g.diff_prog_length >> 9;//  �ȼ��� / 512
-	for(i = 0; i < page_len;i++)
+	OUT_FLASH_CTRL_ENABLE;
+		
+	if(lzma_flag == 0)
 	{
-		Out_Flash_MultipleRead(dataBuf,BOOTLOAD_DIFF_PROG_START_ADDRESS + i * BOOTLOAD_PAGE_SIZE,BOOTLOAD_PAGE_SIZE);
-		crc16 = usMBCRC16(crc16, dataBuf, 512);
-		//flash��512�ֽڴ��10ms
-		IWDT_Clr();             //��ϵͳ���Ź�	
+		//�������У��,����Ƭflash��ȡ,�ݶ�һ�ζ�ȡ512�ֽڣ�Ӧ�ÿ��Զ�ȡ����
+		page_len = bootload_para_g.diff_prog_length >> 9;//  �ȼ��� / 512
+		OUT_FLASH_CTRL_ENABLE;
+		for(i = 0; i < page_len;i++)
+		{
+			Out_Flash_MultipleRead(dataBuf,BOOTLOAD_DIFF_PROG_START_ADDRESS + i * BOOTLOAD_PAGE_SIZE,BOOTLOAD_PAGE_SIZE);
+			crc16 = usMBCRC16(crc16, dataBuf, 512);
+			//flash��512�ֽڴ��10ms
+			IWDT_Clr();             //��ϵͳ���Ź�	
+		}
+		OUT_FLASH_CTRL_DISABLE;
+		crc16 |= (crc16 << 16);
+		if(crc16 != bootload_para_g.diff_prog_crc16)//�������ļ��еij���CRCֵ���бȶ�
+			result = (ErrorStatus_STM32)1;
 	}
-	crc16 |= (crc16 << 16);
-	if(crc16 != bootload_para_g.diff_prog_crc16)//�������ļ��еij���CRCֵ���бȶ�
-		result = (ErrorStatus_STM32)1;
 	//�������map����	
 	crc16 = usMBCRC16(0xFFFF,(unsigned char*)BOOTLOAD_DIFF_SECTOR_MAP_ADDRESS, bootload_para_g.diff_prog_map_length);
 	crc16 |= (crc16 << 16);
@@ -160,28 +189,33 @@
 	if (crc16 != bootload_para_g.user_prog_crc16)//�������ļ��еij���CRCֵ���бȶ�
 		result = (ErrorStatus_STM32)3;
 	IWDT_Clr();             //��ϵͳ���Ź�	
-	//�³���У��
-	crc16 =0xFFFF; 
-	page_len = bootload_para_g.new_prog_length/BOOTLOAD_PAGE_SIZE;
-	for(i = 0;i < page_len;i++)
+	if(lzma_flag == 0)
 	{
-		map = *(unsigned char *)(BOOTLOAD_DIFF_SECTOR_MAP_ADDRESS+i/8);
-		if((map&(1<<(i%8)))==0)//�в���ҳ����Ҫ��Ƭ���
+		//�³���У��
+		crc16 =0xFFFF; 
+		page_len = bootload_para_g.new_prog_length/BOOTLOAD_PAGE_SIZE;
+		OUT_FLASH_CTRL_ENABLE;
+		for(i = 0;i < page_len;i++)
 		{
-			Out_Flash_MultipleRead(dataBuf,BOOTLOAD_DIFF_PROG_START_ADDRESS + j * BOOTLOAD_PAGE_SIZE,BOOTLOAD_PAGE_SIZE);
-			crc16 = usMBCRC16(crc16, dataBuf, BOOTLOAD_PAGE_SIZE);	
-			j++;
+			map = *(unsigned char *)(BOOTLOAD_DIFF_SECTOR_MAP_ADDRESS+i/8);
+			if((map&(1<<(i%8)))==0)//�в���ҳ����Ҫ��Ƭ���
+			{
+				Out_Flash_MultipleRead(dataBuf,BOOTLOAD_DIFF_PROG_START_ADDRESS + j * BOOTLOAD_PAGE_SIZE,BOOTLOAD_PAGE_SIZE);
+				crc16 = usMBCRC16(crc16, dataBuf, BOOTLOAD_PAGE_SIZE);	
+				j++;
+			}
+			else
+				crc16 = usMBCRC16(crc16, (unsigned char *)(BOOTLOAD_USER_PROG_START_ADDRESS+i*BOOTLOAD_PAGE_SIZE), BOOTLOAD_PAGE_SIZE);	
+			IWDT_Clr();             //��ϵͳ���Ź�		
 		}
-		else
-			crc16 = usMBCRC16(crc16, (unsigned char *)(BOOTLOAD_USER_PROG_START_ADDRESS+i*BOOTLOAD_PAGE_SIZE), BOOTLOAD_PAGE_SIZE);	
-		IWDT_Clr();             //��ϵͳ���Ź�		
+		OUT_FLASH_CTRL_DISABLE;
+		crc16 |= (crc16 << 16);
+		if (crc16 != bootload_para_g.new_prog_crc16)//�������ļ��еij���CRCֵ���бȶ�
+			result = (ErrorStatus_STM32)4;
 	}
-	crc16 |= (crc16 << 16);
-	if (crc16 != bootload_para_g.new_prog_crc16)//�������ļ��еij���CRCֵ���бȶ�
-		result = (ErrorStatus_STM32)4;
 	if(IapBootload_WriteCfgFlash_Handler() != SUCCESS_0)
 		result = (ErrorStatus_STM32)5;
-	E2P_PWR_OFF;	
+	OUT_FLASH_CTRL_DISABLE;	
 	return result;
 }
 
@@ -207,4 +241,3 @@
 		return (ErrorStatus_STM32)5;
 	return result;
 }
-

--
Gitblit v1.9.3