221 lines
5.9 KiB
C
221 lines
5.9 KiB
C
/*
|
|
* Copyright (c) 2017 Nordic Semiconductor ASA
|
|
* Copyright (c) 2015 Runtime Inc
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* @brief Public API for flash map
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_FLASH_MAP_H_
|
|
#define ZEPHYR_INCLUDE_FLASH_MAP_H_
|
|
|
|
/**
|
|
* @brief Abstraction over flash area and its driver which helps to operate on
|
|
* flash regions easily and effectively.
|
|
*
|
|
* @defgroup flash_area_api flash area Interface
|
|
* @{
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
*
|
|
* Provides abstraction of flash regions for type of use,
|
|
* for example, where's my image?
|
|
*
|
|
* System will contain a map which contains flash areas. Every
|
|
* region will contain flash identifier, offset within flash, and length.
|
|
*
|
|
* 1. This system map could be in a file within filesystem (Initializer
|
|
* must know/figure out where the filesystem is at).
|
|
* 2. Map could be at fixed location for project (compiled to code)
|
|
* 3. Map could be at specific place in flash (put in place at mfg time).
|
|
*
|
|
* Note that the map you use must be valid for BSP it's for,
|
|
* match the linker scripts when platform executes from flash,
|
|
* and match the target offset specified in download script.
|
|
*/
|
|
#include <zephyr/types.h>
|
|
#include <stddef.h>
|
|
#include <sys/types.h>
|
|
|
|
#define SOC_FLASH_0_ID 0 /** device_id for SoC flash memory driver */
|
|
#define SPI_FLASH_0_ID 1 /** device_id for external SPI flash driver */
|
|
|
|
/**
|
|
* @brief Structure for store flash partition data
|
|
*
|
|
* It is used as the flash_map array entry or stand-alone user data. Structure
|
|
* contains all data needed to operate on the flash partitions.
|
|
*/
|
|
struct flash_area {
|
|
u8_t fa_id; /** ID of flash area */
|
|
u8_t fa_device_id;
|
|
u16_t pad16;
|
|
off_t fa_off; /** flash partition offset */
|
|
size_t fa_size; /** flash partition size */
|
|
const char *fa_dev_name; /** flash device name */
|
|
};
|
|
|
|
/**
|
|
* @brief Structure for transfer flash sector boundaries
|
|
*
|
|
* This template is used for presentation of flash memory structure. It
|
|
* consumes much less RAM than @ref flash_area
|
|
*/
|
|
struct flash_sector {
|
|
off_t fs_off; /** flash sector offset */
|
|
size_t fs_size; /** flash sector size */
|
|
};
|
|
|
|
/**
|
|
* @brief Retrieve partitions flash area form the flash_mpa.
|
|
*
|
|
* Function Retrieves flash_area form flash_map for given partition.
|
|
*
|
|
* @param[in] id ID of the flash partition.
|
|
* @param[out] fa Pointer which has to reference flash_area. If
|
|
* @p ID is unknown, it will be NULL on output.
|
|
*/
|
|
int flash_area_open(u8_t id, const struct flash_area **fa);
|
|
|
|
/**
|
|
* @brief Close flash_area
|
|
*
|
|
* Reserved for future usage and external projects compatibility reason.
|
|
* Currently is NOP.
|
|
*
|
|
* @param[in] fa Flash area to be closed.
|
|
*/
|
|
void flash_area_close(const struct flash_area *fa);
|
|
|
|
/**
|
|
* @brief Read flash area data
|
|
*
|
|
* Read data from flash area. Area readout boundaries are asserted before read
|
|
* request. API has the same limitation regard read-block alignment and size
|
|
* as wrapped flash driver.
|
|
*
|
|
* @param[in] fa Flash area
|
|
* @param[in] off Offset relative from beginning of flash area to read
|
|
* @param[out] dst Buffer to store read data
|
|
* @param[in] len Number of bytes to read
|
|
*
|
|
* @return 0 on success, negative errno code on fail.
|
|
*/
|
|
int flash_area_read(const struct flash_area *fa, off_t off, void *dst,
|
|
size_t len);
|
|
|
|
/**
|
|
* @brief Write data to flash area
|
|
*
|
|
* Write data to flash area. Area write boundaries are asserted before write
|
|
* request. API has the same limitation regard write-block alignment and size
|
|
* as wrapped flash driver.
|
|
*
|
|
* @param[in] fa Flash area
|
|
* @param[in] off Offset relative from beginning of flash area to read
|
|
* @param[out] src Buffer with data to be written
|
|
* @param[in] len Number of bytes to write
|
|
*
|
|
* @return 0 on success, negative errno code on fail.
|
|
*/
|
|
int flash_area_write(const struct flash_area *fa, off_t off, const void *src,
|
|
size_t len);
|
|
|
|
/**
|
|
* @brief Erase flash area
|
|
*
|
|
* Erase given flash area range. Area boundaries are asserted before erase
|
|
* request. API has the same limitation regard erase-block alignment and size
|
|
* as wrapped flash driver.
|
|
*
|
|
* @param[in] fa Flash area
|
|
* @param[in] off Offset relative from beginning of flash area.
|
|
* @param[in] len Number of bytes to be erase
|
|
*
|
|
* @return 0 on success, negative errno code on fail.
|
|
*/
|
|
int flash_area_erase(const struct flash_area *fa, off_t off, size_t len);
|
|
|
|
/**
|
|
* @brief Get write block size of the flash area
|
|
*
|
|
* Currently write block size might be treated as read block size, although
|
|
* most of drivers supports unaligned readout.
|
|
*
|
|
* @param[in] fa Flash area
|
|
*
|
|
* @return Alignment restriction for flash writes in [B].
|
|
*/
|
|
u8_t flash_area_align(const struct flash_area *fa);
|
|
|
|
/*
|
|
* Retrieve info about sectors within the area.
|
|
*
|
|
* @param[in] fa_id Given flash area ID
|
|
* @param[out] sectors buffer for sectors data
|
|
* @param[in,out] count On input Capacity of @p sectors, on output number of
|
|
* sectors Retrieved.
|
|
*
|
|
* @return 0 on success, negative errno code on fail. Especially returns
|
|
* -ENOMEM if There are too many flash pages on the flash_area to fit in the
|
|
* array.
|
|
*/
|
|
int flash_area_get_sectors(int fa_id, u32_t *count,
|
|
struct flash_sector *sectors);
|
|
|
|
/**
|
|
* Flash map iteration callback
|
|
*
|
|
* @param fa flash area
|
|
* @param user_data User supplied data
|
|
*
|
|
*/
|
|
typedef void (*flash_area_cb_t)(const struct flash_area *fa,
|
|
void *user_data);
|
|
|
|
/**
|
|
* Iterate over flash map
|
|
*
|
|
* @param user_cb User callback
|
|
* @param user_data User supplied data
|
|
*/
|
|
void flash_area_foreach(flash_area_cb_t user_cb, void *user_data);
|
|
|
|
/**
|
|
* Check whether given flash area has supporting flash driver
|
|
* in the system.
|
|
*
|
|
* @param[in] fa Flash area.
|
|
*
|
|
* @return 1 On success. -ENODEV if no driver match.
|
|
*/
|
|
int flash_area_has_driver(const struct flash_area *fa);
|
|
|
|
/**
|
|
* Get driver for given flash area.
|
|
*
|
|
* @param fa Flash area.
|
|
*
|
|
* @return device driver.
|
|
*/
|
|
struct device *flash_area_get_device(const struct flash_area *fa);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#endif /* ZEPHYR_INCLUDE_FLASH_MAP_H_ */
|