• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  * Description: UPG common functions header file
15  */
16 
17 #ifndef UPG_COMMON_H
18 #define UPG_COMMON_H
19 
20 #include <stdint.h>
21 #include <stdbool.h>
22 #include "errcode.h"
23 #include "common_def.h"
24 #include "partition.h"
25 #include "upg.h"
26 #include "upg_definitions.h"
27 
28 #ifdef __cplusplus
29 #if __cplusplus
30 extern "C" {
31 #endif
32 #endif
33 
upg_aligned(uint32_t len,uint32_t align)34 static inline uint32_t upg_aligned(uint32_t len, uint32_t align)
35 {
36     return ((uint32_t)(len) + ((align) - 1)) & ~((align) - 1);
37 }
38 
39 /**** upg_commom ****/
40 upg_storage_ctx_t *upg_get_ctx(void);
41 
42 /*
43  * 获取在当前Flash上指定固件镜像的地址信息。该地址为flash上的相对地址,是相对flash基地址的偏移
44  * image_id      固件的镜像ID
45  * start_address 返回该镜像的起始地址
46  * size          返回该镜像区域的大小
47  */
48 errcode_t upg_get_partition_info(uint32_t image_id, uint32_t *start_address, uint32_t *size);
49 
50 /*
51  * 获取指定固件镜像的地址信息。
52  * image_id      固件的镜像ID
53  * image_info    返回该镜像的信息
54  */
55 errcode_t upg_get_image_info(uint32_t image_id, partition_information_t *image_info);
56 
57 /*
58  * 读取升级包中的数据到buffer中
59  * read_offset 相对升级包起始的偏移
60  * buffer 读取数据buffer指针
61  * read_len 输入buffer的长度,输出实际读到的数据长度
62  */
63 errcode_t upg_read_fota_pkg_data(uint32_t read_offset, uint8_t *buffer, uint32_t *read_len);
64 
65 /* 获取升级标记结构到RAM中 */
66 errcode_t upg_alloc_and_get_upgrade_flag(fota_upgrade_flag_area_t **upg_flag);
67 
68 /*
69  * 获取升级包包头结构指针
70  * pkg_header 返回升级包头结构指针,指针指向的空间在函数内分配,需要使用者使用完后调用upg_free释放。
71  *            (如果采用直接访问flash的方式,返回升级包头所在的flash地址)
72  */
73 errcode_t upg_get_package_header(upg_package_header_t **pkg_header);
74 
75 /*
76  * 获取镜像哈希表结构指针
77  * pkg_header 升级包头结构指针
78  * img_hash_table 返回对应的升级镜像HASH表头指针,指针指向的空间在函数内分配,需要使用者使用完后调用upg_free释放。
79  *                (如果采用直接访问flash的方式,返回升级镜像哈希表所在的flash地址)
80  */
81 errcode_t upg_get_pkg_image_hash_table(const upg_package_header_t *pkg_header,
82                                        upg_image_hash_node_t **img_hash_table);
83 
84 /*
85  * 获取升级镜像的头结构指针
86  * img_hash_table 升级镜像HASH表节点指针
87  * img_header 返回对应的升级镜像头指针,指针指向的空间在函数内分配,需要使用者使用完后调用upg_free释放。
88  *            (如果采用直接访问flash的方式,返回镜像头所在的flash地址)
89  */
90 errcode_t upg_get_pkg_image_header(const upg_image_hash_node_t *img_hash_table, upg_image_header_t **img_header);
91 
92 /*
93  * 获取升级镜像的数据指针
94  * img_header 升级镜像头结构指针
95  * data_offset 相对升级镜像数据开头的偏移
96  * data_len 输出要获取数据的长度,输出实际获取到的数据长度
97  * img_data 返回升级镜像数据的指针,指针指向的空间在函数内分配,需要使用者使用完后调用upg_free释放。
98  *          (如果采用直接访问flash的方式,返回数据所在的flash地址)
99  */
100 errcode_t upg_get_pkg_image_data(const upg_image_header_t *img_header,
101                                  uint32_t data_offset, uint32_t *data_len, uint8_t **img_data);
102 
103 /*
104  * 拷贝升级镜像指定范围的数据至buffer中
105  * img_header 升级镜像头结构指针
106  * data_offset 相对升级镜像数据开头的偏移
107  * data_len 输入要拷贝的数据的长度,输出实际拷贝的数据长度
108  * img_data 保存数据的buffer指针,buffer的空间需要使用者分配
109  */
110 errcode_t upg_copy_pkg_image_data(const upg_image_header_t *img_header,
111                                   uint32_t data_offset, uint32_t *data_len, uint8_t *img_data);
112 
113 /*
114  * 将buffer中的数据写入指定image_id的镜像所在的地址上
115  * write_offset 相对镜像起始地址的偏移
116  * buffer       写入数据的buffer指针
117  * write_len    输入buffer的长度,输出实际写入的数据长度
118  * image_id     镜像的ID
119  * do_erase     是否执行写前擦
120  */
121 errcode_t upg_write_new_image_data(uint32_t write_offset, uint8_t *buffer, uint32_t *write_len, uint32_t image_id,
122     bool do_erase);
123 
124 /*
125  * 从指定image_id的镜像所在的地址上读取数据到buffer中
126  * write_offset 相对镜像起始地址的偏移
127  * buffer       存储数据的buffer指针
128  * write_len    buffer的长度
129  * image_id     镜像的ID
130  */
131 errcode_t upg_read_old_image_data(uint32_t read_offset, uint8_t *buffer, uint32_t *read_len, uint32_t image_id);
132 
133 /*
134  * 获取升级包中的升级镜像的升级标记状态(NOT_STARTED/STARTED/RETRY/FINISHED)
135  * firmware_index为升级包中的固件(除NV之外的镜像)的序号
136  * 如升级包中包含 固件0、固件1、固件2、NV、固件3,其中固件3的序号为3而不是4
137  * 如为NV镜像,firmware_index参数可忽略
138  */
139 upg_image_status_t upg_get_image_update_status(fota_upgrade_flag_area_t *upg_flag,
140                                                uint32_t firmware_index, uint32_t image_id);
141 
142 /*
143  * 设置指定固件(不包含NV)的升级标记(STARTED/RETRY/FINISHED)
144  * firmware_index为升级包中的固件(除NV之外的镜像)的序号
145  * 如升级包中包含 固件0、固件1、固件2、NV、固件3,其中固件3的序号为3而不是4
146  */
147 errcode_t upg_set_firmware_update_status(fota_upgrade_flag_area_t *upg_flag,
148                                          uint32_t firmware_index, upg_image_status_switch_t switch_status);
149 errcode_t upg_set_nv_update_flag(fota_upgrade_flag_area_t *upg_flag, upg_image_status_t status);
150 
151 /* 擦除metadata数据区 */
152 errcode_t upg_flash_erase_metadata_pages(void);
153 
154 /* 设置升级结果(临时保存) */
155 void upg_set_temporary_result(upg_result_t result);
156 
157 /* 获取临时保存的升级结果 */
158 upg_result_t upg_get_temporary_result(void);
159 
160 /* 检查是否所有镜像都已完成升级(包括升级失败但是已尝试最大次数) */
161 bool upg_check_image_update_complete(const fota_upgrade_flag_area_t *upg_flag, uint32_t image_num);
162 
163 /* 将升级结果保存至Flash升级标记区 */
164 void upg_set_update_result(upg_result_t result);
165 
166 /* 设置升级完成标记 */
167 void upg_set_complete_flag(uint32_t image_num, errcode_t result, bool direct_finish);
168 
169 /* 获取注册函数列表 */
170 upg_func_t *upg_get_func_list(void);
171 
172 /* update模块是否已经初始化 */
173 bool upg_is_inited(void);
174 
175 /* 镜像是否在当前程序支持升级 */
176 bool upg_img_in_set(uint32_t img_id);
177 
178 /**** upg_process ****/
179 /* 计算升级进度并通知上层 */
180 void upg_calculate_and_notify_process(uint32_t current_size);
181 
182 
183 /**** upg_upgrade ****/
184 /* FOTA压缩升级 */
185 errcode_t uapi_upg_compress_image_update(const upg_image_header_t *image);
186 
187 /* FOTA差分升级 */
188 errcode_t uapi_upg_diff_image_update(const upg_image_header_t *image);
189 
190 /* FOTA全镜像升级 */
191 errcode_t uapi_upg_full_image_update(const upg_image_header_t *image);
192 
193 /* 防回滚号校验 */
194 errcode_t upg_anti_rollback_version_verify(
195     const upg_package_header_t *pkg_header, const upg_image_header_t *img_header);
196 
197 /* 更新防回滚版本号 */
198 errcode_t upg_anti_rollback_version_update(const upg_image_header_t *img_header);
199 
200 /* 判断升级包是否为第一次启动后验签 */
201 #if (UPG_CFG_VERIFICATION_SUPPORT == YES)
202 bool upg_check_first_entry(const fota_upgrade_flag_area_t *upg_flag_info);
203 #endif
204 
205 /**** upg_resource ****/
206 /* 处理资源文件 */
207 errcode_t uapi_upg_resource_index_process(const upg_image_header_t *image);
208 errcode_t uapi_upg_resource_data_process(const upg_image_header_t *image);
209 
210 #ifdef __cplusplus
211 #if __cplusplus
212 }
213 #endif
214 #endif
215 #endif /* UPG_COMMON_H */
216