diff --git a/include/arm11/hardware/hid.h b/include/arm11/hardware/hid.h index ff10158..77e6110 100644 --- a/include/arm11/hardware/hid.h +++ b/include/arm11/hardware/hid.h @@ -66,13 +66,13 @@ // Extra keys use with hidGetExtraKeys() enum { - KEY_POWER = (1u<<0), - KEY_POWER_HELD = (1u<<1), - KEY_HOME = (1u<<2), // Auto clear on release - KEY_WIFI = (1u<<3), - KEY_SHELL = (1u<<4), // Auto clear on open - KEY_CHARGER = (1u<<5), // Auto clears on unplugging - KEY_VOL_SLIDER = (1u<<6) + KEY_POWER = (1u<<0), + KEY_POWER_HELD = (1u<<1), + KEY_HOME = (1u<<2), // Auto clears on release + KEY_WIFI = (1u<<3), + KEY_SHELL = (1u<<4), // Auto clears on open + KEY_BAT_CHARGING = (1u<<5), // Auto clears when charging stops + KEY_VOL_SLIDER = (1u<<6) }; typedef struct @@ -90,7 +90,6 @@ void hidInit(void); -bool hidIsHomeButtonHeldRaw(void); void hidScanInput(void); u32 hidKeysHeld(void); u32 hidKeysDown(void); diff --git a/include/arm11/hardware/i2c.h b/include/arm11/hardware/i2c.h index 5e1e104..0bb477a 100644 --- a/include/arm11/hardware/i2c.h +++ b/include/arm11/hardware/i2c.h @@ -33,9 +33,9 @@ typedef enum { - I2C_DEV_POWER = 0, // Unconfirmed - I2C_DEV_CAMERA = 1, // Unconfirmed - I2C_DEV_CAMERA2 = 2, // Unconfirmed + I2C_DEV_POWER = 0, // Unconfirmed + I2C_DEV_CAMERA = 1, // Unconfirmed + I2C_DEV_CAMERA2 = 2, // Unconfirmed I2C_DEV_MCU = 3, I2C_DEV_GYRO = 10, I2C_DEV_DEBUG_PAD = 12, diff --git a/include/arm11/hardware/mcu.h b/include/arm11/hardware/mcu.h index d26e62f..f06a2e4 100644 --- a/include/arm11/hardware/mcu.h +++ b/include/arm11/hardware/mcu.h @@ -48,7 +48,7 @@ void MCU_triggerPowerOff(void); void MCU_triggerReboot(void); u8 MCU_readBatteryLevel(void); -bool MCU_readBatteryChargeState(void); +u8 MCU_readExternalHwState(void); u8 MCU_readSystemModel(void); void MCU_readRTC(void *rtc); u32 MCU_readReceivedIrqs(void); diff --git a/source/arm11/hardware/hid.c b/source/arm11/hardware/hid.c index 2246e6a..ae490db 100644 --- a/source/arm11/hardware/hid.c +++ b/source/arm11/hardware/hid.c @@ -36,7 +36,7 @@ static u32 extraKeys; //TouchPos tPos; //CpadPos cPos; -static volatile bool mcuIrq = true; +static volatile bool mcuIrq; @@ -44,14 +44,19 @@ void hidInit(void) { - extraKeys = kUp = kDown = kHeld = 0; + kUp = kDown = kHeld = 0; + mcuIrq = false; - // When set after a reboot from TWL_FIRM while holding the HOME button this will - // cause the MCU to spam IRQs infinitely after releasing the HOME button. - // mcuBugs++ - // Update: For some reason this is not reproduceable anymore. - MCU_setIrqBitmask(0xFFBFFC80u); + (void)MCU_readReceivedIrqs(); + u8 state = MCU_readExternalHwState(); + u32 tmp = ~state<<3 & KEY_SHELL; // Current shell state. Bit is inverted. + tmp |= state<<1 & KEY_BAT_CHARGING; // Current battery charging state + state = MCU_readHidHeld(); + tmp |= ~state<<1 & KEY_HOME; // Current HOME button state + extraKeys = tmp; + IRQ_registerHandler(IRQ_MCU_HID, 14, 0, true, hidIrqHandler); + MCU_setIrqBitmask(0xFFBF3F80u); GPIO_setBit(19, 9); // This enables the MCU IRQ. //CODEC_init(); @@ -64,7 +69,6 @@ static void updateMcuIrqState(void) { - // TODO: We should probably disable IRQs temporarily here. if(!mcuIrq) return; mcuIrq = false; @@ -75,8 +79,8 @@ if(state & 1u<<3) tmp &= ~KEY_HOME; // HOME released tmp |= state>>1 & (KEY_WIFI | KEY_SHELL); // WiFi switch, shell closed if(state & 1u<<6) tmp &= ~KEY_SHELL; // Shell opened - tmp |= state>>4 & KEY_CHARGER; // Charger plugged in - if(state & 1u<<8) tmp &= ~KEY_CHARGER; // Charger removed + tmp |= state>>10 & KEY_BAT_CHARGING; // Battery started charging + if(state & 1u<<14) tmp &= ~KEY_BAT_CHARGING; // Battery stopped charging tmp |= state>>16 & KEY_VOL_SLIDER; // Volume slider update extraKeys = tmp; } @@ -96,12 +100,12 @@ cPos.x = -(((buf[36]<<8 | buf[37]) & 0xFFFu) - 2048u); // X axis is inverted cPos.y = ((buf[20]<<8 | buf[21]) & 0xFFFu) - 2048u; - if((cPos.x > 0 ? cPos.x : -cPos.x) > CPAD_THRESHOLD) + if((cPos.x >= 0 ? cPos.x : -cPos.x) > CPAD_THRESHOLD) { if(cPos.x >= 0) emuButtons |= KEY_CPAD_RIGHT; else emuButtons |= KEY_CPAD_LEFT; } - if((cPos.y > 0 ? cPos.y : -cPos.y) > CPAD_THRESHOLD) + if((cPos.y >= 0 ? cPos.y : -cPos.y) > CPAD_THRESHOLD) { if(cPos.y >= 0) emuButtons |= KEY_CPAD_UP; else emuButtons |= KEY_CPAD_DOWN; @@ -110,16 +114,11 @@ return emuButtons; }*/ -bool hidIsHomeButtonHeldRaw(void) -{ - return !(MCU_readHidHeld() & 1u<<1); -} - void hidScanInput(void) { updateMcuIrqState(); - u32 kOld = kHeld; + const u32 kOld = kHeld; kHeld = /*rawCodec2Hid() |*/ REG_HID_PAD; kDown = (~kOld) & kHeld; kUp = kOld & (~kHeld); @@ -152,7 +151,7 @@ u32 hidGetExtraKeys(u32 clearMask) { - u32 tmp = extraKeys; + const u32 tmp = extraKeys; extraKeys &= ~clearMask; return tmp; diff --git a/source/arm11/hardware/i2c.c b/source/arm11/hardware/i2c.c index 0274dda..3e7def0 100644 --- a/source/arm11/hardware/i2c.c +++ b/source/arm11/hardware/i2c.c @@ -57,7 +57,7 @@ {I2C_BUS2, 0x2E}, {I2C_BUS2, 0x40}, {I2C_BUS2, 0x44}, - {I2C_BUS3, 0xA6}, // TODO: Find out if 0xA6 or 0xD6 is correct + {I2C_BUS3, 0xD6}, {I2C_BUS3, 0xD0}, {I2C_BUS3, 0xD2}, {I2C_BUS3, 0xA4}, @@ -98,11 +98,9 @@ void I2C_init(void) { - static bool initialized = false; - - /* run-once */ - if(initialized) return; - initialized = true; + static bool inited = false; + if(inited) return; + inited = true; IRQ_registerHandler(IRQ_I2C1, 14, 0, true, NULL); IRQ_registerHandler(IRQ_I2C2, 14, 0, true, NULL); @@ -175,9 +173,8 @@ bool I2C_readRegBuf(I2cDevice devId, u8 regAddr, u8 *out, u32 size) { - const u8 busId = i2cDevTable[devId].busId; const u8 devAddr = i2cDevTable[devId].devAddr; - I2cRegs *const regs = i2cGetBusRegsBase(busId); + I2cRegs *const regs = i2cGetBusRegsBase(i2cDevTable[devId].busId); if(!i2cStartTransfer(devAddr, regAddr, true, regs)) return false; @@ -199,9 +196,8 @@ bool I2C_writeRegBuf(I2cDevice devId, u8 regAddr, const u8 *in, u32 size) { - const u8 busId = i2cDevTable[devId].busId; const u8 devAddr = i2cDevTable[devId].devAddr; - I2cRegs *const regs = i2cGetBusRegsBase(busId); + I2cRegs *const regs = i2cGetBusRegsBase(i2cDevTable[devId].busId); if(!i2cStartTransfer(devAddr, regAddr, false, regs)) return false; @@ -245,9 +241,8 @@ bool I2C_writeRegIntSafe(I2cDevice devId, u8 regAddr, u8 data) { - const u8 busId = i2cDevTable[devId].busId; const u8 devAddr = i2cDevTable[devId].devAddr; - I2cRegs *const regs = i2cGetBusRegsBase(busId); + I2cRegs *const regs = i2cGetBusRegsBase(i2cDevTable[devId].busId); u32 tries = 8; diff --git a/source/arm11/hardware/mcu.c b/source/arm11/hardware/mcu.c index 05e75e0..c552486 100644 --- a/source/arm11/hardware/mcu.c +++ b/source/arm11/hardware/mcu.c @@ -88,13 +88,9 @@ return state; } -bool MCU_readBatteryChargeState(void) +u8 MCU_readExternalHwState(void) { - u8 state; - - state = I2C_readReg(I2C_DEV_MCU, RegExHW); - - return (state & (1u << 4)) != 0; + return I2C_readReg(I2C_DEV_MCU, RegExHW); } u8 MCU_readSystemModel(void) diff --git a/source/arm11/main.c b/source/arm11/main.c index e88fade..3fb73f5 100644 --- a/source/arm11/main.c +++ b/source/arm11/main.c @@ -61,12 +61,12 @@ loadConfigFile(); + hidScanInput(); // bootrom dumper? // skip bootslot / FCRAM / reboot handling in that case if(dump_bootroms) { - // workaround when HOME button is held - if (hidIsHomeButtonHeldRaw()) + if (hidGetExtraKeys(0) & KEY_HOME) { menu_ret = MENU_RET_REBOOT; if (toggleSuperhax(false) == 0) @@ -90,7 +90,7 @@ nextBootSlot = readStoredBootslot(); // show menu if bootmode is normal or HOME button is pressed - show_menu = (!nextBootSlot && (bootmode == BootModeNormal)) || hidIsHomeButtonHeldRaw(); + show_menu = (!nextBootSlot && (bootmode == BootModeNormal)) || hidGetExtraKeys(0) & KEY_HOME; // show splash if cold boot and (bootmode != BootModeQuiet) bool splash_wait = false; @@ -131,7 +131,6 @@ // check keys held at boot - hidScanInput(); u32 kHeld = hidKeysHeld(); // boot slot keycombo held? diff --git a/source/arm11/menu/battery.c b/source/arm11/menu/battery.c index 40d3cb1..cb6b406 100644 --- a/source/arm11/menu/battery.c +++ b/source/arm11/menu/battery.c @@ -16,12 +16,14 @@ * along with this program. If not, see . */ - -#include "arm11/hardware/mcu.h" #include "arm11/menu/battery.h" +#include "arm11/hardware/mcu.h" +#include "arm11/hardware/hid.h" + + void getBatteryState(BatteryState *battery) { battery->percent = MCU_readBatteryLevel(); - battery->charging = MCU_readBatteryChargeState(); + battery->charging = hidGetExtraKeys(0) & KEY_BAT_CHARGING; } diff --git a/source/arm11/start.s b/source/arm11/start.s index edc814c..2c98a09 100644 --- a/source/arm11/start.s +++ b/source/arm11/start.s @@ -205,7 +205,7 @@ mov r0, #0 mov r1, #0xF00000 @ Give full access to cp10/11 in user and privileged mode mov r2, #0x40000000 @ Clear exception bits and enable VFP11 - mov r3, #0x3C00000 @ Round towards zero (RZ) mode, flush-to-zero mode, default NaN mode + mov r3, #0x3000000 @ Round to nearest (RN) mode, flush-to-zero mode, default NaN mode mcr p15, 0, r1, c1, c0, 2 @ Write Coprocessor Access Control Register mcr p15, 0, r0, c7, c5, 4 @ Flush Prefetch Buffer fmxr fpexc, r2 @ Write Floating-point exception register