| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| #ifndef H_IMG_MGMT_ |
| #define H_IMG_MGMT_ |
| |
| #include <inttypes.h> |
| #include "img_mgmt_config.h" |
| #include "mgmt/mgmt.h" |
| |
| struct image_version; |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #define IMG_MGMT_HASH_STR 48 |
| #define IMG_MGMT_HASH_LEN 32 |
| #define IMG_MGMT_DATA_SHA_LEN 32 /* SHA256 */ |
| |
| /* |
| * Image state flags |
| */ |
| #define IMG_MGMT_STATE_F_PENDING 0x01 |
| #define IMG_MGMT_STATE_F_CONFIRMED 0x02 |
| #define IMG_MGMT_STATE_F_ACTIVE 0x04 |
| #define IMG_MGMT_STATE_F_PERMANENT 0x08 |
| |
| #define IMG_MGMT_VER_MAX_STR_LEN 25 /* 255.255.65535.4294967295\0 */ |
| |
| /* |
| * Swap Types for image management state machine |
| */ |
| #define IMG_MGMT_SWAP_TYPE_NONE 0 |
| #define IMG_MGMT_SWAP_TYPE_TEST 1 |
| #define IMG_MGMT_SWAP_TYPE_PERM 2 |
| #define IMG_MGMT_SWAP_TYPE_REVERT 3 |
| |
| /** |
| * Command IDs for image management group. |
| */ |
| #define IMG_MGMT_ID_STATE 0 |
| #define IMG_MGMT_ID_UPLOAD 1 |
| #define IMG_MGMT_ID_FILE 2 |
| #define IMG_MGMT_ID_CORELIST 3 |
| #define IMG_MGMT_ID_CORELOAD 4 |
| #define IMG_MGMT_ID_ERASE 5 |
| |
| /* |
| * IMG_MGMT_ID_UPLOAD statuses. |
| */ |
| #define IMG_MGMT_ID_UPLOAD_STATUS_START 0 |
| #define IMG_MGMT_ID_UPLOAD_STATUS_ONGOING 1 |
| #define IMG_MGMT_ID_UPLOAD_STATUS_COMPLETE 2 |
| |
| extern int boot_current_slot; |
| extern struct img_mgmt_state g_img_mgmt_state; |
| |
| /** Represents an individual upload request. */ |
| struct img_mgmt_upload_req { |
| unsigned long long int image; /* 0 by default */ |
| unsigned long long int off; /* -1 if unspecified */ |
| unsigned long long int size; /* -1 if unspecified */ |
| size_t data_len; |
| size_t data_sha_len; |
| uint8_t img_data[IMG_MGMT_UL_CHUNK_SIZE]; |
| uint8_t data_sha[IMG_MGMT_DATA_SHA_LEN]; |
| bool upgrade; /* Only allow greater version numbers. */ |
| }; |
| |
| /** Global state for upload in progress. */ |
| struct img_mgmt_state { |
| /** Flash area being written; -1 if no upload in progress. */ |
| int area_id; |
| /** Flash offset of next chunk. */ |
| uint32_t off; |
| /** Total size of image data. */ |
| uint32_t size; |
| /** Hash of image data; used for resumption of a partial upload. */ |
| uint8_t data_sha_len; |
| uint8_t data_sha[IMG_MGMT_DATA_SHA_LEN]; |
| #if IMG_MGMT_LAZY_ERASE |
| int sector_id; |
| uint32_t sector_end; |
| #endif |
| }; |
| |
| /** Describes what to do during processing of an upload request. */ |
| struct img_mgmt_upload_action { |
| /** The total size of the image. */ |
| unsigned long long size; |
| /** The number of image bytes to write to flash. */ |
| int write_bytes; |
| /** The flash area to write to. */ |
| int area_id; |
| /** Whether to process the request; false if offset is wrong. */ |
| bool proceed; |
| /** Whether to erase the destination flash area. */ |
| bool erase; |
| }; |
| |
| /** |
| * @brief Registers the image management command handler group. |
| */ |
| void img_mgmt_register_group(void); |
| |
| /** |
| * @brief Unregisters the image management command handler group. |
| */ |
| void img_mgmt_unregister_group(void); |
| |
| /* |
| * @brief Read info of an image give the slot number |
| * |
| * @param image_slot Image slot to read info from |
| * @param image_version Image version to be filled up |
| * @param hash Ptr to the read image hash |
| * @param flags Ptr to flags filled up from the image |
| */ |
| int img_mgmt_read_info(int image_slot, struct image_version *ver, |
| uint8_t *hash, uint32_t *flags); |
| |
| /** |
| * @brief Get the current running image version |
| * |
| * @param image_version Given image version |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int img_mgmt_my_version(struct image_version *ver); |
| |
| /** |
| * @brief Get image version in string from image_version |
| * |
| * @param image_version Structure filled with image version |
| * information |
| * @param dst Destination string created from the given |
| * in image version |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int img_mgmt_ver_str(const struct image_version *ver, char *dst); |
| |
| /** |
| * @brief Check if the image slot is in use |
| * |
| * @param slot Slot to check if its in use |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int img_mgmt_slot_in_use(int slot); |
| |
| /** |
| * @brief Check if the DFU status is pending |
| * |
| * @return 1 if there's pending DFU otherwise 0. |
| */ |
| int img_mgmt_state_any_pending(void); |
| |
| /** |
| * @brief Collects information about the specified image slot |
| * |
| * @param query_slot Slot to read state flags from |
| * |
| * @return return the state flags |
| */ |
| uint8_t img_mgmt_state_flags(int query_slot); |
| |
| /** |
| * @brief Sets the pending flag for the specified image slot. That is, the system |
| * will swap to the specified image on the next reboot. If the permanent |
| * argument is specified, the system doesn't require a confirm after the swap |
| * occurs. |
| * |
| * @param slot Image slot to set pending |
| * @param permanent If set no confirm is required after image swap |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int img_mgmt_state_set_pending(int slot, int permanent); |
| |
| /** |
| * Confirms the current image state. Prevents a fallback from occurring on the |
| * next reboot if the active image is currently being tested. |
| * |
| * @return 0 on success, non -zero on failure |
| */ |
| int img_mgmt_state_confirm(void); |
| |
| /** @brief Generic callback function for events */ |
| typedef void (*img_mgmt_dfu_cb)(void); |
| |
| /** Callback function pointers */ |
| typedef struct { |
| img_mgmt_dfu_cb dfu_started_cb; |
| img_mgmt_dfu_cb dfu_stopped_cb; |
| img_mgmt_dfu_cb dfu_pending_cb; |
| img_mgmt_dfu_cb dfu_confirmed_cb; |
| } img_mgmt_dfu_callbacks_t; |
| |
| /** @typedef img_mgmt_upload_fn |
| * @brief Application callback that is executed when an image upload request is |
| * received. |
| * |
| * The callback's return code determines whether the upload request is accepted |
| * or rejected. If the callback returns 0, processing of the upload request |
| * proceeds. If the callback returns nonzero, the request is rejected with a |
| * response containing an `rc` value equal to the return code. |
| * |
| * @param offset The offset specified by the incoming request. |
| * @param size The total size of the image being uploaded. |
| * @param arg Optional argument specified when the callback |
| * was configured. |
| * |
| * @return 0 if the upload request should be accepted; |
| * nonzero to reject the request with the |
| * specified status. |
| */ |
| typedef int img_mgmt_upload_fn(uint32_t offset, uint32_t size, void *arg); |
| |
| /** |
| * @brief Configures a callback that gets called whenever a valid image upload |
| * request is received. |
| * |
| * The callback's return code determines whether the upload request is accepted |
| * or rejected. If the callback returns 0, processing of the upload request |
| * proceeds. If the callback returns nonzero, the request is rejected with a |
| * response containing an `rc` value equal to the return code. |
| * |
| * @param cb The callback to execute on rx of an upload |
| * request. |
| * @param arg Optional argument that gets passed to the |
| * callback. |
| */ |
| void img_mgmt_set_upload_cb(img_mgmt_upload_fn *cb, void *arg); |
| void img_mgmt_register_callbacks(const img_mgmt_dfu_callbacks_t *cb_struct); |
| void img_mgmt_dfu_stopped(void); |
| void img_mgmt_dfu_started(void); |
| void img_mgmt_dfu_pending(void); |
| void img_mgmt_dfu_confirmed(void); |
| |
| #if IMG_MGMT_VERBOSE_ERR |
| int img_mgmt_error_rsp(struct mgmt_ctxt *ctxt, int rc, const char *rsn); |
| extern const char *img_mgmt_err_str_app_reject; |
| extern const char *img_mgmt_err_str_hdr_malformed; |
| extern const char *img_mgmt_err_str_magic_mismatch; |
| extern const char *img_mgmt_err_str_no_slot; |
| extern const char *img_mgmt_err_str_flash_open_failed; |
| extern const char *img_mgmt_err_str_flash_erase_failed; |
| extern const char *img_mgmt_err_str_flash_write_failed; |
| extern const char *img_mgmt_err_str_downgrade; |
| extern const char *img_mgmt_err_str_image_bad_flash_addr; |
| #else |
| #define img_mgmt_error_rsp(ctxt, rc, rsn) (rc) |
| #define img_mgmt_err_str_app_reject NULL |
| #define img_mgmt_err_str_hdr_malformed NULL |
| #define img_mgmt_err_str_magic_mismatch NULL |
| #define img_mgmt_err_str_no_slot NULL |
| #define img_mgmt_err_str_flash_open_failed NULL |
| #define img_mgmt_err_str_flash_erase_failed NULL |
| #define img_mgmt_err_str_flash_write_failed NULL |
| #define img_mgmt_err_str_downgrade NULL |
| #define img_mgmt_err_str_image_bad_flash_addr NULL |
| #endif |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* H_IMG_MGMT_ */ |