ChibiOS/HAL
6.1.0
|
Managed Flash Storage Driver. More...
Managed Flash Storage Driver.
This module implements a managed flash storage able to store a finite number of variable-size records. Records are retrieved by their index number.
The driver is automatically performs:
Macros | |
#define | RET_ON_ERROR(err) |
Error check helper. More... | |
Configuration options | |
#define | MFS_CFG_MAX_RECORDS 32 |
Maximum number of indexed records in the managed storage. More... | |
#define | MFS_CFG_MAX_REPAIR_ATTEMPTS 3 |
Maximum number of repair attempts on partition mount. More... | |
#define | MFS_CFG_WRITE_VERIFY TRUE |
Verify written data. More... | |
#define | MFS_CFG_STRONG_CHECKING TRUE |
Enables a stronger and slower check procedure on mount. More... | |
#define | MFS_CFG_BUFFER_SIZE 32 |
Size of the buffer used for data copying. More... | |
Error codes handling macros | |
#define | MFS_IS_ERROR(err) ((err) < MFS_NO_ERROR) |
#define | MFS_IS_WARNING(err) ((err) > MFS_NO_ERROR) |
Typedefs | |
typedef uint32_t | mfs_id_t |
Type of a record identifier. More... | |
Data Structures | |
union | mfs_bank_header_t |
Type of a bank header. More... | |
union | mfs_data_header_t |
Type of a data block header. More... | |
struct | MFSConfig |
Type of a MFS configuration structure. More... | |
struct | MFSDriver |
Type of an MFS instance. More... | |
Functions | |
static mfs_error_t | mfs_flash_read (MFSDriver *mfsp, flash_offset_t offset, size_t n, uint8_t *rp) |
Flash read. More... | |
static mfs_error_t | mfs_flash_write (MFSDriver *mfsp, flash_offset_t offset, size_t n, const uint8_t *wp) |
Flash write. More... | |
static mfs_error_t | mfs_flash_copy (MFSDriver *mfsp, flash_offset_t doffset, flash_offset_t soffset, uint32_t n) |
Flash copy. More... | |
static mfs_error_t | mfs_record_check (MFSDriver *mfsp, mfs_data_header_t *dhdrp, flash_offset_t offset, flash_offset_t limit, mfs_record_state_t *sts) |
Verifies integrity of a record. More... | |
static mfs_error_t | mfs_bank_erase (MFSDriver *mfsp, mfs_bank_t bank) |
Erases and verifies all sectors belonging to a bank. More... | |
static mfs_error_t | mfs_bank_verify_erase (MFSDriver *mfsp, mfs_bank_t bank) |
Erases and verifies all sectors belonging to a bank. More... | |
static mfs_error_t | mfs_bank_write_header (MFSDriver *mfsp, mfs_bank_t bank, uint32_t cnt) |
Writes the validation header in a bank. More... | |
static mfs_error_t | mfs_bank_scan_records (MFSDriver *mfsp, mfs_bank_t bank, mfs_bank_state_t *statep) |
Scans blocks searching for records. More... | |
static mfs_error_t | mfs_bank_get_state (MFSDriver *mfsp, mfs_bank_t bank, mfs_bank_state_t *statep, uint32_t *cntp) |
Determines the state of a bank. More... | |
static mfs_error_t | mfs_bank_mount (MFSDriver *mfsp, mfs_bank_t bank, mfs_bank_state_t *statep) |
Selects a bank as current. More... | |
static mfs_error_t | mfs_garbage_collect (MFSDriver *mfsp) |
Enforces a garbage collection. More... | |
static mfs_error_t | mfs_try_mount (MFSDriver *mfsp) |
Performs a flash partition mount attempt. More... | |
mfs_error_t | mfs_mount (MFSDriver *mfsp) |
Configures and activates a MFS driver. More... | |
void | mfsObjectInit (MFSDriver *mfsp) |
Initializes an instance. More... | |
mfs_error_t | mfsStart (MFSDriver *mfsp, const MFSConfig *config) |
Configures and activates a MFS driver. More... | |
void | mfsStop (MFSDriver *mfsp) |
Deactivates a MFS driver. More... | |
mfs_error_t | mfsErase (MFSDriver *mfsp) |
Destroys the state of the managed storage by erasing the flash. More... | |
mfs_error_t | mfsReadRecord (MFSDriver *mfsp, mfs_id_t id, size_t *np, uint8_t *buffer) |
Retrieves and reads a data record. More... | |
mfs_error_t | mfsWriteRecord (MFSDriver *mfsp, mfs_id_t id, size_t n, const uint8_t *buffer) |
Creates or updates a data record. More... | |
mfs_error_t | mfsEraseRecord (MFSDriver *mfsp, mfs_id_t id) |
Erases a data record. More... | |
mfs_error_t | mfsPerformGarbageCollection (MFSDriver *mfsp) |
Enforces a garbage collection operation. More... | |
Enumerations |
#define RET_ON_ERROR | ( | err | ) |
Error check helper.
Definition at line 52 of file mfs.c.
Referenced by mfs_bank_get_state(), mfs_bank_mount(), mfs_bank_scan_records(), mfs_flash_copy(), mfs_flash_write(), mfs_garbage_collect(), mfs_try_mount(), mfsErase(), mfsEraseRecord(), mfsReadRecord(), and mfsWriteRecord().
#define MFS_CFG_MAX_RECORDS 32 |
Maximum number of indexed records in the managed storage.
MFS_CFG_MAX_RECORDS
- 1. Definition at line 54 of file mfs.h.
Referenced by mfs_bank_mount(), mfs_garbage_collect(), mfs_record_check(), mfsEraseRecord(), mfsReadRecord(), and mfsWriteRecord().
#define MFS_CFG_MAX_REPAIR_ATTEMPTS 3 |
Maximum number of repair attempts on partition mount.
Definition at line 61 of file mfs.h.
Referenced by mfs_mount().
#define MFS_CFG_STRONG_CHECKING TRUE |
#define MFS_CFG_BUFFER_SIZE 32 |
Size of the buffer used for data copying.
Definition at line 89 of file mfs.h.
Referenced by mfs_flash_copy(), and mfs_flash_write().
enum mfs_bank_t |
enum mfs_state_t |
enum mfs_error_t |
enum mfs_bank_state_t |
enum mfs_record_state_t |
|
static |
Flash read.
[in] | mfsp | pointer to the MFSDriver object |
[in] | offset | flash offset |
[in] | n | number of bytes to be read |
[out] | rp | pointer to the data buffer |
Definition at line 151 of file mfs.c.
References MFSDriver::config, MFSConfig::flashp, flashRead, and MFSDriver::state.
Referenced by mfs_bank_get_state(), mfs_bank_scan_records(), mfs_flash_copy(), mfs_flash_write(), and mfsReadRecord().
|
static |
Flash write.
MFS_CFG_WRITE_VERIFY
is enabled then the flash is also read back for verification.[in] | mfsp | pointer to the MFSDriver object |
[in] | offset | flash offset |
[in] | n | number of bytes to be written |
[in] | wp | pointer to the data buffer |
Definition at line 177 of file mfs.c.
References MFSDriver::buffer, MFSDriver::config, MFSConfig::flashp, flashProgram, MFS_CFG_BUFFER_SIZE, mfs_flash_read(), RET_ON_ERROR, and MFSDriver::state.
Referenced by mfs_bank_write_header(), mfs_flash_copy(), mfsEraseRecord(), and mfsWriteRecord().
|
static |
Flash copy.
MFS_CFG_WRITE_VERIFY
is enabled then the flash is also read back for verification.[in] | mfsp | pointer to the MFSDriver object |
[in] | doffset | destination flash offset |
[in] | soffset | source flash offset |
[in] | n | number of bytes to be copied |
Definition at line 220 of file mfs.c.
References MFSDriver::buffer, MFS_CFG_BUFFER_SIZE, mfs_flash_read(), mfs_flash_write(), and RET_ON_ERROR.
Referenced by mfs_garbage_collect().
|
static |
Verifies integrity of a record.
[in] | mfsp | pointer to the MFSDriver object |
[in] | dhdrp | pointer to the header to be checked |
[in] | offset | flash offset of the header to be checked |
[in] | limit | flash limit offset |
[out] | sts | assessed record state |
Definition at line 259 of file mfs.c.
References MFSDriver::config, MFSConfig::erased, mfs_data_header_t::id, mfs_data_header_t::magic, MFS_CFG_MAX_RECORDS, and mfs_data_header_t::size.
Referenced by mfs_bank_scan_records().
|
static |
Erases and verifies all sectors belonging to a bank.
[in] | mfsp | pointer to the MFSDriver object |
[in] | bank | bank to be erased |
Definition at line 302 of file mfs.c.
References MFSConfig::bank0_sectors, MFSConfig::bank0_start, MFSConfig::bank1_sectors, MFSConfig::bank1_start, MFSDriver::config, MFSConfig::flashp, flashStartEraseSector, flashVerifyErase, flashWaitErase(), and MFSDriver::state.
Referenced by mfs_garbage_collect(), mfs_try_mount(), and mfsErase().
|
static |
Erases and verifies all sectors belonging to a bank.
[in] | mfsp | pointer to the MFSDriver object |
[in] | bank | bank to be verified |
Definition at line 348 of file mfs.c.
References MFSConfig::bank0_sectors, MFSConfig::bank0_start, MFSConfig::bank1_sectors, MFSConfig::bank1_start, MFSDriver::config, MFSConfig::flashp, flashVerifyErase, and MFSDriver::state.
Referenced by mfs_bank_get_state().
|
static |
Writes the validation header in a bank.
[in] | mfsp | pointer to the MFSDriver object |
[in] | bank | bank to be validated |
[in] | cnt | value for the flash usage counter |
MFS_NO_ERROR | if the operation has been successfully completed. |
Definition at line 389 of file mfs.c.
References MFSConfig::bank0_start, MFSConfig::bank1_start, MFSDriver::config, mfs_bank_header_t::counter, mfs_bank_header_t::crc, MFSConfig::erased, flashGetSectorOffset(), MFSConfig::flashp, mfs_bank_header_t::magic1, mfs_bank_header_t::magic2, mfs_flash_write(), and mfs_bank_header_t::reserved1.
Referenced by mfs_garbage_collect(), and mfs_try_mount().
|
static |
Scans blocks searching for records.
[in] | mfsp | pointer to the MFSDriver object |
[in] | bank | the bank identifier |
[out] | statep | bank state, it can be:
|
Definition at line 430 of file mfs.c.
References MFSConfig::bank_size, MFSDriver::buffer, MFSDriver::config, MFSDriver::descriptors, mfs_data_header_t::id, mfs_flash_read(), mfs_record_check(), MFSDriver::next_offset, RET_ON_ERROR, and mfs_data_header_t::size.
Referenced by mfs_bank_mount().
|
static |
Determines the state of a bank.
[in] | mfsp | pointer to the MFSDriver object |
[in] | bank | bank to be checked |
[out] | statep | bank state, it can be:
|
[out] | cntp | bank counter |
Definition at line 521 of file mfs.c.
References MFSDriver::buffer, MFSDriver::config, mfs_bank_header_t::counter, mfs_bank_header_t::crc, MFSConfig::erased, mfs_bank_header_t::magic1, mfs_bank_header_t::magic2, mfs_bank_verify_erase(), mfs_flash_read(), mfs_bank_header_t::reserved1, and RET_ON_ERROR.
Referenced by mfs_bank_mount(), and mfs_try_mount().
|
static |
Selects a bank as current.
[in] | mfsp | pointer to the MFSDriver object |
[in] | bank | bank to be scanned |
[out] | statep | bank state, it can be:
|
Definition at line 589 of file mfs.c.
References MFSDriver::current_bank, MFSDriver::current_counter, MFSDriver::descriptors, mfs_bank_get_state(), mfs_bank_scan_records(), MFS_CFG_MAX_RECORDS, RET_ON_ERROR, and MFSDriver::used_space.
Referenced by mfs_try_mount().
|
static |
Enforces a garbage collection.
Storage data is compacted into a single bank.
[out] | mfsp | pointer to the MFSDriver object |
Definition at line 622 of file mfs.c.
References MFSDriver::current_bank, MFSDriver::current_counter, MFSDriver::descriptors, mfs_bank_erase(), mfs_bank_write_header(), MFS_CFG_MAX_RECORDS, mfs_flash_copy(), MFSDriver::next_offset, and RET_ON_ERROR.
Referenced by mfs_try_mount(), mfsEraseRecord(), mfsPerformGarbageCollection(), and mfsWriteRecord().
|
static |
Performs a flash partition mount attempt.
[in] | mfsp | pointer to the MFSDriver object |
Definition at line 673 of file mfs.c.
References mfs_bank_erase(), mfs_bank_get_state(), mfs_bank_mount(), mfs_bank_write_header(), mfs_garbage_collect(), and RET_ON_ERROR.
Referenced by mfs_mount().
mfs_error_t mfs_mount | ( | MFSDriver * | mfsp | ) |
Configures and activates a MFS driver.
[in] | mfsp | pointer to the MFSDriver object |
MFS_NO_ERROR | if the operation has been successfully completed. |
MFS_WARN_GC | if the operation triggered a garbage collection. |
MFS_ERR_FLASH_FAILURE | if the flash memory is unusable because HW failures. Makes the driver enter the MFS_ERROR state. |
MFS_ERR_INTERNAL | if an internal logic failure is detected. |
Definition at line 793 of file mfs.c.
References MFS_CFG_MAX_REPAIR_ATTEMPTS, mfs_try_mount(), and MFSDriver::state.
Referenced by mfsErase(), and mfsStart().
void mfsObjectInit | ( | MFSDriver * | mfsp | ) |
Initializes an instance.
[out] | mfsp | pointer to the MFSDriver object |
Definition at line 832 of file mfs.c.
References MFSDriver::config, osalDbgCheck, and MFSDriver::state.
mfs_error_t mfsStart | ( | MFSDriver * | mfsp, |
const MFSConfig * | config | ||
) |
Configures and activates a MFS driver.
[in] | mfsp | pointer to the MFSDriver object |
[in] | config | pointer to the configuration |
MFS_NO_ERROR | if the operation has been successfully completed. |
MFS_WARN_GC | if the operation triggered a garbage collection. |
MFS_ERR_FLASH_FAILURE | if the flash memory is unusable because HW failures. Makes the driver enter the MFS_ERROR state. |
MFS_ERR_INTERNAL | if an internal logic failure is detected. |
Definition at line 854 of file mfs.c.
References MFSDriver::config, mfs_mount(), osalDbgAssert, osalDbgCheck, and MFSDriver::state.
void mfsStop | ( | MFSDriver * | mfsp | ) |
Deactivates a MFS driver.
[in] | mfsp | pointer to the MFSDriver object |
Definition at line 873 of file mfs.c.
References MFSDriver::config, osalDbgAssert, osalDbgCheck, and MFSDriver::state.
mfs_error_t mfsErase | ( | MFSDriver * | mfsp | ) |
Destroys the state of the managed storage by erasing the flash.
[in] | mfsp | pointer to the MFSDriver object |
MFS_ERR_INV_STATE | if the driver is in not in MSG_READY state. |
MFS_NO_ERROR | if the operation has been successfully completed. |
MFS_ERR_FLASH_FAILURE | if the flash memory is unusable because HW failures. Makes the driver enter the MFS_ERROR state. |
MFS_ERR_INTERNAL | if an internal logic failure is detected. |
Definition at line 896 of file mfs.c.
References mfs_bank_erase(), mfs_mount(), osalDbgCheck, RET_ON_ERROR, and MFSDriver::state.
mfs_error_t mfsReadRecord | ( | MFSDriver * | mfsp, |
mfs_id_t | id, | ||
size_t * | np, | ||
uint8_t * | buffer | ||
) |
Retrieves and reads a data record.
[in] | mfsp | pointer to the MFSDriver object |
[in] | id | record numeric identifier, the valid range is between 1 and MFS_CFG_MAX_RECORDS |
[in,out] | np | on input is the maximum buffer size, on return it is the size of the data copied into the buffer |
[out] | buffer | pointer to a buffer for record data |
MFS_NO_ERROR | if the operation has been successfully completed. |
MFS_ERR_INV_STATE | if the driver is in not in MSG_READY state. |
MFS_ERR_INV_SIZE | if the passed buffer is not large enough to contain the record data. |
MFS_ERR_NOT_FOUND | if the specified id does not exists. |
MFS_ERR_FLASH_FAILURE | if the flash memory is unusable because HW failures. Makes the driver enter the MFS_ERROR state. |
MFS_ERR_INTERNAL | if an internal logic failure is detected. |
Definition at line 931 of file mfs.c.
References MFSDriver::buffer, mfs_data_header_t::crc, MFSDriver::descriptors, MFS_CFG_MAX_RECORDS, mfs_flash_read(), osalDbgCheck, RET_ON_ERROR, and MFSDriver::state.
mfs_error_t mfsWriteRecord | ( | MFSDriver * | mfsp, |
mfs_id_t | id, | ||
size_t | n, | ||
const uint8_t * | buffer | ||
) |
Creates or updates a data record.
[in] | mfsp | pointer to the MFSDriver object |
[in] | id | record numeric identifier, the valid range is between 1 and MFS_CFG_MAX_RECORDS |
[in] | n | size of data to be written, it cannot be zero |
[in] | buffer | pointer to a buffer for record data |
MFS_NO_ERROR | if the operation has been successfully completed. |
MFS_WARN_GC | if the operation triggered a garbage collection. |
MFS_ERR_INV_STATE | if the driver is in not in MSG_READY state. |
MFS_ERR_OUT_OF_MEM | if there is not enough flash space for the operation. |
MFS_ERR_FLASH_FAILURE | if the flash memory is unusable because HW failures. Makes the driver enter the MFS_ERROR state. |
MFS_ERR_INTERNAL | if an internal logic failure is detected. |
Definition at line 996 of file mfs.c.
References MFSConfig::bank_size, MFSDriver::buffer, MFSDriver::config, mfs_data_header_t::crc, MFSDriver::current_bank, MFSDriver::descriptors, MFSConfig::erased, mfs_data_header_t::id, mfs_data_header_t::magic, MFS_CFG_MAX_RECORDS, mfs_flash_write(), mfs_garbage_collect(), MFSDriver::next_offset, osalDbgCheck, RET_ON_ERROR, mfs_data_header_t::size, MFSDriver::state, and MFSDriver::used_space.
mfs_error_t mfsEraseRecord | ( | MFSDriver * | mfsp, |
mfs_id_t | id | ||
) |
Erases a data record.
[in] | mfsp | pointer to the MFSDriver object |
[in] | id | record numeric identifier, the valid range is between 1 and MFS_CFG_MAX_RECORDS |
MFS_NO_ERROR | if the operation has been successfully completed. |
MFS_WARN_GC | if the operation triggered a garbage collection. |
MFS_ERR_INV_STATE | if the driver is in not in MSG_READY state. |
MFS_ERR_FLASH_FAILURE | if the flash memory is unusable because HW failures. Makes the driver enter the MFS_ERROR state. |
MFS_ERR_INTERNAL | if an internal logic failure is detected. |
Definition at line 1084 of file mfs.c.
References MFSConfig::bank_size, MFSDriver::buffer, MFSDriver::config, mfs_data_header_t::crc, MFSDriver::current_bank, MFSDriver::descriptors, mfs_data_header_t::id, mfs_data_header_t::magic, MFS_CFG_MAX_RECORDS, mfs_flash_write(), mfs_garbage_collect(), MFSDriver::next_offset, osalDbgCheck, RET_ON_ERROR, mfs_data_header_t::size, MFSDriver::state, and MFSDriver::used_space.
mfs_error_t mfsPerformGarbageCollection | ( | MFSDriver * | mfsp | ) |
Enforces a garbage collection operation.
Garbage collection involves: integrity check, optionally repairs, obsolete data removal, data compaction and a flash bank swap.
[in] | mfsp | pointer to the MFSDriver object |
MFS_NO_ERROR | if the operation has been successfully completed. |
MFS_ERR_INV_STATE | if the driver is in not in MSG_READY state. |
MFS_ERR_FLASH_FAILURE | if the flash memory is unusable because HW failures. Makes the driver enter the MFS_ERROR state. |
MFS_ERR_INTERNAL | if an internal logic failure is detected. |
Definition at line 1153 of file mfs.c.
References mfs_garbage_collect(), osalDbgCheck, and MFSDriver::state.