rusefi/firmware/controllers/mfs_storage.cpp

99 lines
2.3 KiB
C++

/**
* @file mfs_storage.cpp
* @brief Storage interface to ChibiOS MFS driver
*
* @date Jan 4, 2025
* @author Andrey Gusakov
*/
#include "pch.h"
#include "storage.h"
/* if we use ChibiOS MFS for settings */
#if EFI_STORAGE_MFS == TRUE
#include "hal_mfs.h"
/* Managed Flash Storage driver */
MFSDriver mfsd;
extern void boardInitMfs(void);
extern const MFSConfig *boardGetMfsConfig(void);
StorageStatus mfsStorageWrite(int id, const uint8_t *ptr, size_t size) {
efiPrintf("Writing storage ID %d ... %d bytes", id, size);
efitick_t startNt = getTimeNowNt();
// TODO: add watchdog disable and enable in case MFS is on internal flash and one bank
mfs_error_t err = mfsWriteRecord(&mfsd, id, size, ptr);
efitick_t endNt = getTimeNowNt();
int elapsed_Ms = US2MS(NT2US(endNt - startNt));
if (err >= MFS_NO_ERROR) {
efiPrintf("Write done with no errors after %d mS MFS status %d", elapsed_Ms, err);
} else {
efiPrintf("Write FAILED after %d with MFS status %d", elapsed_Ms, err);
return StorageStatus::Failed;
}
return StorageStatus::Ok;
}
StorageStatus mfsStorageRead(int id, uint8_t *ptr, size_t size) {
efiPrintf("Reading storage ID %d ... %d bytes", id, size);
size_t readed_size = size;
mfs_error_t err = mfsReadRecord(&mfsd, id, &readed_size, ptr);
if (err >= MFS_NO_ERROR) {
if (readed_size != size) {
efiPrintf("Incorrect size expected %d readed %d", size, readed_size);
return StorageStatus::IncompatibleVersion;
}
efiPrintf("Reding done with no errors and MFS status %d", err);
} else {
efiPrintf("Read FAILED with MFS status %d", err);
// TODO: or corrupted?
return StorageStatus::NotFound;
}
return StorageStatus::Ok;
}
StorageStatus mfsStorageFormat()
{
efitick_t startNt = getTimeNowNt();
mfs_error_t err;
err = mfsErase(&mfsd);
efitick_t endNt = getTimeNowNt();
int elapsed_Ms = US2MS(NT2US(endNt - startNt));
efiPrintf("MFS erase done %d mS err %d", elapsed_Ms, err);
return (err >= MFS_NO_ERROR) ? StorageStatus::Ok : StorageStatus::Failed;
}
static void eraseStorage() {
mfsStorageFormat();
}
void initStorageMfs() {
boardInitMfs();
const MFSConfig *mfsConfig = boardGetMfsConfig();
/* MFS */
mfsObjectInit(&mfsd);
mfs_error_t err = mfsStart(&mfsd, mfsConfig);
if (err < MFS_NO_ERROR) {
/* hm...? */
}
addConsoleAction("erasestorage", eraseStorage);
}
#endif //EFI_STORAGE_MFS