summaryrefslogtreecommitdiffstats
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-c9857098ac.tar.gz
rockbox-c9857098ac.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 @@
#if defined(HAVE_BOOTDATA) && !defined(SIMULATOR)
#include "bootdata.h"
+#include "rbpaths.h"
+#include "pathfuncs.h"
+#include "rb-loader.h"
#endif
static const char* threads_getname(int selected_item, void *data,
@@ -2530,12 +2533,17 @@ static bool dbg_boot_data(void)
simplelist_set_line_count(0);
crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff);
#if defined(HAVE_MULTIBOOT)
+ char rootpath[VOL_MAX_LEN+2] = RB_ROOT_CONTENTS_DIR;
int boot_volume = 0;
if(crc == boot_data.crc)
{
boot_volume = boot_data.boot_volume; /* boot volume contained in uint8_t payload */
+ get_redirect_dir(rootpath, sizeof(rootpath), boot_volume, "", "");
+ rootpath[path_strip_trailing_separators(rootpath,NULL)] = '\0';
}
simplelist_addline("Boot Volume: <%lu>", boot_volume);
+ simplelist_addline("Root:");
+ simplelist_addline("%s", rootpath);
simplelist_addline("");
#endif
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)
for (int i = 0; i < NUM_VOLUMES; i++)
vol_drive[i] = -1; /* mark all as unassigned */
-#if defined(HAVE_BOOTDATA) && !defined(SIMULATOR) && !defined(BOOTLOADER)
- unsigned int crc = 0;
- int boot_volume = 0;
- crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff);
- if(crc == boot_data.crc)
- {
- boot_volume = boot_data.boot_volume; /* boot volume contained in uint8_t payload */
- }
- #ifdef HAVE_HOTSWAP
- if (storage_present(boot_volume))
- #endif
- mounted += disk_mount(boot_volume); /* mount boot volume first */
- for (int i = 0; i < NUM_DRIVES; i++)
- if (i != boot_volume)
-#else
for (int i = 0; i < NUM_DRIVES; i++)
-#endif
{
#ifdef HAVE_HOTSWAP
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 @@
#include "pathfuncs.h"
#include "dir.h"
#include "dircache.h"
+
+#if defined(HAVE_MULTIBOOT) && !defined(SIMULATOR)
+#include "rb-loader.h"
+#include "bootdata.h"
+#include "crc32.h"
+#endif
+
#ifndef RB_ROOT_VOL_HIDDEN
#define RB_ROOT_VOL_HIDDEN(v) (0 == 0)
#endif
@@ -137,11 +144,45 @@ static inline void volume_onmount_internal(IF_MV_NONVOID(int volume))
#else
const char *path = PATH_ROOTSTR;
#endif
+
+#if defined(HAVE_MULTIBOOT) && !defined(SIMULATOR)
+ static char rtpath[VOL_MAX_LEN+2] = RB_ROOT_CONTENTS_DIR;
+ static bool redirected = false;
+ int boot_volume = 0;
+ unsigned int crc = 0;
+ crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff);
+ if (crc == boot_data.crc)
+ {
+ root_mount_path(path, 0); /*root could be different folder don't hide*/
+ boot_volume = boot_data.boot_volume; /* boot volume contained in uint8_t payload */
+ //root_mount_path(path, volume == boot_volume ? NSITEM_HIDDEN : 0);
+ if (!redirected && volume == boot_volume)
+ {
+ if (get_redirect_dir(rtpath, sizeof(rtpath), volume, "", "") < 0)
+ { /* Error occurred, card removed? Set root to default */
+ root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS);
+ }
+ else
+ redirected = true;
+ }
+ if (redirected && volume == boot_volume)
+ root_mount_path(rtpath, NSITEM_CONTENTS);
+ } /*CRC OK*/
+ else
+ {
+ root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0);
+ if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false))
+ root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS);
+ }
+#else /*ndef HAVE_MULTIBOOT */
+
root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0);
#ifdef HAVE_MULTIVOLUME
if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false))
#endif
root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS);
+#endif /* HAVE_MULTIBOOT */
+
#ifdef HAVE_DIRCACHE
dircache_mount();
#endif