|
3 | 3 | * |
4 | 4 | * The MIT License (MIT) |
5 | 5 | * |
6 | | - * Copyright (c) 2019 Damien P. George |
| 6 | + * Copyright (c) 2019-2020 Damien P. George |
7 | 7 | * |
8 | 8 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
9 | 9 | * of this software and associated documentation files (the "Software"), to deal |
|
32 | 32 |
|
33 | 33 | #if MBOOT_FSLOAD |
34 | 34 |
|
| 35 | +#if !(MBOOT_VFS_FAT || MBOOT_VFS_LFS1 || MBOOT_VFS_LFS2) |
| 36 | +#error Must enable at least one VFS component |
| 37 | +#endif |
| 38 | + |
35 | 39 | static int fsload_program_file(bool write_to_flash) { |
36 | 40 | // Parse DFU |
37 | 41 | uint8_t buf[512]; |
@@ -183,27 +187,58 @@ int fsload_process(void) { |
183 | 187 | if (elem[0] == mount_point) { |
184 | 188 | uint32_t base_addr = get_le32(&elem[2]); |
185 | 189 | uint32_t byte_len = get_le32(&elem[6]); |
| 190 | + int ret; |
| 191 | + union { |
| 192 | + #if MBOOT_VFS_FAT |
| 193 | + vfs_fat_context_t fat; |
| 194 | + #endif |
| 195 | + #if MBOOT_VFS_LFS1 |
| 196 | + vfs_lfs1_context_t lfs1; |
| 197 | + #endif |
| 198 | + #if MBOOT_VFS_LFS2 |
| 199 | + vfs_lfs2_context_t lfs2; |
| 200 | + #endif |
| 201 | + } ctx; |
| 202 | + const stream_methods_t *methods; |
| 203 | + #if MBOOT_VFS_FAT |
186 | 204 | if (elem[1] == ELEM_MOUNT_FAT) { |
187 | | - vfs_fat_context_t ctx; |
188 | | - int ret = vfs_fat_mount(&ctx, base_addr, byte_len); |
| 205 | + ret = vfs_fat_mount(&ctx.fat, base_addr, byte_len); |
| 206 | + methods = &vfs_fat_stream_methods; |
| 207 | + } else |
| 208 | + #endif |
| 209 | + #if MBOOT_VFS_LFS1 |
| 210 | + if (elem[1] == ELEM_MOUNT_LFS1) { |
| 211 | + ret = vfs_lfs1_mount(&ctx.lfs1, base_addr, byte_len); |
| 212 | + methods = &vfs_lfs1_stream_methods; |
| 213 | + } else |
| 214 | + #endif |
| 215 | + #if MBOOT_VFS_LFS2 |
| 216 | + if (elem[1] == ELEM_MOUNT_LFS2) { |
| 217 | + ret = vfs_lfs2_mount(&ctx.lfs2, base_addr, byte_len); |
| 218 | + methods = &vfs_lfs2_stream_methods; |
| 219 | + } else |
| 220 | + #endif |
| 221 | + { |
| 222 | + // Unknown filesystem type |
| 223 | + return -1; |
| 224 | + } |
| 225 | + |
| 226 | + if (ret == 0) { |
| 227 | + ret = fsload_validate_and_program_file(&ctx, methods, fname); |
| 228 | + } |
| 229 | + |
| 230 | + // Flash LEDs based on success/failure of update |
| 231 | + for (int i = 0; i < 4; ++i) { |
189 | 232 | if (ret == 0) { |
190 | | - ret = fsload_validate_and_program_file(&ctx, &vfs_fat_stream_methods, fname); |
| 233 | + led_state_all(7); |
| 234 | + } else { |
| 235 | + led_state_all(1); |
191 | 236 | } |
192 | | - // Flash LEDs based on success/failure of update |
193 | | - for (int i = 0; i < 4; ++i) { |
194 | | - if (ret == 0) { |
195 | | - led_state_all(7); |
196 | | - } else { |
197 | | - led_state_all(1); |
198 | | - } |
199 | | - mp_hal_delay_ms(100); |
200 | | - led_state_all(0); |
201 | | - mp_hal_delay_ms(100); |
202 | | - } |
203 | | - return ret; |
| 237 | + mp_hal_delay_ms(100); |
| 238 | + led_state_all(0); |
| 239 | + mp_hal_delay_ms(100); |
204 | 240 | } |
205 | | - // Unknown filesystem type |
206 | | - return -1; |
| 241 | + return ret; |
207 | 242 | } |
208 | 243 | elem += elem[-1]; |
209 | 244 | } |
|
0 commit comments