summaryrefslogtreecommitdiff
path: root/include/rvl/SC/scsystem.h
blob: b50d64fbd01239dae5e827b2d406d9ec351613a3 (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
#ifndef RVL_SDK_SC_SCSYSTEM_H
#define RVL_SDK_SC_SCSYSTEM_H
#include "common.h"
#include "rvl/FS.h"   // IWYU pragma: export
#include "rvl/NAND.h" // IWYU pragma: export
#include "rvl/OS.h"   // IWYU pragma: export


#ifdef __cplusplus
extern "C" {
#endif

/**
 * SC/SYSCONF documentation from:
 * https://wiibrew.org/wiki//shared2/sys/SYSCONF
 */

typedef u32 SCStatus;
enum SCStatus_et
{
	SC_STATUS_OK,	/* name known from asserts */
	SC_STATUS_BUSY,
	SC_STATUS_FATAL,
	SC_STATUS_PARSE,
};

typedef enum {
    SC_CONF_FILE_SYSTEM,  //!< SYSCONF
    SC_CONF_FILE_PRODUCT, //!< setting.txt
    SC_CONF_FILE_MAX
} SCConfFile;

typedef enum {
    SC_ITEM_IPL_CB,
    SC_ITEM_IPL_AR,
    SC_ITEM_IPL_ARN,
    SC_ITEM_IPL_CD,
    SC_ITEM_IPL_CD2,
    SC_ITEM_IPL_DH,
    SC_ITEM_IPL_E60,
    SC_ITEM_IPL_EULA,
    SC_ITEM_IPL_FRC,
    SC_ITEM_IPL_IDL,
    SC_ITEM_IPL_INC,
    SC_ITEM_IPL_LNG,
    SC_ITEM_IPL_NIK,
    SC_ITEM_IPL_PC,
    SC_ITEM_IPL_PGS,
    SC_ITEM_IPL_SSV,
    SC_ITEM_IPL_SADR,
    SC_ITEM_IPL_SND,
    SC_ITEM_IPL_UPT,
    SC_ITEM_NET_CNF,
    SC_ITEM_NET_CTPC,
    SC_ITEM_NET_PROF,
    SC_ITEM_NET_WCPC,
    SC_ITEM_NET_WCFG,
    SC_ITEM_DEV_BTM,
    SC_ITEM_DEV_VIM,
    SC_ITEM_DEV_CTC,
    SC_ITEM_DEV_DSM,
    SC_ITEM_BT_DINF,
    SC_ITEM_BT_SENS,
    SC_ITEM_BT_SPKV,
    SC_ITEM_BT_MOT,
    SC_ITEM_BT_BAR,
    SC_ITEM_DVD_CNF,
    SC_ITEM_WWW_RST,
    SC_ITEM_MAX
} SCItemID;

typedef enum {
    SC_ITEM_BIGARRAY = (1 << 5),
    SC_ITEM_SMALLARRAY = (2 << 5),
    SC_ITEM_BYTE = (3 << 5),
    SC_ITEM_SHORT = (4 << 5),
    SC_ITEM_LONG = (5 << 5),
    SC_ITEM_LONGLONG = (6 << 5),
    SC_ITEM_BOOL = (7 << 5)
} SCItemType;

typedef void (*SCAsyncCallback)(NANDResult result);
typedef void (*SCFlushCallback)(SCStatus status);

typedef struct SCItem {
    char UNK_0x0[0x8];
    u8 primType;      // at 0x8
    u8 arrayType;     // at 0x9
    u32 nameLen;      // at 0xC
    u32 dataLen;      // at 0x10
    const char *name; // at 0x14
    u8 *data;         // at 0x18
    u32 itemLen;      // at 0x1C
} SCItem;

typedef struct SCControl {
    OSThreadQueue threadQueue;     // at 0x0
    NANDFileInfo fileInfo;         // at 0x8
    NANDCommandBlock commandBlock; // at 0x94
    NANDStatus fileAttr;           // at 0x14C
    u8 nandCbState;                // at 0x154
    u8 BYTE_0x155;
    u8 openFile; // at 0x156
    u8 BYTE_0x157;
    SCAsyncCallback asyncCallback;           // at 0x158
    NANDResult asyncResult;                  // at 0x15C
    const char *filePaths[SC_CONF_FILE_MAX]; // at 0x160
    u8 *fileBuffers[SC_CONF_FILE_MAX];       // at 0x168
    u32 bufferSizes[SC_CONF_FILE_MAX];       // at 0x170
    u32 fileSizes[SC_CONF_FILE_MAX];         // at 0x178
    SCFlushCallback flushCallback;           // at 0x180
    SCStatus flushStatus;                    // at 0x184
    u32 flushSize;                           // at 0x188
} SCControl;

void SCInit(void);
SCStatus SCCheckStatus(void);

BOOL SCFindByteArrayItem(void *dst, u32 len, SCItemID id);
BOOL SCReplaceByteArrayItem(const void *src, u32 len, SCItemID id);

BOOL SCFindU8Item(u8 *dst, SCItemID id);
BOOL SCFindS8Item(s8 *dst, SCItemID id);
BOOL SCFindU32Item(u32 *dst, SCItemID id);

BOOL SCReplaceU8Item(u8 data, SCItemID id);

void SCFlushAsync(SCFlushCallback callback);

BOOL __SCIsDirty(void);
void __SCSetDirtyFlag(void);
void __SCClearDirtyFlag(void);

u8 *__SCGetConfBuf(void);
u32 __SCGetConfBufSize(void);

#ifdef __cplusplus
}
#endif
#endif