aboutsummaryrefslogtreecommitdiff
path: root/src/SPI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/SPI.cpp')
-rw-r--r--src/SPI.cpp53
1 files changed, 35 insertions, 18 deletions
diff --git a/src/SPI.cpp b/src/SPI.cpp
index 6ecb86c..e990b3a 100644
--- a/src/SPI.cpp
+++ b/src/SPI.cpp
@@ -215,7 +215,8 @@ void LoadDefaultFirmware()
// wifi access points
// TODO: WFC ID??
- FILE* f = Platform::OpenLocalFile("wfcsettings.bin", "rb");
+ FILE* f = Platform::OpenLocalFile("wfcsettings.bin"+Platform::InstanceFileSuffix(), "rb");
+ if (!f) f = Platform::OpenLocalFile("wfcsettings.bin", "rb");
if (f)
{
u32 apdata = userdata - 0xA00;
@@ -259,7 +260,7 @@ void LoadDefaultFirmware()
}
}
-void LoadFirmwareFromFile(FILE* f)
+void LoadFirmwareFromFile(FILE* f, bool makecopy)
{
fseek(f, 0, SEEK_END);
@@ -271,7 +272,9 @@ void LoadFirmwareFromFile(FILE* f)
fread(Firmware, 1, FirmwareLength, f);
// take a backup
- std::string fwBackupPath = FirmwarePath + ".bak";
+ std::string fwBackupPath;
+ if (!makecopy) fwBackupPath = FirmwarePath + ".bak";
+ else fwBackupPath = FirmwarePath;
FILE* bf = Platform::OpenLocalFile(fwBackupPath, "rb");
if (!bf)
{
@@ -333,15 +336,24 @@ void Reset()
else
FirmwarePath = Platform::GetConfigString(Platform::FirmwarePath);
+ bool makecopy = false;
+ std::string origpath = FirmwarePath;
+ FirmwarePath += Platform::InstanceFileSuffix();
+
FILE* f = Platform::OpenLocalFile(FirmwarePath, "rb");
if (!f)
{
+ f = Platform::OpenLocalFile(origpath, "rb");
+ makecopy = true;
+ }
+ if (!f)
+ {
printf("Firmware not found! Generating default firmware.\n");
FirmwarePath = "";
}
else
{
- LoadFirmwareFromFile(f);
+ LoadFirmwareFromFile(f, makecopy);
fclose(f);
}
}
@@ -385,28 +397,28 @@ void Reset()
*(u16*)&Firmware[userdata+0x72] = CRC16(&Firmware[userdata], 0x70, 0xFFFF);
- if (firmoverride)
+ //if (firmoverride)
{
u8 mac[6];
- bool rep;
+ bool rep = false;
+
+ memcpy(mac, &Firmware[0x36], 6);
- if (Platform::GetConfigBool(Platform::Firm_RandomizeMAC))
+ if (firmoverride)
+ rep = Platform::GetConfigArray(Platform::Firm_MAC, mac);
+
+ int inst = Platform::InstanceID();
+ if (inst > 0)
{
- mac[0] = 0x00;
- mac[1] = 0x09;
- mac[2] = 0xBF;
- mac[3] = rand()&0xFF;
- mac[4] = rand()&0xFF;
- mac[5] = rand()&0xFF;
rep = true;
- }
- else
- {
- rep = Platform::GetConfigArray(Platform::Firm_MAC, mac);
+ mac[3] += inst;
+ mac[4] += inst*0x44;
+ mac[5] += inst*0x10;
}
if (rep)
{
+ mac[0] &= 0xFC; // ensure the MAC isn't a broadcast MAC
memcpy(&Firmware[0x36], mac, 6);
*(u16*)&Firmware[0x2A] = CRC16(&Firmware[0x2C], *(u16*)&Firmware[0x2C], 0x0000);
@@ -593,7 +605,12 @@ void Write(u8 val, u32 hold)
}
else
{
- FILE* f = Platform::OpenLocalFile("wfcsettings.bin", "wb");
+ char wfcfile[50] = {0};
+ int inst = Platform::InstanceID();
+ if (inst > 0) snprintf(wfcfile, 49, "wfcsettings.bin", Platform::InstanceID());
+ else strncpy(wfcfile, "wfcsettings.bin", 49);
+
+ FILE* f = Platform::OpenLocalFile(wfcfile, "wb");
if (f)
{
u32 cutoff = 0x7F400 & FirmwareMask;