@@ -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+
117132s32 __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
182188s32 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
206204s32 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
231223s32 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
252238s32 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
284263s32 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
320292s32 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