rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
storage_sd.cpp
Go to the documentation of this file.
1/**
2 * @file storage_sd.cpp
3 * @brief Storage interface to FatFS
4 *
5 * @date Jul 16, 2025
6 * @author Andrey Gusakov
7 */
8
9#include "pch.h"
10
11#include "storage.h"
12
13/* if we use ChibiOS MFS for settings */
14#if EFI_STORAGE_SD == TRUE
15
16#if EFI_SUPPORT_FATFS == FALSE
17 #error EFI_SUPPORT_FATFS should be enabled for EFI_STORAGE_SD
18#endif
19
20#include "ff.h"
21#include "mmc_card.h"
22#include "mmc_card_util.h"
23
24class SettingStorageSD : public SettingStorageBase {
25public:
26 bool isReady() override;
27 bool isIdSupported(size_t id) override;
28 StorageStatus store(size_t id, const uint8_t *ptr, size_t size) override;
29 StorageStatus read(size_t id, uint8_t *ptr, size_t size) override;
30 StorageStatus format() override;
31
32 SettingStorageSD(FIL *fd) {
33 m_fd = fd;
34 }
35
36private:
37 const char *getIdFileName(size_t id);
38 FIL *m_fd;
39};
40
41const char *SettingStorageSD::getIdFileName(size_t id) {
42 switch (id) {
44 return "ltft.bin";
45 default:
46 return nullptr;
47 }
48}
49
50bool SettingStorageSD::isReady() {
52}
53
54bool SettingStorageSD::isIdSupported(size_t id) {
55 return (getIdFileName(id) != nullptr);
56}
57
58StorageStatus SettingStorageSD::store(size_t id, const uint8_t *ptr, size_t size) {
59 const char *fileName = getIdFileName(id);
60
61 if (fileName == nullptr) {
63 }
64
65 efiPrintf("SD: Writing storage ID %d %s... %d bytes", id, fileName, size);
66 efitick_t startNt = getTimeNowNt();
67
68 /* Create new or truncate file. */
69 FRESULT err = f_open(m_fd, fileName, FA_CREATE_ALWAYS | FA_WRITE);
70 if (err != FR_OK) {
71 printFatFsError("SD: failed to create file", err);
73 }
74
76 size_t bytesWritten = 0;
77 err = f_write(m_fd, ptr, size, &bytesWritten);
78 if (err != FR_OK) {
79 printFatFsError("SD: failed to write", err);
80 status = StorageStatus::Failed;
81 }
82
83 if (bytesWritten != size) {
84 efiPrintf("SD: failed to write whole file %d != %d", bytesWritten, size);
85 status = StorageStatus::Failed;
86 }
87
88 f_close(m_fd);
89
90 efitick_t endNt = getTimeNowNt();
91 int elapsed_Ms = US2MS(NT2US(endNt - startNt));
92
93 efiPrintf("SD: Write done after %d mS", elapsed_Ms);
94
95 return status;
96}
97
98StorageStatus SettingStorageSD::read(size_t id, uint8_t *ptr, size_t size) {
99 const char *fileName = getIdFileName(id);
100
101 if (fileName == nullptr) {
103 }
104
105 efiPrintf("SD: Reading storage ID %d %s ... %d bytes", id, fileName, size);
106
107 /* Create new or truncate file. */
108 FRESULT err = f_open(m_fd, fileName, FA_READ);
109 if (err != FR_OK) {
110 printFatFsError("SD: failed to open file", err);
112 }
113
115 size_t bytesRead = 0;
116 err = f_read(m_fd, ptr, size, &bytesRead);
117 if (err != FR_OK) {
118 printFatFsError("SD: failed to read", err);
119 status = StorageStatus::Failed;
120 }
121
122 if (bytesRead != size) {
123 efiPrintf("SD: failed to read whole file %d != %d", bytesRead, size);
124 status = StorageStatus::Failed;
125 }
126
127 f_close(m_fd);
128
129 efiPrintf("SD: Reading done");
130
131 return status;
132}
133
134StorageStatus SettingStorageSD::format() {
135 /* TODO: actually format sd? */
136
138}
139
140static NO_CACHE FIL fd;
141
142static SettingStorageSD storageSD(&fd);
143
145 return storageRegisterStorage(STORAGE_SD_CARD, &storageSD);
146}
147
151
152#endif //EFI_STORAGE_SD
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
SD_MODE sdCardGetCurrentMode(void)
void printFatFsError(const char *str, FRESULT f_error)
Definition mmc_card.cpp:273
@ SD_MODE_ECU
Definition mmc_card.h:18
bool storageUnregisterStorage(StorageType type)
Definition storage.cpp:213
bool storageRegisterStorage(StorageType type, SettingStorageBase *storage)
Definition storage.cpp:194
@ STORAGE_SD_CARD
Definition storage.h:41
@ EFI_LTFT_RECORD_ID
Definition storage.h:51
StorageStatus
Definition storage.h:12
bool deinitStorageSD()
bool initStorageSD()
static NO_CACHE FIL fd
composite packet size