mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-09 21:22:39 -05:00
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
This commit is contained in:
parent
c7bbd5b090
commit
c9857098ac
3 changed files with 49 additions and 16 deletions
|
|
@ -128,6 +128,9 @@
|
||||||
|
|
||||||
#if defined(HAVE_BOOTDATA) && !defined(SIMULATOR)
|
#if defined(HAVE_BOOTDATA) && !defined(SIMULATOR)
|
||||||
#include "bootdata.h"
|
#include "bootdata.h"
|
||||||
|
#include "rbpaths.h"
|
||||||
|
#include "pathfuncs.h"
|
||||||
|
#include "rb-loader.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const char* threads_getname(int selected_item, void *data,
|
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);
|
simplelist_set_line_count(0);
|
||||||
crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff);
|
crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff);
|
||||||
#if defined(HAVE_MULTIBOOT)
|
#if defined(HAVE_MULTIBOOT)
|
||||||
|
char rootpath[VOL_MAX_LEN+2] = RB_ROOT_CONTENTS_DIR;
|
||||||
int boot_volume = 0;
|
int boot_volume = 0;
|
||||||
if(crc == boot_data.crc)
|
if(crc == boot_data.crc)
|
||||||
{
|
{
|
||||||
boot_volume = boot_data.boot_volume; /* boot volume contained in uint8_t payload */
|
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("Boot Volume: <%lu>", boot_volume);
|
||||||
|
simplelist_addline("Root:");
|
||||||
|
simplelist_addline("%s", rootpath);
|
||||||
simplelist_addline("");
|
simplelist_addline("");
|
||||||
#endif
|
#endif
|
||||||
simplelist_addline("Bootdata RAW:");
|
simplelist_addline("Bootdata RAW:");
|
||||||
|
|
|
||||||
|
|
@ -260,23 +260,7 @@ int disk_mount_all(void)
|
||||||
for (int i = 0; i < NUM_VOLUMES; i++)
|
for (int i = 0; i < NUM_VOLUMES; i++)
|
||||||
vol_drive[i] = -1; /* mark all as unassigned */
|
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++)
|
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
|
#ifdef HAVE_HOTSWAP
|
||||||
if (storage_present(i))
|
if (storage_present(i))
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,13 @@
|
||||||
#include "pathfuncs.h"
|
#include "pathfuncs.h"
|
||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
#include "dircache.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
|
#ifndef RB_ROOT_VOL_HIDDEN
|
||||||
#define RB_ROOT_VOL_HIDDEN(v) (0 == 0)
|
#define RB_ROOT_VOL_HIDDEN(v) (0 == 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -137,11 +144,45 @@ static inline void volume_onmount_internal(IF_MV_NONVOID(int volume))
|
||||||
#else
|
#else
|
||||||
const char *path = PATH_ROOTSTR;
|
const char *path = PATH_ROOTSTR;
|
||||||
#endif
|
#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);
|
root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0);
|
||||||
#ifdef HAVE_MULTIVOLUME
|
#ifdef HAVE_MULTIVOLUME
|
||||||
if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false))
|
if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false))
|
||||||
#endif
|
#endif
|
||||||
root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS);
|
root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS);
|
||||||
|
#endif /* HAVE_MULTIBOOT */
|
||||||
|
|
||||||
#ifdef HAVE_DIRCACHE
|
#ifdef HAVE_DIRCACHE
|
||||||
dircache_mount();
|
dircache_mount();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue