blob: eb0445c341feef8974d363db4f91524ad0e1e69e [file] [log] [blame]
/*
* 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.
*/
/**
* @file
* @brief Declares implementation-specific functions required by image
* management. The default stubs can be overridden with functions that
* are compatible with the host OS.
*/
#ifndef H_IMG_MGMT_IMPL_
#define H_IMG_MGMT_IMPL_
#include <stdbool.h>
#include <inttypes.h>
#include "img_mgmt/img_mgmt.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Ensures the spare slot (slot 1) is fully erased.
*
* @return 0 on success, MGMT_ERR_[...] code on failure.
*/
int img_mgmt_impl_erase_slot(void);
/**
* @brief Marks the image in the specified slot as pending. On the next reboot,
* the system will perform a boot of the specified image.
*
* @param slot The slot to mark as pending. In the typical
* use case, this is 1.
* @param permanent Whether the image should be used permanently or
* only tested once:
* 0=run image once, then confirm or
* revert.
* 1=run image forever.
*
* @return 0 on success, MGMT_ERR_[...] code on failure.
*/
int img_mgmt_impl_write_pending(int slot, bool permanent);
/**
* @brief Marks the image in slot 0 as confirmed. The system will continue
* booting into the image in slot 0 until told to boot from a different slot.
*
* @return 0 on success, MGMT_ERR_[...] code on failure.
*/
int img_mgmt_impl_write_confirmed(void);
/**
* @brief Reads the specified chunk of data from an image slot.
*
* @param slot The index of the slot to read from.
* @param offset The offset within the slot to read from.
* @param dst On success, the read data gets written here.
* @param num_bytes The number of byets to read.
*
* @return 0 on success, MGMT_ERR_[...] code on failure.
*/
int img_mgmt_impl_read(int slot, unsigned int offset, void *dst,
unsigned int num_bytes);
/**
* @brief Writes the specified chunk of image data to slot 1.
*
* @param offset The offset within slot 1 to write to.
* @param data The image data to write.
* @param num_bytes The number of bytes to read.
* @param last Whether this chunk is the end of the image:
* false=additional image chunks are
* forthcoming.
* true=last image chunk; flush unwritten data
* to disk.
*
* @return 0 on success, MGMT_ERR_[...] code on failure.
*/
int img_mgmt_impl_write_image_data(unsigned int offset, const void *data,
unsigned int num_bytes, bool last);
/**
* @brief Indicates the type of swap operation that will occur on the next
* reboot, if any, between provided slot and it's pair.
* Quering any slots of the same pair will give the same result.
*
* @param image An slot number;
* @return An IMG_MGMT_SWAP_TYPE_[...] code.
*/
int img_mgmt_impl_swap_type(int slot);
/**
* Collects information about the specified image slot.
*
* @return Flags of the specified image slot
*/
uint8_t img_mgmt_state_flags(int query_slot);
/**
* Erases image data at given offset
*
* @param offset The offset within slot 1 to erase at.
* @param num_bytes The number of bytes to erase.
* @return 0 on success, MGMT_ERR_[...] code on failure.
*/
int img_mgmt_impl_erase_image_data(unsigned int off, unsigned int num_bytes);
/**
* Erases a flash sector as image upload crosses a sector boundary.
* Erasing the entire flash size at one time can take significant time,
* causing a bluetooth disconnect or significant battery sag.
* Instead we will erase immediately prior to crossing a sector.
* We could check for empty to increase efficiency, but instead we always erase
* for consistency and simplicity.
*
* @param off Offset that is about to be written
* @param len Number of bytes to be written
*
* @return 0 if success
* ERROR_CODE if could not erase sector
*/
int img_mgmt_impl_erase_if_needed(uint32_t off, uint32_t len);
/**
* Verifies an upload request and indicates the actions that should be taken
* during processing of the request. This is a "read only" function in the
* sense that it doesn't write anything to flash and doesn't modify any global
* variables.
*
* @param req The upload request to inspect.
* @param action On success, gets populated with information
* about how to process the request.
*
* @return 0 if processing should occur;
* A MGMT_ERR code if an error response should be
* sent instead.
*/
int img_mgmt_impl_upload_inspect(const struct img_mgmt_upload_req *req,
struct img_mgmt_upload_action *action,
const char **errstr);
#define ERASED_VAL_32(x) (((x) << 24) | ((x) << 16) | ((x) << 8) | (x))
int img_mgmt_impl_erased_val(int slot, uint8_t *erased_val);
int img_mgmt_impl_log_upload_start(int status);
int img_mgmt_impl_log_upload_done(int status, const uint8_t *hashp);
int img_mgmt_impl_log_pending(int status, const uint8_t *hash);
int img_mgmt_impl_log_confirm(int status, const uint8_t *hash);
#ifdef __cplusplus
}
#endif
#endif