diff --git a/include/fs.h b/include/fs.h index ab39a76..a955761 100644 --- a/include/fs.h +++ b/include/fs.h @@ -63,6 +63,7 @@ s32 fMount(FsDrive drive); s32 fUnmount(FsDrive drive); +bool fIsDriveMounted(FsDrive drive); s32 fGetFree(FsDrive drive, u64 *size); u32 fGetDeviceSize(FsDevice dev); bool fIsDevActive(FsDevice dev); diff --git a/include/ipc_handler.h b/include/ipc_handler.h index 4764548..d14643c 100644 --- a/include/ipc_handler.h +++ b/include/ipc_handler.h @@ -37,41 +37,42 @@ { IPC_CMD9_FMOUNT = CMD_ID(0) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), IPC_CMD9_FUNMOUNT = CMD_ID(1) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FGETFREE = CMD_ID(2) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(1) | CMD_PARAMS(1), - IPC_CMD9_FGET_DEV_SIZE = CMD_ID(3) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FIS_DEV_ACTIVE = CMD_ID(4) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FPREP_RAW_ACCESS = CMD_ID(5) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FFINAL_RAW_ACCESS = CMD_ID(6) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FCREATE_DEV_BUF = CMD_ID(7) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FFREE_DEV_BUF = CMD_ID(8) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FREAD_TO_DEV_BUF = CMD_ID(9) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(4), - IPC_CMD9_FWRITE_FROM_DEV_BUF = CMD_ID(10) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(4), - IPC_CMD9_FOPEN = CMD_ID(11) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FREAD = CMD_ID(12) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(1) | CMD_PARAMS(1), - IPC_CMD9_FWRITE = CMD_ID(13) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FSYNC = CMD_ID(14) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FLSEEK = CMD_ID(15) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(2), - IPC_CMD9_FTELL = CMD_ID(16) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FSIZE = CMD_ID(17) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FCLOSE = CMD_ID(18) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FEXPAND = CMD_ID(19) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(2), - IPC_CMD9_FSTAT = CMD_ID(20) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(1) | CMD_PARAMS(0), - IPC_CMD9_FOPEN_DIR = CMD_ID(21) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_FREAD_DIR = CMD_ID(22) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(1) | CMD_PARAMS(2), - IPC_CMD9_FCLOSE_DIR = CMD_ID(23) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FMKDIR = CMD_ID(24) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_FRENAME = CMD_ID(25) | CMD_IN_BUFS(2) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_FUNLINK = CMD_ID(26) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_FVERIFY_NAND_IMG = CMD_ID(27) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_FSET_NAND_PROT = CMD_ID(28) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_WRITE_FIRM_PART = CMD_ID(29) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_LOAD_VERIFY_FIRM = CMD_ID(30) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FIRM_LAUNCH = CMD_ID(31) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_LOAD_VERIFY_UPDATE = CMD_ID(32) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(1) | CMD_PARAMS(0), - IPC_CMD9_GET_BOOT_ENV = CMD_ID(33) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_PREPARE_POWER = CMD_ID(34) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_PANIC = CMD_ID(35) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_EXCEPTION = CMD_ID(36) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0) + IPC_CMD9_FIS_DRIVE_MOUNTED = CMD_ID(2) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_FGETFREE = CMD_ID(3) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(1) | CMD_PARAMS(1), + IPC_CMD9_FGET_DEV_SIZE = CMD_ID(4) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_FIS_DEV_ACTIVE = CMD_ID(5) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_FPREP_RAW_ACCESS = CMD_ID(6) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_FFINAL_RAW_ACCESS = CMD_ID(7) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_FCREATE_DEV_BUF = CMD_ID(8) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_FFREE_DEV_BUF = CMD_ID(9) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_FREAD_TO_DEV_BUF = CMD_ID(10) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(4), + IPC_CMD9_FWRITE_FROM_DEV_BUF = CMD_ID(11) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(4), + IPC_CMD9_FOPEN = CMD_ID(12) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_FREAD = CMD_ID(13) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(1) | CMD_PARAMS(1), + IPC_CMD9_FWRITE = CMD_ID(14) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_FSYNC = CMD_ID(15) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_FLSEEK = CMD_ID(16) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(2), + IPC_CMD9_FTELL = CMD_ID(17) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_FSIZE = CMD_ID(18) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_FCLOSE = CMD_ID(19) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_FEXPAND = CMD_ID(20) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(2), + IPC_CMD9_FSTAT = CMD_ID(21) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(1) | CMD_PARAMS(0), + IPC_CMD9_FOPEN_DIR = CMD_ID(22) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), + IPC_CMD9_FREAD_DIR = CMD_ID(23) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(1) | CMD_PARAMS(2), + IPC_CMD9_FCLOSE_DIR = CMD_ID(24) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_FMKDIR = CMD_ID(25) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), + IPC_CMD9_FRENAME = CMD_ID(26) | CMD_IN_BUFS(2) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), + IPC_CMD9_FUNLINK = CMD_ID(27) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), + IPC_CMD9_FVERIFY_NAND_IMG = CMD_ID(28) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), + IPC_CMD9_FSET_NAND_PROT = CMD_ID(29) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_WRITE_FIRM_PART = CMD_ID(30) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_LOAD_VERIFY_FIRM = CMD_ID(31) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), + IPC_CMD9_FIRM_LAUNCH = CMD_ID(32) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), + IPC_CMD9_LOAD_VERIFY_UPDATE = CMD_ID(33) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(1) | CMD_PARAMS(0), + IPC_CMD9_GET_BOOT_ENV = CMD_ID(34) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), + IPC_CMD9_PREPARE_POWER = CMD_ID(35) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), + IPC_CMD9_PANIC = CMD_ID(36) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), + IPC_CMD9_EXCEPTION = CMD_ID(37) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0) } IpcCmd9; typedef enum diff --git a/source/arm11/fs.c b/source/arm11/fs.c index 8db01ff..7fd4c8e 100644 --- a/source/arm11/fs.c +++ b/source/arm11/fs.c @@ -36,6 +36,12 @@ return PXI_sendCmd(IPC_CMD9_FUNMOUNT, &cmdBuf, 1); } +bool fIsDriveMounted(FsDrive drive) +{ + const u32 cmdBuf = drive; + return PXI_sendCmd(IPC_CMD9_FIS_DRIVE_MOUNTED, &cmdBuf, 1); +} + s32 fGetFree(FsDrive drive, u64 *size) { u32 cmdBuf[3]; diff --git a/source/arm9/fs.c b/source/arm9/fs.c index 850490a..a1dc85d 100644 --- a/source/arm9/fs.c +++ b/source/arm9/fs.c @@ -126,7 +126,7 @@ else return -res; } -static bool isDriveMounted(FsDrive drive) +bool fIsDriveMounted(FsDrive drive) { if((u32)drive >= FS_MAX_DRIVES) return false; @@ -135,7 +135,7 @@ static s32 ensureUnmounted(FsDrive drive) { - if(!isDriveMounted(drive)) + if(!fIsDriveMounted(drive)) return FR_OK; return fUnmount(drive); @@ -143,7 +143,7 @@ static s32 ensureMounted(FsDrive drive) { - if(isDriveMounted(drive)) + if(fIsDriveMounted(drive)) return FR_OK; return fMount(drive); diff --git a/source/arm9/ipc_handler.c b/source/arm9/ipc_handler.c index 1f9f412..4872019 100644 --- a/source/arm9/ipc_handler.c +++ b/source/arm9/ipc_handler.c @@ -45,6 +45,9 @@ case IPC_CMD_ID_MASK(IPC_CMD9_FUNMOUNT): result = fUnmount(buf[0]); break; + case IPC_CMD_ID_MASK(IPC_CMD9_FIS_DRIVE_MOUNTED): + result = fIsDriveMounted(buf[0]); + break; case IPC_CMD_ID_MASK(IPC_CMD9_FGETFREE): result = fGetFree(buf[2], (u64*)buf[0]); break;