Skip to content

Commit 9590478

Browse files
committed
Improve power button disable/throttle code
1 parent d10c65b commit 9590478

3 files changed

Lines changed: 16 additions & 16 deletions

File tree

gc/ogc/system.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,6 @@ void* SYS_GetArena2Hi(void);
391391
void SYS_SetArena2Hi(void *newHi);
392392
u32 SYS_GetArena2Size(void);
393393
powercallback SYS_SetPowerCallback(powercallback cb);
394-
void SYS_DisablePowerButton(u32 duration);
395394
void SYS_DoPowerCB(void);
396395
#endif
397396

libogc/system.c

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,6 @@ static powercallback __POWCallback = NULL;
157157

158158
static u32 __sys_resetdown = 0;
159159
static u64 __sys_powerenabletime = 0;
160-
static u64 __sys_powercbtime = 0;
161160
#endif
162161

163162
static vu64* const _bootTime = (u64*)0x800030d8;
@@ -457,18 +456,11 @@ static void __STMEventHandler(u32 event)
457456
}
458457

459458
if(event==STM_EVENT_POWER) {
460-
if(gettime() >= __sys_powerenabletime) {
461-
_CPU_ISR_Disable(level);
462-
SYS_DoPowerCB();
463-
_CPU_ISR_Restore(level);
464-
}
459+
_CPU_ISR_Disable(level);
460+
SYS_DoPowerCB();
461+
_CPU_ISR_Restore(level);
465462
}
466463
}
467-
468-
void SYS_DisablePowerButton(u32 disableTime)
469-
{
470-
__sys_powerenabletime = gettime() + millisecs_to_ticks(disableTime);
471-
}
472464
#endif
473465

474466
void * __attribute__ ((weak)) __myArena1Lo = 0;
@@ -1034,12 +1026,17 @@ void SYS_DoPowerCB(void)
10341026

10351027
// Power button events fire repeatedly for one second after button is pressed
10361028
// Throttle events so only one callback gets called per button press
1037-
if(gettime() >= __sys_powercbtime) {
1029+
if(gettime() >= __sys_powerenabletime) {
10381030
_CPU_ISR_Disable(level);
10391031
__POWCallback();
10401032
_CPU_ISR_Restore(level);
10411033
}
1042-
__sys_powercbtime = gettime() + millisecs_to_ticks(10);
1034+
__sys_powerenabletime = gettime() + millisecs_to_ticks(50);
1035+
}
1036+
1037+
void __SYS_DisablePowerButton(u32 disableTime)
1038+
{
1039+
__sys_powerenabletime = gettime() + millisecs_to_ticks(disableTime);
10431040
}
10441041
#endif
10451042

wiiuse/io_wii.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ extern void parse_event(struct wiimote_t *wm);
2222
extern void idle_cycle(struct wiimote_t* wm);
2323
extern void hexdump(void *d, int len);
2424

25+
extern void __SYS_DisablePowerButton(u32 duration);
26+
2527
static __inline__ u32 ACR_ReadReg(u32 reg)
2628
{
2729
return _ipcReg[reg>>2];
@@ -39,10 +41,12 @@ static s32 __wiiuse_disconnected(void *arg,struct bte_pcb *pcb,u8 err)
3941

4042
if(!wm) return ERR_OK;
4143

42-
// Disable system power button events for 1100ms after Wiimote disconnection
44+
// Disable system power button events for a bit after Wiimote disconnection
4345
// BT module hardware will trigger power button press in GPIO just like front panel
4446
// if auth'd Wiimote power button pressed, so this is the only way to disambiguate
45-
SYS_DisablePowerButton(1100);
47+
// It sends power button events for ~1s, but if we disable for 200ms, we can get
48+
// power button event throttling to take care of the rest
49+
__SYS_DisablePowerButton(200);
4650

4751
WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_BATTERY_CRITICAL));
4852
WIIMOTE_DISABLE_STATE(wm, (WIIMOTE_STATE_IR|WIIMOTE_STATE_IR_INIT));

0 commit comments

Comments
 (0)