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