aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArisotura <thetotalworm@gmail.com>2021-11-20 13:22:20 +0100
committerArisotura <thetotalworm@gmail.com>2021-11-20 13:22:20 +0100
commit73d7bada873994ed9a1d89b27f647cfe549ca544 (patch)
tree701d4e3d2c291c3a4eb095236ccc7d3d2fc8b79b
parent8100b6da6b93c745823226540c495fb091e57d2f (diff)
add valid wifi data to the default firmware
-rw-r--r--src/SPI.cpp123
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)