diff options
Diffstat (limited to 'os/ex/subsystems/mfs')
-rw-r--r-- | os/ex/subsystems/mfs/mfs.c | 49 | ||||
-rw-r--r-- | os/ex/subsystems/mfs/mfs.h | 23 |
2 files changed, 58 insertions, 14 deletions
diff --git a/os/ex/subsystems/mfs/mfs.c b/os/ex/subsystems/mfs/mfs.c index d138852e9..58ddcbe81 100644 --- a/os/ex/subsystems/mfs/mfs.c +++ b/os/ex/subsystems/mfs/mfs.c @@ -140,6 +140,36 @@ void mfs_cache_erase_id(MFSDriver *devp, uint32_t id) { #endif /* MFS_CFG_ID_CACHE_SIZE > 0 */ /** + * @brief Flash write. + * @note If the option @p MFS_CFG_WRITE_VERIFY is enabled then the flash + * is also read back for verification. + * + * @param[in] devp pointer to the @p MFSDriver object + * @param[in] offset flash offset + * @param[in] n number of bytes to be read + * @param[out] rp pointer to the data buffer + * @return The operation status. + * @retval MFS_NO_ERROR if the operation has been successfully completed. + * @retval MFS_FLASH_FAILURE if the flash memory is unusable because HW + * failures. + * + * @notapi + */ +static mfs_error_t mfs_flash_write(MFSDriver *devp, + flash_offset_t offset, + size_t n, const + uint8_t *p) { + flash_error_t ferr; + + ferr = flashProgram(devp->config->flashp, offset, n, p); + if (ferr != FLASH_NO_ERROR) { + return MFS_FLASH_FAILURE; + } + + return MFS_NO_ERROR; +} + +/** * @brief Erases and verifies all sectors belonging to a bank. * * @param[in] devp pointer to the @p MFSDriver object @@ -201,19 +231,26 @@ static mfs_error_t mfs_bank_erase(MFSDriver *devp, mfs_bank_t bank) { static mfs_error_t mfs_bank_set_header(MFSDriver *devp, mfs_bank_t bank, uint32_t cnt) { + flash_sector_t sector; mfs_bank_header_t header; + if (bank == MFS_BANK_0) { + sector = devp->config->bank0_start; + } + else { + sector = devp->config->bank1_start; + } + header.magic1 = MFS_BANK_MAGIC_1; header.magic1 = MFS_BANK_MAGIC_1; header.counter = cnt; header.next = sizeof (mfs_bank_header_t); header.crc = crc16(0U, (const uint8_t *)&header, sizeof (uint32_t) * 4); - (void)devp; - (void)bank; - (void)cnt; - - return MFS_NO_ERROR; + return mfs_flash_write(devp, + flashGetSectorOffset(devp->config->flashp, sector), + sizeof (mfs_bank_header_t), + (const uint8_t *)&header); } /** @@ -549,7 +586,7 @@ mfs_error_t mfsMount(MFSDriver *devp) { unsigned i; /* Attempting to mount the managed partition.*/ - for (i = 0; i < MFS_MAX_REPAIR_ATTEMPTS; i++) { + for (i = 0; i < MFS_CFG_MAX_REPAIR_ATTEMPTS; i++) { mfs_error_t err; err = mfs_try_mount(devp); diff --git a/os/ex/subsystems/mfs/mfs.h b/os/ex/subsystems/mfs/mfs.h index 28b8436a6..ec5719738 100644 --- a/os/ex/subsystems/mfs/mfs.h +++ b/os/ex/subsystems/mfs/mfs.h @@ -57,8 +57,15 @@ /** * @brief Maximum number of repair attempts on partition mount. */ -#if !defined(MFS_MAX_REPAIR_ATTEMPTS) || defined(__DOXIGEN__) -#define MFS_MAX_REPAIR_ATTEMPTS 3 +#if !defined(MFS_CFG_MAX_REPAIR_ATTEMPTS) || defined(__DOXIGEN__) +#define MFS_CFG_MAX_REPAIR_ATTEMPTS 3 +#endif + +/** + * @brief Verify written data. + */ +#if !defined(MFS_CFG_WRITE_VERIFY) || defined(__DOXIGEN__) +#define MFS_CFG_WRITE_VERIFY TRUE #endif /** @} */ @@ -70,7 +77,7 @@ #error "invalid MFS_CFG_ID_CACHE_SIZE value" #endif -#if (MFS_MAX_REPAIR_ATTEMPTS < 1) || (MFS_MAX_REPAIR_ATTEMPTS > 10) +#if (MFS_CFG_MAX_REPAIR_ATTEMPTS < 1) || (MFS_CFG_MAX_REPAIR_ATTEMPTS > 10) #error "invalid MFS_MAX_REPAIR_ATTEMPTS value" #endif @@ -145,7 +152,7 @@ typedef struct { /** * @brief First data element. */ - flash_address_t next; + flash_offset_t next; /** * @brief Header CRC. */ @@ -176,7 +183,7 @@ typedef struct { /** * @brief Address of the previous header or zero if none. */ - flash_address_t prev_header; + flash_offset_t prev_header; } mfs_data_header_t; #if (MFS_CFG_ID_CACHE_SIZE > 0) || defined(__DOXYGEN__) @@ -199,7 +206,7 @@ typedef struct mfs_cached_id { /** * @brief Data address of the cached element. */ - flash_address_t addr; + flash_offset_t offset; /** * @brief Data size of the cached element. */ @@ -272,11 +279,11 @@ typedef struct { /** * @brief Pointer to the next free position in the current bank. */ - flash_address_t next_position; + flash_offset_t next_offset; /** * @brief Pointer to the last header in the list or zero. */ - flash_address_t last_header; + flash_offset_t last_offset; /** * @brief Used space in the current bank without considering erased records. */ |