1 #include <stdlib.h>
2 #include <string.h>
3 #include <stdint.h>
4 #include "ota_log.h"
5 #include "ota_import.h"
6 #include "ota_hal_os.h"
7 #include "aos_hal_flash.h"
8 
ota_is_download_mode(void)9 int ota_is_download_mode(void)
10 {
11     int ret = 0;
12     ota_boot_param_t param = {0};
13     memset(&param, 0, sizeof(ota_boot_param_t));
14     ret = ota_read_parameter(&param);
15     if(ret < 0) {
16          return 0;
17     }
18     if((param.upg_status == OTA_TRANSPORT) && (param.upg_flag != 0xffff)){
19          OTA_LOG_I("OTA running status :0x%04x \n",param.upg_status);
20          return 1;
21     }
22     OTA_LOG_I("ota is status:%d  param crc:0x%04x \n",param.upg_status, param.param_crc);
23     return ret;
24 }
25 
ota_read_parameter(ota_boot_param_t * ota_param)26 int ota_read_parameter(ota_boot_param_t *ota_param)
27 {
28     int ret = OTA_UPGRADE_PARAM_FAIL;
29     int param_part = HAL_PARTITION_PARAMETER_1;
30     unsigned int offset = 0;
31     unsigned short patch_crc = 0;
32     if(ota_param == NULL) {
33         return ret;
34     }
35     memset(ota_param, 0, sizeof(ota_boot_param_t));
36     ret = aos_hal_flash_read(param_part, &offset, ota_param, sizeof(ota_boot_param_t));
37     if(ret < 0) {
38         return ret;
39     }
40     patch_crc = ota_get_data_crc16((const unsigned char *)ota_param, sizeof(ota_boot_param_t) - sizeof(unsigned short));
41     OTA_LOG_I("ota param crc:0x%04x cal:0x%04x \n", ota_param->param_crc, patch_crc);
42     if(patch_crc == ota_param->param_crc) {
43         return 0;
44     }
45     return ret;
46 }
47 
ota_update_parameter(ota_boot_param_t * ota_param)48 int ota_update_parameter(ota_boot_param_t *ota_param)
49 {
50     int ret = OTA_UPGRADE_PARAM_FAIL;
51     unsigned int offset = 0x00;
52     unsigned int len = sizeof(ota_boot_param_t);
53     ota_boot_param_t comp_buf;
54     if(ota_param == NULL) {
55         return ret;
56     }
57     ota_param->param_crc = ota_get_data_crc16((const unsigned char *)ota_param, sizeof(ota_boot_param_t) - sizeof(unsigned short));
58     OTA_LOG_I("ota update param crc:0x%04x flag:0x%04x \n", ota_param->param_crc, ota_param->upg_flag);
59     memset(&comp_buf, 0, len);
60 #if 0
61     ret = hal_flash_dis_secure(HAL_PARTITION_PARAMETER_1, 0, 0);
62     if(ret != 0) {
63         return OTA_UPGRADE_PARAM_FAIL;
64     }
65 #endif
66     ret = aos_hal_flash_erase(HAL_PARTITION_PARAMETER_1, offset, len);
67     if(ret >= 0) {
68         ret = aos_hal_flash_write(HAL_PARTITION_PARAMETER_1, &offset, ota_param, len);
69         offset = 0x00;
70         if(ret >= 0) {
71             ret = aos_hal_flash_read(HAL_PARTITION_PARAMETER_1, &offset, (unsigned char *)&comp_buf, len);
72             if(ret >= 0) {
73                  if(memcmp(ota_param, (unsigned char*)&comp_buf, len) != 0) {
74                      ret = OTA_UPGRADE_PARAM_FAIL;
75                      aos_printf("ble ota save param failed\r\n");
76                  }
77             }
78         }
79     }
80     return 0;
81 }
82 
ota_get_upgrade_flag(void)83 unsigned short ota_get_upgrade_flag(void)
84 {
85     int ret = 0;
86     unsigned short flag = 0;
87     ota_boot_param_t ota_param = {0};
88     ret = ota_read_parameter(&ota_param);
89     if(ret < 0) {
90         return 0xffff;
91     }
92     flag = ota_param.upg_flag;
93     return flag;
94 }
95 
ota_update_upg_flag(unsigned short flag)96 int ota_update_upg_flag(unsigned short flag)
97 {
98     int ret = 0;
99     ota_boot_param_t ota_param = {0};
100     OTA_LOG_I("upg_flag:0x%x \n", flag);
101     ret = ota_read_parameter(&ota_param);
102     if(ret < 0) {
103         return ret;
104     }
105     ota_param.upg_flag = flag;
106     ret = ota_update_parameter(&ota_param);
107     return 0;
108 }
109 
ota_clear_paramters()110 int ota_clear_paramters()
111 {
112     int ret = 0;
113     unsigned int offset = 0x00;
114     unsigned int len = sizeof(ota_boot_param_t);
115     ret = aos_hal_flash_erase(HAL_PARTITION_PARAMER1, offset, len);
116     OTA_LOG_I("ota clear ret = %d\r\n", ret);
117     return ret;
118 }
119 
ota_parse_ota_type(unsigned char * buf,unsigned int len)120 unsigned int ota_parse_ota_type(unsigned char *buf, unsigned int len)
121 {
122     int upg_flag = 0;
123     unsigned char xz_header[6] = { 0xFD, '7', 'z', 'X', 'Z', 0x00 };
124     if((buf != NULL) && (len >= 8)) {
125         if (memcmp(buf, "BSDIFF40", 8) == 0) {
126             upg_flag = OTA_UPGRADE_DIFF;
127         }
128         else if (memcmp(buf, xz_header, 6) == 0) {
129             upg_flag = OTA_UPGRADE_XZ;
130         }
131         else {
132             upg_flag = OTA_UPGRADE_ALL;
133         }
134     }
135     OTA_LOG_I("ota header:0x%x", upg_flag);
136     return upg_flag;
137 }