Files
ss/include/rvl/NAND/nand.h
T
Elijah Thomas 26af4db82d update from dtk-template - clangd :) (#66)
* update from dtk-template and start work towards using clangd

* include <a> -> "a"

* Update build.yml

* remove/add non-trivial class in union warning
2024-10-16 15:36:02 -04:00

181 lines
6.0 KiB
C

#ifndef RVL_SDK_NAND_H
#define RVL_SDK_NAND_H
#include "common.h"
#include "rvl/FS.h"
#ifdef __cplusplus
extern "C" {
#endif
#define NAND_BANNER_TITLE_MAX 32
#define NAND_BANNER_ICON_MAX_FRAME 8
// Forward declarations
typedef struct NANDCommandBlock;
typedef enum {
NAND_RESULT_FATAL_ERROR = -128,
NAND_RESULT_UNKNOWN = -64,
NAND_RESULT_MAXDEPTH = -16,
NAND_RESULT_AUTHENTICATION,
NAND_RESULT_OPENFD,
NAND_RESULT_NOTEMPTY,
NAND_RESULT_NOEXISTS,
NAND_RESULT_MAXFILES,
NAND_RESULT_MAXFD,
NAND_RESULT_MAXBLOCKS,
NAND_RESULT_INVALID,
NAND_RESULT_EXISTS = -6,
NAND_RESULT_ECC_CRIT,
NAND_RESULT_CORRUPT,
NAND_RESULT_BUSY,
NAND_RESULT_ALLOC_FAILED,
NAND_RESULT_ACCESS,
NAND_RESULT_OK,
} NANDResult;
typedef enum {
NAND_SEEK_BEG,
NAND_SEEK_CUR,
NAND_SEEK_END,
} NANDSeekMode;
typedef enum {
NAND_ACCESS_NONE,
NAND_ACCESS_READ,
NAND_ACCESS_WRITE,
NAND_ACCESS_RW
} NANDAccessType;
typedef enum {
NAND_FILE_TYPE_NONE,
NAND_FILE_TYPE_FILE,
NAND_FILE_TYPE_DIR,
} NANDFileType;
typedef enum {
// Read/write by owner
NAND_PERM_RUSR = (NAND_ACCESS_READ << 4),
NAND_PERM_WUSR = (NAND_ACCESS_WRITE << 4),
// Read/write by group
NAND_PERM_RGRP = (NAND_ACCESS_READ << 2),
NAND_PERM_WGRP = (NAND_ACCESS_WRITE << 2),
// Read/write by other
NAND_PERM_ROTH = (NAND_ACCESS_READ << 0),
NAND_PERM_WOTH = (NAND_ACCESS_WRITE << 0),
// Read/write by all
NAND_PERM_RALL = NAND_PERM_RUSR | NAND_PERM_RGRP | NAND_PERM_ROTH,
NAND_PERM_WALL = NAND_PERM_WUSR | NAND_PERM_WGRP | NAND_PERM_WOTH,
NAND_PERM_RWALL = NAND_PERM_RALL | NAND_PERM_WALL
} NANDPermission;
typedef void (*NANDAsyncCallback)(s32 result, struct NANDCommandBlock *block);
typedef struct NANDStatus {
u32 ownerId; // at 0x0
u16 groupId; // at 0x4
u8 attr; // at 0x6
u8 perm; // at 0x7
} NANDStatus;
typedef struct NANDFileInfo {
s32 fd; // at 0x0
s32 tempFd; // at 0x4
char openPath[FS_MAX_PATH]; // at 0x8
char tempPath[FS_MAX_PATH]; // at 0x48
u8 access; // at 0x88
u8 stage; // at 0x89
u8 mark; // at 0x8A
} NANDFileInfo;
typedef struct NANDCommandBlock {
void *userData; // at 0x0
NANDAsyncCallback callback; // at 0x4
NANDFileInfo *info; // at 0x8
void *bytes; // at 0xC
void *inodes; // at 0x10
NANDStatus *status; // at 0x14
u32 ownerId; // at 0x18
u16 groupId; // at 0x1C
u8 nextStage; // at 0x1E
u32 attr; // at 0x20
u32 ownerPerm; // at 0x24
u32 groupPerm; // at 0x28
u32 otherPerm; // at 0x2C
u32 dirFileCount; // at 0x30
char path[FS_MAX_PATH]; // at 0x34
u32 *length; // at 0x74
u32 *position; // at 0x78
s32 state; // at 0x7C
void *buffer; // at 0x80
u32 bufferSize; // at 0x84
u8 *type; // at 0x88
u32 uniqueNo; // at 0x8C
u32 reqBlocks; // at 0x90
u32 reqInodes; // at 0x94
u32 *answer; // at 0x98
u32 homeBlocks; // at 0x9C
u32 homeInodes; // at 0xA0
u32 userBlocks; // at 0xA4
u32 userInodes; // at 0xA8
u32 workBlocks; // at 0xAC
u32 workInodes; // at 0xB0
const char **dir; // at 0xB4
int simpleFlag; //
} NANDCommandBlock;
typedef struct NANDBanner {
u32 magic; // at 0x0
u32 flags; // at 0x4
u16 iconSpeed; // at 0x8
u8 reserved[0x20 - 0xA]; // at 0xA
wchar_t title[NAND_BANNER_TITLE_MAX]; // at 0x20
wchar_t subtitle[NAND_BANNER_TITLE_MAX]; // at 0x60
u8 bannerTexture[0x6000]; // at 0xA0
u8 iconTexture[0x1200][NAND_BANNER_ICON_MAX_FRAME]; // at 0x60A0
} NANDBanner;
NANDResult NANDCreate(const char *path, u8 perm, u8 attr);
NANDResult NANDPrivateCreate(const char *path, u8 perm, u8 attr);
NANDResult
NANDPrivateCreateAsync(const char *path, u8 perm, u8 attr, NANDAsyncCallback callback, NANDCommandBlock *block);
NANDResult NANDDelete(const char *path);
NANDResult NANDPrivateDelete(const char *path);
NANDResult NANDPrivateDeleteAsync(const char *path, NANDAsyncCallback callback, NANDCommandBlock *block);
NANDResult NANDRead(NANDFileInfo *info, void *buf, u32 len);
NANDResult NANDReadAsync(NANDFileInfo *info, void *buf, u32 len, NANDAsyncCallback callback, NANDCommandBlock *block);
NANDResult NANDWrite(NANDFileInfo *info, const void *buf, u32 len);
NANDResult
NANDWriteAsync(NANDFileInfo *info, const void *buf, u32 len, NANDAsyncCallback callback, NANDCommandBlock *block);
NANDResult NANDSeek(NANDFileInfo *info, s32 offset, NANDSeekMode whence);
NANDResult
NANDSeekAsync(NANDFileInfo *info, s32 offset, NANDSeekMode whence, NANDAsyncCallback callback, NANDCommandBlock *block);
NANDResult NANDPrivateCreateDir(const char *path, u8 perm, u8 attr);
NANDResult
NANDPrivateCreateDirAsync(const char *path, u8 perm, u8 attr, NANDAsyncCallback callback, NANDCommandBlock *block);
NANDResult NANDMove(const char *from, const char *to);
NANDResult NANDGetLength(NANDFileInfo *info, u32 *length);
NANDResult NANDGetLengthAsync(NANDFileInfo *info, u32 *lengthOut, NANDAsyncCallback callback, NANDCommandBlock *block);
NANDResult NANDGetStatus(const char *path, NANDStatus *status);
NANDResult
NANDPrivateGetStatusAsync(const char *path, NANDStatus *status, NANDAsyncCallback callback, NANDCommandBlock *block);
void NANDSetUserData(NANDCommandBlock *block, void *data);
void *NANDGetUserData(NANDCommandBlock *block);
#ifdef __cplusplus
}
#endif
#endif