Add partitioning

Also add sd mounting/unmounting
Also add vol+/- controls for sideways menus
This commit is contained in:
suchmememanyskill
2020-12-28 20:08:15 +01:00
parent baec43da2a
commit f1d433e69a
12 changed files with 225 additions and 15 deletions

View File

@@ -45,9 +45,9 @@ int MakeHorizontalMenu(MenuEntry_t *entries, int len, int spacesBetween, u32 bg)
return highlight;
else if (input->b)
return 0;
else if (input->left && highlight > 0)
else if ((input->left || input->down) && highlight > 0)
highlight--;
else if (input->right && highlight < len - 1)
else if ((input->right || input->up) && highlight < len - 1)
highlight++;
}
}

View File

@@ -98,11 +98,39 @@ DRESULT disk_write (
/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions */
/*-----------------------------------------------------------------------*/
static u32 part_rsvd_size = 0;
DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive number (0..) */
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
{
DWORD *buf = (DWORD *)buff;
if (pdrv == DRIVE_SD)
{
switch (cmd)
{
case GET_SECTOR_COUNT:
*buf = sd_storage.sec_cnt - part_rsvd_size;
break;
case GET_BLOCK_SIZE:
*buf = 32768; // Align to 16MB.
break;
}
}
else if (pdrv == DRIVE_RAM)
{
switch (cmd)
{
case GET_SECTOR_COUNT:
*buf = RAM_DISK_SZ >> 9; // 1GB.
break;
case GET_BLOCK_SIZE:
*buf = 2048; // Align to 1MB.
break;
}
}
return RES_OK;
}

View File

@@ -38,7 +38,7 @@
/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */
#define FF_USE_MKFS 0
#define FF_USE_MKFS 1
/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */
#define FF_FASTFS 0

View File

@@ -13,4 +13,5 @@ int connectMMC(u8 mmcType);
ErrCode_t mountMMCPart(const char *partition);
void SetKeySlots();
void unmountMMCPart();
link_t *GetCurGPT();
link_t *GetCurGPT();
void disconnectMMC();

View File

@@ -22,7 +22,7 @@
#include <libs/fatfs/ff.h>
#include <mem/heap.h>
static bool sd_mounted = false;
bool sd_mounted = false;
static u16 sd_errors[3] = { 0 }; // Init and Read/Write errors.
static u32 sd_mode = SD_UHS_SDR82;
@@ -130,12 +130,15 @@ bool sd_initialize(bool power_cycle)
return false;
}
bool is_sd_inited = false;
bool sd_mount()
{
if (sd_mounted)
return true;
int res = !sd_initialize(false);
is_sd_inited = !res;
if (res)
{

View File

@@ -12,6 +12,7 @@
#include "../storage/mountmanager.h"
#include "../storage/gptmenu.h"
#include "../storage/emummc.h"
#include <utils/util.h>
MenuEntry_t mainMenuEntries[] = {
{.R = 255, .G = 255, .B = 255, .skip = 1, .name = "-- Main Menu --"},
@@ -20,15 +21,18 @@ MenuEntry_t mainMenuEntries[] = {
{.optionUnion = COLORTORGB(COLOR_YELLOW), .name = "Emummc"},
{.B = 255, .G = 255, .name = "Test Controllers"},
{.R = 255, .name = "Cause an exception"},
{.R = 255, .name = "Partition the sd"},
{.optionUnion = COLORTORGB(COLOR_BLUE), .name = "Dump Firmware"},
{.optionUnion = COLORTORGB(COLOR_ORANGE), .name = "View dumped keys"},
{.R = 255, .name = "Reboot to payload"}
{.optionUnion = COLORTORGB(COLOR_ORANGE)},
{.R = 255, .name = "Reboot to payload"},
{.R = 255, .name = "Reboot to RCM"}
};
void HandleSD(){
gfx_clearscreen();
TConf.curExplorerLoc = LOC_SD;
if (!sd_mount()){
if (!sd_mount() || sd_get_card_removed()){
gfx_printf("Sd is not mounted!");
hidWait();
}
@@ -67,6 +71,12 @@ void ViewKeys(){
hidWait();
}
extern bool sd_mounted;
void MountOrUnmountSD(){
(sd_mounted) ? sd_unmount() : sd_mount();
}
menuPaths mainMenuPaths[] = {
NULL,
HandleSD,
@@ -74,16 +84,24 @@ menuPaths mainMenuPaths[] = {
HandleEMUMMC,
TestControllers,
CrashTE,
FormatSD,
DumpSysFw,
ViewKeys,
RebootToPayload
MountOrUnmountSD,
RebootToPayload,
reboot_rcm
};
void EnterMainMenu(){
while (1){
if (sd_get_card_removed())
sd_unmount();
mainMenuEntries[1].hide = !sd_mounted;
mainMenuEntries[2].hide = !TConf.keysDumped;
mainMenuEntries[3].hide = (!TConf.keysDumped || !emu_cfg.enabled);
mainMenuEntries[6].hide = !TConf.keysDumped;
mainMenuEntries[3].hide = (!TConf.keysDumped || !emu_cfg.enabled || !sd_mounted);
mainMenuEntries[7].hide = !TConf.keysDumped;
mainMenuEntries[9].name = (sd_mounted) ? "Unmount SD" : "Mount SD";
FunctionMenuHandler(mainMenuEntries, ARR_LEN(mainMenuEntries), mainMenuPaths, ALWAYSREDRAW);
}
}

View File

@@ -17,6 +17,7 @@
#include "../fs/readers/folderReader.h"
#include <string.h>
#include "../fs/fscopy.h"
#include "../utils/utils.h"
void TestControllers(){
gfx_clearscreen();
@@ -137,4 +138,79 @@ void DumpSysFw(){
gfx_printf("\n\nDone! Time taken: %ds\nPress any key to exit", get_tmr_s() - timer);
free(baseSdPath);
hidWait();
}
extern sdmmc_storage_t sd_storage;
extern bool is_sd_inited;
MenuEntry_t FatAndEmu[] = {
{.optionUnion = COLORTORGB(COLOR_ORANGE), .name = "Back to main menu"},
{.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Fat32 + EmuMMC"},
{.optionUnion = COLORTORGB(COLOR_BLUE), .name = "Only Fat32"}
};
void FormatSD(){
gfx_clearscreen();
disconnectMMC();
DWORD plist[] = {0,0,0,0};
bool emummc = 0;
int res;
if (!is_sd_inited || sd_get_card_removed())
return;
gfx_printf("\nDo you want to partition for an emummc?\n");
res = MakeHorizontalMenu(FatAndEmu, ARR_LEN(FatAndEmu), 3, COLOR_DEFAULT);
if (!res)
return;
emummc = !(res - 1);
plist[0] = sd_storage.csd.capacity;
if (emummc){
plist[0] -= 61145088;
u32 allignedSectors = plist[0] - plist[0] % 2048;
plist[1] = 61145088 + plist[0] % 2048;
plist[0] = allignedSectors;
}
SETCOLOR(COLOR_RED, COLOR_DEFAULT);
gfx_printf("\n\nAre you sure you want to format your sd?\nThis will delete everything on your SD card!\nThis action is irreversible!\n\n");
WaitFor(1500);
gfx_printf("%kAre you sure? ", COLOR_WHITE);
if (!MakeYesNoHorzMenu(3, COLOR_DEFAULT)){
return;
}
RESETCOLOR;
gfx_printf("\n\nStarting Partitioning & Formatting\n");
for (int i = 0; i < 2; i++){
gfx_printf("Part %d: %dKiB\n", i + 1, plist[i] / 2);
}
u8 *work = malloc(TConf.FSBuffSize);
res = f_fdisk_mod(0, plist, work);
if (!res){
res = f_mkfs("sd:", FM_FAT32, 32768, work, TConf.FSBuffSize);
}
sd_unmount();
if (res){
DrawError(newErrCode(res));
gfx_clearscreen();
gfx_printf("Something went wrong\nPress any key to exit");
}
else {
sd_mount();
gfx_printf("\nDone!\nPress any key to exit");
}
free(work);
hidWait();
}

View File

@@ -2,4 +2,5 @@
void RebootToPayload();
void TestControllers();
void DumpSysFw();
void DumpSysFw();
void FormatSD();

View File

@@ -2,6 +2,7 @@
#include <string.h>
#include <utils/types.h>
#include <mem/heap.h>
#include <utils/util.h>
char *CpyStr(const char* in){
int len = strlen(in);
@@ -29,4 +30,9 @@ bool StrEndsWith(char *begin, char *end){
return !strcmp(begin, end);
return 0;
}
void WaitFor(u32 ms){
u32 a = get_tmr_ms();
while (a + ms > get_tmr_ms());
}

View File

@@ -4,5 +4,6 @@
char *CpyStr(const char* in);
void MaskIn(char *mod, u32 bitstream, char mask);
bool StrEndsWith(char *begin, char *end);
void WaitFor(u32 ms);
#define FREE(x) free(x); x = NULL;