99 lines
2.3 KiB
C++
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
|