u32 InputWait() { static u64 delay = 0; u32 pad_state_old = HID_STATE; delay = (delay) ? 72 : 128; timer_start(); while (true) { u32 pad_state = HID_STATE; if (!(pad_state & BUTTON_ANY)) { // no buttons pressed u32 special_key = i2cReadRegister(I2C_DEV_MCU, 0x10); if (special_key == 0x01) return pad_state | BUTTON_POWER; else if (special_key == 0x04) return pad_state | BUTTON_HOME; pad_state_old = pad_state; delay = 0; continue; } if ((pad_state == pad_state_old) && (!(pad_state & BUTTON_ARROW) || (delay && (timer_msec() < delay)))) continue; // make sure the key is pressed u32 t_pressed = 0; for(; (t_pressed < 0x13000) && (pad_state == HID_STATE); t_pressed++); if (t_pressed >= 0x13000) return pad_state; } }
//--------------------------------------------------------------------------------- void i2cIRQHandler() { //--------------------------------------------------------------------------------- int cause = (i2cReadRegister(I2C_PM, I2CREGPM_PWRIF) & 0x3) | (i2cReadRegister(I2C_GPIO, 0x02)<<2); switch (cause & 3) { case 1: if (__powerbuttonCB) { __powerbuttonCB(); } else { i2cWriteRegister(I2C_PM, I2CREGPM_RESETFLAG, 1); i2cWriteRegister(I2C_PM, I2CREGPM_PWRCNT, 1); } break; case 2: writePowerManagement(PM_CONTROL_REG,PM_SYSTEM_PWR); break; } }
u32 waitInput(bool isMenu) { static u64 dPadDelay = 0ULL; u64 initialValue = 0ULL; u32 key, oldKey = HID_PAD; if(isMenu) { dPadDelay = dPadDelay > 0ULL ? 87ULL : 143ULL; startChrono(); initialValue = chrono(); } while(true) { key = HID_PAD; if(!key) { if((i2cReadRegister(I2C_DEV_MCU, 0x10) & 1)== 1) mcuPowerOff(); oldKey = 0; dPadDelay = 0; continue; } if(key == oldKey && (!isMenu || (!(key & DPAD_BUTTONS) || chrono() - initialValue < dPadDelay))) continue; //Make sure the key is pressed u32 i; for(i = 0; i < 0x13000 && key == HID_PAD; i++); if(i == 0x13000) break; } return key; }