河北水利局项目

This commit is contained in:
2025-12-15 16:07:49 +08:00
commit f11a7c2b95
1146 changed files with 452892 additions and 0 deletions

413
upgrade/upgrade.c Normal file
View File

@@ -0,0 +1,413 @@
#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();
}
}