414 lines
8.2 KiB
C
414 lines
8.2 KiB
C
|
||
#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();
|
||
}
|
||
|
||
}
|
||
|