Files
HBshuiwuConcentrator/upgrade/upgrade.c
2025-12-15 16:07:49 +08:00

414 lines
8.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "FreeRTOS.h"
#include "task.h"
/* ST library functions. */
#include "stm32f10x.h"
#include "Led.h"
#include "debug_printf.h"
#include "uart.h"
#include "Init.h"
#include "addr.h"
#include "bl24c512.h"
#include "update.h"
#include "PHY.h"
#include "IRDA.h"
#include "rtc_ext.h"
#include "file.h"
#define PROGRAM_FILE_START_ADDR 0x0CC000
#define ADDRESS_FILE_START_ADDR 0x0FB000
#define PROGRAM_FILE_END_ADDR 0x0FE000
#define PARABACKUP_AREA_START_ADDR 0x0803F000
#define PARAMETER_AREA_START_ADDR 0x0803F800
#define PARAMETER_AREA_LENGTH 48u
#define ATTACH_CONTENT_LENGTH 30u
#define VALID_ATTACH_FLAG 0xAAA55AAA
#define sFLASH_SECTOR_SIZE 0x1000
#define GOOD_CRC 0x0F47
#define IAP_CHECK_FLAG 0x5AA5
#define IAP_NOCHECK_FLAG 0xA55A
////////////////////////////////////////////////////////////
extern void upgrade_delete();
extern u8 * get_uart_recv();
extern int format_1();
extern CPU_INT08S M3761_Default_Param(CPU_INT08U *tem_file, CPU_INT08U *default_file);
extern void upgrade_delete_terminalcodemsgtxt();
extern void upgrade_create_terminalcodemsgtxt();
extern void upgrade_write_codemsg_txt(u8 *buffer,u16 size);
extern void upgrade_write_terminal_txt(u8 *buffer,u16 size);
extern void upgrade_write_codemsg_txt(u8 *buffer,u16 size);
extern void update_write(u32 index,u8 * val,u8 len);
extern void update_read(u32 index,u8 * val,u8 len);
extern void update_clear();
extern void upgrade_flash();
/* 处理升级文件首段 */
void UpdataProcessFirstSegment(void);
/* 处理升级文件中间段 */
void UpdataProcessMiddleSegment(void);
/* 处理升级文件末段 */
void UpdataProcessLastSegment(void);
/* 清除下装文件 */
void UpdataClearDownloadFile(void);
u16 sum_packet = 0;
//u8 recvflag[2000];
u16 currentpos = 0;
void AckErr(u8 val)
{
}
/*
开启定时器,如论是否完成,都会复位
如果2分钟内没有收到任何数据
*/
void concent_upgrade(u32 * seg)
{
u8 * p = get_uart_recv();
//
//数据内容 数据格式 字节数
//文件标识 BIN 1
//文件属性 BIN 1
//文件指令 BIN 1
//总段数n BIN 2
//第i段标识或偏移i=0n-1 BIN 4
//第i段数据长度Lf BIN 2
//文件数据 BIN Lf
//
u8 * pval = &p[11];
u8 fileFlag = pval[0];
u8 fileAttribute = pval[1];
u8 fileDirective = pval[2];
u16 totalSegment = (((u16)pval[4]) << 8) | ((u16)pval[3]);
u32 currentSegment = (((u32)pval[8]) << 24) | (((u32)pval[7]) << 16) | (((u32)pval[6]) << 8) | ((u32)pval[5]);
u16 dataLength = (((u16)pval[10]) << 8) | ((u16)pval[9]);
u32 attachFlag = (((u32)pval[14]) << 24) | (((u32)pval[13]) << 16) | (((u32)pval[12]) << 8) | ((u32)pval[11]);
*seg = currentSegment;
if ((fileAttribute > 0x01) || (fileDirective != 0x00))
{
AckErr(0);
return;
}
if ((totalSegment > 0) && (currentSegment >= totalSegment))
{
AckErr(0);
return;
}
if (fileFlag > 0)
{
if (attachFlag == VALID_ATTACH_FLAG)
{
if (dataLength < ATTACH_CONTENT_LENGTH)
{
AckErr(0);
return;
}
}
else
{
if (dataLength == 0)
{
AckErr(0);
return;
}
}
}
/* 清除下装文件 */
if (fileFlag == 0)
{
UpdataClearDownloadFile();
}
else
{
if (fileAttribute == 0)
{
if (currentSegment == 0)
{
/* 处理首段 */
UpdataProcessFirstSegment();
}
else
{
/* 处理中间段 */
UpdataProcessMiddleSegment();
}
}
else
{
/* 处理末段 */
UpdataProcessLastSegment();
}
}
}
/* 清除下装文件 */
void UpdataClearDownloadFile(void)
{
//erase_128k();
update_clear();
currentpos = 0xFFFF;
//启动时钟
}
void flash_write(u8 * data,u16 len)
{
update_write(currentpos*3, data, 128);
update_write(currentpos*3+1, data+128, 128);
update_write(currentpos*3+2, data+256, 128);
}
void flash_last_write(u8 * data,u16 len)
{
if(len<=128)
{
update_write(currentpos*3, data, len);
sum_packet ++;
}
else if(len<=256)
{
update_write(currentpos*3, data, 128);
update_write(currentpos*3+1, data+128, len-128);
sum_packet ++;
sum_packet ++;
}
else
{
update_write(currentpos*3, data, 128);
update_write(currentpos*3+1, data+128, 128);
update_write(currentpos*3+2, data+256, len-256);
sum_packet ++;
sum_packet ++;
sum_packet ++;
}
}
/* 处理升级文件首段 */
void UpdataProcessFirstSegment(void)
{
u8 * p = get_uart_recv();
u8 * pval = &p[11];
// u8 fileFlag = pval[0];
// u8 fileAttribute = pval[1];
// u8 fileDirective = pval[2];
u16 totalSegment = (((u16)pval[4]) << 8) | ((u16)pval[3]);
u32 currentSegment = (((u32)pval[8]) << 24) | (((u32)pval[7]) << 16) | (((u32)pval[6]) << 8) | ((u32)pval[5]);
u16 dataLength = (((u16)pval[10]) << 8) | ((u16)pval[9]);
// u32 attachFlag = (((u32)pval[14]) << 24) | (((u32)pval[13]) << 16) | (((u32)pval[12]) << 8) | ((u32)pval[11]);
u8 * pdata = &p[22];
if(currentpos == currentSegment)
{
//
return;
}
currentpos = currentSegment;
flash_write(pdata,dataLength);
printf("sum = %d cur=%04d\r\n", totalSegment,currentSegment);
}
/* 处理升级文件中间段 */
void UpdataProcessMiddleSegment(void)
{
u8 * p = get_uart_recv();
u8 * pval = &p[11];
// u8 fileFlag = pval[0];
// u8 fileAttribute = pval[1];
// u8 fileDirective = pval[2];
u16 totalSegment = (((u16)pval[4]) << 8) | ((u16)pval[3]);
u32 currentSegment = (((u32)pval[8]) << 24) | (((u32)pval[7]) << 16) | (((u32)pval[6]) << 8) | ((u32)pval[5]);
u16 dataLength = (((u16)pval[10]) << 8) | ((u16)pval[9]);
// u32 attachFlag = (((u32)pval[14]) << 24) | (((u32)pval[13]) << 16) | (((u32)pval[12]) << 8) | ((u32)pval[11]);
u8 * pdata = &p[22];
if(currentpos == currentSegment)
{
//
return;
}
currentpos = currentSegment;
flash_write(pdata,dataLength);
printf("sum = %d cur=%04d\r\n", totalSegment,currentSegment);
}
extern void erase_128k(void);
extern void update_read(u32 index,u8 * val,u8 len);
extern void FLASH_Write_update_page(u16 packetNo, u8 * Data, u8 length);
extern bool update_software_check(u32 totalBytes);
extern void updata_finish(u32 total_packets);
void updata_end()
{
u8 value[256];
u8 write_value[256];
memset(value,0,sizeof(value));
update_read(0,value,128);
//前面4个字节
u32 currentSegment = (((u32)value[3]) << 24) | (((u32)value[2]) << 16) | (((u32)value[1]) << 8) | ((u32)value[0]);
u16 packet_num = currentSegment/128 + 1;
printf("erase flash begin\r\n");
erase_128k();
// FEED_WDG;
printf("erase flash end\r\n");
vTaskDelay( 100 / portTICK_RATE_MS );
for(u16 i = 0;i<packet_num;i++)
{
memset(value,0,sizeof(value));
update_read(i,value,128);
update_read(i+1,&value[128],128);
memmove(write_value,&value[4],128-4);
memmove(&write_value[124],&value[128],4);
FLASH_Write_update_page(i,write_value,128);
}
if(update_software_check(currentSegment))
{
printf("down file ok\r\n");
vTaskDelay( 100 / portTICK_RATE_MS );
updata_finish(currentSegment);
printf("---- finish %d ---\r\n",currentSegment);
printf("---- reboot ---\r\n");
vTaskDelay( 100 / portTICK_RATE_MS );
}
else
{
printf("down file error\r\n");
}
}
/* 处理升级文件末段 */
void UpdataProcessLastSegment(void)
{
u8 * p = get_uart_recv();
u8 * pval = &p[11];
// u8 fileFlag = pval[0];
// u8 fileAttribute = pval[1];
// u8 fileDirective = pval[2];
// u16 totalSegment = (((u16)pval[4]) << 8) | ((u16)pval[3]);
u32 currentSegment = (((u32)pval[8]) << 24) | (((u32)pval[7]) << 16) | (((u32)pval[6]) << 8) | ((u32)pval[5]);
u16 dataLength = (((u16)pval[10]) << 8) | ((u16)pval[9]);
// u32 attachFlag = (((u32)pval[14]) << 24) | (((u32)pval[13]) << 16) | (((u32)pval[12]) << 8) | ((u32)pval[11]);
u8 * pdata = &p[22];
if(currentpos == currentSegment)
{
return;
}
currentpos = currentSegment;
sum_packet = currentpos * 3;
if(dataLength>0)
{
flash_last_write(pdata,dataLength);
}
//
//搬迁位置
// updata_end();
// vTaskDelay( 2000 / portTICK_RATE_MS );
// SysReset();
upgrade_flash();
}
SemaphoreHandle_t upgrade_semaphore;
void upgrade_flash()
{
xSemaphoreGive(upgrade_semaphore);
}
void upgrade_flash1()
{
updata_end();
vTaskDelay( 2000 / portTICK_RATE_MS );
SysReset();
}
void upgrade_task()
{
vSemaphoreCreateBinary(upgrade_semaphore);
xSemaphoreTake(upgrade_semaphore, 0);
for (;;)
{
xSemaphoreTake(upgrade_semaphore, portMAX_DELAY);
upgrade_flash1();
}
}