From 2e9659e36ab22883c0ff00a11626d6ae02b3e16b Mon Sep 17 00:00:00 2001 From: d0k3 Date: Tue, 16 May 2017 23:14:28 +0200 Subject: [PATCH] Improved unit detection routines --- source/common/platform.c | 15 --------------- source/common/platform.h | 8 -------- source/common/unittype.h | 13 +++++++++++++ source/nand/nand.c | 6 +++--- source/nand/nand.h | 4 ++-- 5 files changed, 18 insertions(+), 28 deletions(-) delete mode 100644 source/common/platform.c delete mode 100644 source/common/platform.h create mode 100644 source/common/unittype.h diff --git a/source/common/platform.c b/source/common/platform.c deleted file mode 100644 index b56ef46..0000000 --- a/source/common/platform.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "common.h" -#include "platform.h" - -#define CONFIG_PLATFORM_REG ((volatile u32*)0x10140FFC) - -Platform GetUnitPlatform() -{ - switch (*CONFIG_PLATFORM_REG) { - case 7: - return PLATFORM_N3DS; - case 1: - default: - return PLATFORM_3DS; - } -} diff --git a/source/common/platform.h b/source/common/platform.h deleted file mode 100644 index ce04df1..0000000 --- a/source/common/platform.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -typedef enum { - PLATFORM_3DS, - PLATFORM_N3DS, -} Platform; - -Platform GetUnitPlatform(); diff --git a/source/common/unittype.h b/source/common/unittype.h new file mode 100644 index 0000000..98dfa7f --- /dev/null +++ b/source/common/unittype.h @@ -0,0 +1,13 @@ +#pragma once + +#include "common.h" + +// see: https://3dbrew.org/wiki/CONFIG11_Registers +#define IS_O3DS ((*(vu32*) 0x10140FFC) != 0x7) + +// see: https://www.3dbrew.org/wiki/Memory_layout#ARM9_ITCM +// see: https://www.3dbrew.org/wiki/OTP_Registers#Plaintext_OTP +#define IS_DEVKIT ((*(vu8*) (0x01FFB800+0x19)) != 0x0) + +// see: https://3dbrew.org/wiki/CONFIG11_Registers +#define IS_A9LH ((*(vu32*) 0x101401C0) == 0) diff --git a/source/nand/nand.c b/source/nand/nand.c index 60c6965..761e982 100644 --- a/source/nand/nand.c +++ b/source/nand/nand.c @@ -326,7 +326,7 @@ u32 CheckNandHeader(void* header) // header type check u8* header_enc = header; if (memcmp(header_enc + 0x100, nand_magic_n3ds, sizeof(nand_magic_n3ds) == 0) == 0) - return (GetUnitPlatform() == PLATFORM_3DS) ? 0 : NAND_TYPE_N3DS; + return (IS_O3DS) ? 0 : NAND_TYPE_N3DS; else if (memcmp(header_enc + 0x100, nand_magic_o3ds, sizeof(nand_magic_o3ds) == 0) == 0) return NAND_TYPE_O3DS; @@ -338,12 +338,12 @@ u32 CheckNandType(void) if (ReadNandSectors(NAND_BUFFER, 0, 1, 0xFF) != 0) return 0; if (memcmp(NAND_BUFFER + 0x100, nand_magic_n3ds, 0x60) == 0) { - return (GetUnitPlatform() == PLATFORM_3DS) ? 0 : NAND_TYPE_N3DS; + return (IS_O3DS) ? 0 : NAND_TYPE_N3DS; } else if (memcmp(NAND_BUFFER + 0x100, nand_magic_o3ds, 0x60) == 0) { u8 magic[8] = {0xE9, 0x00, 0x00, 0x43, 0x54, 0x52, 0x20, 0x20}; if (ReadNandSectors(NAND_BUFFER, 0x5CAE5, 1, 0x04) != 0) return 0; - return ((GetUnitPlatform() == PLATFORM_3DS) || (memcmp(magic, NAND_BUFFER, 8) == 0)) ? + return ((IS_O3DS) || (memcmp(magic, NAND_BUFFER, 8) == 0)) ? NAND_TYPE_O3DS : NAND_TYPE_NO3DS; } diff --git a/source/nand/nand.h b/source/nand/nand.h index c204294..cc34423 100644 --- a/source/nand/nand.h +++ b/source/nand/nand.h @@ -1,9 +1,9 @@ #pragma once #include "common.h" -#include "platform.h" +#include "unittype.h" -#define NAND_MIN_SECTORS ((GetUnitPlatform() == PLATFORM_N3DS) ? NAND_MIN_SECTORS_N3DS : NAND_MIN_SECTORS_O3DS) +#define NAND_MIN_SECTORS ((!IS_O3DS) ? NAND_MIN_SECTORS_N3DS : NAND_MIN_SECTORS_O3DS) #define NAND_SYSNAND (1<<0) #define NAND_ZERONAND (1<<3)