diff --git a/Ubiquitous/XiZi_IIoT/resources/serial/dev_serial.c b/Ubiquitous/XiZi_IIoT/resources/serial/dev_serial.c index fcd9aeefd..428e1c935 100644 --- a/Ubiquitous/XiZi_IIoT/resources/serial/dev_serial.c +++ b/Ubiquitous/XiZi_IIoT/resources/serial/dev_serial.c @@ -154,9 +154,7 @@ static inline int SerialDevIntRead(struct SerialHardwareDevice *serial_dev, stru CriticalAreaUnLock(lock); -#ifndef TOOL_USING_OTA MdelayKTask(20); -#endif *read_data = get_char; read_data++; diff --git a/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.c b/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.c index 56fcbc74f..1e83b0a36 100644 --- a/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.c +++ b/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/ota.c @@ -33,13 +33,21 @@ * Private Function Prototypes ****************************************************************************/ static uint32_t calculate_crc32(uint32_t addr, uint32_t len); +static uint16_t calculate_crc16(uint8_t * data, uint32_t len); static void UpdateNewApplication(void); static void InitialVersion(void); static void BackupVersion(void); static void BootLoaderJumpApp(void); static status_t UpdateOTAFlag(ota_info_t *ptr); +static void app_ota_by_iap(void); static void Update(void); +#ifdef CONNECTION_ADAPTER_4G +static void get_start_signal(struct Adapter* adapter); +static int ota_data_recv(struct Adapter* adapter); +static void app_ota_by_4g(void); +#endif + /**************************************************************************** * Private Data ****************************************************************************/ @@ -60,6 +68,7 @@ static const mcuboot_t mcuboot = mcuboot_delay }; + static const uint32_t crc32tab[] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, @@ -142,6 +151,7 @@ static uint16_t calculate_crc16(uint8_t * data, uint32_t len) return reg_crc; } + /******************************************************************************* * 函 数 名: UpdateNewApplication * 功能描述: 在bootloader里进行调用,根据Flash中Flag分区中的信息决定是否进行版本更新 @@ -255,6 +265,7 @@ static void InitialVersion(void) } } + /******************************************************************************* * 函 数 名: BackupVersion * 功能描述: 版本回退函数,如果升级的APP存在bug导致无法跳转需调用此函数进行版本回退 @@ -396,13 +407,14 @@ void app_clear_jumpflag(void) mcuboot.flash_deinit(); } + /******************************************************************************* * 函 数 名: Update * 功能描述: 根据实际情况进行初始化版本的烧录或者新版本的升级 * 形 参: 无 * 返 回 值: 无 *******************************************************************************/ -void Update(void) +static void Update(void) { ota_info_t ota_info; mcuboot.flash_init(); @@ -420,6 +432,7 @@ void Update(void) mcuboot.flash_deinit(); } + /******************************************************************************* * 函 数 名: ota_entry * 功能描述: bootloader的入口函数 @@ -667,7 +680,7 @@ try_again: * 形 参: adapter:Adapter指针,指向注册的4G设备 * 返 回 值: 0:传输成功,-1:传输失败 *******************************************************************************/ -void app_ota_by_4g(void) +static void app_ota_by_4g(void) { struct ota_data recv_msg; char reply[16] = {0}; diff --git a/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/server_tcp.c b/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/server_tcp.c index 08353e6b7..88871782e 100644 --- a/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/server_tcp.c +++ b/Ubiquitous/XiZi_IIoT/tool/bootloader/ota/server_tcp.c @@ -254,6 +254,7 @@ int ota_file_send(int fd) if(NULL == file_fd) { printf("open file failed.\n"); + fclose(file_fd); return -1; } fseek(file_fd, 0, SEEK_SET); @@ -266,7 +267,7 @@ int ota_file_send(int fd) data.header.frame_flag = 0x5A5A; length = fread(data.frame.frame_data, 1, LENGTH, file_fd); - if(length > 0) + if(length == LENGTH) { printf("read %d bytes\n",length); data.frame.frame_id = frame_cnt; @@ -274,6 +275,29 @@ int ota_file_send(int fd) data.frame.crc = calculate_crc16(data.frame.frame_data, length); file_length += length; } + else if(length > 0 && length < LENGTH) + { + if(ferror(file_fd)) + { + printf("read %s file error!\n", basename(BIN_PATH)); + ret = -1; + break; + } + else + { + printf("read %d bytes\n",length); + data.frame.frame_id = frame_cnt; + data.frame.frame_len = length; + data.frame.crc = calculate_crc16(data.frame.frame_data, length); + file_length += length; + } + } + //fread返回值为0,此时是个空包,不需要再发送了否则是冗余数据 + else + { + printf("read %s file done!\n", basename(BIN_PATH)); + break; + } send_again: printf("send frame[%d] to client %d.\n", frame_cnt, fd); @@ -303,7 +327,7 @@ recv_again: else if(0 == strncmp(buf, "ok", length)) { printf("receive buf[%s] length %d from client %d.\n", buf, length, fd); - try_times = 10; + try_times = 5; printf("send to client %d frame[%d] data send done.\n",fd, frame_cnt); frame_cnt++; continue; @@ -319,7 +343,7 @@ recv_again: } else { - printf("send to client %d frame[%d] 10 times failed.\n",fd, frame_cnt); + printf("send to client %d frame[%d] 5 times failed.\n",fd, frame_cnt); ret = -1; break; }