summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Wilgus <wilgus.william@gmail.com>2022-03-03 22:08:28 -0500
committerWilliam Wilgus <wilgus.william@gmail.com>2022-03-03 22:08:28 -0500
commitc9857098ac0a3173d5d03baa3c32d9a8e29faec8 (patch)
tree3b3baeb89a9bb6440ad4518f5363338ca820cf29
parentc7bbd5b0902d7efc2fd204f2aa4ac8881c5a97be (diff)
downloadrockbox-c9857098ac0a3173d5d03baa3c32d9a8e29faec8.tar.gz
rockbox-c9857098ac0a3173d5d03baa3c32d9a8e29faec8.zip
Multiboot Firmware Root Redirect - WIP
Loads external drive into root namespace Root Redirects can now be put into different folders For instance placing '/_test' into SD1/rockbox_main.<playername> will redirect to /<1>/_test/.rockbox Debug menu>Bootdata now has root directory listed in addition to RAW Bootdata Redirect root work from Michael Sevakis g#1556, RESTORED -> g#4256 Change-Id: Ia97cf50ff5f5b440877f9c005da6f12c53af931e
-rw-r--r--apps/debug_menu.c8
-rw-r--r--firmware/common/disk.c16
-rw-r--r--firmware/include/dircache_redirect.h41
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
133static const char* threads_getname(int selected_item, void *data, 136static 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