aboutsummaryrefslogtreecommitdiffstats
path: root/os/ex/subsystems
diff options
context:
space:
mode:
authorGiovanni Di Sirio <gdisirio@gmail.com>2016-06-14 09:26:16 +0000
committerGiovanni Di Sirio <gdisirio@gmail.com>2016-06-14 09:26:16 +0000
commit2d4c475d1d9a67d03193366a6a402d00de7f414a (patch)
tree3255af82e3afacb3684ec86f61df4c71ff82f823 /os/ex/subsystems
parent75d0d3d59766c8834305dce0025e27a037b9408d (diff)
downloadChibiOS-2d4c475d1d9a67d03193366a6a402d00de7f414a.tar.gz
ChibiOS-2d4c475d1d9a67d03193366a6a402d00de7f414a.tar.bz2
ChibiOS-2d4c475d1d9a67d03193366a6a402d00de7f414a.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9625 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/ex/subsystems')
-rw-r--r--os/ex/subsystems/mfs/mfs.c49
-rw-r--r--os/ex/subsystems/mfs/mfs.h23
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.
*/