git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9702 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
e97ed74364
commit
53fe4e39fa
|
@ -112,33 +112,6 @@ uint16_t crc16(uint16_t crc, const uint8_t *data, size_t n) {
|
|||
return crc;
|
||||
}
|
||||
|
||||
#if (MFS_CFG_ID_CACHE_SIZE > 0) || defined(__DOXYGEN__)
|
||||
void mfs_cache_init(MFSDriver *devp) {
|
||||
|
||||
(void)devp;
|
||||
}
|
||||
|
||||
mfs_cached_id_t *mfs_cache_find_id(MFSDriver *devp, uint32_t id) {
|
||||
|
||||
(void)devp;
|
||||
(void)id;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void mfs_cache_update_id(MFSDriver *devp, uint32_t id) {
|
||||
|
||||
(void)devp;
|
||||
(void)id;
|
||||
}
|
||||
|
||||
void mfs_cache_erase_id(MFSDriver *devp, uint32_t id) {
|
||||
|
||||
(void)devp;
|
||||
(void)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
|
||||
|
@ -150,7 +123,7 @@ void mfs_cache_erase_id(MFSDriver *devp, uint32_t id) {
|
|||
* @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
|
||||
* @retval MFS_ERR_FLASH_FAILURE if the flash memory is unusable because HW
|
||||
* failures.
|
||||
*
|
||||
* @notapi
|
||||
|
@ -163,7 +136,7 @@ static mfs_error_t mfs_flash_write(MFSDriver *devp,
|
|||
|
||||
ferr = flashProgram(devp->config->flashp, offset, n, p);
|
||||
if (ferr != FLASH_NO_ERROR) {
|
||||
return MFS_FLASH_FAILURE;
|
||||
return MFS_ERR_FLASH_FAILURE;
|
||||
}
|
||||
|
||||
return MFS_NO_ERROR;
|
||||
|
@ -176,7 +149,7 @@ static mfs_error_t mfs_flash_write(MFSDriver *devp,
|
|||
* @param[in] bank bank to be erased
|
||||
* @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
|
||||
* @retval MFS_ERR_FLASH_FAILURE if the flash memory is unusable because HW
|
||||
* failures.
|
||||
*
|
||||
* @notapi
|
||||
|
@ -198,15 +171,15 @@ static mfs_error_t mfs_bank_erase(MFSDriver *devp, mfs_bank_t bank) {
|
|||
|
||||
ferr = flashStartEraseSector(devp->config->flashp, sector);
|
||||
if (ferr != FLASH_NO_ERROR) {
|
||||
return MFS_FLASH_FAILURE;
|
||||
return MFS_ERR_FLASH_FAILURE;
|
||||
}
|
||||
ferr = flashWaitErase(devp->config->flashp);
|
||||
if (ferr != FLASH_NO_ERROR) {
|
||||
return MFS_FLASH_FAILURE;
|
||||
return MFS_ERR_FLASH_FAILURE;
|
||||
}
|
||||
ferr = flashVerifyErase(devp->config->flashp, sector);
|
||||
if (ferr != FLASH_NO_ERROR) {
|
||||
return MFS_FLASH_FAILURE;
|
||||
return MFS_ERR_FLASH_FAILURE;
|
||||
}
|
||||
|
||||
sector++;
|
||||
|
@ -223,7 +196,7 @@ static mfs_error_t mfs_bank_erase(MFSDriver *devp, mfs_bank_t bank) {
|
|||
* @param[in] cnt value for the flash usage counter
|
||||
* @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
|
||||
* @retval MFS_ERR_FLASH_FAILURE if the flash memory is unusable because HW
|
||||
* failures.
|
||||
*
|
||||
* @notapi
|
||||
|
@ -263,7 +236,7 @@ static mfs_error_t mfs_bank_set_header(MFSDriver *devp,
|
|||
* @param[in] dbank destination bank
|
||||
* @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
|
||||
* @retval MFS_ERR_FLASH_FAILURE if the flash memory is unusable because HW
|
||||
* failures.
|
||||
*
|
||||
* @notapi
|
||||
|
@ -330,9 +303,9 @@ static mfs_bank_state_t mfs_get_bank_state(MFSDriver *devp,
|
|||
* @param[in] devp pointer to the @p MFSDriver object
|
||||
* @return The operation status.
|
||||
* @retval MFS_NO_ERROR if the operation has been successfully completed.
|
||||
* @retval MFS_REPAIR_WARNING if the operation has been completed but a
|
||||
* @retval MFS_WARN_REPAIR if the operation has been completed but a
|
||||
* repair has been performed.
|
||||
* @retval MFS_FLASH_FAILURE if the flash memory is unusable because HW
|
||||
* @retval MFS_ERR_FLASH_FAILURE if the flash memory is unusable because HW
|
||||
* failures.
|
||||
*
|
||||
* @api
|
||||
|
@ -366,14 +339,14 @@ static mfs_error_t mfs_try_mount(MFSDriver *devp) {
|
|||
RET_ON_ERROR(mfs_bank_set_header(devp, MFS_BANK_0, cnt1 + 1));
|
||||
RET_ON_ERROR(mfs_bank_erase(devp, MFS_BANK_1));
|
||||
RET_ON_ERROR(mfs_bank_mount(devp, MFS_BANK_0));
|
||||
return MFS_REPAIR_WARNING;
|
||||
return MFS_WARN_REPAIR;
|
||||
|
||||
case PAIR(MFS_BANK_ERASED, MFS_BANK_GARBAGE):
|
||||
/* Bank zero is erased, bank one is not readable.*/
|
||||
RET_ON_ERROR(mfs_bank_erase(devp, MFS_BANK_1));
|
||||
RET_ON_ERROR(mfs_bank_set_header(devp, MFS_BANK_0, 1));
|
||||
RET_ON_ERROR(mfs_bank_mount(devp, MFS_BANK_0));
|
||||
return MFS_REPAIR_WARNING;
|
||||
return MFS_WARN_REPAIR;
|
||||
|
||||
case PAIR(MFS_BANK_OK, MFS_BANK_ERASED):
|
||||
/* Normal situation, bank zero is used.*/
|
||||
|
@ -393,7 +366,7 @@ static mfs_error_t mfs_try_mount(MFSDriver *devp) {
|
|||
RET_ON_ERROR(mfs_bank_erase(devp, MFS_BANK_0));
|
||||
RET_ON_ERROR(mfs_bank_mount(devp, MFS_BANK_1));
|
||||
}
|
||||
return MFS_REPAIR_WARNING;
|
||||
return MFS_WARN_REPAIR;
|
||||
|
||||
case PAIR(MFS_BANK_OK, MFS_BANK_PARTIAL):
|
||||
/* Bank zero is normal, bank one has problems.*/
|
||||
|
@ -411,13 +384,13 @@ static mfs_error_t mfs_try_mount(MFSDriver *devp) {
|
|||
RET_ON_ERROR(mfs_bank_erase(devp, MFS_BANK_1));
|
||||
RET_ON_ERROR(mfs_bank_mount(devp, MFS_BANK_0));
|
||||
}
|
||||
return MFS_REPAIR_WARNING;
|
||||
return MFS_WARN_REPAIR;
|
||||
|
||||
case PAIR(MFS_BANK_OK, MFS_BANK_GARBAGE):
|
||||
/* Bank zero is normal, bank one is unreadable.*/
|
||||
RET_ON_ERROR(mfs_bank_erase(devp, MFS_BANK_1));
|
||||
RET_ON_ERROR(mfs_bank_mount(devp, MFS_BANK_0));
|
||||
return MFS_REPAIR_WARNING;
|
||||
return MFS_WARN_REPAIR;
|
||||
|
||||
case PAIR(MFS_BANK_PARTIAL, MFS_BANK_ERASED):
|
||||
/* Bank zero has problems, bank one is erased.*/
|
||||
|
@ -425,7 +398,7 @@ static mfs_error_t mfs_try_mount(MFSDriver *devp) {
|
|||
RET_ON_ERROR(mfs_bank_set_header(devp, MFS_BANK_1, cnt0 + 1));
|
||||
RET_ON_ERROR(mfs_bank_erase(devp, MFS_BANK_0));
|
||||
RET_ON_ERROR(mfs_bank_mount(devp, MFS_BANK_1));
|
||||
return MFS_REPAIR_WARNING;
|
||||
return MFS_WARN_REPAIR;
|
||||
|
||||
case PAIR(MFS_BANK_PARTIAL, MFS_BANK_OK):
|
||||
/* Bank zero has problems, bank one is normal.*/
|
||||
|
@ -443,7 +416,7 @@ static mfs_error_t mfs_try_mount(MFSDriver *devp) {
|
|||
RET_ON_ERROR(mfs_bank_erase(devp, MFS_BANK_0));
|
||||
RET_ON_ERROR(mfs_bank_mount(devp, MFS_BANK_1));
|
||||
}
|
||||
return MFS_REPAIR_WARNING;
|
||||
return MFS_WARN_REPAIR;
|
||||
|
||||
case PAIR(MFS_BANK_PARTIAL, MFS_BANK_PARTIAL):
|
||||
/* Both banks have problems.*/
|
||||
|
@ -463,7 +436,7 @@ static mfs_error_t mfs_try_mount(MFSDriver *devp) {
|
|||
RET_ON_ERROR(mfs_bank_erase(devp, MFS_BANK_1));
|
||||
RET_ON_ERROR(mfs_bank_mount(devp, MFS_BANK_0));
|
||||
}
|
||||
return MFS_REPAIR_WARNING;
|
||||
return MFS_WARN_REPAIR;
|
||||
|
||||
case PAIR(MFS_BANK_PARTIAL, MFS_BANK_GARBAGE):
|
||||
/* Bank zero has problems, bank one is unreadable.*/
|
||||
|
@ -472,20 +445,20 @@ static mfs_error_t mfs_try_mount(MFSDriver *devp) {
|
|||
RET_ON_ERROR(mfs_bank_set_header(devp, MFS_BANK_1, cnt0 + 1));
|
||||
RET_ON_ERROR(mfs_bank_erase(devp, MFS_BANK_0));
|
||||
RET_ON_ERROR(mfs_bank_mount(devp, MFS_BANK_1));
|
||||
return MFS_REPAIR_WARNING;
|
||||
return MFS_WARN_REPAIR;
|
||||
|
||||
case PAIR(MFS_BANK_GARBAGE, MFS_BANK_ERASED):
|
||||
/* Bank zero is unreadable, bank one is erased.*/
|
||||
RET_ON_ERROR(mfs_bank_erase(devp, MFS_BANK_1));
|
||||
RET_ON_ERROR(mfs_bank_set_header(devp, MFS_BANK_0, 1));
|
||||
RET_ON_ERROR(mfs_bank_mount(devp, MFS_BANK_0));
|
||||
return MFS_REPAIR_WARNING;
|
||||
return MFS_WARN_REPAIR;
|
||||
|
||||
case PAIR(MFS_BANK_GARBAGE, MFS_BANK_OK):
|
||||
/* Bank zero is unreadable, bank one is normal.*/
|
||||
RET_ON_ERROR(mfs_bank_erase(devp, MFS_BANK_0));
|
||||
RET_ON_ERROR(mfs_bank_mount(devp, MFS_BANK_1));
|
||||
return MFS_REPAIR_WARNING;
|
||||
return MFS_WARN_REPAIR;
|
||||
|
||||
case PAIR(MFS_BANK_GARBAGE, MFS_BANK_PARTIAL):
|
||||
/* Bank zero is unreadable, bank one has problems.*/
|
||||
|
@ -494,7 +467,7 @@ static mfs_error_t mfs_try_mount(MFSDriver *devp) {
|
|||
RET_ON_ERROR(mfs_bank_set_header(devp, MFS_BANK_0, cnt0 + 1));
|
||||
RET_ON_ERROR(mfs_bank_erase(devp, MFS_BANK_1));
|
||||
RET_ON_ERROR(mfs_bank_mount(devp, MFS_BANK_0));
|
||||
return MFS_REPAIR_WARNING;
|
||||
return MFS_WARN_REPAIR;
|
||||
|
||||
case PAIR(MFS_BANK_GARBAGE, MFS_BANK_GARBAGE):
|
||||
/* Both banks are unreadable, reinitializing.*/
|
||||
|
@ -502,14 +475,14 @@ static mfs_error_t mfs_try_mount(MFSDriver *devp) {
|
|||
RET_ON_ERROR(mfs_bank_erase(devp, MFS_BANK_1));
|
||||
RET_ON_ERROR(mfs_bank_set_header(devp, MFS_BANK_0, 1));
|
||||
RET_ON_ERROR(mfs_bank_mount(devp, MFS_BANK_0));
|
||||
return MFS_REPAIR_WARNING;
|
||||
return MFS_WARN_REPAIR;
|
||||
|
||||
default:
|
||||
osalSysHalt("internal error");
|
||||
}
|
||||
|
||||
/* Never reached.*/
|
||||
return MFS_INTERNAL_ERROR;
|
||||
return MFS_ERR_INTERNAL;
|
||||
}
|
||||
|
||||
/*===========================================================================*/
|
||||
|
@ -577,9 +550,9 @@ void mfsStop(MFSDriver *devp) {
|
|||
* @param[in] devp pointer to the @p MFSDriver object
|
||||
* @return The operation status.
|
||||
* @retval MFS_NO_ERROR if the operation has been successfully completed.
|
||||
* @retval MFS_REPAIR_WARNING if the operation has been completed but a
|
||||
* @retval MFS_WARN_REPAIR if the operation has been completed but a
|
||||
* repair has been performed.
|
||||
* @retval MFS_FLASH_FAILURE if the flash memory is unusable because HW
|
||||
* @retval MFS_ERR_FLASH_FAILURE if the flash memory is unusable because HW
|
||||
* failures.
|
||||
*
|
||||
* @api
|
||||
|
@ -596,7 +569,7 @@ mfs_error_t mfsMount(MFSDriver *devp) {
|
|||
return err;
|
||||
}
|
||||
|
||||
return MFS_FLASH_FAILURE;
|
||||
return MFS_ERR_FLASH_FAILURE;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -619,8 +592,8 @@ mfs_error_t mfsUnmount(MFSDriver *devp) {
|
|||
* @param[in] buffer pointer to a buffer for record data
|
||||
* @return The operation status.
|
||||
* @retval MFS_NO_ERROR if the operation has been successfully completed.
|
||||
* @retval MFS_ID_NOT_FOUND if the specified id does not exists.
|
||||
* @retval MFS_CRC_ERROR if retrieved data has a CRC error.
|
||||
* @retval MFS_ERR_NOT_FOUND if the specified id does not exists.
|
||||
* @retval MFS_ERR_CRC if retrieved data has a CRC error.
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
|
@ -644,13 +617,13 @@ mfs_error_t mfsReadRecord(MFSDriver *devp, uint32_t id,
|
|||
* @param[in] buffer pointer to a buffer for record data
|
||||
* @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
|
||||
* @retval MFS_ERR_FLASH_FAILURE if the flash memory is unusable because HW
|
||||
* failures.
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
mfs_error_t mfsUpdateRecord(MFSDriver *devp, uint32_t id,
|
||||
uint32_t n, const uint8_t *buffer) {
|
||||
mfs_error_t mfsWriteRecord(MFSDriver *devp, uint32_t id,
|
||||
uint32_t n, const uint8_t *buffer) {
|
||||
|
||||
(void)devp;
|
||||
(void)id;
|
||||
|
@ -667,7 +640,7 @@ mfs_error_t mfsUpdateRecord(MFSDriver *devp, uint32_t id,
|
|||
* @param[in] id record numeric identifier
|
||||
* @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
|
||||
* @retval MFS_ERR_FLASH_FAILURE if the flash memory is unusable because HW
|
||||
* failures.
|
||||
*
|
||||
* @api
|
||||
|
|
|
@ -46,12 +46,11 @@
|
|||
* @{
|
||||
*/
|
||||
/**
|
||||
* @brief Record identifiers cache size.
|
||||
* @details Cache trades RAM for a faster access to stored records. If zero
|
||||
* then the cache is disabled.
|
||||
* @brief Maximum number of indexed records in the managed storage.
|
||||
* @note Record indexes go from 0 to @p MFS_CFG_MAX_RECORDS - 1.
|
||||
*/
|
||||
#if !defined(MFS_CFG_ID_CACHE_SIZE) || defined(__DOXIGEN__)
|
||||
#define MFS_CFG_ID_CACHE_SIZE 16
|
||||
#if !defined(MFS_CFG_MAX_RECORDS) || defined(__DOXIGEN__)
|
||||
#define MFS_CFG_MAX_RECORDS 32
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
@ -73,8 +72,8 @@
|
|||
/* Derived constants and error checks. */
|
||||
/*===========================================================================*/
|
||||
|
||||
#if MFS_CFG_ID_CACHE_SIZE < 0
|
||||
#error "invalid MFS_CFG_ID_CACHE_SIZE value"
|
||||
#if MFS_CFG_MAX_RECORDS < 0
|
||||
#error "invalid MFS_CFG_MAX_RECORDS value"
|
||||
#endif
|
||||
|
||||
#if (MFS_CFG_MAX_REPAIR_ATTEMPTS < 1) || (MFS_CFG_MAX_REPAIR_ATTEMPTS > 10)
|
||||
|
@ -111,12 +110,12 @@ typedef enum {
|
|||
*/
|
||||
typedef enum {
|
||||
MFS_NO_ERROR = 0,
|
||||
MFS_REPAIR_WARNING = 1,
|
||||
MFS_GC_WARNING = 2,
|
||||
MFS_ID_NOT_FOUND = -1,
|
||||
MFS_CRC_ERROR = -2,
|
||||
MFS_FLASH_FAILURE = -3,
|
||||
MFS_INTERNAL_ERROR = -4
|
||||
MFS_WARN_REPAIR = 1,
|
||||
MFS_WARN_GC = 2,
|
||||
MFS_ERR_NOT_FOUND = -1,
|
||||
MFS_ERR_CRC = -2,
|
||||
MFS_ERR_FLASH_FAILURE = -3,
|
||||
MFS_ERR_INTERNAL = -4
|
||||
} mfs_error_t;
|
||||
|
||||
/**
|
||||
|
@ -175,59 +174,17 @@ typedef struct {
|
|||
/**
|
||||
* @brief Data identifier.
|
||||
*/
|
||||
uint32_t id;
|
||||
uint16_t id;
|
||||
/**
|
||||
* @brief Data size for forward scan.
|
||||
* @brief Data attributes.
|
||||
*/
|
||||
uint16_t flags;
|
||||
/**
|
||||
* @brief Data size.
|
||||
*/
|
||||
uint32_t size;
|
||||
/**
|
||||
* @brief Address of the previous header or zero if none.
|
||||
*/
|
||||
flash_offset_t prev_header;
|
||||
} mfs_data_header_t;
|
||||
|
||||
#if (MFS_CFG_ID_CACHE_SIZE > 0) || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Type of an element of the record identifiers cache.
|
||||
*/
|
||||
typedef struct mfs_cached_id {
|
||||
/**
|
||||
* @brief Pointer to the next element in the list.
|
||||
*/
|
||||
struct mfs_cached_id *lru_next;
|
||||
/**
|
||||
* @brief Pointer to the previous element in the list.
|
||||
*/
|
||||
struct mfs_cached_id *lru_prev;
|
||||
/**
|
||||
* @brief Identifier of the cached element.
|
||||
*/
|
||||
uint32_t id;
|
||||
/**
|
||||
* @brief Data address of the cached element.
|
||||
*/
|
||||
flash_offset_t offset;
|
||||
/**
|
||||
* @brief Data size of the cached element.
|
||||
*/
|
||||
uint32_t size;
|
||||
} mfs_cached_id_t;
|
||||
|
||||
/**
|
||||
* @brief Type of an element of the record identifiers cache.
|
||||
*/
|
||||
typedef struct mfs_cache_header {
|
||||
/**
|
||||
* @brief Pointer to the first element in the list.
|
||||
*/
|
||||
struct mfs_cached_id *lru_next;
|
||||
/**
|
||||
* @brief Pointer to the last element in the list.
|
||||
*/
|
||||
struct mfs_cached_id *lru_prev;
|
||||
} mfs_cache_header_t;
|
||||
#endif /* MFS_CFG_ID_CACHE_SIZE > 0 */
|
||||
|
||||
/**
|
||||
* @brief Type of a MFS configuration structure.
|
||||
*/
|
||||
|
@ -280,24 +237,15 @@ typedef struct {
|
|||
* @brief Pointer to the next free position in the current bank.
|
||||
*/
|
||||
flash_offset_t next_offset;
|
||||
/**
|
||||
* @brief Pointer to the last header in the list or zero.
|
||||
*/
|
||||
flash_offset_t last_offset;
|
||||
/**
|
||||
* @brief Used space in the current bank without considering erased records.
|
||||
*/
|
||||
uint32_t used_space;
|
||||
#if (MFS_CFG_ID_CACHE_SIZE > 0) || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Header of the cache LRU list.
|
||||
* @brief Offsets of the most recent instance of the records.
|
||||
* @note Zero means that ther is not a record with that id.
|
||||
*/
|
||||
mfs_cache_header_t cache_header;
|
||||
/**
|
||||
* @brief Array of the cached identifiers.
|
||||
*/
|
||||
mfs_cached_id_t cache_buffer[MFS_CFG_ID_CACHE_SIZE];
|
||||
#endif /* MFS_CFG_ID_CACHE_SIZE > 0 */
|
||||
flash_offset_t instances[MFS_CFG_MAX_RECORDS];
|
||||
} MFSDriver;
|
||||
|
||||
/*===========================================================================*/
|
||||
|
@ -326,8 +274,8 @@ extern "C" {
|
|||
mfs_error_t mfsUnmount(MFSDriver *devp);
|
||||
mfs_error_t mfsReadRecord(MFSDriver *devp, uint32_t id,
|
||||
uint32_t *np, uint8_t *buffer);
|
||||
mfs_error_t mfsUpdateRecord(MFSDriver *devp, uint32_t id,
|
||||
uint32_t n, const uint8_t *buffer);
|
||||
mfs_error_t mfsWriteRecord(MFSDriver *devp, uint32_t id,
|
||||
uint32_t n, const uint8_t *buffer);
|
||||
mfs_error_t mfsEraseRecord(MFSDriver *devp, uint32_t id);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue