diff --git a/include/arm11/hid.h b/include/arm11/hid.h new file mode 100644 index 0000000..5d118cd --- /dev/null +++ b/include/arm11/hid.h @@ -0,0 +1,35 @@ +#pragma once + +#include "types.h" + + +#define HID_KEY_MASK_ALL ((KEY_SHELL << 1) - 1) +#define HID_VERBOSE_MODE_BUTTONS (KEY_SELECT | KEY_START) + +enum +{ + KEY_A = (1), + KEY_B = (1<<1), + KEY_SELECT = (1<<2), + KEY_START = (1<<3), + KEY_DRIGHT = (1<<4), + KEY_DLEFT = (1<<5), + KEY_DUP = (1<<6), + KEY_DDOWN = (1<<7), + KEY_R = (1<<8), + KEY_L = (1<<9), + KEY_X = (1<<10), + KEY_Y = (1<<11), + KEY_HOME = (1<<21), + KEY_SHELL = (1<<22) +}; + + + +void hidInit(void); +u32 hidGetPowerButton(void); +u32 hidGetWifiButton(void); +void hidScanInput(void); +u32 hidKeysHeld(void); +u32 hidKeysDown(void); +u32 hidKeysUp(void); diff --git a/include/arm9/hid.h b/include/arm9/hid.h new file mode 100644 index 0000000..910b6c9 --- /dev/null +++ b/include/arm9/hid.h @@ -0,0 +1,30 @@ +#pragma once + +#include "types.h" + + +#define HID_KEY_MASK_ALL ((KEY_Y << 1) - 1) +#define HID_VERBOSE_MODE_BUTTONS (KEY_SELECT | KEY_START) + +enum +{ + KEY_A = (1), + KEY_B = (1<<1), + KEY_SELECT = (1<<2), + KEY_START = (1<<3), + KEY_DRIGHT = (1<<4), + KEY_DLEFT = (1<<5), + KEY_DUP = (1<<6), + KEY_DDOWN = (1<<7), + KEY_R = (1<<8), + KEY_L = (1<<9), + KEY_X = (1<<10), + KEY_Y = (1<<11) +}; + + + +void hidScanInput(void); +u32 hidKeysHeld(void); +u32 hidKeysDown(void); +u32 hidKeysUp(void); diff --git a/include/hid.h b/include/hid.h deleted file mode 100644 index 53a5089..0000000 --- a/include/hid.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include "types.h" - - -#define HID_KEY_MASK_ALL ((KEY_Y << 1) - 1) -#define HID_VERBOSE_MODE_BUTTONS (KEY_SELECT | KEY_START) - -enum -{ - KEY_A = (1), - KEY_B = (1<<1), - KEY_SELECT = (1<<2), - KEY_START = (1<<3), - KEY_DRIGHT = (1<<4), - KEY_DLEFT = (1<<5), - KEY_DUP = (1<<6), - KEY_DDOWN = (1<<7), - KEY_R = (1<<8), - KEY_L = (1<<9), - KEY_X = (1<<10), - KEY_Y = (1<<11), -}; - - - -void hidScanInput(void); -u32 hidKeysHeld(void); -u32 hidKeysDown(void); -u32 hidKeysUp(void); diff --git a/source/arm11/hardware.c b/source/arm11/hardware.c index 285f3bc..2cb5792 100644 --- a/source/arm11/hardware.c +++ b/source/arm11/hardware.c @@ -1,6 +1,7 @@ #include "types.h" #include "arm11/interrupt.h" #include "pxi.h" +#include "arm11/hid.h" @@ -8,6 +9,7 @@ { IRQ_init(); PXI_init(); + hidInit(); } /*void hardwareDeinit(void) diff --git a/source/arm11/hid.c b/source/arm11/hid.c new file mode 100644 index 0000000..73a714a --- /dev/null +++ b/source/arm11/hid.c @@ -0,0 +1,74 @@ +/* + * Original code from ctrulib + */ + +#include "mem_map.h" +#include "types.h" +#include "arm11/i2c.h" +#include "arm11/interrupt.h" +#include "arm11/gpio.h" + + +#define REG_HID_PAD (*((vu16*)(IO_MEM_ARM9_ARM11 + 0x46000)) ^ 0xFFFFu) + + +static u32 kHeld, kDown, kUp, homeShellState, powerWifiState; + + + +static void hidIrqHandler(UNUSED u32 intSource) +{ + const u32 state = (u32)i2cmcu_readreg_hid_irq(); + + powerWifiState |= state & 3; + powerWifiState |= state>>2 & 4; + + homeShellState |= (state & 4)<<19; + homeShellState |= (state & 0x20)<<17; + + homeShellState ^= (state & 8)<<18; + homeShellState ^= (state & 0x40)<<16; +} + +void hidInit(void) +{ + IRQ_registerHandler(IRQ_MCU_HID, 14, 0, true, hidIrqHandler); + GPIO_setBit(19, 9); // This enables the MCU HID IRQ +} + +u32 hidGetPowerButton(void) +{ + u32 tmp = powerWifiState; + powerWifiState &= ~3; + return tmp & 3; +} + +u32 hidGetWifiButton(void) +{ + u32 tmp = powerWifiState; + powerWifiState &= ~4; + return tmp>>2; +} + +void hidScanInput(void) +{ + u32 kOld = kHeld; + kHeld = homeShellState | REG_HID_PAD; + kDown = (~kOld) & kHeld; + kUp = kOld & (~kHeld); +} + +u32 hidKeysHeld(void) +{ + return kHeld; +} + +u32 hidKeysDown(void) +{ + return kDown; +} + +u32 hidKeysUp(void) +{ + return kUp; +} diff --git a/source/arm11/main.c b/source/arm11/main.c index c47c679..4c59259 100644 --- a/source/arm11/main.c +++ b/source/arm11/main.c @@ -7,6 +7,9 @@ #include "arm11/interrupt.h" #include "arm11/gpio.h" #include "arm11/firm.h" +#include "arm11/hid.h" + + extern bool battery_ok(void); extern void power_off(void); @@ -19,8 +22,6 @@ hardwareInit(); IRQ_registerHandler(IRQ_PXI_SYNC, 14, 0, true, NULL); - IRQ_registerHandler(IRQ_MCU_HID, 14, 0, true, NULL); - GPIO_setBit(19, 9); // This enables the MCU HID IRQ for(;;) { @@ -59,30 +60,26 @@ } - /* Update state, check for changes */ - - u8 hidstate = i2cmcu_readreg_hid_irq(); + hidScanInput(); + const u32 kDown = hidKeysDown(); + const u32 kUp = hidKeysUp(); - if(hidstate & MCU_HID_POWER_BUTTON_PRESSED) + if(hidGetPowerButton()) { - if(poweroff_allowed) // direct power off allowed? - power_off(); + if(poweroff_allowed) power_off(); PXI_trySendWord(PXI_RPL_POWER_PRESSED); } - if(hidstate & MCU_HID_HOME_BUTTON_PRESSED) - PXI_trySendWord(PXI_RPL_HOME_PRESSED); - - // handle shell state - if(hidstate & MCU_HID_SHELL_GOT_CLOSED) - i2cmcu_lcd_poweroff(); - else if(hidstate & MCU_HID_SHELL_GOT_OPENED) + if(kDown & KEY_HOME) PXI_trySendWord(PXI_RPL_HOME_PRESSED); + if(kDown & KEY_SHELL) i2cmcu_lcd_poweroff(); + if(kUp & KEY_SHELL) { i2cmcu_lcd_poweron(); i2cmcu_lcd_backlight_poweron(); } - - hidstate = i2cmcu_readreg_hid_held(); + + + u8 hidstate = i2cmcu_readreg_hid_held(); if(!(hidstate & MCU_HID_HOME_BUTTON_NOT_HELD)) PXI_trySendWord(PXI_RPL_HOME_HELD); diff --git a/source/arm11/power.c b/source/arm11/power.c index 6163a87..9ecade9 100644 --- a/source/arm11/power.c +++ b/source/arm11/power.c @@ -2,6 +2,8 @@ #include "util.h" #include "arm11/i2c.h" + + bool battery_ok(void) { u8 state; diff --git a/source/arm9/config.c b/source/arm9/config.c index a5f0075..d9aeb06 100644 --- a/source/arm9/config.c +++ b/source/arm9/config.c @@ -13,7 +13,7 @@ #include "arm9/main.h" #include "arm9/interrupt.h" #include "util.h" -#include "hid.h" +#include "arm9/hid.h" #include "arm9/debug.h" #include "arm9/ui.h" #include "arm9/config.h" diff --git a/source/arm9/firmwriter.c b/source/arm9/firmwriter.c index e1b6cdb..ab76bf8 100644 --- a/source/arm9/firmwriter.c +++ b/source/arm9/firmwriter.c @@ -5,7 +5,7 @@ #include "mem_map.h" #include "arm9/dev.h" #include "fatfs/ff.h" -#include "hid.h" +#include "arm9/hid.h" #include "util.h" #include "arm9/firmwriter.h" #include "arm9/main.h" diff --git a/source/arm9/hid.c b/source/arm9/hid.c new file mode 100644 index 0000000..bfbef93 --- /dev/null +++ b/source/arm9/hid.c @@ -0,0 +1,37 @@ +/* + * Original code from ctrulib + */ + +#include "mem_map.h" +#include "types.h" + + +#define REG_HID_PAD (*((vu16*)(IO_MEM_ARM9_ARM11 + 0x46000)) ^ 0xFFFFu) + + +static u32 kHeld, kDown, kUp; + + + +void hidScanInput(void) +{ + u32 kOld = kHeld; + kHeld = REG_HID_PAD; + kDown = (~kOld) & kHeld; + kUp = kOld & (~kHeld); +} + +u32 hidKeysHeld(void) +{ + return kHeld; +} + +u32 hidKeysDown(void) +{ + return kDown; +} + +u32 hidKeysUp(void) +{ + return kUp; +} diff --git a/source/arm9/main.c b/source/arm9/main.c index f49858a..575f60a 100644 --- a/source/arm9/main.c +++ b/source/arm9/main.c @@ -5,7 +5,7 @@ #include "types.h" #include "util.h" #include "pxi.h" -#include "hid.h" +#include "arm9/hid.h" #include "arm9/hardware.h" #include "fatfs/ff.h" #include "arm9/dev.h" diff --git a/source/arm9/menu.c b/source/arm9/menu.c index e2c16fd..b87686d 100644 --- a/source/arm9/menu.c +++ b/source/arm9/menu.c @@ -10,7 +10,7 @@ #include "fatfs/ff.h" #include "fatfs/diskio.h" #include "arm9/fsutils.h" -#include "hid.h" +#include "arm9/hid.h" #include "arm9/main.h" #include "arm9/menu.h" #include "arm9/menu_firmloader.h" diff --git a/source/arm9/menu_credits.c b/source/arm9/menu_credits.c index 9d25c86..5bff0f2 100644 --- a/source/arm9/menu_credits.c +++ b/source/arm9/menu_credits.c @@ -7,7 +7,7 @@ #include "arm9/dev.h" #include "fatfs/ff.h" #include "pxi.h" -#include "hid.h" +#include "arm9/hid.h" #include "util.h" #include "arm9/main.h" #include "arm9/timer.h" diff --git a/source/arm9/menu_filebrowse.c b/source/arm9/menu_filebrowse.c index f26ad5b..31894ca 100644 --- a/source/arm9/menu_filebrowse.c +++ b/source/arm9/menu_filebrowse.c @@ -10,7 +10,7 @@ #include "arm9/interrupt.h" #include "arm9/dev.h" #include "util.h" -#include "hid.h" +#include "arm9/hid.h" #define MAX_CACHED_ENTRIES 0x400 diff --git a/source/arm9/menu_firmloader.c b/source/arm9/menu_firmloader.c index dd7033f..098ade5 100644 --- a/source/arm9/menu_firmloader.c +++ b/source/arm9/menu_firmloader.c @@ -6,7 +6,7 @@ #include "arm9/console.h" #include "arm9/dev.h" #include "fatfs/ff.h" -#include "hid.h" +#include "arm9/hid.h" #include "util.h" #include "pxi.h" #include "arm9/main.h" diff --git a/source/arm9/menu_nand.c b/source/arm9/menu_nand.c index ae335b9..f319eb2 100644 --- a/source/arm9/menu_nand.c +++ b/source/arm9/menu_nand.c @@ -5,7 +5,7 @@ #include "arm9/console.h" #include "arm9/dev.h" #include "fatfs/ff.h" -#include "hid.h" +#include "arm9/hid.h" #include "util.h" #include "arm9/main.h" #include "arm9/menu.h" diff --git a/source/arm9/menu_options.c b/source/arm9/menu_options.c index 2c19af8..8471fd7 100644 --- a/source/arm9/menu_options.c +++ b/source/arm9/menu_options.c @@ -7,7 +7,7 @@ #include "arm9/dev.h" #include "fatfs/ff.h" #include "pxi.h" -#include "hid.h" +#include "arm9/hid.h" #include "util.h" #include "arm9/main.h" #include "arm9/timer.h" diff --git a/source/arm9/menu_update.c b/source/arm9/menu_update.c index 8d1e995..96df2fe 100644 --- a/source/arm9/menu_update.c +++ b/source/arm9/menu_update.c @@ -7,7 +7,7 @@ #include "arm9/dev.h" #include "arm9/partitions.h" #include "fatfs/ff.h" -#include "hid.h" +#include "arm9/hid.h" #include "util.h" #include "arm9/firmwriter.h" #include "arm9/main.h" diff --git a/source/arm9/ui.c b/source/arm9/ui.c index 8b8a65e..d12ff38 100644 --- a/source/arm9/ui.c +++ b/source/arm9/ui.c @@ -4,7 +4,7 @@ #include #include "types.h" #include "util.h" -#include "hid.h" +#include "arm9/hid.h" #include "pxi.h" #include "arm9/timer.h" #include "arm9/main.h" diff --git a/source/hid.c b/source/hid.c deleted file mode 100644 index 1ab8bb5..0000000 --- a/source/hid.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Original code from ctrulib - */ - -#include "mem_map.h" -#include "types.h" -#include "hid.h" - - -#define HID_REGS_BASE (IO_MEM_ARM9_ARM11 + 0x00046000) -#define REG_HID_PAD ~(*((vu32*)(HID_REGS_BASE))) - - -static u32 kOld, kHeld, kDown, kUp; - - - -void hidScanInput(void) -{ - kOld = kHeld; - kHeld = REG_HID_PAD; - kDown = (~kOld) & kHeld; - kUp = kOld & (~kHeld); -} - -u32 hidKeysHeld(void) -{ - return kHeld; -} - -u32 hidKeysDown(void) -{ - return kDown; -} - -u32 hidKeysUp(void) -{ - return kUp; -}