forked from xuos/xiuos
				
			1、Verify file size before ota file transfer
2、update MQTT connection parameter configuration
This commit is contained in:
		
							parent
							
								
									474557a5ac
								
							
						
					
					
						commit
						5ef61d14b1
					
				|  | @ -23,7 +23,7 @@ menu "lib using MQTT" | ||||||
| 
 | 
 | ||||||
|                 config CLIENTID |                 config CLIENTID | ||||||
|                     string "mqtt client id." |                     string "mqtt client id." | ||||||
|                     default "xidatong0001" |                     default "D001" | ||||||
| 
 | 
 | ||||||
|                 config USERNAME |                 config USERNAME | ||||||
|                     string "mqtt client username." |                     string "mqtt client username." | ||||||
|  |  | ||||||
|  | @ -578,6 +578,11 @@ static void get_start_signal(struct Adapter* adapter) | ||||||
|         KPrintf("waiting for start msg...\n"); |         KPrintf("waiting for start msg...\n"); | ||||||
|         if(AdapterDeviceRecv(adapter, &start_msg, sizeof(start_msg)) >= 0 && start_msg.header.frame_flag == STARTFLAG)  |         if(AdapterDeviceRecv(adapter, &start_msg, sizeof(start_msg)) >= 0 && start_msg.header.frame_flag == STARTFLAG)  | ||||||
|         { |         { | ||||||
|  |             if(start_msg.header.total_len > APP_FLASH_SIZE) | ||||||
|  |             { | ||||||
|  |                 KPrintf("File size is larger than partition size,the partition size is %dk.\n",APP_FLASH_SIZE/1024); | ||||||
|  |                 break; | ||||||
|  |             }    | ||||||
|             if(mcuboot.op_flash_erase(DOWN_FLAH_ADDRESS,start_msg.header.total_len) != kStatus_Success) |             if(mcuboot.op_flash_erase(DOWN_FLAH_ADDRESS,start_msg.header.total_len) != kStatus_Success) | ||||||
|             { |             { | ||||||
|                 KPrintf("Failed to erase target fash!\n"); |                 KPrintf("Failed to erase target fash!\n"); | ||||||
|  | @ -896,15 +901,30 @@ reconnect: | ||||||
|             ptr2 = strstr((char *)Platform_mqtt.cmdbuff,"{\"fileSize\":");  |             ptr2 = strstr((char *)Platform_mqtt.cmdbuff,"{\"fileSize\":");  | ||||||
|             if((ptr1 != NULL) &&(ptr2 != NULL)) |             if((ptr1 != NULL) &&(ptr2 != NULL)) | ||||||
|             { |             { | ||||||
|  |                 // 1.获取新版本固件大小及版本信息
 | ||||||
|                 if(sscanf(ptr2,"{\"fileSize\":%d,\"version\":\"%11s\",\"fileId\":%d,\"md5\"",&platform_ota.size,platform_ota.version,&platform_ota.streamId)==3) |                 if(sscanf(ptr2,"{\"fileSize\":%d,\"version\":\"%11s\",\"fileId\":%d,\"md5\"",&platform_ota.size,platform_ota.version,&platform_ota.streamId)==3) | ||||||
|                 { |                 { | ||||||
|                     KPrintf("------Start the firmware file transfer!------\r\n"); |                     KPrintf("------Start the firmware file transfer!------\r\n"); | ||||||
|                     KPrintf("file size:%d,file id:%d,file version:%s\r\n",platform_ota.size,platform_ota.streamId,platform_ota.version); |                     KPrintf("file size:%d,file id:%d,file version:%s\r\n",platform_ota.size,platform_ota.streamId,platform_ota.version); | ||||||
|                     KPrintf("---------------------------------------------\r\n"); |                     KPrintf("---------------------------------------------\r\n"); | ||||||
|  |                     if(platform_ota.size > APP_FLASH_SIZE) | ||||||
|  |                     { | ||||||
|  |                         KPrintf("File size is larger than partition size,the partition size is %dk.\n",APP_FLASH_SIZE/1024); | ||||||
|  |                         ret = -1; | ||||||
|  |                         ota_info.status = OTA_STATUS_ERROR; | ||||||
|  |                         memset(ota_info.error_message,0,sizeof(ota_info.error_message)); | ||||||
|  |                         strncpy(ota_info.error_message, "File size is larger than partition size!",sizeof(ota_info.error_message)); | ||||||
|  |                         UpdateOTAFlag(&ota_info); | ||||||
|  |                         break; | ||||||
|  |                     } | ||||||
|                     if(mcuboot.op_flash_erase(DOWN_FLAH_ADDRESS,platform_ota.size) != kStatus_Success) |                     if(mcuboot.op_flash_erase(DOWN_FLAH_ADDRESS,platform_ota.size) != kStatus_Success) | ||||||
|                     { |                     { | ||||||
|                         KPrintf("Failed to erase target fash!\n"); |                         KPrintf("Failed to erase download partition!\n"); | ||||||
|                         ret = -1; |                         ret = -1; | ||||||
|  |                         ota_info.status = OTA_STATUS_ERROR; | ||||||
|  |                         memset(ota_info.error_message,0,sizeof(ota_info.error_message)); | ||||||
|  |                         strncpy(ota_info.error_message, "Failed to erase download partition!",sizeof(ota_info.error_message)); | ||||||
|  |                         UpdateOTAFlag(&ota_info); | ||||||
|                         break; |                         break; | ||||||
|                     } |                     } | ||||||
|                     platform_ota.counter = (platform_ota.size%FRAME_LEN != 0)? (platform_ota.size/FRAME_LEN + 1):(platform_ota.size/FRAME_LEN); |                     platform_ota.counter = (platform_ota.size%FRAME_LEN != 0)? (platform_ota.size/FRAME_LEN + 1):(platform_ota.size/FRAME_LEN); | ||||||
|  | @ -924,6 +944,7 @@ reconnect: | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             // 2.分片接收新版本固件
 | ||||||
|             if(strstr((char *)Platform_mqtt.cmdbuff,topicdatabuff[1])) |             if(strstr((char *)Platform_mqtt.cmdbuff,topicdatabuff[1])) | ||||||
|             { |             { | ||||||
|                 memset(FrameBuf,0,sizeof(FrameBuf)); |                 memset(FrameBuf,0,sizeof(FrameBuf)); | ||||||
|  | @ -980,6 +1001,7 @@ reconnect: | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     // 3.新版本固件接收完毕,写入描述信息
 | ||||||
|     if(0 == ret) |     if(0 == ret) | ||||||
|     { |     { | ||||||
|         ota_info.down.size = platform_ota.size; |         ota_info.down.size = platform_ota.size; | ||||||
|  | @ -1122,14 +1144,25 @@ reconnect: | ||||||
|             ptr = strstr((char *)Platform_mqtt.cmdbuff,"{\"code\":\"1000\"");  |             ptr = strstr((char *)Platform_mqtt.cmdbuff,"{\"code\":\"1000\"");  | ||||||
|             if(ptr != NULL) |             if(ptr != NULL) | ||||||
|             { |             { | ||||||
|  |                 // 1.获取新版本固件大小及版本信息
 | ||||||
|                 if(sscanf(ptr,"{\"code\":\"1000\",\"data\":{\"size\":%d,\"streamId\":%d,\"sign\":\"%*32s\",\"dProtocol\":\"mqtt\",\"version\":\"%11s\"",&platform_ota.size,&platform_ota.streamId,platform_ota.version)==3) |                 if(sscanf(ptr,"{\"code\":\"1000\",\"data\":{\"size\":%d,\"streamId\":%d,\"sign\":\"%*32s\",\"dProtocol\":\"mqtt\",\"version\":\"%11s\"",&platform_ota.size,&platform_ota.streamId,platform_ota.version)==3) | ||||||
|                 { |                 { | ||||||
|                     KPrintf("------Start the firmware file transfer!------\r\n"); |                     KPrintf("------Start the firmware file transfer!------\r\n"); | ||||||
|                     KPrintf("file size:%d,file id:%d,file version:%s\r\n",platform_ota.size,platform_ota.streamId,platform_ota.version); |                     KPrintf("file size:%d,file id:%d,file version:%s\r\n",platform_ota.size,platform_ota.streamId,platform_ota.version); | ||||||
|                     KPrintf("---------------------------------------------\r\n"); |                     KPrintf("---------------------------------------------\r\n"); | ||||||
|  |                     if(platform_ota.size > APP_FLASH_SIZE) | ||||||
|  |                     { | ||||||
|  |                         KPrintf("File size is larger than partition size,the partition size is %dk.\n",APP_FLASH_SIZE/1024); | ||||||
|  |                         ret = -1; | ||||||
|  |                         ota_info.status = OTA_STATUS_ERROR; | ||||||
|  |                         memset(ota_info.error_message,0,sizeof(ota_info.error_message)); | ||||||
|  |                         strncpy(ota_info.error_message, "File size is larger than partition size!",sizeof(ota_info.error_message)); | ||||||
|  |                         UpdateOTAFlag(&ota_info); | ||||||
|  |                         break; | ||||||
|  |                     } | ||||||
|                     if(mcuboot.op_flash_erase(DOWN_FLAH_ADDRESS,platform_ota.size) != kStatus_Success) |                     if(mcuboot.op_flash_erase(DOWN_FLAH_ADDRESS,platform_ota.size) != kStatus_Success) | ||||||
|                     { |                     { | ||||||
|                         KPrintf("Failed to erase target fash!\n"); |                         KPrintf("Failed to erase download partition!\n"); | ||||||
|                         ret = -1; |                         ret = -1; | ||||||
|                         break; |                         break; | ||||||
|                     } |                     } | ||||||
|  | @ -1150,6 +1183,7 @@ reconnect: | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             // 2.分片接收新版本固件
 | ||||||
|             if(strstr((char *)Platform_mqtt.cmdbuff,"download_reply")) |             if(strstr((char *)Platform_mqtt.cmdbuff,"download_reply")) | ||||||
|             { |             { | ||||||
|                 memset(FrameBuf,0,sizeof(FrameBuf)); |                 memset(FrameBuf,0,sizeof(FrameBuf)); | ||||||
|  | @ -1206,6 +1240,7 @@ reconnect: | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     // 3.新版本固件接收完毕,写入描述信息
 | ||||||
|     if(0 == ret) |     if(0 == ret) | ||||||
|     { |     { | ||||||
|         ota_info.down.size = platform_ota.size; |         ota_info.down.size = platform_ota.size; | ||||||
|  |  | ||||||
|  | @ -27,33 +27,33 @@ | ||||||
| #define JUMP_SUCCESS_FLAG 0XCDCDCDCD | #define JUMP_SUCCESS_FLAG 0XCDCDCDCD | ||||||
| 
 | 
 | ||||||
| typedef enum { | typedef enum { | ||||||
|     OTA_STATUS_IDLE = 0,     // 空闲状态,没有进行OTA升级
 |     OTA_STATUS_IDLE = 0,     //空闲状态,没有进行OTA升级
 | ||||||
|     OTA_STATUS_READY,        // 准备状态,可以进行OTA升级
 |     OTA_STATUS_READY,        //准备状态,可以进行OTA升级
 | ||||||
|     OTA_STATUS_DOWNLOADING,  // 正在下载固件
 |     OTA_STATUS_DOWNLOADING,  //正在下载固件
 | ||||||
|     OTA_STATUS_DOWNLOADED,   // 固件下载完成
 |     OTA_STATUS_DOWNLOADED,   //固件下载完成
 | ||||||
|     OTA_STATUS_UPDATING,     // 正在进行OTA升级
 |     OTA_STATUS_UPDATING,     //正在进行OTA升级
 | ||||||
|     OTA_STATUS_BACKUP,       // 正在版本回退
 |     OTA_STATUS_BACKUP,       //正在版本回退
 | ||||||
|     OTA_STATUS_ERROR,        // 出现错误,升级失败
 |     OTA_STATUS_ERROR,        //出现错误,升级失败
 | ||||||
| } ota_status_t; | } ota_status_t; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* Flash分区中保存固件的属性描述 */ | /* Flash分区中保存固件的属性描述 */ | ||||||
| typedef struct { | typedef struct { | ||||||
|     uint32_t size;              // 应用程序大小,记录分区固件的大小
 |     uint32_t size;            //应用程序大小,记录分区固件的大小
 | ||||||
|     uint32_t crc32;             // 应用程序CRC32校验值,记录分区固件的crc32值
 |     uint32_t crc32;           //应用程序CRC32校验值,记录分区固件的crc32值
 | ||||||
|     uint8_t version[32];        // 应用程序版本号,记录分区固件的版本
 |     uint8_t version[32];      //应用程序版本号,记录分区固件的版本
 | ||||||
|     uint8_t description[32];   // 固件的描述信息,最多32个字符
 |     uint8_t description[32];  //固件的描述信息,最多32个字符
 | ||||||
| } firmware_t; | } firmware_t; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* OTA升级过程中的信息结构体 */ | /* OTA升级过程中的信息结构体 */ | ||||||
| typedef struct { | typedef struct { | ||||||
|     firmware_t os;                // XiUOS System分区属性信息
 |     firmware_t os;               //XiUOS System分区属性信息
 | ||||||
|     firmware_t bak;               // Bakup分区属性信息
 |     firmware_t bak;              //Bakup分区属性信息
 | ||||||
|     firmware_t down;              // Download分区属性信息
 |     firmware_t down;             //Download分区属性信息
 | ||||||
|     uint32_t status;              // 升级状态,取值来自于ota_status_t类型
 |     uint32_t status;             //升级状态,取值来自于ota_status_t类型
 | ||||||
|     uint32_t lastjumpflag;        // bootloaer跳转失败的标志,bootloader里置0xABABABAB,跳转成功后在应用里置0xCDCDCDCD
 |     uint32_t lastjumpflag;       //bootloaer跳转失败的标志,bootloader里置0xABABABAB,跳转成功后在应用里置0xCDCDCDCD
 | ||||||
|     uint8_t  error_message[64];   // 错误信息,最多64个字符
 |     uint8_t  error_message[64];  //错误信息,最多64个字符
 | ||||||
| } ota_info_t; | } ota_info_t; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -65,17 +65,17 @@ typedef struct { | ||||||
| /*bin包传输过程中的数据帧相关的结构体*/ | /*bin包传输过程中的数据帧相关的结构体*/ | ||||||
| typedef struct | typedef struct | ||||||
| { | { | ||||||
|     uint16_t frame_flag;          // frame start flag 2 Bytes
 |     uint16_t frame_flag;  //frame start flag 2 Bytes
 | ||||||
|     uint16_t dev_sid;             // device software version
 |     uint16_t dev_sid;     //device software version
 | ||||||
|     uint32_t total_len;           // send data total length caculated from each frame_len 
 |     uint32_t total_len;   //send data total length caculated from each frame_len 
 | ||||||
| } ota_header_t; | } ota_header_t; | ||||||
| 
 | 
 | ||||||
| typedef struct | typedef struct | ||||||
| { | { | ||||||
|     uint32_t frame_id;               // Current frame id
 |     uint32_t frame_id;            //Current frame id
 | ||||||
|     uint8_t  frame_data[LENGTH];     // Current frame data
 |     uint8_t  frame_data[LENGTH];  //Current frame data
 | ||||||
|     uint16_t frame_len;              // Current frame data length
 |     uint16_t frame_len;           //Current frame data length
 | ||||||
|     uint16_t crc;                    // Current frame data crc
 |     uint16_t crc;                 //Current frame data crc
 | ||||||
| } ota_frame_t; | } ota_frame_t; | ||||||
| 
 | 
 | ||||||
| typedef struct | typedef struct | ||||||
|  | @ -93,7 +93,7 @@ typedef struct{ | ||||||
|     uint32_t num;          //OTA当前下载次数
 |     uint32_t num;          //OTA当前下载次数
 | ||||||
|     uint32_t downlen;      //OTA当前下载次数的下载量
 |     uint32_t downlen;      //OTA当前下载次数的下载量
 | ||||||
|     uint8_t  version[32];  //OTA下载时存储版本号的缓存区
 |     uint8_t  version[32];  //OTA下载时存储版本号的缓存区
 | ||||||
| }OTA_TCB; | } OTA_TCB; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| void app_clear_jumpflag(void); | void app_clear_jumpflag(void); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue