mirror of
https://github.com/aaru-dps/imhex-patterns.git
synced 2025-12-16 11:14:38 +00:00
Add pattern for Wii U's SEEPROM dumps.
This commit is contained in:
289
wiiu/seeprom.hexpat
Normal file
289
wiiu/seeprom.hexpat
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
// /***************************************************************************
|
||||||
|
// Aaru Data Preservation Suite
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Filename : seeprom.hexpat
|
||||||
|
// Author(s) : Natalia Portillo <claunia@claunia.com>
|
||||||
|
//
|
||||||
|
// Component : ImHex pattern for parsing Wii U's SPI EEPROM.
|
||||||
|
// Version : 1.00
|
||||||
|
//
|
||||||
|
// --[ Description ] ----------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Parses Wii U's SPI EEPROM dumps.
|
||||||
|
//
|
||||||
|
// --[ History ] --------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// 1.00: Initial release.
|
||||||
|
//
|
||||||
|
// --[ License ] --------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Copyright © 2011-2025 Natalia Portillo
|
||||||
|
// ****************************************************************************/
|
||||||
|
|
||||||
|
#pragma author Nat Portillo <claunia@claunia.com>
|
||||||
|
#pragma description WII U SPI EEPROM parser (seeprom.bin)
|
||||||
|
#pragma endian big
|
||||||
|
#pragma magic [ AA 55 ] @ 0x192
|
||||||
|
|
||||||
|
#include <aaru/lib/functions.incpat>
|
||||||
|
|
||||||
|
import std.core;
|
||||||
|
import std.mem;
|
||||||
|
import std.sys;
|
||||||
|
import type.base;
|
||||||
|
import type.bcd;
|
||||||
|
import type.magic;
|
||||||
|
|
||||||
|
struct espresso_package_info_t
|
||||||
|
{
|
||||||
|
type::Hex<u32> ppc_pvr [[name("PPC PVR")]];
|
||||||
|
char package_id[6] [[name("Package ID")]];
|
||||||
|
u16 unknown [[highlight_hidden]];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct latte_package_info_t
|
||||||
|
{
|
||||||
|
u16 latte_pkg_wafer_x [[name("Package Wafer X Coordinate")]];
|
||||||
|
u16 latte_pkg_wafer_y [[name("Package Wafer Y Coordinate")]];
|
||||||
|
char latte_pkg_id[8] [[name("Package ID")]];
|
||||||
|
};
|
||||||
|
|
||||||
|
enum sata_device_t : u16
|
||||||
|
{
|
||||||
|
Default = 1,
|
||||||
|
None = 2,
|
||||||
|
ROM = 3,
|
||||||
|
R = 4,
|
||||||
|
MION = 5,
|
||||||
|
SES = 6,
|
||||||
|
GEN2_HDD = 7,
|
||||||
|
GEN1_HDD = 8
|
||||||
|
};
|
||||||
|
|
||||||
|
enum console_type_t : u16
|
||||||
|
{
|
||||||
|
WUP = 1,
|
||||||
|
CAT_R = 2,
|
||||||
|
CAT_DEV = 3,
|
||||||
|
EV = 4,
|
||||||
|
Promotion = 5,
|
||||||
|
OrchestraX = 6,
|
||||||
|
WUIH = 7,
|
||||||
|
WUIH_DEV = 8,
|
||||||
|
CAT_DEV_WUIH = 9
|
||||||
|
};
|
||||||
|
|
||||||
|
struct board_config_t
|
||||||
|
{
|
||||||
|
type::Hex<u32> crc;
|
||||||
|
u16 size;
|
||||||
|
u16 version;
|
||||||
|
char author[2];
|
||||||
|
char board_type[2];
|
||||||
|
u16 board_revision;
|
||||||
|
char boot_source[2];
|
||||||
|
u16 ddr3_size;
|
||||||
|
u16 ddr3_speed;
|
||||||
|
u16 ppc_clock_multiplier;
|
||||||
|
u16 iop_clock_multiplier;
|
||||||
|
u16 video_1080;
|
||||||
|
char ddr3_vendor[2];
|
||||||
|
u16 mov_passive_reset;
|
||||||
|
u16 sys_pii_speed;
|
||||||
|
sata_device_t sata_device;
|
||||||
|
console_type_t console_type;
|
||||||
|
u32 device_presence;
|
||||||
|
u8 reserved[0x20];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sys_prod_info_t
|
||||||
|
{
|
||||||
|
u32 product_area;
|
||||||
|
u16 eeprom_version;
|
||||||
|
padding[2];
|
||||||
|
u32 game_region;
|
||||||
|
padding[4];
|
||||||
|
char ntsc_pal[4];
|
||||||
|
char _5ghz_country_code[3];
|
||||||
|
u8 _5ghz_country_code_revision;
|
||||||
|
char code_id[8];
|
||||||
|
char serial_id[12];
|
||||||
|
padding[4];
|
||||||
|
char model_number[16];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cpu_board_log_t
|
||||||
|
{
|
||||||
|
u16 version;
|
||||||
|
u16 id;
|
||||||
|
u8 ng_code[4] [[format_read("format_array_as_hex")]];
|
||||||
|
u32 date;
|
||||||
|
u16 time;
|
||||||
|
type::Hex<u32> crc;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct dcr_mcr_t
|
||||||
|
{
|
||||||
|
type::Magic<"\xAA\x55"> magic1;
|
||||||
|
u16 mcr_group;
|
||||||
|
u16 mcr_diag;
|
||||||
|
u16 mcr_flags;
|
||||||
|
u32 dcr_status;
|
||||||
|
u32 dcr_disk_id;
|
||||||
|
type::Magic<"\xBB\x66"> magic2;
|
||||||
|
u16 dcr_file_idx;
|
||||||
|
u16 dcr_state;
|
||||||
|
char dcr_name[8];
|
||||||
|
type::Hex<u16> crc;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct diag_result_log_t
|
||||||
|
{
|
||||||
|
u16 result0;
|
||||||
|
u16 result1;
|
||||||
|
u16 result2;
|
||||||
|
u16 result3;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct other_info_t
|
||||||
|
{
|
||||||
|
u8 mlc_size;
|
||||||
|
u8 crush_log;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct wii_u_spi_eeprom_t
|
||||||
|
{
|
||||||
|
padding[18];
|
||||||
|
u8 rng_seed[8] [[format_read("format_array_as_hex")]];
|
||||||
|
padding[6];
|
||||||
|
espresso_package_info_t espresso_package_info;
|
||||||
|
latte_package_info_t latte_package_info;
|
||||||
|
board_config_t board_config;
|
||||||
|
u8 drive_key[16] [[format_read("format_array_as_hex")]];
|
||||||
|
u8 factory_key[16] [[format_read("format_array_as_hex")]];
|
||||||
|
u8 shdd_seed[16] [[format_read("format_array_as_hex")]];
|
||||||
|
u8 ivs_seed[16] [[format_read("format_array_as_hex")]];
|
||||||
|
u16 drive_config;
|
||||||
|
u16 ivs_config;
|
||||||
|
u16 shdd_config;
|
||||||
|
padding[106];
|
||||||
|
type::Hex<u32> unknown1 [[highlight_hidden]];
|
||||||
|
type::Hex<u16> unknown2 [[highlight_hidden]];
|
||||||
|
type::Hex<u16> unknown3 [[highlight_hidden]];
|
||||||
|
padding[8];
|
||||||
|
sys_prod_info_t sys_prod_info;
|
||||||
|
cpu_board_log_t cpu_board_log;
|
||||||
|
dcr_mcr_t dcr_mcr;
|
||||||
|
diag_result_log_t diag_result_log;
|
||||||
|
type::Hex<u16> unknown4 [[highlight_hidden]];
|
||||||
|
type::Hex<u16> unknown5 [[highlight_hidden]];
|
||||||
|
other_info_t other_info;
|
||||||
|
u8 boot_params[48]; // Encrypted
|
||||||
|
padding[16];
|
||||||
|
};
|
||||||
|
|
||||||
|
if(std::mem::size() != 512)
|
||||||
|
std::error("Invalid size.");
|
||||||
|
|
||||||
|
wii_u_spi_eeprom_t eeprom @ 0x00;
|
||||||
|
|
||||||
|
std::print("Espresso Package ID: {}", eeprom.espresso_package_info.package_id);
|
||||||
|
std::print(" Latte Package ID: {}", eeprom.latte_package_info.latte_pkg_id);
|
||||||
|
std::print("");
|
||||||
|
std::print("==== Board configuration =======================================================================");
|
||||||
|
if(eeprom.board_config.author == "@M")
|
||||||
|
std::print(" Board manufacturer: Nintendo");
|
||||||
|
else
|
||||||
|
std::print(" Board manufacturer: {}", eeprom.board_config.author);
|
||||||
|
|
||||||
|
match(eeprom.board_config.board_type)
|
||||||
|
{
|
||||||
|
("CF"): std::print(" Board type: Production");
|
||||||
|
("CT"): std::print(" Board type: Development");
|
||||||
|
("EV" | "EY"): std::print(" Board type: Evaluation");
|
||||||
|
(_): std::print(" Board type: {}", eeprom.board_config.board_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
match(eeprom.board_config.boot_source)
|
||||||
|
{
|
||||||
|
("N1"): std::print(" Boot source: NAND");
|
||||||
|
("S0"): std::print(" Boot source: SDIO0");
|
||||||
|
("S3"): std::print(" Boot source: SDIO3");
|
||||||
|
(_): std::print(" Boot source: {}", eeprom.board_config.boot_source);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::print(" DDR3 size: {} MiB", eeprom.board_config.ddr3_size);
|
||||||
|
|
||||||
|
match(eeprom.board_config.sata_device)
|
||||||
|
{
|
||||||
|
(1): std::print(" SATA device: default");
|
||||||
|
(2): std::print(" SATA device: none");
|
||||||
|
(3): std::print(" SATA device: -ROM");
|
||||||
|
(4): std::print(" SATA device: -R");
|
||||||
|
(5): std::print(" SATA device: MION");
|
||||||
|
(6): std::print(" SATA device: SES");
|
||||||
|
(7): std::print(" SATA device: Gen. 2 HDD");
|
||||||
|
(8): std::print(" SATA device: Gen. 1 HDD");
|
||||||
|
(_): std::print(" SATA device: {}", eeprom.board_config.sata_device);
|
||||||
|
}
|
||||||
|
|
||||||
|
match(eeprom.board_config.console_type)
|
||||||
|
{
|
||||||
|
(1): std::print(" Console type: Production");
|
||||||
|
(2): std::print(" Console type: Test");
|
||||||
|
(3): std::print(" Console type: Development");
|
||||||
|
(4): std::print(" Console type: Evaluation");
|
||||||
|
(5): std::print(" Console type: Promotion");
|
||||||
|
(6): std::print(" Console type: OrchestraX");
|
||||||
|
(7): std::print(" Console type: WUIH");
|
||||||
|
(8): std::print(" Console type: WUIH_DEV");
|
||||||
|
(9): std::print(" Console type: CAT_DEV_WUIH");
|
||||||
|
(_): std::print(" Console type: {}", eeprom.board_config.console_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::print("==== Keys ======================================================================================");
|
||||||
|
match(eeprom.drive_config)
|
||||||
|
{
|
||||||
|
(0x0000): std::print(" The drive key is unencrypted");
|
||||||
|
(0xFFFE): std::print(" The drive key is empty");
|
||||||
|
(0xFFFF): std::print(" The drive key is encrypted with the EEPROM key");
|
||||||
|
}
|
||||||
|
std::print(" Drive key: {}", eeprom.drive_key);
|
||||||
|
std::print(" Factory key: {}", eeprom.factory_key);
|
||||||
|
match(eeprom.shdd_config)
|
||||||
|
{
|
||||||
|
(0x0000): std::print(" The SHDD seed is empty");
|
||||||
|
(0xFFFF): std::print(" The SHDD seed is encrypted with the SHDD key from the OTP");
|
||||||
|
}
|
||||||
|
std::print(" SHDD seed: {}", eeprom.shdd_seed);
|
||||||
|
match(eeprom.ivs_config)
|
||||||
|
{
|
||||||
|
(0x0010): std::print(" Real IVS should be used");
|
||||||
|
}
|
||||||
|
std::print(" IVS seed: {}", eeprom.ivs_seed);
|
||||||
|
|
||||||
|
std::print("==== System product information ================================================================");
|
||||||
|
std::print(" Product area: {}", eeprom.sys_prod_info.product_area);
|
||||||
|
std::print(" EEPROM version: {}", eeprom.sys_prod_info.eeprom_version);
|
||||||
|
std::print(" Game region: {}", eeprom.sys_prod_info.game_region);
|
||||||
|
std::print(" NTSC/PAL: {}", eeprom.sys_prod_info.ntsc_pal);
|
||||||
|
std::print(" 5GHz Country Code: {}", eeprom.sys_prod_info._5ghz_country_code);
|
||||||
|
std::print(" 5Ghz C.C. Revision: {}", eeprom.sys_prod_info._5ghz_country_code_revision);
|
||||||
|
std::print(" Code ID: {}", eeprom.sys_prod_info.code_id);
|
||||||
|
std::print(" Serial ID: {}", eeprom.sys_prod_info.serial_id);
|
||||||
|
std::print(" Model number: {}", eeprom.sys_prod_info.model_number);
|
||||||
Reference in New Issue
Block a user