NWifi: correctly determine ROM/chip/etc IDs based on hardware version (as specified in firmware).
fixes #700
This commit is contained in:
parent
e1add6f3d7
commit
c9447935ff
|
@ -165,6 +165,36 @@ void DSi_NWifi::Reset()
|
||||||
printf("NWifi MAC: %02X:%02X:%02X:%02X:%02X:%02X\n",
|
printf("NWifi MAC: %02X:%02X:%02X:%02X:%02X:%02X\n",
|
||||||
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
||||||
|
|
||||||
|
u8 type = SPI_Firmware::GetNWifiVersion();
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case 1: // AR6002
|
||||||
|
ROMID = 0x20000188;
|
||||||
|
ChipID = 0x02000001;
|
||||||
|
HostIntAddr = 0x00500400;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: // AR6013
|
||||||
|
ROMID = 0x23000024;
|
||||||
|
ChipID = 0x0D000000;
|
||||||
|
HostIntAddr = 0x00520000;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3: // AR6014 (3DS)
|
||||||
|
ROMID = 0x2300006F;
|
||||||
|
ChipID = 0x0D000001;
|
||||||
|
HostIntAddr = 0x00520000;
|
||||||
|
printf("NWifi: hardware is 3DS type, unchecked\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
printf("NWifi: unknown hardware type %02X, assuming AR6002\n");
|
||||||
|
ROMID = 0x20000188;
|
||||||
|
ChipID = 0x02000001;
|
||||||
|
HostIntAddr = 0x00500400;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
memset(EEPROM, 0, 0x400);
|
memset(EEPROM, 0, 0x400);
|
||||||
|
|
||||||
*(u32*)&EEPROM[0x000] = 0x300;
|
*(u32*)&EEPROM[0x000] = 0x300;
|
||||||
|
@ -755,8 +785,7 @@ void DSi_NWifi::BMI_Command()
|
||||||
case 0x08: // BMI_GET_TARGET_ID
|
case 0x08: // BMI_GET_TARGET_ID
|
||||||
MB_Write32(4, 0xFFFFFFFF);
|
MB_Write32(4, 0xFFFFFFFF);
|
||||||
MB_Write32(4, 0x0000000C);
|
MB_Write32(4, 0x0000000C);
|
||||||
//MB_Write32(4, 0x20000118);
|
MB_Write32(4, ROMID);
|
||||||
MB_Write32(4, 0x23000024); // ROM version (TODO: how to determine correct one?)
|
|
||||||
MB_Write32(4, 0x00000002);
|
MB_Write32(4, 0x00000002);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1436,7 +1465,7 @@ u32 DSi_NWifi::WindowRead(u32 addr)
|
||||||
{
|
{
|
||||||
printf("NWifi: window read %08X\n", addr);
|
printf("NWifi: window read %08X\n", addr);
|
||||||
|
|
||||||
if ((addr & 0xFFFF00) == 0x520000)
|
if ((addr & 0xFFFF00) == HostIntAddr)
|
||||||
{
|
{
|
||||||
// RAM host interest area
|
// RAM host interest area
|
||||||
// TODO: different base based on hardware version
|
// TODO: different base based on hardware version
|
||||||
|
@ -1462,9 +1491,7 @@ u32 DSi_NWifi::WindowRead(u32 addr)
|
||||||
switch (addr)
|
switch (addr)
|
||||||
{
|
{
|
||||||
case 0x40EC: // chip ID
|
case 0x40EC: // chip ID
|
||||||
// 0D000000 / 0D000001 == AR6013
|
return ChipID;
|
||||||
// TODO: check firmware.bin to determine the correct value
|
|
||||||
return 0x0D000001;
|
|
||||||
|
|
||||||
// SOC_RESET_CAUSE
|
// SOC_RESET_CAUSE
|
||||||
case 0x40C0: return 2;
|
case 0x40C0: return 2;
|
||||||
|
|
|
@ -127,6 +127,10 @@ private:
|
||||||
|
|
||||||
u32 WindowData, WindowReadAddr, WindowWriteAddr;
|
u32 WindowData, WindowReadAddr, WindowWriteAddr;
|
||||||
|
|
||||||
|
u32 ROMID;
|
||||||
|
u32 ChipID;
|
||||||
|
u32 HostIntAddr;
|
||||||
|
|
||||||
u8 EEPROM[0x400];
|
u8 EEPROM[0x400];
|
||||||
u32 EEPROMReady;
|
u32 EEPROMReady;
|
||||||
|
|
||||||
|
|
|
@ -241,6 +241,7 @@ void SetupDirectBoot()
|
||||||
|
|
||||||
u8 GetConsoleType() { return Firmware[0x1D]; }
|
u8 GetConsoleType() { return Firmware[0x1D]; }
|
||||||
u8 GetWifiVersion() { return Firmware[0x2F]; }
|
u8 GetWifiVersion() { return Firmware[0x2F]; }
|
||||||
|
u8 GetNWifiVersion() { return Firmware[0x1FD]; } // for DSi; will return 0xFF on a DS
|
||||||
u8 GetRFVersion() { return Firmware[0x40]; }
|
u8 GetRFVersion() { return Firmware[0x40]; }
|
||||||
u8* GetWifiMAC() { return &Firmware[0x36]; }
|
u8* GetWifiMAC() { return &Firmware[0x36]; }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue