@@ -114,22 +114,28 @@ s32 __STM_SetEventHook(void)
114
114
return ret ;
115
115
}
116
116
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
+
117
132
s32 __STM_ReleaseEventHook (void )
118
133
{
119
- s32 ret , fd ;
134
+ s32 ret ;
120
135
121
136
STM_printf ("Release\n" );
122
137
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 );
133
139
134
140
if (__stm_eventhook .fd >= 0 ) {
135
141
IOS_Close (__stm_eventhook .fd );
@@ -181,90 +187,63 @@ static void WaitForImpendingDoom(void) {
181
187
182
188
s32 STM_ShutdownToStandby (void )
183
189
{
184
- s32 ret , fd ;
190
+ s32 ret ;
185
191
u32 config = 0 ;
186
192
187
193
_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 ();
199
197
} else {
200
- STM_printf ("Open /dev/stm/immediate failed {%i} \n" , ret );
198
+ STM_printf ("STM Shutdown failed (%i). \n" , ret );
201
199
}
202
200
203
201
return ret ;
204
202
}
205
203
206
204
s32 STM_ShutdownToIdle (void )
207
205
{
208
- s32 ret , fd ;
206
+ s32 ret ;
209
207
210
208
u32 config = 0xFCA08280 ;
211
209
if (SYS_GetHollywoodRevision () > 2 )
212
210
config |= 0x00400040 ;
213
211
214
212
_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 ();
224
216
} else {
225
- STM_printf ("Open /dev/stm/immediate failed {%i} \n" , ret );
217
+ STM_printf ("STM IdleMode failed (%i). \n" , ret );
226
218
}
227
219
228
220
return ret ;
229
221
}
230
222
231
223
s32 STM_RebootSystem (void )
232
224
{
233
- s32 ret , fd ;
225
+ s32 ret ;
234
226
235
227
_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 ();
245
231
} else {
246
- STM_printf ("Open /dev/stm/immediate failed {%i} \n" , ret );
232
+ STM_printf ("STM HotReset failed. (%i) \n" , ret );
247
233
}
248
234
249
235
return ret ;
250
236
}
251
237
252
238
s32 STM_SetLedMode (u32 mode )
253
239
{
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 ;
264
241
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" );
268
247
}
269
248
270
249
return ret ;
@@ -283,42 +262,35 @@ _Static_assert(offsetof(struct STM_LEDFlashConfig, patterns) == 0x4, "?");
283
262
284
263
s32 STM_StartLEDFlashLoop (u8 id , u8 priority , u8 flags , const u16 * patterns , u32 num_patterns )
285
264
{
286
- s32 ret , fd ;
265
+ s32 ret ;
287
266
288
- ret = fd = IOS_Open ("/dev/stm/immediate" , 0 );
289
- if (ret >= 0 ) {
290
- struct STM_LEDFlashConfig config ;
267
+ struct STM_LEDFlashConfig config ;
291
268
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 ;
295
272
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
+ }
305
278
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 ;
310
282
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 );
314
286
}
315
287
316
288
return ret ;
317
289
}
318
290
319
291
// https://wiibrew.org/wiki//dev/stm/immediate#VIDimming
320
292
s32 STM_VIDimming (bool enable , u32 luma , u32 chroma ) {
321
- s32 ret , fd ;
293
+ s32 ret ;
322
294
u32 inbuf [8 ], outbuf [8 ];
323
295
324
296
inbuf [0 ] = enable << 7 | (luma & 0x7 ) << 3 | (chroma & 0x7 );
@@ -329,20 +301,13 @@ s32 STM_VIDimming(bool enable, u32 luma, u32 chroma) {
329
301
inbuf [5 ] = ~0 ; // keep everything
330
302
inbuf [6 ] = ~0 ; // <official software> uses 0xFFFF0000 here, but, what is the register even for....
331
303
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 );
344
307
} 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 ]);
346
311
}
347
312
348
313
return ret ;
0 commit comments