rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
storage_mfs.cpp
Go to the documentation of this file.
1/**
2 * @file storage_mfs.cpp
3 * @brief Storage interface to ChibiOS MFS driver
4 *
5 * @date Jan 4, 2025
6 * @author Andrey Gusakov
7 */
8
9#include "pch.h"
10
11#include "storage_mfs.h"
12#include "flash_main.h"
13
14/* if we use ChibiOS MFS for settings */
15#if EFI_STORAGE_MFS == TRUE
16
17#include "hal_mfs.h"
18
19class SettingStorageMFS : public SettingStorageBase {
20public:
21 bool isReady() override;
22 bool isIdSupported(size_t id) override;
23 StorageStatus store(size_t id, const uint8_t *ptr, size_t size) override;
24 StorageStatus read(size_t id, uint8_t *ptr, size_t size) override;
25 StorageStatus format() override;
26
27 SettingStorageMFS(MFSDriver *drv) {
28 m_drv = drv;
29 }
30
31 bool m_ready = false;
32
33private:
34 MFSDriver *m_drv;
35};
36
37bool SettingStorageMFS::isReady(){
38 return m_ready;
39}
40
41bool SettingStorageMFS::isIdSupported(size_t id) {
42#if (EFI_STORAGE_INT_FLASH == TRUE)
43 // If internal flash storage is enabled - settings are stored in there
44 if ((id == EFI_SETTINGS_RECORD_ID) ||
46 return false;
47 }
48#endif // EFI_STORAGE_INT_FLASH
49 if ((id >= 1) && (id < MFS_CFG_MAX_RECORDS)) {
50 return true;
51 }
52
53 return false;
54}
55
56StorageStatus SettingStorageMFS::store(size_t id, const uint8_t *ptr, size_t size) {
57 efiPrintf("MFS: Writing storage ID %d ... %d bytes", id, size);
58 efitick_t startNt = getTimeNowNt();
59
60 // TODO: add watchdog disable and enable in case MFS is on internal flash and one bank
61 mfs_error_t err = mfsWriteRecord(m_drv, id, size, ptr);
62
63 efitick_t endNt = getTimeNowNt();
64 int elapsed_Ms = US2MS(NT2US(endNt - startNt));
65
66 if (err >= MFS_NO_ERROR) {
67 efiPrintf("MFS: Write done with no errors after %d mS MFS status %d", elapsed_Ms, err);
68 } else {
69 efiPrintf("MFS: Write FAILED after %d with MFS status %d", elapsed_Ms, err);
70
72 }
73
74 return StorageStatus::Ok;
75}
76
77StorageStatus SettingStorageMFS::read(size_t id, uint8_t *ptr, size_t size) {
78 efiPrintf("MFS: Reading storage ID %d ... %d bytes", id, size);
79
80 size_t readed_size = size;
81 mfs_error_t err = mfsReadRecord(m_drv, id, &readed_size, ptr);
82
83 if (err >= MFS_NO_ERROR) {
84 if (readed_size != size) {
85 efiPrintf("MFS: Incorrect size expected %d readed %d", size, readed_size);
87 }
88 efiPrintf("MFS: Reding done with no errors and MFS status %d", err);
89 } else {
90 efiPrintf("MFS: Read FAILED with MFS status %d", err);
91
92 // TODO: or corrupted?
94 }
95 return StorageStatus::Ok;
96}
97
98StorageStatus SettingStorageMFS::format()
99{
100 efitick_t startNt = getTimeNowNt();
101
102 mfs_error_t err;
103 err = mfsErase(m_drv);
104
105 efitick_t endNt = getTimeNowNt();
106 int elapsed_Ms = US2MS(NT2US(endNt - startNt));
107 efiPrintf("MFS: format done %d mS err %d", elapsed_Ms, err);
108
109 return (err >= MFS_NO_ERROR) ? StorageStatus::Ok : StorageStatus::Failed;
110}
111
112//static void eraseStorage() {
113// mfsStorageFormat();
114//}
115
116/* Managed Flash Storage driver */
117static MFSDriver mfsd;
118static NO_CACHE mfs_nocache_buffer_t mfsbuf;
119
120static SettingStorageMFS storageMFS(&mfsd);
121
122extern bool boardInitMfs(void);
123extern const MFSConfig *boardGetMfsConfig(void);
124
126 if (boardInitMfs() == false) {
127 return false;
128 }
129
130 const MFSConfig *mfsConfig = boardGetMfsConfig();
131
132 /* MFS */
133 mfsObjectInit(&mfsd, &mfsbuf);
134 mfs_error_t err = mfsStart(&mfsd, mfsConfig);
135 if (err < MFS_NO_ERROR) {
136 efiPrintf("MFS: storage failed to start: %d", err);
137 return false;
138 }
139
140 //addConsoleAction("erasestorage", eraseStorage);
141
142 storageMFS.m_ready = true;
143
145}
146
147#endif //EFI_STORAGE_MFS
virtual StorageStatus read(size_t id, uint8_t *ptr, size_t size)=0
virtual StorageStatus store(size_t id, const uint8_t *ptr, size_t size)=0
virtual bool isReady()=0
virtual bool isIdSupported(size_t id)=0
virtual StorageStatus format()=0
efitick_t getTimeNowNt()
Definition efitime.cpp:19
static union @47 NO_CACHE
bool storageRegisterStorage(StorageType type, SettingStorageBase *storage)
Definition storage.cpp:194
@ STORAGE_MFS_EXT_FLASH
Definition storage.h:40
@ EFI_SETTINGS_BACKUP_RECORD_ID
Definition storage.h:50
@ EFI_SETTINGS_RECORD_ID
Definition storage.h:49
StorageStatus
Definition storage.h:12
static NO_CACHE mfs_nocache_buffer_t mfsbuf
bool boardInitMfs(void)
bool initStorageMfs()
const MFSConfig * boardGetMfsConfig(void)
static MFSDriver mfsd
composite packet size