summaryrefslogtreecommitdiff
path: root/include/rvl/NAND/nand.h
blob: 6cc5555648da89fb8d94cdcd8cf9ae48ef57c93e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#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
#define NAND_BANNER_TEXTURE_SIZE 0x6000
#define NAND_BANNER_ICON_TEXTURE_SIZE 0x1200

// 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;

// via spm
#define NAND_SET_ICON_SPEED(banner, icon, speed)                                                                       \
    (banner)->iconSpeed = (u16)(((banner)->iconSpeed & ~(3 << 2 * (icon))) | ((speed) << 2 * (icon)))

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[NAND_BANNER_TEXTURE_SIZE];                                // at 0xA0
    u8 iconTexture[NAND_BANNER_ICON_MAX_FRAME][NAND_BANNER_ICON_TEXTURE_SIZE]; // 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