MW22-02A/APP/Service/service_update.c

1306 lines
47 KiB
C
Raw Permalink Normal View History

2025-05-21 01:55:40 +00:00
#include "ptz_header_file.h"
#include "agent_hyt.h"
#include "service_update.h"
#include "comm_cfginfo.h"
#include "includes.h"
#include "w25q128.h"
#include "rotate_plan.h"
#include "enet_to_udp.h"
#include "device_wdog.h"
#include "onchip_flash.h"
//void OnChip_Flash_read_in_add(uint32_t address,uint16_t cnt,uint8_t*bBuf);
//uint8_t OnChip_Flash_write_byte(uint32_t address,uint16_t cnt, uint8_t buf[]);
//uint8_t OnChip_Flash_erase_sector(uint16_t sectorNo);
/******************************************************************************
** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD> ushort cmCRC_16(uchar *PuchMsg,ushort usDataLen)
** <EFBFBD><EFBFBD> <EFBFBD>ܣ<EFBFBD> 16λCRCУ<EFBFBD><EFBFBD>
** <EFBFBD>޸<EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD>
******************************************************************************/
extern system_cfg_info system_info;
static unsigned char auch_crc_h[]={
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81, //DESCRIPTION:RTU CRCУ<43><D0A3><EFBFBD>ĸ<EFBFBD>λ<EFBFBD>ֽڱ<D6BD>
0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,
0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,
0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,
0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,
0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,
0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,
0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,
0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,
0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,
0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40};
static unsigned char auch_crc_l[]={
0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4, //DESCRIPTION:RTU CRCУ<43><D0A3><EFBFBD>ĵ<EFBFBD>λ<EFBFBD>ֽڱ<D6BD>
0x04,0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,
0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,
0x1D,0x1C,0xDC,0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,
0x11,0xD1,0xD0,0x10,0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,
0x37,0xF5,0x35,0x34,0xF4,0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,
0x3B,0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,
0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C,0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,
0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,
0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,
0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,0x78,0xB8,0xB9,0x79,0xBB,
0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,0xB4,0x74,0x75,0xB5,
0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,0x50,0x90,0x91,
0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9C,0x5C,
0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99,0x59,0x58,0x98,0x88,
0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,
0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40};
static struct sockaddr_in ptz_update_local;//<2F><><EFBFBD><EFBFBD>IP<49>Ͷ˿<CDB6>
static struct sockaddr_in ptz_update_from;//IP<49>Ͷ˿<CDB6>
static socklen_t ptz_update_fromlen;//<2F><><EFBFBD><EFBFBD>
static struct sockaddr_in ptz_update_serv_a;//ָ<><D6B8><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static socklen_t ptz_update_servlen_a;
static struct sockaddr_in ptz_update_serv_b;//ָ<><D6B8><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static socklen_t ptz_update_servlen_b;
static struct sockaddr_in ptz_update_serv_c;//ָ<><D6B8><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static socklen_t ptz_update_servlen_c;
static struct sockaddr_in ptz_update_serv_d;//ָ<><D6B8><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static socklen_t ptz_update_servlen_d;
static int ptz_update_fd;//<2F><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static UpdateRecvFifoBuff udrb;//<2F><><EFBFBD>ݽ<EFBFBD><DDBD>մ洢
static UpdateRecvFifoBuff udpb;//<2F><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD>
static UpdateRecvFifoBuff udsb;//<2F><><EFBFBD>ݷ<EFBFBD><DDB7>ʹ<CDB4><E6B4A2>
static UpdateRecvFifoBuff urfb[UPDATE_BUFF_FIFO_NUM];//ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static int ptz_update_communicaton = PTZ_CONNECT_STATE_DEAD;
static unsigned short int ptz_update_fifo_read_addr;//ѭ<><D1AD><EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
static unsigned short int ptz_update_fifo_write_addr;//ѭ<><D1AD><EFBFBD><EFBFBD><E6B4A2>д<EFBFBD><D0B4>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
//static UpdateFileHead ptz_update_file_head;//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ͷ
static UpdateFileHead ptz_update_file_head_inf;//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ͷ
//<2F><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>frame<6D><65>״̬<D7B4><CCAC>
//ÿһλ<D2BB><CEBB>Ӧһ<D3A6><D2BB>frame<6D><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>֡<EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ճɹ<D5B3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һλ<D2BB><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>frame_bit_map<61><70>ÿһλ<D2BB><CEBB><EFBFBD><EFBFBD>ÿһ֡<D2BB><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĽ<DDB5><C4BD>ձ<EFBFBD><D5B1><EFBFBD>״̬
static unsigned char update_frame_bit_map[256];//<2F><><EFBFBD><EFBFBD>״̬<D7B4><EFBFBD><E6B4A2>
static int update_bit_map_count = 0; //<2F>ܹ<EFBFBD><DCB9>ж<EFBFBD><D0B6><EFBFBD>bit
static int update_byte_map_count = 0;//<2F>ܹ<EFBFBD><DCB9>ж<EFBFBD><D0B6>ٸ<EFBFBD>byte
static unsigned char update_state;//<2F><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD>״̬
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static u_int16_t update_retrans_table_buff[MAX_RETRANS_TABLE_LEN+1];
static UpdateRetransTable *update_retrans_table = (UpdateRetransTable *)update_retrans_table_buff;
//<2F>ļ<EFBFBD>У<EFBFBD><D0A3>
static u_int8_t flash_read_buff[256]; //Ƭ<><C6AC>flash<73><68>ȡ<EFBFBD><C8A1>buffer
static u_int8_t flash_read_buff2[256];
static u_int8_t flash_read_buff3[256];
static u_int16_t feeddog_num = 0;
//UDP<44><50><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ż<EFBFBD><C5BC><EFBFBD><E3BAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѻ<EFBFBD><D1BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƻص<C6BB>ͷ<EFBFBD><CDB7>
static unsigned char ptz_update_fifo_addring(unsigned short int i)
{
return ((i + 1) == UPDATE_BUFF_FIFO_NUM) ? 0 : i+1;
}
//UDP<44><50><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void ptz_update_fifo_write_data()
{
//<2F><>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memset(&urfb[ptz_update_fifo_write_addr], 0, sizeof(urfb[ptz_update_fifo_write_addr]));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
memcpy(&urfb[ptz_update_fifo_write_addr], &udrb, sizeof(udrb));
ptz_update_fifo_write_addr = ptz_update_fifo_addring(ptz_update_fifo_write_addr);
}
//UDP<44><50><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static UpdateRecvFifoBuff ptz_update_fifo_read_data()
{
UpdateRecvFifoBuff fifo_data;
fifo_data = urfb[ptz_update_fifo_read_addr];
ptz_update_fifo_read_addr = ptz_update_fifo_addring(ptz_update_fifo_read_addr);
return fifo_data;
}
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static unsigned short int ptz_update_calc_frame_crc16( unsigned char *PuchMsg,unsigned int usDataLen)
{
unsigned char uch_crc_h; //high byte of CRC initialized
unsigned char uch_crc_l; //low byte of CRC initialized
unsigned short int uIndex; //will index into CRC lookup table
uch_crc_h=0xFF;
uch_crc_l=0xFF;
while(usDataLen--)
{
//calculate the CRC
uIndex = uch_crc_h^(unsigned char)(*PuchMsg++);
uch_crc_h = uch_crc_l^auch_crc_h[uIndex];
uch_crc_l = auch_crc_l[uIndex];
}
return(uch_crc_h <<8|uch_crc_l);
}
//Ӧ<><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭд<C6AC><D0B4>Ƭ<EFBFBD><C6AC>flash<73><68><EFBFBD><EFBFBD><EFBFBD>ռ<D5BC>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȱ<EFBFBD><C8B1><EFBFBD><EFBFBD><EFBFBD>
//request<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>frame<6D><65>Ҫд<D2AA><D0B4><EFBFBD>ķ<EFBFBD>Ƭ
static BOOL ptz_update_write_frame_to_flash_buff(UpdateRequest *request, UpdateData *frame)
{
u_int32_t offset = UPDATE_FLASH_BUFF_BEGIN_ADDR + request->frame_len * frame->index;
if((offset + frame->data_len) > UPDATE_FLASH_BUFF_END_ADDR)
return FALSE;
Flash_Write_MorePage(frame->data, offset, frame->data_len);
return TRUE;
}
//<2F><><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC>flashӦ<68><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ䣬total_len<65><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
static BOOL ptz_update_erase_flash_buff(unsigned int total_len)
{
int i = 0;
int block_count = total_len / Flash_BLOCKBYTE_LENGTH;
if(total_len>UPDATE_FLASH_BUFF_SIZE)
return FALSE;
if(total_len % Flash_BLOCKBYTE_LENGTH)
block_count++;
feeddog_num = 0;
for(i = 0; i<block_count; i++)
{
Flash_Erase_Block(UPDATE_FLASH_BUFF_BEGIN_BLOCK + i);
feeddog_num = feeddog_num + 1;
if(feeddog_num % 2 == 0)
{
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
}
}
feeddog_num = 0;
return TRUE;
}
//<2F><>ʼ<EFBFBD><CABC>frame_bit_map<61><70><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static int ptz_update_init_frame_bit_map(int frame_count)
{
int byte_count = frame_count / BITS_PER_UNIT;
if(frame_count % BITS_PER_UNIT)
byte_count++;
if(byte_count > sizeof(update_frame_bit_map))
{
return 0;
}
else
{
update_bit_map_count = frame_count;
update_byte_map_count = byte_count;
memset(update_frame_bit_map, 0, sizeof(update_frame_bit_map));
return update_byte_map_count;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊindex<65><78>֡<EFBFBD><D6A1>Ӧ<EFBFBD><D3A6>bit_map
static BOOL ptz_update_set_frame_bit_map(int index)
{
if(index > update_bit_map_count)//index<65>Ǵ<EFBFBD>0<EFBFBD><30>ʼ<EFBFBD><CABC>
return FALSE;
int byte_offset = index / BITS_PER_UNIT;
int bit_offset = index % BITS_PER_UNIT;
update_frame_bit_map[byte_offset] |= (0x01<<bit_offset);
return TRUE;
}
//<2F><><EFBFBD><EFBFBD>bit_map<61><70><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>max_count<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>
static BOOL ptz_update_get_upgrade_retrans_table(UpdateRequest *request_info, UpdateRetransTable *table, int max_count)
{
int byte_offset = 0;
int bit_offset = 0;
int index = 0;
table->count = 0;
memset(update_retrans_table_buff, 0, sizeof(update_retrans_table_buff));
for(byte_offset= 0; byte_offset < update_byte_map_count; byte_offset++)
{
for(bit_offset = 0; bit_offset < BITS_PER_UNIT; bit_offset++)
{
if(((0x01 << bit_offset) & update_frame_bit_map[byte_offset]) == 0) //<2F><>֡δ<D6A1>ɹ<EFBFBD><C9B9>յ<EFBFBD>
{
if(table->count >= max_count) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return FALSE;
table->index[table->count] = index;
table->count++;
}
index++;
if(index >= request_info->frame_count)
return TRUE;
}
}
return TRUE;
}
static void ptz_update_CRC16_init(CPU_INT16U *crc16)
{
*crc16 = 0xFFFF;
}
static CPU_INT16U ptz_update_CRC16( CPU_INT08U *PuchMsg,CPU_INT32U usDataLen)
{
CPU_INT08U uchCRCHi; //high byte of CRC initialized
CPU_INT08U uchCRCLo; //low byte of CRC initialized
CPU_INT16U uIndex; //will index into CRC lookup table
uchCRCHi=0xFF;
uchCRCLo=0xFF;
while(usDataLen--)
{
//calculate the CRC
uIndex = uchCRCHi^(CPU_INT08U)(*PuchMsg++);
uchCRCHi = uchCRCLo^auch_crc_h[uIndex];
uchCRCLo = auch_crc_l[uIndex];
}
return(uchCRCHi <<8|uchCRCLo);
}
static void ptz_update_CRC16_update(CPU_INT16U *crc16, CPU_INT08U *PuchMsg,CPU_INT32U usDataLen)
{
CPU_INT08U uchCRCHi; //high byte of CRC initialized
CPU_INT08U uchCRCLo; //low byte of CRC initialized
CPU_INT16U uIndex; //will index into CRC lookup table
uchCRCHi = (*crc16) >> 8;
uchCRCLo = (*crc16) & 0xFF;
while(usDataLen--)
{
uIndex = uchCRCHi^(CPU_INT08U)(*PuchMsg++);
uchCRCHi = uchCRCLo^auch_crc_h[uIndex];
uchCRCLo = auch_crc_l[uIndex];
}
*crc16 = (uchCRCHi <<8|uchCRCLo);
}
static u_int16_t _flash_buff_crc16(u_int32_t offset, u_int32_t len)
{
u_int16_t ret;
u_int32_t read_len;
ptz_update_CRC16_init(&ret);
feeddog_num = 0;
while(len)
{
if(len > sizeof(flash_read_buff))
read_len = sizeof(flash_read_buff);
else
read_len = len;
Flash_Read(flash_read_buff, offset, read_len);
ptz_update_CRC16_update(&ret, flash_read_buff, read_len);
len -= read_len;
offset += read_len;
feeddog_num = feeddog_num + 1;
if(feeddog_num % 20 == 0)
{
OSTimeDlyHMSM(0u, 0u, 0u, 5u);
}
}
feeddog_num = 0;
return ret;
}
//<2F><><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC>flash<73><68><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC>е<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CRC<52>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
//total_len<65><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2>crc16
static BOOL ptz_update_flash_buff_file_crc_OK(u_int32_t total_len)
{
u_int16_t crc_calc = 0;
u_int16_t crc_read = 0;
if(total_len < sizeof(crc_calc))
return FALSE;
crc_calc = flash_buff_crc16(total_len-2);
Flash_Read((u_int8_t *)&crc_read, UPDATE_FLASH_BUFF_BEGIN_ADDR + total_len - sizeof(crc_calc), sizeof(crc_calc));
return crc_calc == crc_read;
}
void ptz_update_complete_frame_packet(UpdateFrame *pack)
{
pack->frame_type = UPDATE_FRAME_TYPE_SEND;
*(u_int16_t *)(&pack->data[pack->data_len]) = ptz_update_CRC16((u_int8_t *)pack, UPDATE_FRAME_SIZE(pack) - sizeof(u_int16_t));
}
//<2F><><EFBFBD><EFBFBD>chcksum
static u_int8_t ptz_check_sum(u_int8_t *p, int len)
{
u_int8_t ret = 0;
int i = 0;
for(; i<len; i++)
{
ret += p[i];
}
return (~ret)+1;
}
//<2F><><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>checksum
static u_int8_t ptz_update_file_head_checksum_OK(UpdateFileHead *file_head)
{
return ptz_check_sum((u_int8_t *)file_head, (u_int8_t *)(&file_head->head_checksum) - (u_int8_t *)file_head)
== file_head->head_checksum;
}
//У<><D0A3>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><E6B4A2><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static BOOL ptz_update_file_head_verify(u_int32_t total_len, UpdateFileHead *file_head)
{
Flash_Read((u_int8_t *)file_head, UPDATE_FLASH_BUFF_BEGIN_ADDR, sizeof(*file_head));
//<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>checksum
if(!ptz_update_file_head_checksum_OK(file_head))
return FALSE;
//<2F><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>ȷ<EFBFBD><C8B7>
if(file_head->data_len != (total_len - sizeof(u_int16_t) - sizeof(*file_head)))
return FALSE;
//<2F><>ʼ<EFBFBD><CABC>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
if(file_head->flag != UPDATE_RELEASE_FILE_FLAG)
return FALSE;
//ͷ<><CDB7><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD>
if(file_head->head_len != sizeof(*file_head))
return FALSE;
//<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD> boot app cert key cfg_file
if((file_head->file_type != UPDATE_FILE_TYPE_NW_INFO) && (file_head->file_type != UPDATE_FILE_TYPE_APP) && (file_head->file_type != UPDATE_FILE_TYPE_BOOT_LOADER) && (file_head->file_type != UPDATE_FILE_TYPE_CERT) && (file_head->file_type != UPDATE_FILE_TYPE_PUB_KEY)&& (file_head->file_type != UPDATE_FILE_TYPE_CFG_FILE) && ((file_head->file_type != UPDATE_FILE_TYPE_CFG_IP)))
return FALSE;
//<2F>ļ<EFBFBD><C4BC><EFBFBD>ʽ<EFBFBD>
if(file_head->file_format_ver != 1)
return FALSE;
if(file_head->file_type == UPDATE_FILE_TYPE_APP){ //App
//<2F><>д<EFBFBD><D0B4>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
if(file_head->addr < (UPDATE_APP_ADDR_BEGIN - APP_ADD_BEGIN_OFFEST))
return FALSE;
//<2F>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
if((file_head->addr + file_head->data_len) > (UPDATE_APP_ADDR_END - APP_ADD_BEGIN_OFFEST))
return FALSE;
}else if(file_head->file_type == UPDATE_FILE_TYPE_BOOT_LOADER){ //Bootloader
//<2F><>д<EFBFBD><D0B4>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
if(file_head->addr != 0) //bootloader<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><30><CEAA>ʼ<EFBFBD><CABC>ַ
return FALSE;
//<2F>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
if((file_head->addr + file_head->data_len) > UPDATE_BOOTLOADER_ADDR_END)
return FALSE;
}else if(file_head->file_type == UPDATE_FILE_TYPE_CERT){//CERT
//<2F><>д<EFBFBD><D0B4>ַ
if(file_head->addr < UPDATE_CERT_ADDR_BEGIN)
return FALSE;
//<2F>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
if((file_head->addr + file_head->data_len) > UPDATE_CERT_ADDR_END)
return FALSE;
}else if(file_head->file_type == UPDATE_FILE_TYPE_PUB_KEY){//KEY
//<2F><>д<EFBFBD><D0B4>ַ
if(file_head->addr < UPDATE_KEY_ADDR_BEGIN)
return FALSE;
//<2F>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
if((file_head->addr + file_head->data_len) > UPDATE_KEY_ADDR_END)
return FALSE;
}else if(file_head->file_type == UPDATE_FILE_TYPE_CFG_FILE){//CFG FILE
//<2F><>д<EFBFBD><D0B4>ַ
if(file_head->addr < UPDATE_CFG_FILE_ADDR_BEGIN)
return FALSE;
//<2F>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
if((file_head->addr + file_head->data_len) > UPDATE_CFG_FILE_ADDR_END)
return FALSE;
}else if (file_head->file_type == UPDATE_FILE_TYPE_CFG_IP){//CFG IP
//<2F><>д<EFBFBD><D0B4>ַ
if(file_head->addr < UPDATE_CFG_IP_ADDR_BEGIN)
return FALSE;
//<2F>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
if((file_head->addr + file_head->data_len) > UPDATE_CFG_IP_ADDR_END)
return FALSE;
}else if (file_head->file_type == UPDATE_FILE_TYPE_NW_INFO){//NW INFO
//<2F><>д<EFBFBD><D0B4>ַ
if(file_head->addr < UPDATE_CFG_NW_INFO_ADDR_BEGIN)
return FALSE;
//<2F>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
if((file_head->addr + file_head->data_len) > UPDATE_CFG_NW_INFO_ADDR_END)
return FALSE;
}
return TRUE;
}
//<2F><><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC>rom<6F>еĴ洢<C4B4>ռ<EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>app/bootloader<65><72><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC>flash.
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cert--/key/cfgƬ<67><C6AC>flash
static BOOL ptz_update_program_flash_erase(UpdateFileHead *file_head)
{
//int i = 0;
u_int32_t total_len = file_head->data_len;
//int sector_begin = file_head->addr / UPDATE_ON_CHIP_FLASH_SECTOR_SIZE;
//int sector_count = total_len / UPDATE_ON_CHIP_FLASH_SECTOR_SIZE;
if(file_head->file_type == UPDATE_FILE_TYPE_APP)
{
if((file_head->addr + total_len) > UPDATE_APP_ADDR_END)
{
return FALSE;
}
// return TRUE;
if(1 == OnChip_Flash_erase_sector(APP_PKG_HEAD_SECTOR_BEGIN))
{
term_printf("\n <20><><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC>romʧ<6D>ܣ<EFBFBD>APP_PKG_HEAD_SECTOR_BEGIN \r\n");
return FALSE;
}
if(1 == OnChip_Flash_erase_sector(CTL_SECTOR_NUMBER_4))
{
term_printf("\n <20><><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC>romʧ<6D>ܣ<EFBFBD>CTL_SECTOR_NUMBER_4 \r\n");
return FALSE;
}
if(1 == OnChip_Flash_erase_sector(CTL_SECTOR_NUMBER_5))
{
term_printf("\n <20><><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC>romʧ<6D>ܣ<EFBFBD>CTL_SECTOR_NUMBER_5 \r\n");
return FALSE;
}
// OnChip_Flash_erase_sector(UPDATE_APP_PKG_HEAD_SECTOR_BEGIN);//ͬʱΪ<CAB1><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>Ϣɾ<CFA2><C9BE>һ<EFBFBD><D2BB>sector
// if(total_len % UPDATE_ON_CHIP_FLASH_SECTOR_SIZE)
// sector_count++;
//
// for(i = 0; i<sector_count; i++){
// OnChip_Flash_erase_sector(sector_begin + i);
// }
}
else if(file_head->file_type == UPDATE_FILE_TYPE_PUB_KEY)
{
if((file_head->addr + total_len) > UPDATE_KEY_ADDR_END)
return FALSE;
Flash_Erase_Sector(UPDATE_EXT_FLASH_BLOCK_NUM,UPDATE_KEY_HEAD_SECTOR_BEGIN);
Flash_Erase_Sector(UPDATE_EXT_FLASH_BLOCK_NUM,UPDATE_KEY_SECTOR_BEGIN);
}
else if(file_head->file_type == UPDATE_FILE_TYPE_CERT)
{
if((file_head->addr + total_len) > UPDATE_CERT_ADDR_END)
return FALSE;
Flash_Erase_Sector(UPDATE_EXT_FLASH_BLOCK_NUM,UPDATE_CERT_HEAD_SECTOR_BEGIN);
Flash_Erase_Sector(UPDATE_EXT_FLASH_BLOCK_NUM,UPDATE_CERT_SECTOR_BEGIN);
}
else if(file_head->file_type == UPDATE_FILE_TYPE_CFG_FILE)
{
if((file_head->addr + total_len) > UPDATE_CFG_FILE_ADDR_END)
return FALSE;
Flash_Erase_Sector(UPDATE_EXT_FLASH_BLOCK_NUM,UPDATE_CFG_FILE_HEAD_SECTOR_BEGIN);
Flash_Erase_Sector(UPDATE_EXT_FLASH_BLOCK_NUM,UPDATE_CFG_FILE_SECTOR_BEGIN);
}
else if(file_head->file_type == UPDATE_FILE_TYPE_CFG_IP)
{//ip<69><70><EFBFBD><EFBFBD>
if((file_head->addr + total_len) > UPDATE_CFG_IP_ADDR_END)
return FALSE;
Flash_Erase_Sector(UPDATE_EXT_FLASH_BLOCK_NUM16,UPDATE_CFG_IP_HEAD_SECTOR_BEGIN);
Flash_Erase_Sector(UPDATE_EXT_FLASH_BLOCK_NUM16,UPDATE_CFG_IP_SECTOR_BEGIN);
}
else if(file_head->file_type == UPDATE_FILE_TYPE_NW_INFO)
{//<2F><><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD>Ϣ
if((file_head->addr + total_len) > UPDATE_CFG_NW_INFO_ADDR_END)
return FALSE;
Flash_Erase_Sector(UPDATE_EXT_FLASH_BLOCK_NUM16,UPDATE_CFG_NW_INFO_HEAD_SECTOR_BEGIN);
Flash_Erase_Sector(UPDATE_EXT_FLASH_BLOCK_NUM16,UPDATE_CFG_NW_INFO_SECTOR_BEGIN);
Flash_Erase_Sector(UPDATE_EXT_FLASH_BLOCK_NUM16,UPDATE_CFG_NW_INFO_SECTOR_BEGIN+1);
}
return TRUE;
}
//app/booter<65><72>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8>Ƶ<EFBFBD>Ƭ<EFBFBD><C6AC>rom
//cert/key/cfg_file <20><>Ƭ<EFBFBD><EFBFBD><E2BBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static BOOL ptz_update_program_flash_copy(UpdateFileHead *file_head)
{
u_int32_t read_len;
u_int32_t read_addr = UPDATE_FLASH_BUFF_BEGIN_ADDR + file_head->head_len;
u_int32_t len = file_head->data_len + sizeof(u_int16_t); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2>crc16
// u_int32_t write_addr = file_head->addr;
u_int32_t write_addr = APP_ADDR_BEGIN;
char erase_state=0;
if (file_head->file_type == UPDATE_FILE_TYPE_APP)
{//Ӧ<>ó<EFBFBD><C3B3><EFBFBD>
// return TRUE;
while(len)
{//д<><D0B4><EFBFBD><EFBFBD>
if(erase_state == 0)
{
erase_state++;
if(1 == OnChip_Flash_erase_sector(CTL_SECTOR_NUMBER_4))
{
term_printf("\n <20><><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC>romʧ<6D>ܣ<EFBFBD>CTL_SECTOR_NUMBER_4 \r\n");
return FALSE;
}
}
if(len > sizeof(flash_read_buff))
{
read_len = sizeof(flash_read_buff);
}else{
read_len = len;
}
memset(flash_read_buff,0,sizeof(flash_read_buff));
Flash_Read(flash_read_buff, read_addr, read_len);
// FeedDog();
// term_printf("\n <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ɹ<EFBFBD>,<2C><>ַwrite_addr = %d \r\n",flash_read_buff);
if(OnChip_Flash_write_byte(write_addr, read_len, flash_read_buff) != 0)
{
term_printf("\n <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ʧ<EFBFBD><CAA7>,<2C><>ַwrite_addr = \r\n",write_addr);
return FALSE;
}
OnChip_Flash_read_in_add(write_addr, read_len, (uint8_t*)&flash_read_buff3);
if (memcmp(flash_read_buff, flash_read_buff3, read_len) != 0)
{
term_printf("\n write rom error to different \r\n");
return FALSE;
}
len -= read_len;
read_addr += read_len;
write_addr += read_len;
if(erase_state == 1 && write_addr >= 0x801FFFF)
{
erase_state++;
if(1 == OnChip_Flash_erase_sector(CTL_SECTOR_NUMBER_5))
{
term_printf("\n <20><><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC>romʧ<6D>ܣ<EFBFBD>CTL_SECTOR_NUMBER_5 \r\n");
return FALSE;
}
}
}
term_printf("\n <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ɹ<EFBFBD>,<2C><>ַwrite_addr = %d \r\n",write_addr);
// if(write_addr >= 0x8040c00)
// {
// term_printf("\n write_addr == 0x8040c00 \r\n");
// }
// OnChip_Flash_erase_sector(APP_PKG_HEAD_SECTOR_BEGIN);
if (OnChip_Flash_write_byte(APP_PKG_HEAD_BEGIN, sizeof(*file_head), (u_int8_t *)file_head) != 0)//дͷ
{
term_printf("\n <20>ļ<EFBFBD>ͷд<CDB7><D0B4>ʧ<EFBFBD><CAA7>,<2C><>ַwrite_addr = \r\n",APP_PKG_HEAD_BEGIN);
return FALSE;
}
}
else
{
feeddog_num = 0;
while(len)
{
if(len > sizeof(flash_read_buff))
read_len = sizeof(flash_read_buff);
else
read_len = len;
Flash_Read(flash_read_buff, read_addr, read_len);
Flash_Write_Page(flash_read_buff,write_addr,read_len);
len -= read_len;
read_addr += read_len;
write_addr += read_len;
feeddog_num = feeddog_num + 1;
if(feeddog_num % 20 == 0)
{
OSTimeDlyHMSM(0u, 0u, 0u, 5u);
}
}
feeddog_num = 0;
if (file_head->file_type == UPDATE_FILE_TYPE_PUB_KEY)
{//<2F><>Կ
Flash_Write_Page((u_int8_t *)file_head,UPDATE_KEY_HEAD_BEGIN,sizeof(*file_head));
}
else if(file_head->file_type == UPDATE_FILE_TYPE_CERT)
{//֤<><D6A4>
Flash_Write_Page((u_int8_t *)file_head,UPDATE_CERT_HEAD_BEGIN,sizeof(*file_head));
}
else if(file_head->file_type == UPDATE_FILE_TYPE_CFG_FILE)
{//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
Flash_Write_Page((u_int8_t *)file_head,UPDATE_CFG_FILE_HEAD_BEGIN,sizeof(*file_head));
}
else if(file_head->file_type == UPDATE_FILE_TYPE_CFG_IP)
{//IP<49><50><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
Flash_Write_Page((u_int8_t *)file_head,UPDATE_CFG_IP_HEAD_BEGIN,sizeof(*file_head));
}
else if(file_head->file_type == UPDATE_FILE_TYPE_NW_INFO)
{//<2F><><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>
Flash_Write_Page((u_int8_t *)file_head,UPDATE_CFG_NW_INFO_HEAD_BEGIN,sizeof(*file_head));
}
}
return TRUE;
}
//У<><D0A3><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Ƭ<EFBFBD><C6AC>rom<6F><6D>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>
//ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC>flash<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>Ƚϵķ<CFB5>ʽУ<CABD><D0A3>
static BOOL ptz_update_program_app_verify(u_int8_t file_type)
{
u_int32_t read_len, len;
u_int32_t read_addr = UPDATE_FLASH_BUFF_BEGIN_ADDR + sizeof(UpdateFileHead);
static UpdateFileHead file_head;
static UpdateFileHead file_head2;
u_int32_t app_addr = 0;
memset(&file_head, 0, sizeof(file_head));
//<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ͷ<EFBFBD><CDB7>Ϣ
if (file_type == UPDATE_FILE_TYPE_APP)
{//APP
app_addr = UPDATE_APP_ADDR_BEGIN;
Flash_Read((u_int8_t *)&file_head, UPDATE_FLASH_BUFF_BEGIN_ADDR, sizeof(file_head));
if(memcmp(&file_head, (u_int8_t *)UPDATE_APP_PKG_HEAD_BEGIN, sizeof(file_head)) != 0)
return FALSE;
len = file_head.data_len + sizeof(u_int16_t); //У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>crc16<31><36><EFBFBD><EFBFBD>
while(len){
if(len > sizeof(flash_read_buff))
read_len = sizeof(flash_read_buff);
else
read_len = len;
Flash_Read(flash_read_buff, read_addr, read_len);
if(memcmp(flash_read_buff, (u_int8_t *)app_addr, read_len) != 0)
return FALSE;
len -= read_len;
read_addr += read_len;
app_addr += read_len;
}
return TRUE;
}
else
{
if (file_type == UPDATE_FILE_TYPE_CERT)
{//CERT
app_addr = UPDATE_CERT_ADDR_BEGIN;
Flash_Read((u_int8_t *)&file_head, UPDATE_FLASH_BUFF_BEGIN_ADDR, sizeof(file_head));
Flash_Read((u_int8_t *)&file_head2, UPDATE_CERT_HEAD_BEGIN, sizeof(file_head2));
if(memcmp(&file_head,&file_head2, sizeof(file_head)) != 0)
return FALSE;
}
else if(file_type == UPDATE_FILE_TYPE_PUB_KEY)
{
app_addr = UPDATE_KEY_ADDR_BEGIN;
Flash_Read((u_int8_t *)&file_head, UPDATE_FLASH_BUFF_BEGIN_ADDR, sizeof(file_head));
Flash_Read((u_int8_t *)&file_head2, UPDATE_KEY_HEAD_BEGIN, sizeof(file_head2));
if (memcmp(&file_head,&file_head2, sizeof(file_head)) != 0)
return FALSE;
}
else if(file_type ==UPDATE_FILE_TYPE_CFG_FILE)
{
app_addr = UPDATE_CFG_FILE_ADDR_BEGIN;
Flash_Read((u_int8_t *)&file_head, UPDATE_FLASH_BUFF_BEGIN_ADDR, sizeof(file_head));
Flash_Read((u_int8_t *)&file_head2, UPDATE_CFG_FILE_HEAD_BEGIN, sizeof(file_head2));
if (memcmp(&file_head,&file_head2, sizeof(file_head)) != 0)
return FALSE;
}
else if(file_type ==UPDATE_FILE_TYPE_CFG_IP)
{
app_addr = UPDATE_CFG_IP_ADDR_BEGIN;
Flash_Read((u_int8_t *)&file_head, UPDATE_FLASH_BUFF_BEGIN_ADDR, sizeof(file_head));
Flash_Read((u_int8_t *)&file_head2, UPDATE_CFG_IP_HEAD_BEGIN, sizeof(file_head2));
if (memcmp(&file_head,&file_head2, sizeof(file_head)) != 0)
return FALSE;
}
else if(file_type ==UPDATE_FILE_TYPE_NW_INFO)
{
app_addr = UPDATE_CFG_NW_INFO_ADDR_BEGIN;
Flash_Read((u_int8_t *)&file_head, UPDATE_FLASH_BUFF_BEGIN_ADDR, sizeof(file_head));
Flash_Read((u_int8_t *)&file_head2, UPDATE_CFG_NW_INFO_HEAD_BEGIN, sizeof(file_head2));
if (memcmp(&file_head,&file_head2, sizeof(file_head)) != 0)
return FALSE;
}
len = file_head.data_len + sizeof(u_int16_t); //У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>crc16<31><36><EFBFBD><EFBFBD>
feeddog_num = 0;
while(len)
{
if(len > sizeof(flash_read_buff))
read_len = sizeof(flash_read_buff);
else
read_len = len;
Flash_Read(flash_read_buff, read_addr, read_len);
Flash_Read(flash_read_buff2,app_addr,read_len);
if(memcmp(flash_read_buff,flash_read_buff2, read_len) != 0)
return FALSE;
len -= read_len;
read_addr += read_len;
app_addr += read_len;
feeddog_num = feeddog_num + 1;
if(feeddog_num % 20 == 0)
{
OSTimeDlyHMSM(0u, 0u, 0u, 5u);
}
}
feeddog_num = 0;
}
return TRUE;
}
//У<><EFBFBD><E9B2A2>Ƭ<EFBFBD><C6AC>flash<73>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>App<70><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Ƭ<EFBFBD><C6AC>rom<6F><6D>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
static BOOL ptz_update_program_file(u_int32_t total_len)
{
static UpdateFileHead file_head;
memset(&file_head, 0, sizeof(file_head));
Flash_Read((u_int8_t *)&file_head, UPDATE_FLASH_BUFF_BEGIN_ADDR, sizeof(file_head));
if(!ptz_update_file_head_verify(total_len, &file_head))
return FALSE;
if((file_head.file_type == UPDATE_FILE_TYPE_NW_INFO) ||
(file_head.file_type == UPDATE_FILE_TYPE_APP) ||
(file_head.file_type == UPDATE_FILE_TYPE_PUB_KEY) ||
(file_head.file_type == UPDATE_FILE_TYPE_CERT) ||
(file_head.file_type == UPDATE_FILE_TYPE_CFG_FILE) ||
(file_head.file_type == UPDATE_FILE_TYPE_CFG_IP))
{
if(!ptz_update_program_flash_erase(&file_head))
return FALSE;
if(!ptz_update_program_flash_copy(&file_head))
return FALSE;
if(!ptz_update_program_app_verify(file_head.file_type))
return FALSE;
}else //<2F><><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
return FALSE;
return TRUE;
}
static BOOL ptz_update_burn_bootloader(u_int32_t total_len)
{
static UpdateFileHead file_head;
memset(&file_head, 0, sizeof(file_head));
Flash_Read((u_int8_t *)&file_head, UPDATE_FLASH_BUFF_BEGIN_ADDR, sizeof(file_head));
if(file_head.file_type == UPDATE_FILE_TYPE_BOOT_LOADER)
{
if(!ptz_update_file_head_verify(total_len, &file_head))
return FALSE;
// if(!ptz_update_bootloader_flash_erase(&file_head))
// return FALSE;
//
// if(!ptz_update_bootloader_flash_copy(&file_head))
// return FALSE;
//
// if(!ptz_update_bootloader_verify())
// return FALSE;
}else
//<2F><><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
return FALSE;
return TRUE;
}
//<2F><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>
static void ptz_send_update_reply(unsigned char pack_type, const void *data, int len)
{
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ָ<EFBFBD><D6B8>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
UpdateFrame *pack = (UpdateFrame *)udsb.data_buff;
//<2F>Է<EFBFBD><D4B7>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
memset(&udsb, 0, sizeof(udsb));
//<2F><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>
pack->flag = UPDATE_FRAME_HEAD_FLAG;//֡ͷ
pack->data_len = len;//<2F><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
if(data && (len > 0))//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(pack->data, data, len);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(pack->id, system_info.cmd_id, sizeof(pack->id));//<2F><><EFBFBD><EFBFBD><EFBFBD>豸ID
pack->frame_type = UPDATE_FRAME_TYPE_SEND;
pack->pack_type = pack_type;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0>ܳ<EFBFBD><DCB3><EFBFBD>
udsb.data_len = UPDATE_FRAME_SIZE(pack);
ptz_update_complete_frame_packet(pack);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BSP_OS_SemWait(&udp_send_data_mutex, 0u);
if(ptz_update_communicaton == PTZ_CONNECT_STATE_SUCCESS){
int ret = sendto(ptz_update_fd, pack, udsb.data_len, 0, (struct sockaddr*)&ptz_update_from, ptz_update_fromlen);
if(ret == -1){
ptz_update_communicaton = PTZ_CONNECT_STATE_FAILED;
close(ptz_update_fd);
}
}
BSP_OS_SemPost(&udp_send_data_mutex);
}
//<2F><>̨<EFBFBD><CCA8>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ptz_send_update_reply(UPDATE_FRAME_TYPE_KEEP_ALIVE, NULL, 0);
static void ptz_send_update_heartbeat()
{
int ret;
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ָ<EFBFBD><D6B8>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
UpdateFrame *pack = (UpdateFrame *)udsb.data_buff;
//<2F>Է<EFBFBD><D4B7>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
memset(&udsb, 0, sizeof(udsb));
//<2F><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>
pack->flag = UPDATE_FRAME_HEAD_FLAG;//֡ͷ
pack->data_len = 0;//<2F><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
memcpy(pack->id, system_info.cmd_id, sizeof(pack->id));//<2F><><EFBFBD><EFBFBD><EFBFBD>豸ID
pack->frame_type = UPDATE_FRAME_TYPE_SEND;
pack->pack_type = UPDATE_FRAME_TYPE_KEEP_ALIVE;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0>ܳ<EFBFBD><DCB3><EFBFBD>
udsb.data_len = UPDATE_FRAME_SIZE(pack);
ptz_update_complete_frame_packet(pack);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BSP_OS_SemWait(&udp_send_data_mutex, 0u);
if(ptz_update_communicaton == PTZ_CONNECT_STATE_SUCCESS)
{
ret = sendto(ptz_update_fd, pack, udsb.data_len, 0, (struct sockaddr*)&ptz_update_serv_a, ptz_update_servlen_a);
if(ret == -1){
ptz_update_communicaton = PTZ_CONNECT_STATE_FAILED;
close(ptz_update_fd);
BSP_OS_SemPost(&udp_send_data_mutex);
return;
}
ret = sendto(ptz_update_fd, pack, udsb.data_len, 0, (struct sockaddr*)&ptz_update_serv_b, ptz_update_servlen_b);
if(ret == -1){
ptz_update_communicaton = PTZ_CONNECT_STATE_FAILED;
close(ptz_update_fd);
BSP_OS_SemPost(&udp_send_data_mutex);
return;
}
ret = sendto(ptz_update_fd, pack, udsb.data_len, 0, (struct sockaddr*)&ptz_update_serv_c, ptz_update_servlen_c);
if(ret == -1){
ptz_update_communicaton = PTZ_CONNECT_STATE_FAILED;
close(ptz_update_fd);
BSP_OS_SemPost(&udp_send_data_mutex);
return;
}
ret = sendto(ptz_update_fd, pack, udsb.data_len, 0, (struct sockaddr*)&ptz_update_serv_d, ptz_update_servlen_d);
if(ret == -1){
ptz_update_communicaton = PTZ_CONNECT_STATE_FAILED;
close(ptz_update_fd);
BSP_OS_SemPost(&udp_send_data_mutex);
return;
}
}
BSP_OS_SemPost(&udp_send_data_mutex);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>
static void ptz_update_rece_data_task()
{
while(1)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
if(ptz_update_communicaton != PTZ_CONNECT_STATE_SUCCESS)
{
ptz_update_fd = CreateUDPClientSock();
if(ptz_update_fd != -1)
{
// <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ip<69>Ͷ˿ں<CBBF>
memset(&ptz_update_from, 0, sizeof(struct sockaddr_in));
ptz_update_local.sin_family = PF_INET;
// <20><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
ptz_update_local.sin_port = htons(PTZ_UPDATE_PORT);
ptz_update_local.sin_addr.s_addr = INADDR_ANY;
ptz_update_fromlen = sizeof(ptz_update_from);
if(0!=bind(ptz_update_fd,(struct sockaddr*)&ptz_update_local,sizeof(ptz_update_local)))
{
close(ptz_update_fd);
}
else
{
ptz_update_communicaton = PTZ_CONNECT_STATE_SUCCESS;
}
}
else
{
ptz_update_communicaton = PTZ_CONNECT_STATE_FAILED;
close(ptz_update_fd);
}
}
if(ptz_update_communicaton == PTZ_CONNECT_STATE_SUCCESS)
{
memset(&udrb, 0, sizeof(udrb));//'\0'
udrb.data_len =
recvfrom(ptz_update_fd, udrb.data_buff, sizeof(udrb.data_buff), 0, (struct sockaddr*)&ptz_update_from, &ptz_update_fromlen);
if (udrb.data_len >0)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><E6B5BD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>
ptz_update_fifo_write_data();
}
else
{
ptz_update_communicaton = PTZ_CONNECT_STATE_FAILED;
close(ptz_update_fd);
}
}
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
}
}
//<2F><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
static void ptz_update_data_process_task()
{
static char info_str[256];
static char kh = 0;
int count = 0;
static UpdateFrame* update_frame = (UpdateFrame *)udpb.data_buff;//<2F><><EFBFBD><EFBFBD>֡
static UpdateRequest request_info;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static UpdateData* update_data = NULL;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static unsigned char update_active_connect_switch = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>
static unsigned int update_active_connect_timer = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˼<EFBFBD>ʱ
while(1)
{
#if 1
//<2F>ж<EFBFBD>ѭ<EFBFBD><D1AD>buff<66><66><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(ptz_update_fifo_read_addr != ptz_update_fifo_write_addr)
{
memset(&udpb, 0, sizeof(udpb));
//<2F><>ѭ<EFBFBD><D1AD>buff<66><66>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// udpb = ptz_update_fifo_read_data();
udpb = urfb[ptz_update_fifo_read_addr];
ptz_update_fifo_read_addr = ptz_update_fifo_addring(ptz_update_fifo_read_addr);
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(ptz_update_calc_frame_crc16(udpb.data_buff, udpb.data_len - 2) ==
UPDATE_FRAME_GET_CRC16(update_frame)) //<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ÿһ֡<D2BB><D6A1>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
{
if(update_frame->frame_type == UPDATE_FRAME_TYPE_RECE &&//<2F>ж<EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
update_frame->flag == UPDATE_FRAME_HEAD_FLAG)//<2F>ж<EFBFBD>֡ͷ<D6A1>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
{
switch(update_frame->pack_type)
{
case UPDATE_FRAME_TYPE_KEEP_ALIVE: //0X01 <20><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ptz_send_update_reply(UPDATE_FRAME_TYPE_KEEP_ALIVE, NULL, 0);
break;
case UPDATE_FRAME_TYPE_GET_DEVICE_INFO: //0X02 <20><><EFBFBD>ڻ<EFBFBD>ȡ<EFBFBD><EFBFBD><E8B1B8>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><E6B1BE>
memset((u_int8_t *)&ptz_update_file_head_inf, 0, sizeof(ptz_update_file_head_inf));
memcpy((u_int8_t *)&ptz_update_file_head_inf, (u_int8_t *)UPDATE_APP_PKG_HEAD, sizeof(ptz_update_file_head_inf));
//У<><D0A3><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC>û<EFBFBD><C3BB>ͷ<EFBFBD><CDB7>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ʼֵ
//<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>checksum
if(!ptz_update_file_head_checksum_OK(&ptz_update_file_head_inf))
{
ptz_update_file_head_inf.hardware_type[0] = HARD_WARE_TYPE_DEFAULT_K;
ptz_update_file_head_inf.hardware_type[1] = HARD_WARE_TYPE_DEFAULT_6;
ptz_update_file_head_inf.hardware_ver = 1;
ptz_update_file_head_inf.software_ver = 1;
ptz_update_file_head_inf.addr = 0x00010000;
}
ptz_send_update_reply(UPDATE_FRAME_TYPE_GET_DEVICE_INFO, (u_int8_t *)&ptz_update_file_head_inf, sizeof(ptz_update_file_head_inf));
break;
case UPDATE_FRAME_TYPE_RESET_DEVICE: //0X03 <20><EFBFBD><E8B1B8>λ
ptz_hori_stop(0);
ptz_vert_stop(0);
count = sprintf(info_str, "OK");
ptz_send_update_reply(UPDATE_FRAME_TYPE_RESET_DEVICE, info_str, count);
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
GD32_RESET();
break;
case UPDATE_FRAME_TYPE_BOOT_APP: //0X04 Ҫ<><D2AA><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>Ӧ<EFBFBD>ã<EFBFBD>ֱ<EFBFBD>Ӹ<EFBFBD>λ<EFBFBD><CEBB>
ptz_hori_stop(0);
ptz_vert_stop(0);
count = sprintf(info_str, "OK");
ptz_send_update_reply(UPDATE_FRAME_TYPE_BOOT_APP, info_str, count);
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
GD32_RESET();
break;
case UPDATE_FRAME_TYPE_UPGRADE_REQ: //0X05 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>upgrade_request<73>
memset(&request_info, 0, sizeof(request_info));
update_bit_map_count = 0; //<2F>ܹ<EFBFBD><DCB9>ж<EFBFBD><D0B6><EFBFBD>bit,ÿһλbit<69>洢ÿһ֡<D2BB><D6A1><EFBFBD>յ<EFBFBD>״̬
update_byte_map_count = 0;//<2F>ܹ<EFBFBD><DCB9>ж<EFBFBD><D0B6>ٸ<EFBFBD>byte<74><65><EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD>յ<EFBFBD>״̬Ҫ<CCAC>ö<EFBFBD><C3B6>ٸ<EFBFBD><D9B8>ֽ<EFBFBD>
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ͷ
memcpy(&request_info, update_frame->data, sizeof(request_info));
//<2F>жϴ洢ÿһ<C3BF><D2BB>֡<EFBFBD><D6A1>״̬<D7B4><CCAC>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>λBIT<49><54><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD><D9B8>ֽ<EFBFBD>BYTE
if(!ptz_update_init_frame_bit_map(request_info.frame_count))
{
count = sprintf(info_str, "׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>(init_frame_bit_map)<29><>");
ptz_send_update_reply(UPDATE_FRAME_TYPE_ERROR, info_str, count);
break;
}
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0>Ƿ񳬳<C7B7><F1B3ACB3><EFBFBD><E8B6A8>Ƭ<EFBFBD><C6AC>FLASH<53><EFBFBD>Ĵ<EFBFBD>С
if(!ptz_update_erase_flash_buff(request_info.total_len))
{
count = sprintf(info_str, "׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>(erase_upgrad_flash_buff)<29><>");
ptz_send_update_reply(UPDATE_FRAME_TYPE_ERROR, info_str, count);
break;
}
update_state = UPDATE_STATE_UPGRADE_DATA_TRANS;
ptz_send_update_reply(UPDATE_FRAME_TYPE_UPGRADE_REQ, &request_info, sizeof(request_info));
break;
case UPDATE_FRAME_TYPE_UPGRADE_DATE: //0X06 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>upgrade_frame<6D>
update_data = (UpdateData*)update_frame->data;
if(update_state != UPDATE_STATE_UPGRADE_DATA_TRANS)
{
count = sprintf(info_str, "<EFBFBD>豸δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
ptz_send_update_reply(UPDATE_FRAME_TYPE_ERROR, info_str, count);
break;
}
if(!ptz_update_write_frame_to_flash_buff(&request_info, update_data))
{
count = sprintf(info_str, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>");
ptz_send_update_reply(UPDATE_FRAME_TYPE_ERROR, info_str, count);
break;
}
if(!ptz_update_set_frame_bit_map(update_data->index))
{
count = sprintf(info_str, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
ptz_send_update_reply(UPDATE_FRAME_TYPE_ERROR, info_str, count);
break;
}
break;
case UPDATE_FRAME_TYPE_UPGRADE_FINISH: //0X07 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SRV->Device<63><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD>
if(update_state != UPDATE_STATE_UPGRADE_DATA_TRANS)
{
count = sprintf(info_str, "<EFBFBD>豸δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
ptz_send_update_reply(UPDATE_FRAME_TYPE_ERROR, info_str, count);
break;
}
//<2F>ж<EFBFBD><D0B6><EFBFBD>Щ֡<D0A9><D6A1><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
if(!ptz_update_get_upgrade_retrans_table(&request_info, update_retrans_table, MAX_RETRANS_TABLE_LEN))
{
count = sprintf(info_str, "׼<EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
ptz_send_update_reply(UPDATE_FRAME_TYPE_ERROR, info_str, count);
update_state = UPDATE_STATE_IDEL;
break;
}
//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD>ش<EFBFBD>
if(update_retrans_table->count > 0)
{
ptz_send_update_reply(UPDATE_FRAME_TYPE_UPGRADE_FINISH, update_retrans_table, UPDATE_RETRANS_TABLE_SIZE(update_retrans_table));
update_state = UPDATE_STATE_UPGRADE_DATA_TRANS;
break;
}
//У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
if(!ptz_update_flash_buff_file_crc_OK(request_info.total_len))
{
count = sprintf(info_str, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CRCУ<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>");
ptz_send_update_reply(UPDATE_FRAME_TYPE_ERROR, info_str, count);
update_state = UPDATE_STATE_IDEL;
break;
}
//<2F><>bootloader<65><72><EFBFBD>뵥Ƭ<EBB5A5><C6AC><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>RAM
if(request_info.file_head.file_type == UPDATE_FILE_TYPE_BOOT_LOADER)
{
// if(!ptz_update_burn_bootloader(request_info.total_len))
// {
// count = sprintf(info_str, "<22><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>!!!<21><>");
// ptz_send_update_reply(UPDATE_FRAME_TYPE_ERROR, info_str, count);
// update_state = UPDATE_STATE_IDEL;
// break;
// }
ptz_send_update_reply(UPDATE_FRAME_TYPE_UPGRADE_FINISH, update_retrans_table, UPDATE_RETRANS_TABLE_SIZE(update_retrans_table));
update_state = UPDATE_STATE_IDEL;
break;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
if(request_info.file_head.file_type != UPDATE_FILE_TYPE_BOOT_LOADER)
{
// if(!ptz_update_program_file(request_info.total_len))
// {
// count = sprintf(info_str, "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>!!!<21><>");
// ptz_send_update_reply(UPDATE_FRAME_TYPE_ERROR, info_str, count);
// update_state = UPDATE_STATE_IDEL;
// break;
// }
ptz_send_update_reply(UPDATE_FRAME_TYPE_UPGRADE_FINISH, update_retrans_table, UPDATE_RETRANS_TABLE_SIZE(update_retrans_table));
update_state = UPDATE_STATE_IDEL;
}
break;
}
}
}
}
#endif
//<2F><>ʼ<EFBFBD><CABC>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>IP<49>Ͷ˿<CDB6>
if(ptz_update_communicaton == PTZ_CONNECT_STATE_SUCCESS)
{
if(update_active_connect_switch == 0)
{
//<2F><>ʼ<EFBFBD><CABC>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>IP<49>Ͷ˿<CDB6>
ptz_update_serv_a.sin_family = PF_INET;
ptz_update_serv_a.sin_port = htons(PTZ_UPDATE_SERV_PORT_A);
ptz_update_serv_a.sin_addr.s_addr = inet_addr(PTZ_UPDATE_SERV_IP_A);
ptz_update_servlen_a = sizeof(ptz_update_serv_a);
ptz_update_serv_b.sin_family = PF_INET;
ptz_update_serv_b.sin_port = htons(PTZ_UPDATE_SERV_PORT_A);
ptz_update_serv_b.sin_addr.s_addr = inet_addr(PTZ_UPDATE_SERV_IP_B);
ptz_update_servlen_b = sizeof(ptz_update_serv_b);
ptz_update_serv_c.sin_family = PF_INET;
ptz_update_serv_c.sin_port = htons(PTZ_UPDATE_SERV_PORT_B);
ptz_update_serv_c.sin_addr.s_addr = inet_addr(PTZ_UPDATE_SERV_IP_A);
ptz_update_servlen_c = sizeof(ptz_update_serv_c);
ptz_update_serv_d.sin_family = PF_INET;
ptz_update_serv_d.sin_port = htons(PTZ_UPDATE_SERV_PORT_B);
ptz_update_serv_d.sin_addr.s_addr = inet_addr(PTZ_UPDATE_SERV_IP_B);
ptz_update_servlen_d = sizeof(ptz_update_serv_d);
update_active_connect_timer = 0;//<2F><><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>0
update_active_connect_switch = 1;//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD>Ĭ<EFBFBD>ϴ򿪷<CFB4><F2BFAAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(update_active_connect_switch != 0)
{//<2F><><EFBFBD>ȷ<EFBFBD><C8B7>͵Ķ˿ں<CBBF>ͨ<EFBFBD><CDA8>Ҫ<EFBFBD><D2AA><EFBFBD>ɳ<EFBFBD>ʼ<EFBFBD><CABC>
if(update_state == UPDATE_STATE_UPGRADE_DATA_TRANS)
{
update_active_connect_switch = 2;//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else//update_state == UPDATE_STATE_IDEL || update_state == UPDATE_STATE_DEAD
{
update_active_connect_switch = 1;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(ptz_update_communicaton == PTZ_CONNECT_STATE_SUCCESS)
{
if(update_active_connect_switch == 1)
{
if(kh == 0)
{//һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
kh = 1;
ptz_send_update_heartbeat();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
OSTimeDlyHMSM(0u, 0u, 1u, 0u);
ptz_send_update_heartbeat();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
update_active_connect_timer = update_active_connect_timer + 2;//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(update_active_connect_timer >= 30000)//30S<30><53>һ<EFBFBD><D2BB>
{
update_active_connect_timer = 0;
ptz_send_update_heartbeat();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
}
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
}
}
static OS_STK task_update_rece_data_stk[TASK_PTZ_UPDATE_RECE_DATA_STK_SIZE];
static void creat_task_update_rece_data(void)
{
CPU_INT08U task_err;
CPU_INT08U name_err;
task_err = OSTaskCreateExt((void (*)(void *)) ptz_update_rece_data_task,
(void *) 0,
(OS_STK *)&task_update_rece_data_stk[TASK_PTZ_UPDATE_RECE_DATA_STK_SIZE - 1],
(INT8U ) TASK_PTZ_UPDATE_RECE_DATA_PRIO,
(INT16U ) TASK_PTZ_UPDATE_RECE_DATA_PRIO,
(OS_STK *)&task_update_rece_data_stk[0],
(INT32U ) TASK_PTZ_UPDATE_RECE_DATA_STK_SIZE,
(void *) 0,
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
#if (OS_TASK_NAME_EN > 0)
OSTaskNameSet(TASK_PTZ_UPDATE_RECE_DATA_PRIO, "ptz_update_rece_data_task", &name_err);
#endif
if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) {
pdebug(DEBUG_LEVEL_INFO,"create ptz_update_rece_data_task success...\n\r");
} else {
pdebug(DEBUG_LEVEL_FATAL,"create ptz_update_rece_data_task failed...\n\r");
}
}
static OS_STK task_update_data_process_stk[TASK_PTZ_UPDATE_DATA_PROCESS_STK_SIZE];
static void creat_task_update_data_process(void)
{
CPU_INT08U task_err;
CPU_INT08U name_err;
task_err = OSTaskCreateExt((void (*)(void *)) ptz_update_data_process_task,
(void *) 0,
(OS_STK *)&task_update_data_process_stk[TASK_PTZ_UPDATE_DATA_PROCESS_STK_SIZE - 1],
(INT8U ) TASK_PTZ_UPDATE_DATA_PROCESS_PRIO,
(INT16U ) TASK_PTZ_UPDATE_DATA_PROCESS_PRIO,
(OS_STK *)&task_update_data_process_stk[0],
(INT32U ) TASK_PTZ_UPDATE_DATA_PROCESS_STK_SIZE,
(void *) 0,
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
#if (OS_TASK_NAME_EN > 0)
OSTaskNameSet(TASK_PTZ_UPDATE_DATA_PROCESS_PRIO, "ptz_update_data_process_task", &name_err);
#endif
if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) {
pdebug(DEBUG_LEVEL_INFO,"create ptz_update_data_process_task success...\n\r");
} else {
pdebug(DEBUG_LEVEL_FATAL,"create ptz_update_data_process_task failed...\n\r");
}
}
void init_update_module()
{
creat_task_update_rece_data();
creat_task_update_data_process();
}
/*****************************/