diff options
-rw-r--r-- | apps/debug_menu.c | 8 | ||||
-rw-r--r-- | firmware/common/disk.c | 16 | ||||
-rw-r--r-- | firmware/include/dircache_redirect.h | 41 |
3 files changed, 49 insertions, 16 deletions
diff --git a/apps/debug_menu.c b/apps/debug_menu.c index 3a9218bc84..1b341a96e4 100644 --- a/apps/debug_menu.c +++ b/apps/debug_menu.c | |||
@@ -128,6 +128,9 @@ | |||
128 | 128 | ||
129 | #if defined(HAVE_BOOTDATA) && !defined(SIMULATOR) | 129 | #if defined(HAVE_BOOTDATA) && !defined(SIMULATOR) |
130 | #include "bootdata.h" | 130 | #include "bootdata.h" |
131 | #include "rbpaths.h" | ||
132 | #include "pathfuncs.h" | ||
133 | #include "rb-loader.h" | ||
131 | #endif | 134 | #endif |
132 | 135 | ||
133 | static const char* threads_getname(int selected_item, void *data, | 136 | static const char* threads_getname(int selected_item, void *data, |
@@ -2530,12 +2533,17 @@ static bool dbg_boot_data(void) | |||
2530 | simplelist_set_line_count(0); | 2533 | simplelist_set_line_count(0); |
2531 | crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff); | 2534 | crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff); |
2532 | #if defined(HAVE_MULTIBOOT) | 2535 | #if defined(HAVE_MULTIBOOT) |
2536 | char rootpath[VOL_MAX_LEN+2] = RB_ROOT_CONTENTS_DIR; | ||
2533 | int boot_volume = 0; | 2537 | int boot_volume = 0; |
2534 | if(crc == boot_data.crc) | 2538 | if(crc == boot_data.crc) |
2535 | { | 2539 | { |
2536 | boot_volume = boot_data.boot_volume; /* boot volume contained in uint8_t payload */ | 2540 | boot_volume = boot_data.boot_volume; /* boot volume contained in uint8_t payload */ |
2541 | get_redirect_dir(rootpath, sizeof(rootpath), boot_volume, "", ""); | ||
2542 | rootpath[path_strip_trailing_separators(rootpath,NULL)] = '\0'; | ||
2537 | } | 2543 | } |
2538 | simplelist_addline("Boot Volume: <%lu>", boot_volume); | 2544 | simplelist_addline("Boot Volume: <%lu>", boot_volume); |
2545 | simplelist_addline("Root:"); | ||
2546 | simplelist_addline("%s", rootpath); | ||
2539 | simplelist_addline(""); | 2547 | simplelist_addline(""); |
2540 | #endif | 2548 | #endif |
2541 | simplelist_addline("Bootdata RAW:"); | 2549 | simplelist_addline("Bootdata RAW:"); |
diff --git a/firmware/common/disk.c b/firmware/common/disk.c index c6fbc34409..e94e161d44 100644 --- a/firmware/common/disk.c +++ b/firmware/common/disk.c | |||
@@ -260,23 +260,7 @@ int disk_mount_all(void) | |||
260 | for (int i = 0; i < NUM_VOLUMES; i++) | 260 | for (int i = 0; i < NUM_VOLUMES; i++) |
261 | vol_drive[i] = -1; /* mark all as unassigned */ | 261 | vol_drive[i] = -1; /* mark all as unassigned */ |
262 | 262 | ||
263 | #if defined(HAVE_BOOTDATA) && !defined(SIMULATOR) && !defined(BOOTLOADER) | ||
264 | unsigned int crc = 0; | ||
265 | int boot_volume = 0; | ||
266 | crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff); | ||
267 | if(crc == boot_data.crc) | ||
268 | { | ||
269 | boot_volume = boot_data.boot_volume; /* boot volume contained in uint8_t payload */ | ||
270 | } | ||
271 | #ifdef HAVE_HOTSWAP | ||
272 | if (storage_present(boot_volume)) | ||
273 | #endif | ||
274 | mounted += disk_mount(boot_volume); /* mount boot volume first */ | ||
275 | for (int i = 0; i < NUM_DRIVES; i++) | ||
276 | if (i != boot_volume) | ||
277 | #else | ||
278 | for (int i = 0; i < NUM_DRIVES; i++) | 263 | for (int i = 0; i < NUM_DRIVES; i++) |
279 | #endif | ||
280 | { | 264 | { |
281 | #ifdef HAVE_HOTSWAP | 265 | #ifdef HAVE_HOTSWAP |
282 | if (storage_present(i)) | 266 | if (storage_present(i)) |
diff --git a/firmware/include/dircache_redirect.h b/firmware/include/dircache_redirect.h index 171954a135..dfab6fd5a3 100644 --- a/firmware/include/dircache_redirect.h +++ b/firmware/include/dircache_redirect.h | |||
@@ -24,6 +24,13 @@ | |||
24 | #include "pathfuncs.h" | 24 | #include "pathfuncs.h" |
25 | #include "dir.h" | 25 | #include "dir.h" |
26 | #include "dircache.h" | 26 | #include "dircache.h" |
27 | |||
28 | #if defined(HAVE_MULTIBOOT) && !defined(SIMULATOR) | ||
29 | #include "rb-loader.h" | ||
30 | #include "bootdata.h" | ||
31 | #include "crc32.h" | ||
32 | #endif | ||
33 | |||
27 | #ifndef RB_ROOT_VOL_HIDDEN | 34 | #ifndef RB_ROOT_VOL_HIDDEN |
28 | #define RB_ROOT_VOL_HIDDEN(v) (0 == 0) | 35 | #define RB_ROOT_VOL_HIDDEN(v) (0 == 0) |
29 | #endif | 36 | #endif |
@@ -137,11 +144,45 @@ static inline void volume_onmount_internal(IF_MV_NONVOID(int volume)) | |||
137 | #else | 144 | #else |
138 | const char *path = PATH_ROOTSTR; | 145 | const char *path = PATH_ROOTSTR; |
139 | #endif | 146 | #endif |
147 | |||
148 | #if defined(HAVE_MULTIBOOT) && !defined(SIMULATOR) | ||
149 | static char rtpath[VOL_MAX_LEN+2] = RB_ROOT_CONTENTS_DIR; | ||
150 | static bool redirected = false; | ||
151 | int boot_volume = 0; | ||
152 | unsigned int crc = 0; | ||
153 | crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff); | ||
154 | if (crc == boot_data.crc) | ||
155 | { | ||
156 | root_mount_path(path, 0); /*root could be different folder don't hide*/ | ||
157 | boot_volume = boot_data.boot_volume; /* boot volume contained in uint8_t payload */ | ||
158 | //root_mount_path(path, volume == boot_volume ? NSITEM_HIDDEN : 0); | ||
159 | if (!redirected && volume == boot_volume) | ||
160 | { | ||
161 | if (get_redirect_dir(rtpath, sizeof(rtpath), volume, "", "") < 0) | ||
162 | { /* Error occurred, card removed? Set root to default */ | ||
163 | root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS); | ||
164 | } | ||
165 | else | ||
166 | redirected = true; | ||
167 | } | ||
168 | if (redirected && volume == boot_volume) | ||
169 | root_mount_path(rtpath, NSITEM_CONTENTS); | ||
170 | } /*CRC OK*/ | ||
171 | else | ||
172 | { | ||
173 | root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0); | ||
174 | if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false)) | ||
175 | root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS); | ||
176 | } | ||
177 | #else /*ndef HAVE_MULTIBOOT */ | ||
178 | |||
140 | root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0); | 179 | root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0); |
141 | #ifdef HAVE_MULTIVOLUME | 180 | #ifdef HAVE_MULTIVOLUME |
142 | if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false)) | 181 | if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false)) |
143 | #endif | 182 | #endif |
144 | root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS); | 183 | root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS); |
184 | #endif /* HAVE_MULTIBOOT */ | ||
185 | |||
145 | #ifdef HAVE_DIRCACHE | 186 | #ifdef HAVE_DIRCACHE |
146 | dircache_mount(); | 187 | dircache_mount(); |
147 | #endif | 188 | #endif |