From 8535fcf16314547676648017848495e01c64370b Mon Sep 17 00:00:00 2001 From: d0k3 Date: Wed, 1 Mar 2017 17:03:27 +0100 Subject: [PATCH] Handle SD card inserts / ejects --- source/common/hid.c | 4 ++++ source/common/hid.h | 7 ++++++- source/godmode.c | 19 +++++++++++++++++-- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/source/common/hid.c b/source/common/hid.c index d5e9414..2ea6396 100644 --- a/source/common/hid.c +++ b/source/common/hid.c @@ -6,6 +6,7 @@ u32 InputWait() { static u64 delay = 0; u32 pad_state_old = HID_STATE; u32 cart_state_old = CART_STATE; + u32 sd_state_old = SD_STATE; delay = (delay) ? 72 : 128; timer_start(); while (true) { @@ -14,6 +15,9 @@ u32 InputWait() { u32 cart_state = CART_STATE; if (cart_state != cart_state_old) return cart_state ? CART_INSERT : CART_EJECT; + u32 sd_state = SD_STATE; + if (sd_state != sd_state_old) + return sd_state ? SD_INSERT : SD_EJECT; u32 special_key = i2cReadRegister(I2C_DEV_MCU, 0x10); if (special_key == 0x01) return pad_state | BUTTON_POWER; diff --git a/source/common/hid.h b/source/common/hid.h index 2825ad7..3cb3a2e 100644 --- a/source/common/hid.h +++ b/source/common/hid.h @@ -2,8 +2,11 @@ #include "common.h" +// see: http://3dbrew.org/wiki/CONFIG9_Registers +// see: http://3dbrew.org/wiki/EMMC_Registers #define HID_STATE (~(*(volatile u32*)0x10146000) & BUTTON_ANY) #define CART_STATE (~(*(volatile u8*)0x10000010) & 0x1) +#define SD_STATE ((*(volatile u16*)0x1000601C) & (0x1<<5)) #define BUTTON_A (1 << 0) @@ -21,11 +24,13 @@ #define BUTTON_ANY 0x00000FFF #define BUTTON_ARROW (BUTTON_RIGHT|BUTTON_LEFT|BUTTON_UP|BUTTON_DOWN) -// special buttons / cart handling +// special buttons / cart / sd #define BUTTON_POWER (1 << 12) #define BUTTON_HOME (1 << 13) #define CART_INSERT (1 << 14) #define CART_EJECT (1 << 15) +#define SD_INSERT (1 << 16) +#define SD_EJECT (1 << 17) u32 InputWait(); bool CheckButton(u32 button); diff --git a/source/godmode.c b/source/godmode.c index ed47ec1..388e035 100644 --- a/source/godmode.c +++ b/source/godmode.c @@ -1055,7 +1055,7 @@ u32 HomeMoreMenu(char* current_path, DirStruct* current_dir, DirStruct* clipboar DeinitSDCardFS(); if ((SdFormatMenu() == 0) || sd_state) {; while (!InitSDCardFS() && - ShowPrompt(true, "Reinitialising SD card failed! Retry?")); + ShowPrompt(true, "Initialising SD card failed! Retry?")); } ClearScreenF(true, true, COLOR_STD_BG); InitEmuNandBase(true); @@ -1260,7 +1260,7 @@ u32 GodMode() { DeinitExtFS(); if (!CheckSDMountState()) { while (!InitSDCardFS() && - ShowPrompt(true, "Reinitialising SD card failed! Retry?")); + ShowPrompt(true, "Initialising SD card failed! Retry?")); } else { DeinitSDCardFS(); if (clipboard->n_entries && (DriveType(clipboard->entry[0].path) & @@ -1466,6 +1466,21 @@ u32 GodMode() { ShowPrompt(false, "Cart init failed!"); if (!(*current_path) || (curr_drvtype & DRV_CART)) GetDirContents(current_dir, current_path); // refresh dir contents + } else if (pad_state & SD_INSERT) { + while (!InitSDCardFS() && ShowPrompt(true, "Initialising SD card failed! Retry?")); + ClearScreenF(true, true, COLOR_STD_BG); + InitEmuNandBase(true); + InitExtFS(); + GetDirContents(current_dir, current_path); + } else if ((pad_state & SD_EJECT) && CheckSDMountState()) { + ShowPrompt(false, "!Unexpected SD card removal!\n \nTo prevent data loss, unmount\nbefore ejecting the SD card."); + DeinitExtFS(); + DeinitSDCardFS(); + InitExtFS(); + if (clipboard->n_entries && (DriveType(clipboard->entry[0].path) & + (DRV_SDCARD|DRV_ALIAS|DRV_EMUNAND|DRV_IMAGE))) + clipboard->n_entries = 0; // remove SD clipboard entries + GetDirContents(current_dir, current_path); } }