17
17
18
18
19
19
// Block device emulated on existing filesystem
20
- lfs_error_t lfs_emubd_create (lfs_emubd_t * emu , const char * path ) {
20
+ int lfs_emubd_create (lfs_emubd_t * emu , const char * path ) {
21
21
memset (& emu -> info , 0 , sizeof (emu -> info ));
22
22
memset (& emu -> stats , 0 , sizeof (emu -> stats ));
23
23
@@ -41,8 +41,8 @@ lfs_error_t lfs_emubd_create(lfs_emubd_t *emu, const char *path) {
41
41
return err ;
42
42
}
43
43
44
- emu -> info .read_size = lfs_cfg_getu (& cfg , "read_size" , 0 );
45
- emu -> info .write_size = lfs_cfg_getu (& cfg , "write_size" , 0 );
44
+ emu -> info .read_size = lfs_cfg_getu (& cfg , "read_size" , 0 );
45
+ emu -> info .prog_size = lfs_cfg_getu (& cfg , "prog_size" , 0 );
46
46
emu -> info .erase_size = lfs_cfg_getu (& cfg , "erase_size" , 0 );
47
47
emu -> info .total_size = lfs_cfg_getu (& cfg , "total_size" , 0 );
48
48
@@ -55,23 +55,24 @@ void lfs_emubd_destroy(lfs_emubd_t *emu) {
55
55
free (emu -> path );
56
56
}
57
57
58
- lfs_error_t lfs_emubd_read (lfs_emubd_t * emu , uint8_t * buffer ,
59
- lfs_ino_t ino , lfs_off_t off , lfs_size_t size ) {
58
+ int lfs_emubd_read (lfs_emubd_t * emu , lfs_block_t block ,
59
+ lfs_off_t off , lfs_size_t size , void * buffer ) {
60
+ uint8_t * data = buffer ;
60
61
61
62
// Check if read is valid
62
63
if (!(off % emu -> info .read_size == 0 &&
63
64
size % emu -> info .read_size == 0 &&
64
- ((lfs_lsize_t ) ino * emu -> info .erase_size + off + size
65
+ ((uint64_t ) block * emu -> info .erase_size + off + size
65
66
< emu -> info .total_size ))) {
66
67
return - EINVAL ;
67
68
}
68
69
69
70
// Zero out buffer for debugging
70
- memset (buffer , 0 , size );
71
+ memset (data , 0 , size );
71
72
72
73
// Iterate over blocks until enough data is read
73
74
while (size > 0 ) {
74
- snprintf (emu -> child , LFS_NAME_MAX , "%d" , ino );
75
+ snprintf (emu -> child , LFS_NAME_MAX , "%d" , block );
75
76
size_t count = lfs_min (emu -> info .erase_size - off , size );
76
77
77
78
FILE * f = fopen (emu -> path , "rb" );
@@ -85,7 +86,7 @@ lfs_error_t lfs_emubd_read(lfs_emubd_t *emu, uint8_t *buffer,
85
86
return - errno ;
86
87
}
87
88
88
- size_t res = fread (buffer , 1 , count , f );
89
+ size_t res = fread (data , 1 , count , f );
89
90
if (res < count && !feof (f )) {
90
91
return - errno ;
91
92
}
@@ -97,29 +98,30 @@ lfs_error_t lfs_emubd_read(lfs_emubd_t *emu, uint8_t *buffer,
97
98
}
98
99
99
100
size -= count ;
100
- buffer += count ;
101
- ino += 1 ;
101
+ data += count ;
102
+ block += 1 ;
102
103
off = 0 ;
103
104
}
104
105
105
106
emu -> stats .read_count += 1 ;
106
107
return 0 ;
107
108
}
108
109
109
- lfs_error_t lfs_emubd_write (lfs_emubd_t * emu , const uint8_t * buffer ,
110
- lfs_ino_t ino , lfs_off_t off , lfs_size_t size ) {
110
+ int lfs_emubd_prog (lfs_emubd_t * emu , lfs_block_t block ,
111
+ lfs_off_t off , lfs_size_t size , const void * buffer ) {
112
+ const uint8_t * data = buffer ;
111
113
112
114
// Check if write is valid
113
- if (!(off % emu -> info .write_size == 0 &&
114
- size % emu -> info .write_size == 0 &&
115
- ((lfs_lsize_t ) ino * emu -> info .erase_size + off + size
115
+ if (!(off % emu -> info .prog_size == 0 &&
116
+ size % emu -> info .prog_size == 0 &&
117
+ ((uint64_t ) block * emu -> info .erase_size + off + size
116
118
< emu -> info .total_size ))) {
117
119
return - EINVAL ;
118
120
}
119
121
120
122
// Iterate over blocks until enough data is read
121
123
while (size > 0 ) {
122
- snprintf (emu -> child , LFS_NAME_MAX , "%d" , ino );
124
+ snprintf (emu -> child , LFS_NAME_MAX , "%d" , block );
123
125
size_t count = lfs_min (emu -> info .erase_size - off , size );
124
126
125
127
FILE * f = fopen (emu -> path , "r+b" );
@@ -135,7 +137,7 @@ lfs_error_t lfs_emubd_write(lfs_emubd_t *emu, const uint8_t *buffer,
135
137
return - errno ;
136
138
}
137
139
138
- size_t res = fwrite (buffer , 1 , count , f );
140
+ size_t res = fwrite (data , 1 , count , f );
139
141
if (res < count ) {
140
142
return - errno ;
141
143
}
@@ -146,29 +148,29 @@ lfs_error_t lfs_emubd_write(lfs_emubd_t *emu, const uint8_t *buffer,
146
148
}
147
149
148
150
size -= count ;
149
- buffer += count ;
150
- ino += 1 ;
151
+ data += count ;
152
+ block += 1 ;
151
153
off = 0 ;
152
154
}
153
155
154
- emu -> stats .write_count += 1 ;
156
+ emu -> stats .prog_count += 1 ;
155
157
return 0 ;
156
158
}
157
159
158
- lfs_error_t lfs_emubd_erase (lfs_emubd_t * emu ,
159
- lfs_ino_t ino , lfs_off_t off , lfs_size_t size ) {
160
+ int lfs_emubd_erase (lfs_emubd_t * emu , lfs_block_t block ,
161
+ lfs_off_t off , lfs_size_t size ) {
160
162
161
163
// Check if erase is valid
162
164
if (!(off % emu -> info .erase_size == 0 &&
163
165
size % emu -> info .erase_size == 0 &&
164
- ((lfs_lsize_t ) ino * emu -> info .erase_size + off + size
166
+ ((uint64_t ) block * emu -> info .erase_size + off + size
165
167
< emu -> info .total_size ))) {
166
168
return - EINVAL ;
167
169
}
168
170
169
171
// Iterate and erase blocks
170
172
while (size > 0 ) {
171
- snprintf (emu -> child , LFS_NAME_MAX , "%d" , ino );
173
+ snprintf (emu -> child , LFS_NAME_MAX , "%d" , block );
172
174
struct stat st ;
173
175
int err = stat (emu -> path , & st );
174
176
if (err && errno != ENOENT ) {
@@ -183,57 +185,57 @@ lfs_error_t lfs_emubd_erase(lfs_emubd_t *emu,
183
185
}
184
186
185
187
size -= emu -> info .erase_size ;
186
- ino += 1 ;
188
+ block += 1 ;
187
189
off = 0 ;
188
190
}
189
191
190
192
emu -> stats .erase_count += 1 ;
191
193
return 0 ;
192
194
}
193
195
194
- lfs_error_t lfs_emubd_sync (lfs_emubd_t * emu ) {
196
+ int lfs_emubd_sync (lfs_emubd_t * emu ) {
195
197
// Always in sync
196
198
return 0 ;
197
199
}
198
200
199
- lfs_error_t lfs_emubd_info (lfs_emubd_t * emu , struct lfs_bd_info * info ) {
201
+ int lfs_emubd_info (lfs_emubd_t * emu , struct lfs_bd_info * info ) {
200
202
* info = emu -> info ;
201
203
return 0 ;
202
204
}
203
205
204
- lfs_error_t lfs_emubd_stats (lfs_emubd_t * emu , struct lfs_bd_stats * stats ) {
206
+ int lfs_emubd_stats (lfs_emubd_t * emu , struct lfs_bd_stats * stats ) {
205
207
* stats = emu -> stats ;
206
208
return 0 ;
207
209
}
208
210
209
211
210
212
// Wrappers for void*s
211
- static lfs_error_t lfs_emubd_bd_read (void * bd , uint8_t * buffer ,
212
- lfs_ino_t ino , lfs_off_t off , lfs_size_t size ) {
213
- return lfs_emubd_read ((lfs_emubd_t * )bd , buffer , ino , off , size );
213
+ static int lfs_emubd_bd_read (void * bd , lfs_block_t block ,
214
+ lfs_off_t off , lfs_size_t size , void * buffer ) {
215
+ return lfs_emubd_read ((lfs_emubd_t * )bd , block , off , size , buffer );
214
216
}
215
217
216
- static lfs_error_t lfs_emubd_bd_write (void * bd , const uint8_t * buffer ,
217
- lfs_ino_t ino , lfs_off_t off , lfs_size_t size ) {
218
- return lfs_emubd_write ((lfs_emubd_t * )bd , buffer , ino , off , size );
218
+ static int lfs_emubd_bd_prog (void * bd , lfs_block_t block ,
219
+ lfs_off_t off , lfs_size_t size , const void * buffer ) {
220
+ return lfs_emubd_prog ((lfs_emubd_t * )bd , block , off , size , buffer );
219
221
}
220
222
221
- static lfs_error_t lfs_emubd_bd_erase (void * bd ,
222
- lfs_ino_t ino , lfs_off_t off , lfs_size_t size ) {
223
- return lfs_emubd_erase ((lfs_emubd_t * )bd , ino , off , size );
223
+ static int lfs_emubd_bd_erase (void * bd , lfs_block_t block ,
224
+ lfs_off_t off , lfs_size_t size ) {
225
+ return lfs_emubd_erase ((lfs_emubd_t * )bd , block , off , size );
224
226
}
225
227
226
- static lfs_error_t lfs_emubd_bd_sync (void * bd ) {
228
+ static int lfs_emubd_bd_sync (void * bd ) {
227
229
return lfs_emubd_sync ((lfs_emubd_t * )bd );
228
230
}
229
231
230
- static lfs_error_t lfs_emubd_bd_info (void * bd , struct lfs_bd_info * info ) {
232
+ static int lfs_emubd_bd_info (void * bd , struct lfs_bd_info * info ) {
231
233
return lfs_emubd_info ((lfs_emubd_t * )bd , info );
232
234
}
233
235
234
236
const struct lfs_bd_ops lfs_emubd_ops = {
235
237
.read = lfs_emubd_bd_read ,
236
- .write = lfs_emubd_bd_write ,
238
+ .prog = lfs_emubd_bd_prog ,
237
239
.erase = lfs_emubd_bd_erase ,
238
240
.sync = lfs_emubd_bd_sync ,
239
241
.info = lfs_emubd_bd_info ,
0 commit comments