#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;i0) { 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(); } }