Skip to content

Commit 57d8b8e

Browse files
committed
wrapper for /dev/stm/immediate commands
1 parent 1d69907 commit 57d8b8e

File tree

1 file changed

+61
-96
lines changed

1 file changed

+61
-96
lines changed

libogc/stm.c

Lines changed: 61 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -114,22 +114,28 @@ s32 __STM_SetEventHook(void)
114114
return ret;
115115
}
116116

117+
// static?
118+
s32 __STM_SendCommand(s32 cmd, void* inbuf, u32 inlen, void* outbuf, u32 outlen) {
119+
s32 ret, fd;
120+
121+
ret = fd = IOS_Open("/dev/stm/immediate", 0);
122+
if (ret < 0) {
123+
STM_printf("Open /dev/stm/immediate failed (%i)\n", ret);
124+
return ret;
125+
}
126+
127+
ret = IOS_Ioctl(fd, cmd, inbuf, inlen, outbuf, outlen);
128+
IOS_Close(fd);
129+
return ret;
130+
}
131+
117132
s32 __STM_ReleaseEventHook(void)
118133
{
119-
s32 ret, fd;
134+
s32 ret;
120135

121136
STM_printf("Release\n");
122137

123-
ret = fd = IOS_Open("/dev/stm/immediate", 0);
124-
if (ret >= 0) {
125-
ret = IOS_Ioctl(fd, IOCTL_STM_RELEASE_EH, NULL, 0, NULL, 0);
126-
if (ret == IPC_ENOENT)
127-
ret = STM_ENOHANDLER;
128-
129-
IOS_Close(fd);
130-
} else {
131-
STM_printf("Open /dev/stm/immediate failed {%i}\n", ret);
132-
}
138+
ret = __STM_SendCommand(IOCTL_STM_RELEASE_EH, NULL, 0, NULL, 0);
133139

134140
if (__stm_eventhook.fd >= 0) {
135141
IOS_Close(__stm_eventhook.fd);
@@ -181,90 +187,63 @@ static void WaitForImpendingDoom(void) {
181187

182188
s32 STM_ShutdownToStandby(void)
183189
{
184-
s32 ret, fd;
190+
s32 ret;
185191
u32 config = 0;
186192

187193
_viReg[1] = 0;
188-
ret = fd = IOS_Open("/dev/stm/immediate", 0);
189-
if (ret >= 0) {
190-
ret = IOS_Ioctl(fd, IOCTL_STM_SHUTDOWN, &config, sizeof(u32), NULL, 0);
191-
if (ret == 0) {
192-
WaitForImpendingDoom();
193-
} else {
194-
STM_printf("STM Shutdown failed (%i). Why? It does not even check input size...\n", ret);
195-
}
196-
197-
/* Should we hang regardless? The Wii menu does, pulling OSHalt if STM was not ready by the time <function> was called */
198-
IOS_Close(fd);
194+
ret = __STM_SendCommand(IOCTL_STM_SHUTDOWN, &config, sizeof(u32), NULL, 0);
195+
if (ret == 0) {
196+
WaitForImpendingDoom();
199197
} else {
200-
STM_printf("Open /dev/stm/immediate failed {%i}\n", ret);
198+
STM_printf("STM Shutdown failed (%i).\n", ret);
201199
}
202200

203201
return ret;
204202
}
205203

206204
s32 STM_ShutdownToIdle(void)
207205
{
208-
s32 ret, fd;
206+
s32 ret;
209207

210208
u32 config = 0xFCA08280;
211209
if (SYS_GetHollywoodRevision() > 2)
212210
config |= 0x00400040;
213211

214212
_viReg[1] = 0;
215-
ret = fd = IOS_Open("/dev/stm/immediate", 0);
216-
if (ret >= 0) {
217-
ret = IOS_Ioctl(fd, IOCTL_STM_IDLEMODE, &config, sizeof(u32), NULL, 0);
218-
if (ret == 0) {
219-
WaitForImpendingDoom();
220-
} else {
221-
STM_printf("STM IdleMode failed (%i).\n", ret);
222-
}
223-
IOS_Close(fd);
213+
ret = __STM_SendCommand(IOCTL_STM_IDLEMODE, &config, sizeof(u32), NULL, 0);
214+
if (ret == 0) {
215+
WaitForImpendingDoom();
224216
} else {
225-
STM_printf("Open /dev/stm/immediate failed {%i}\n", ret);
217+
STM_printf("STM IdleMode failed (%i).\n", ret);
226218
}
227219

228220
return ret;
229221
}
230222

231223
s32 STM_RebootSystem(void)
232224
{
233-
s32 ret, fd;
225+
s32 ret;
234226

235227
_viReg[1] = 0;
236-
ret = fd = IOS_Open("/dev/stm/immediate", 0);
237-
if (ret >= 0) {
238-
ret = IOS_Ioctl(fd, IOCTL_STM_HOTRESET, NULL, 0, NULL, 0);
239-
if (ret == 0) {
240-
WaitForImpendingDoom();
241-
} else {
242-
STM_printf("STM HotReset failed. (%i)\n", ret);
243-
}
244-
IOS_Close(fd);
228+
ret = __STM_SendCommand(IOCTL_STM_HOTRESET, NULL, 0, NULL, 0);
229+
if (ret == 0) {
230+
WaitForImpendingDoom();
245231
} else {
246-
STM_printf("Open /dev/stm/immediate failed {%i}\n", ret);
232+
STM_printf("STM HotReset failed. (%i)\n", ret);
247233
}
248234

249235
return ret;
250236
}
251237

252238
s32 STM_SetLedMode(u32 mode)
253239
{
254-
s32 ret, fd;
255-
256-
ret = fd = IOS_Open("/dev/stm/immediate", 0);
257-
if (ret >= 0) {
258-
ret = IOS_Ioctl(fd, IOCTL_STM_LEDMODE, &mode, sizeof(u32), NULL, 0);
259-
if (ret < 0) {
260-
STM_printf("STM LEDMode failed (%i).\n", ret);
261-
} else if (mode == 0) {
262-
STM_printf("Forced led off.\n");
263-
}
240+
s32 ret;
264241

265-
IOS_Close(fd);
266-
} else {
267-
STM_printf("Open /dev/stm/immediate failed {%i}\n", ret);
242+
ret = __STM_SendCommand(IOCTL_STM_LEDMODE, &mode, sizeof(u32), NULL, 0);
243+
if (ret < 0) {
244+
STM_printf("STM LEDMode failed (%i).\n", ret);
245+
} else if (mode == STM_LEDMODE_OFF) {
246+
STM_printf("Forced led off.\n");
268247
}
269248

270249
return ret;
@@ -283,42 +262,35 @@ _Static_assert(offsetof(struct STM_LEDFlashConfig, patterns) == 0x4, "?");
283262

284263
s32 STM_StartLEDFlashLoop(u8 id, u8 priority, u8 flags, const u16* patterns, u32 num_patterns)
285264
{
286-
s32 ret, fd;
265+
s32 ret;
287266

288-
ret = fd = IOS_Open("/dev/stm/immediate", 0);
289-
if (ret >= 0) {
290-
struct STM_LEDFlashConfig config;
267+
struct STM_LEDFlashConfig config;
291268

292-
if ((flags & STM_LEDFLASH_USER) && patterns != NULL) {
293-
if (num_patterns >= STM_MAX_LED_PATTERNS)
294-
num_patterns = STM_MAX_LED_PATTERNS;
269+
if ((flags & STM_LEDFLASH_USER) && patterns != NULL) {
270+
if (num_patterns >= STM_MAX_LED_PATTERNS)
271+
num_patterns = STM_MAX_LED_PATTERNS;
295272

296-
memcpy(config.patterns, patterns, sizeof(u16[num_patterns]));
297-
} else {
298-
num_patterns = 0;
299-
flags &= ~STM_LEDFLASH_USER;
300-
}
301-
302-
config.id = id;
303-
config.priority = priority;
304-
config.flags = flags;
273+
memcpy(config.patterns, patterns, sizeof(u16[num_patterns]));
274+
} else {
275+
num_patterns = 0;
276+
flags &= ~STM_LEDFLASH_USER;
277+
}
305278

306-
ret = IOS_Ioctl(fd, IOCTL_STM_LEDFLASH, &config, offsetof(struct STM_LEDFlashConfig, patterns[num_patterns]), NULL, 0);
307-
if (ret < 0) {
308-
STM_printf("STM LEDFlash failed (%i). :(\n", ret);
309-
}
279+
config.id = id;
280+
config.priority = priority;
281+
config.flags = flags;
310282

311-
IOS_Close(fd);
312-
} else {
313-
STM_printf("Open /dev/stm/immediate failed {%i}\n", ret);
283+
ret = __STM_SendCommand(IOCTL_STM_LEDFLASH, &config, offsetof(struct STM_LEDFlashConfig, patterns[num_patterns]), NULL, 0);
284+
if (ret < 0) {
285+
STM_printf("STM LEDFlash failed (%i). :(\n", ret);
314286
}
315287

316288
return ret;
317289
}
318290

319291
// https://wiibrew.org/wiki//dev/stm/immediate#VIDimming
320292
s32 STM_VIDimming(bool enable, u32 luma, u32 chroma) {
321-
s32 ret, fd;
293+
s32 ret;
322294
u32 inbuf[8], outbuf[8];
323295

324296
inbuf[0] = enable << 7 | (luma & 0x7) << 3 | (chroma & 0x7);
@@ -329,20 +301,13 @@ s32 STM_VIDimming(bool enable, u32 luma, u32 chroma) {
329301
inbuf[5] = ~0; // keep everything
330302
inbuf[6] = ~0; // <official software> uses 0xFFFF0000 here, but, what is the register even for....
331303

332-
ret = fd = IOS_Open("/dev/stm/immediate", 0);
333-
if (ret >= 0) {
334-
ret = IOS_Ioctl(fd, IOCTL_STM_VIDIMMING, inbuf, sizeof inbuf, outbuf, sizeof outbuf);
335-
if (ret < 0) {
336-
STM_printf("STM LEDMode failed (%i).\n", ret);
337-
} else {
338-
STM_printf("0x0d80001c: %08x\n", outbuf[0]);
339-
STM_printf("0x0d800020: %08x\n", outbuf[1]);
340-
STM_printf("0x0d800028: %08x\n", outbuf[2]);
341-
}
342-
343-
IOS_Close(fd);
304+
ret = __STM_SendCommand(IOCTL_STM_VIDIMMING, inbuf, sizeof inbuf, outbuf, sizeof outbuf);
305+
if (ret < 0) {
306+
STM_printf("STM VIDimming failed (%i).\n", ret);
344307
} else {
345-
STM_printf("Open /dev/stm/immediate failed {%i}\n", ret);
308+
STM_printf("0x0d80001c: %08x\n", outbuf[0]);
309+
STM_printf("0x0d800020: %08x\n", outbuf[1]);
310+
STM_printf("0x0d800028: %08x\n", outbuf[2]);
346311
}
347312

348313
return ret;

0 commit comments

Comments
 (0)