/* * 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 #include #include #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_ */