misc fixes/cleanups in ds firmware handling

This commit is contained in:
CasualPokePlayer 2023-11-05 16:59:48 -08:00
parent eeb824d035
commit 1f58596d3c
2 changed files with 21 additions and 25 deletions

Binary file not shown.

View File

@ -92,12 +92,12 @@ static void SanitizeExternalFirmware(SPI_Firmware::Firmware& firmware)
if (isDSiFw) if (isDSiFw)
{ {
memset(&header.Unknown0[0], 0, (uintptr_t)&header.Unused2[0] - (uintptr_t)&header.Unknown0[0]); memset(&header.Bytes[0x22], 0x00, 6);
header.Unused2[0] = header.Unused2[1] = 0xFF; memset(&header.Bytes[0x28], 0xFF, 2);
} }
memcpy(&header.WifiConfigLength, &defaultHeader.WifiConfigLength, (uintptr_t)&header.Unknown4 - (uintptr_t)&header.WifiConfigLength); memcpy(&header.Bytes[0x2C], &defaultHeader.Bytes[0x2C], 0x136);
memset(&header.Unknown4, 0xFF, (uintptr_t)&header.Unused7 - (uintptr_t)&header.Unknown4 + 1); memset(&header.Bytes[0x162], 0xFF, 0x9E);
if (isDSiFw) if (isDSiFw)
{ {
@ -108,7 +108,7 @@ static void SanitizeExternalFirmware(SPI_Firmware::Firmware& firmware)
header.UpdateChecksum(); header.UpdateChecksum();
auto& aps = firmware.AccessPoints(); auto& aps = firmware.AccessPoints();
aps[0] = SPI_Firmware::WifiAccessPoint(NDS::ConsoleType); aps[0] = SPI_Firmware::WifiAccessPoint(isDSiFw);
aps[1] = SPI_Firmware::WifiAccessPoint(); aps[1] = SPI_Firmware::WifiAccessPoint();
aps[2] = SPI_Firmware::WifiAccessPoint(); aps[2] = SPI_Firmware::WifiAccessPoint();
@ -133,15 +133,16 @@ static void FixFirmwareTouchscreenCalibration(SPI_Firmware::UserData& userData)
userData.TouchCalibrationPixel2[1] = 191; userData.TouchCalibrationPixel2[1] = 191;
} }
static void SetFirmwareSettings(SPI_Firmware::UserData& userData, FirmwareSettings& fwSettings, bool dsiFw) static void SetFirmwareSettings(SPI_Firmware::UserData& userData, FirmwareSettings& fwSettings)
{ {
memset(userData.Bytes, 0, 0x74); memset(userData.Bytes, 0, 0x74);
userData.Version = 5; userData.Version = 5;
FixFirmwareTouchscreenCalibration(userData); FixFirmwareTouchscreenCalibration(userData);
userData.NameLength = fwSettings.UsernameLength; userData.NameLength = fwSettings.UsernameLength;
memcpy(userData.Nickname, fwSettings.Username, sizeof(fwSettings.Username)); memcpy(userData.Nickname, fwSettings.Username, sizeof(fwSettings.Username));
userData.Settings = fwSettings.Language | SPI_Firmware::BacklightLevel::Max | 0xFC00; userData.Settings = fwSettings.Language | SPI_Firmware::BacklightLevel::Max | 0xEC00;
userData.BirthdayMonth = fwSettings.BirthdayMonth; userData.BirthdayMonth = fwSettings.BirthdayMonth;
userData.BirthdayDay = fwSettings.BirthdayDay; userData.BirthdayDay = fwSettings.BirthdayDay;
userData.FavoriteColor = fwSettings.Color; userData.FavoriteColor = fwSettings.Color;
@ -151,7 +152,14 @@ static void SetFirmwareSettings(SPI_Firmware::UserData& userData, FirmwareSettin
if (userData.ExtendedSettings.Unknown0 == 1) if (userData.ExtendedSettings.Unknown0 == 1)
{ {
userData.ExtendedSettings.ExtendedLanguage = static_cast<SPI_Firmware::Language>(fwSettings.Language & SPI_Firmware::Language::Reserved); userData.ExtendedSettings.ExtendedLanguage = static_cast<SPI_Firmware::Language>(fwSettings.Language & SPI_Firmware::Language::Reserved);
memset(userData.ExtendedSettings.Unused0, dsiFw ? 0x00 : 0xFF, sizeof(userData.ExtendedSettings.Unused0)); memset(userData.ExtendedSettings.Unused0, 0, sizeof(userData.ExtendedSettings.Unused0));
if (!((1 << static_cast<u8>(userData.ExtendedSettings.ExtendedLanguage)) & userData.ExtendedSettings.SupportedLanguageMask))
{
userData.ExtendedSettings.ExtendedLanguage = SPI_Firmware::Language::English;
userData.Settings &= ~SPI_Firmware::Language::Reserved;
userData.Settings |= SPI_Firmware::Language::English;
}
} }
else else
{ {
@ -184,7 +192,7 @@ const char* InitFirmware(FirmwareSettings& fwSettings)
if (firmware.Buffer()) if (firmware.Buffer())
{ {
// Fix header and AP points // sanitize header, wifi calibration, and AP points
SanitizeExternalFirmware(firmware); SanitizeExternalFirmware(firmware);
} }
} }
@ -208,7 +216,7 @@ const char* InitFirmware(FirmwareSettings& fwSettings)
{ {
for (SPI_Firmware::UserData& userData : firmware.UserData()) for (SPI_Firmware::UserData& userData : firmware.UserData())
{ {
SetFirmwareSettings(userData, fwSettings, firmware.Header().ConsoleType == SPI_Firmware::FirmwareConsoleType::DSi); SetFirmwareSettings(userData, fwSettings);
userData.UpdateChecksum(); userData.UpdateChecksum();
} }
@ -247,6 +255,7 @@ const char* InitDSiBIOS()
if (!Platform::GetConfigBool(Platform::DSi_FullBIOSBoot)) if (!Platform::GetConfigBool(Platform::DSi_FullBIOSBoot))
{ {
// upstream applies this patch, for whatever reason
static const u8 patch[] = { 0xFE, 0xFF, 0xFF, 0xEA }; static const u8 patch[] = { 0xFE, 0xFF, 0xFF, 0xEA };
memcpy(DSi::ARM7iBIOS, patch, sizeof(patch)); memcpy(DSi::ARM7iBIOS, patch, sizeof(patch));
memcpy(DSi::ARM9iBIOS, patch, sizeof(patch)); memcpy(DSi::ARM9iBIOS, patch, sizeof(patch));
@ -316,20 +325,6 @@ static void SanitizeNANDSettings(DSi_NAND::DSiFirmwareSystemSettings& settings,
memset(settings.ParentalControlsSecretAnswer, 0, sizeof(settings.ParentalControlsSecretAnswer)); memset(settings.ParentalControlsSecretAnswer, 0, sizeof(settings.ParentalControlsSecretAnswer));
} }
static SPI_Firmware::Language GetDefaultDSiLanguage(DSi_NAND::ConsoleRegion region)
{
switch (region)
{
case DSi_NAND::ConsoleRegion::Japan: return SPI_Firmware::Language::Japanese;
case DSi_NAND::ConsoleRegion::USA: return SPI_Firmware::Language::English;
case DSi_NAND::ConsoleRegion::Europe: return SPI_Firmware::Language::English;
case DSi_NAND::ConsoleRegion::Australia: return SPI_Firmware::Language::English;
case DSi_NAND::ConsoleRegion::China: return SPI_Firmware::Language::Chinese;
case DSi_NAND::ConsoleRegion::Korea: return SPI_Firmware::Language::Reserved; // actually Korean
default: return SPI_Firmware::Language::English; // ???
}
}
const char* InitNAND(FirmwareSettings& fwSettings, bool clearNand, bool dsiWare) const char* InitNAND(FirmwareSettings& fwSettings, bool clearNand, bool dsiWare)
{ {
auto nand = DSi_NAND::NANDImage(Platform::OpenFile("nand.bin", Platform::FileMode::ReadWrite), &DSi::ARM7iBIOS[0x8308]); auto nand = DSi_NAND::NANDImage(Platform::OpenFile("nand.bin", Platform::FileMode::ReadWrite), &DSi::ARM7iBIOS[0x8308]);
@ -372,7 +367,8 @@ const char* InitNAND(FirmwareSettings& fwSettings, bool clearNand, bool dsiWare)
if (!((1 << static_cast<u8>(settings.Language)) & serialData.SupportedLanguages)) if (!((1 << static_cast<u8>(settings.Language)) & serialData.SupportedLanguages))
{ {
settings.Language = GetDefaultDSiLanguage(serialData.Region); // English is valid among all NANDs
settings.Language = SPI_Firmware::Language::English;
} }
} }