河北水利局项目
This commit is contained in:
413
upgrade/upgrade.c
Normal file
413
upgrade/upgrade.c
Normal 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=0~n-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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user