diff --git a/include/fs.h b/include/fs.h index 00e5688..ab39a76 100644 --- a/include/fs.h +++ b/include/fs.h @@ -25,9 +25,9 @@ #define FS_MAX_DRIVES (FF_VOLUMES) #define FS_DRIVE_NAMES "sdmc:/","twln:/","twlp:/","nand:/" -#define FS_MAX_FILES (5) +#define FS_MAX_FILES (3) -#define FS_MAX_DIRS (3) +#define FS_MAX_DIRS (2) typedef enum @@ -61,34 +61,35 @@ typedef s32 DevBufHandle; -s32 fMount(FsDrive drive); -s32 fUnmount(FsDrive drive); -s32 fGetFree(FsDrive drive, u64 *size); -u32 fGetDeviceSize(FsDevice dev); -s32 fPrepareRawAccess(FsDevice dev); -s32 fFinalizeRawAccess(DevHandle handle); -s32 fCreateDeviceBuffer(u32 size); -s32 fFreeDeviceBuffer(DevBufHandle handle); -s32 fReadToDeviceBuffer(s32 sourceHandle, u32 sourceOffset, u32 sourceSize, DevBufHandle devBufHandle); -s32 fsWriteFromDeviceBuffer(s32 destHandle, u32 destOffset, u32 destSize, DevBufHandle devBufHandle); -s32 fOpen(const char *const path, FsOpenMode mode); -s32 fRead(s32 handle, void *const buf, u32 size); -s32 fWrite(s32 handle, const void *const buf, u32 size); -s32 fSync(s32 handle); -s32 fLseek(s32 handle, u32 offset); -u32 fTell(s32 handle); -u32 fSize(s32 handle); -s32 fClose(s32 handle); -s32 fExpand(s32 handle, u32 size); -s32 fStat(const char *const path, FsFileInfo *fi); -s32 fOpenDir(const char *const path); -s32 fReadDir(s32 handle, FsFileInfo *fi, u32 num); -s32 fCloseDir(s32 handle); -s32 fMkdir(const char *const path); -s32 fRename(const char *const old, const char *const new); -s32 fUnlink(const char *const path); -s32 fVerifyNandImage(const char *const path); -s32 fSetNandProtection(bool protect); +s32 fMount(FsDrive drive); +s32 fUnmount(FsDrive drive); +s32 fGetFree(FsDrive drive, u64 *size); +u32 fGetDeviceSize(FsDevice dev); +bool fIsDevActive(FsDevice dev); +s32 fPrepareRawAccess(FsDevice dev); +s32 fFinalizeRawAccess(DevHandle handle); +s32 fCreateDeviceBuffer(u32 size); +s32 fFreeDeviceBuffer(DevBufHandle handle); +s32 fReadToDeviceBuffer(s32 sourceHandle, u32 sourceOffset, u32 sourceSize, DevBufHandle devBufHandle); +s32 fsWriteFromDeviceBuffer(s32 destHandle, u32 destOffset, u32 destSize, DevBufHandle devBufHandle); +s32 fOpen(const char *const path, FsOpenMode mode); +s32 fRead(s32 handle, void *const buf, u32 size); +s32 fWrite(s32 handle, const void *const buf, u32 size); +s32 fSync(s32 handle); +s32 fLseek(s32 handle, u32 offset); +u32 fTell(s32 handle); +u32 fSize(s32 handle); +s32 fClose(s32 handle); +s32 fExpand(s32 handle, u32 size); +s32 fStat(const char *const path, FsFileInfo *fi); +s32 fOpenDir(const char *const path); +s32 fReadDir(s32 handle, FsFileInfo *fi, u32 num); +s32 fCloseDir(s32 handle); +s32 fMkdir(const char *const path); +s32 fRename(const char *const old, const char *const new); +s32 fUnlink(const char *const path); +s32 fVerifyNandImage(const char *const path); +s32 fSetNandProtection(bool protect); #ifdef ARM9 void fsDeinit(void); diff --git a/include/ipc_handler.h b/include/ipc_handler.h index b1c9c5c..4764548 100644 --- a/include/ipc_handler.h +++ b/include/ipc_handler.h @@ -39,38 +39,39 @@ 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_FPREP_RAW_ACCESS = CMD_ID(4) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FFINAL_RAW_ACCESS = CMD_ID(5) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FCREATE_DEV_BUF = CMD_ID(6) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FFREE_DEV_BUF = CMD_ID(7) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FREAD_TO_DEV_BUF = CMD_ID(8) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(4), - IPC_CMD9_FWRITE_FROM_DEV_BUF = CMD_ID(9) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(4), - IPC_CMD9_FOPEN = CMD_ID(10) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FREAD = CMD_ID(11) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(1) | CMD_PARAMS(1), - IPC_CMD9_FWRITE = CMD_ID(12) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FSYNC = CMD_ID(13) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FLSEEK = CMD_ID(14) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(2), - IPC_CMD9_FTELL = CMD_ID(15) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FSIZE = CMD_ID(16) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FCLOSE = CMD_ID(17) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FEXPAND = CMD_ID(18) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(2), - IPC_CMD9_FSTAT = CMD_ID(19) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(1) | CMD_PARAMS(0), - IPC_CMD9_FOPEN_DIR = CMD_ID(20) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_FREAD_DIR = CMD_ID(21) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(1) | CMD_PARAMS(2), - IPC_CMD9_FCLOSE_DIR = CMD_ID(22) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FMKDIR = CMD_ID(23) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_FRENAME = CMD_ID(24) | CMD_IN_BUFS(2) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_FUNLINK = CMD_ID(25) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_FVERIFY_NAND_IMG = CMD_ID(26) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_FSET_NAND_PROT = CMD_ID(27) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_WRITE_FIRM_PART = CMD_ID(28) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_LOAD_VERIFY_FIRM = CMD_ID(29) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), - IPC_CMD9_FIRM_LAUNCH = CMD_ID(30) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_LOAD_VERIFY_UPDATE = CMD_ID(31) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(1) | CMD_PARAMS(0), - IPC_CMD9_GET_BOOT_ENV = CMD_ID(32) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_PREPARE_POWER = CMD_ID(33) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_PANIC = CMD_ID(34) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_EXCEPTION = CMD_ID(35) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0) + 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) } IpcCmd9; typedef enum diff --git a/source/arm11/fs.c b/source/arm11/fs.c index e126935..8db01ff 100644 --- a/source/arm11/fs.c +++ b/source/arm11/fs.c @@ -52,6 +52,12 @@ return PXI_sendCmd(IPC_CMD9_FGET_DEV_SIZE, &cmdBuf, 1); } +bool fIsDevActive(FsDevice dev) +{ + const u32 cmdBuf = dev; + return PXI_sendCmd(IPC_CMD9_FIS_DEV_ACTIVE, &cmdBuf, 1); +} + s32 fPrepareRawAccess(FsDevice dev) { const u32 cmdBuf = dev; diff --git a/source/arm9/fs.c b/source/arm9/fs.c index 764979f..850490a 100644 --- a/source/arm9/fs.c +++ b/source/arm9/fs.c @@ -182,6 +182,23 @@ return 0; } +bool fIsDevActive(FsDevice dev) +{ + switch(dev) + { + case FS_DEVICE_SDMC: + return dev_sdcard->is_active(); + break; + case FS_DEVICE_NAND: + return dev_rawnand->is_active(); + break; + default: + break; + } + + return false; +} + s32 fPrepareRawAccess(FsDevice dev) { s32 err; diff --git a/source/arm9/ipc_handler.c b/source/arm9/ipc_handler.c index 99c236b..1f9f412 100644 --- a/source/arm9/ipc_handler.c +++ b/source/arm9/ipc_handler.c @@ -51,6 +51,9 @@ case IPC_CMD_ID_MASK(IPC_CMD9_FGET_DEV_SIZE): result = fGetDeviceSize(buf[0]); break; + case IPC_CMD_ID_MASK(IPC_CMD9_FIS_DEV_ACTIVE): + result = fIsDevActive(buf[0]); + break; case IPC_CMD_ID_MASK(IPC_CMD9_FPREP_RAW_ACCESS): result = fPrepareRawAccess(buf[0]); break;