diff options
author | Arisotura <thetotalworm@gmail.com> | 2021-11-20 13:22:20 +0100 |
---|---|---|
committer | Arisotura <thetotalworm@gmail.com> | 2021-11-20 13:22:20 +0100 |
commit | 73d7bada873994ed9a1d89b27f647cfe549ca544 (patch) | |
tree | 701d4e3d2c291c3a4eb095236ccc7d3d2fc8b79b | |
parent | 8100b6da6b93c745823226540c495fb091e57d2f (diff) |
add valid wifi data to the default firmware
-rw-r--r-- | src/SPI.cpp | 123 |
1 files changed, 120 insertions, 3 deletions
diff --git a/src/SPI.cpp b/src/SPI.cpp index 698fe2e..80ef336 100644 --- a/src/SPI.cpp +++ b/src/SPI.cpp @@ -122,14 +122,131 @@ void LoadDefaultFirmware() memset(Firmware, 0xFF, FirmwareLength); FirmwareMask = FirmwareLength - 1; + memset(Firmware, 0, 0x1D); + + if (NDS::ConsoleType == 1) + { + Firmware[0x1D] = 0x57; // DSi + Firmware[0x2F] = 0x18; + Firmware[0x1FD] = 0x02; + Firmware[0x1FE] = 0x20; + } + else + { + Firmware[0x1D] = 0x20; // DS Lite (TODO: make configurable?) + Firmware[0x2F] = 0x06; + } + + // wifi calibration + + const u8 defaultmac[6] = {0x00, 0x09, 0xBF, 0x11, 0x22, 0x33}; + const u8 bbinit[0x69] = + { + 0x03, 0x17, 0x40, 0x00, 0x1B, 0x6C, 0x48, 0x80, 0x38, 0x00, 0x35, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0xBB, 0x01, 0x24, 0x7F, + 0x5A, 0x01, 0x3F, 0x01, 0x3F, 0x36, 0x1D, 0x00, 0x78, 0x35, 0x55, 0x12, 0x34, 0x1C, 0x00, 0x01, + 0x0E, 0x38, 0x03, 0x70, 0xC5, 0x2A, 0x0A, 0x08, 0x04, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, + 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xF8, 0xF8, 0xF6, 0x00, 0x12, 0x14, + 0x12, 0x41, 0x23, 0x03, 0x04, 0x70, 0x35, 0x0E, 0x2C, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x12, 0x28, 0x1C + }; + const u8 rfinit[0x29] = + { + 0x31, 0x4C, 0x4F, 0x21, 0x00, 0x10, 0xB0, 0x08, 0xFA, 0x15, 0x26, 0xE6, 0xC1, 0x01, 0x0E, 0x50, + 0x05, 0x00, 0x6D, 0x12, 0x00, 0x00, 0x01, 0xFF, 0x0E, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x06, 0x00, 0x00, 0x00, 0x18, 0x00, 0x02, 0x00, 0x00 + }; + const u8 chandata[0x3C] = + { + 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x16, + 0x26, 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, 0x1D, 0x1E, 0x1E, 0x1E, 0x1E, 0x1F, 0x1E, 0x1F, 0x18, + 0x01, 0x4B, 0x4B, 0x4B, 0x4B, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4D, 0x4D, 0x4D, + 0x02, 0x6C, 0x71, 0x76, 0x5B, 0x40, 0x45, 0x4A, 0x2F, 0x34, 0x39, 0x3E, 0x03, 0x08, 0x14 + }; + + *(u16*)&Firmware[0x2C] = 0x138; + Firmware[0x2E] = 0; + *(u32*)&Firmware[0x30] = 0xFFFFFFFF; + *(u16*)&Firmware[0x34] = 0x00FF; + memcpy(&Firmware[0x36], defaultmac, 6); + *(u16*)&Firmware[0x3C] = 0x3FFE; + *(u16*)&Firmware[0x3E] = 0xFFFF; + Firmware[0x40] = 0x03; + Firmware[0x41] = 0x94; + Firmware[0x42] = 0x29; + Firmware[0x43] = 0x02; + *(u16*)&Firmware[0x44] = 0x0002; + *(u16*)&Firmware[0x46] = 0x0017; + *(u16*)&Firmware[0x48] = 0x0026; + *(u16*)&Firmware[0x4A] = 0x1818; + *(u16*)&Firmware[0x4C] = 0x0048; + *(u16*)&Firmware[0x4E] = 0x4840; + *(u16*)&Firmware[0x50] = 0x0058; + *(u16*)&Firmware[0x52] = 0x0042; + *(u16*)&Firmware[0x54] = 0x0146; + *(u16*)&Firmware[0x56] = 0x8064; + *(u16*)&Firmware[0x58] = 0xE6E6; + *(u16*)&Firmware[0x5A] = 0x2443; + *(u16*)&Firmware[0x5C] = 0x000E; + *(u16*)&Firmware[0x5E] = 0x0001; + *(u16*)&Firmware[0x60] = 0x0001; + *(u16*)&Firmware[0x62] = 0x0402; + memcpy(&Firmware[0x64], bbinit, 0x69); + Firmware[0xCD] = 0; + memcpy(&Firmware[0xCE], rfinit, 0x29); + Firmware[0xF7] = 0x02; + memcpy(&Firmware[0xF8], chandata, 0x3C); + + *(u16*)&Firmware[0x2A] = CRC16(&Firmware[0x2C], *(u16*)&Firmware[0x2C], 0x0000); + + // user data + u32 userdata = 0x7FE00 & FirmwareMask; + *(u16*)&Firmware[0x20] = userdata >> 3; memset(Firmware + userdata, 0, 0x74); + Firmware[userdata+0x00] = 5; // version + Firmware[userdata+0x03] = 1; + Firmware[userdata+0x04] = 1; + *(u16*)&Firmware[userdata+0x64] = 0x0031; - // user settings offset - *(u16*)&Firmware[0x20] = (FirmwareLength - 0x200) >> 3; + *(u16*)&Firmware[userdata+0x72] = CRC16(&Firmware[userdata], 0x70, 0xFFFF); - Firmware[userdata+0x00] = 5; // version + // wifi access points + // TODO: WFC ID?? + + u32 apdata = userdata - 0x400; + memset(&Firmware[apdata], 0, 0x300); + + strcpy((char*)&Firmware[apdata+0x40], "melonAP"); + if (NDS::ConsoleType == 1) *(u16*)&Firmware[apdata+0xEA] = 1400; + Firmware[apdata+0xEF] = 0x01; + *(u16*)&Firmware[apdata+0xFE] = CRC16(&Firmware[apdata], 0xFE, 0x0000); + + apdata += 0x100; + Firmware[apdata+0xE7] = 0xFF; + Firmware[apdata+0xEF] = 0x01; + *(u16*)&Firmware[apdata+0xFE] = CRC16(&Firmware[apdata], 0xFE, 0x0000); + + apdata += 0x100; + Firmware[apdata+0xE7] = 0xFF; + Firmware[apdata+0xEF] = 0x01; + *(u16*)&Firmware[apdata+0xFE] = CRC16(&Firmware[apdata], 0xFE, 0x0000); + + if (NDS::ConsoleType == 1) + { + apdata = userdata - 0xA00; + Firmware[apdata+0xE7] = 0xFF; + *(u16*)&Firmware[apdata+0xFE] = CRC16(&Firmware[apdata], 0xFE, 0x0000); + + apdata += 0x200; + Firmware[apdata+0xE7] = 0xFF; + *(u16*)&Firmware[apdata+0xFE] = CRC16(&Firmware[apdata], 0xFE, 0x0000); + + apdata += 0x200; + Firmware[apdata+0xE7] = 0xFF; + *(u16*)&Firmware[apdata+0xFE] = CRC16(&Firmware[apdata], 0xFE, 0x0000); + } } void LoadFirmwareFromFile(FILE* f) |