diff options
author | William Wilgus <wilgus.william@gmail.com> | 2022-03-03 22:08:28 -0500 |
---|---|---|
committer | William Wilgus <wilgus.william@gmail.com> | 2022-03-03 22:08:28 -0500 |
commit | c9857098ac0a3173d5d03baa3c32d9a8e29faec8 (patch) | |
tree | 3b3baeb89a9bb6440ad4518f5363338ca820cf29 /firmware | |
parent | c7bbd5b0902d7efc2fd204f2aa4ac8881c5a97be (diff) | |
download | rockbox-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
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/common/disk.c | 16 | ||||
-rw-r--r-- | firmware/include/dircache_redirect.h | 41 |
2 files changed, 41 insertions, 16 deletions
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 |