From 5172bf92054aac7866d20d12dc64679e1723c2e2 Mon Sep 17 00:00:00 2001 From: d0k3 Date: Mon, 17 Oct 2016 23:45:22 +0200 Subject: [PATCH] Allow POWER and HOME for poweroff / reboot ... also revised HID functions --- source/godmode.c | 8 +++++++- source/hid.c | 20 ++++++++++++++++---- source/hid.h | 8 +++++++- source/ui.c | 2 +- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/source/godmode.c b/source/godmode.c index 90893d1..d801fef 100644 --- a/source/godmode.c +++ b/source/godmode.c @@ -906,7 +906,13 @@ u32 GodMode() { if (pad_state & BUTTON_START) { exit_mode = (switched || (pad_state & BUTTON_LEFT)) ? GODMODE_EXIT_POWEROFF : GODMODE_EXIT_REBOOT; break; - } + } else if (pad_state & BUTTON_POWER) { + exit_mode = GODMODE_EXIT_POWEROFF; + break; + } else if (pad_state & BUTTON_HOME) { + exit_mode = GODMODE_EXIT_REBOOT; + break; + } } DeinitExtFS(); diff --git a/source/hid.c b/source/hid.c index dd34002..ae753a5 100644 --- a/source/hid.c +++ b/source/hid.c @@ -1,4 +1,5 @@ #include "hid.h" +#include "i2c.h" #include "timer.h" u32 InputWait() { @@ -8,19 +9,30 @@ u32 InputWait() { timer_start(); while (true) { u32 pad_state = HID_STATE; - if (!(~pad_state & BUTTON_ANY)) { // no buttons pressed + 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) || + (!(pad_state & BUTTON_ARROW) || (delay && (timer_msec() < delay)))) continue; - //Make sure the key is pressed + // 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; + return pad_state; } } + +bool CheckButton(u32 button) { + u32 t_pressed = 0; + for(; (t_pressed < 0x13000) && ((HID_STATE & button) == button); t_pressed++); + return (t_pressed >= 0x13000); +} diff --git a/source/hid.h b/source/hid.h index a86c48e..57a0ca5 100644 --- a/source/hid.h +++ b/source/hid.h @@ -2,7 +2,8 @@ #include "common.h" -#define HID_STATE (*(volatile u32*)0x10146000) +#define HID_STATE (~(*(volatile u32*)0x10146000) & BUTTON_ANY) + #define BUTTON_A (1 << 0) #define BUTTON_B (1 << 1) @@ -19,4 +20,9 @@ #define BUTTON_ANY 0x00000FFF #define BUTTON_ARROW (BUTTON_RIGHT|BUTTON_LEFT|BUTTON_UP|BUTTON_DOWN) +// special buttons +#define BUTTON_POWER (1 << 12) +#define BUTTON_HOME (1 << 13) + u32 InputWait(); +bool CheckButton(u32 button); diff --git a/source/ui.c b/source/ui.c index c9fb239..7b3e2ca 100644 --- a/source/ui.c +++ b/source/ui.c @@ -543,5 +543,5 @@ bool ShowProgress(u64 current, u64 total, const char* opstr) last_prog_width = prog_width; - return !(~HID_STATE & BUTTON_B); + return !CheckButton(BUTTON_B); }