public void ReadFirmware() { if (IVFERHandshake()) { firmware_image = new SCP_FLASH_IMAGE(ProbeMemLayout()); switch (firmware_image.FlashSize) { case RomSize._216k: firmware_image.Write(0x02000, BlockRead(0x002000, 0x00FFFF)); firmware_image.Write(0x12000, BlockRead(0x012000, 0x01DFFF)); firmware_image.Write(0x82000, BlockRead(0x082000, 0x08FFFF)); firmware_image.Write(0x92000, BlockRead(0x092000, 0x09FFFF)); break; case RomSize._112k: firmware_image.Write(0x12000, BlockRead(0x012000, 0x01FFFF)); firmware_image.Write(0x82000, BlockRead(0x082000, 0x08FFFF)); break; case RomSize._88k: firmware_image.Write(0x12000, BlockRead(0x012000, 0x019FFF)); firmware_image.Write(0x82000, BlockRead(0x082000, 0x08FFFF)); break; default: break; } if (!Checksum()) { throw new Exception("Checksum of firmware read failed!"); } //System.IO.File.WriteAllBytes("read.bin", firmware_image.ToSCTBIN()); } }
public void WriteFirmware(bool TransferVIN = true) { firmware_image = new SCP_FLASH_IMAGE(RomSize._216k); firmware_image.SCTBINImage = System.IO.File.ReadAllBytes("read.bin"); if (IVFERHandshake()) { if (ProbeMemLayout() != firmware_image.FlashSize) { throw new Exception("Loaded firmware image does not match target hardware!"); } SCP_VIN_Parser PCM_VIN = new SCP_VIN_Parser(ReadVINBlock()); //Write Vin to disk if (TransferVIN) { firmware_image.VIN.PATS_Key = PCM_VIN.PATS_Key; firmware_image.VIN.VIN = PCM_VIN.VIN; } EraseFlash(); switch (firmware_image.FlashSize) { case RomSize._88k: ProgramBank(0x12000, firmware_image.GetBank(1)); ProgramBank(0x82000, firmware_image.GetBank(8)); break; case RomSize._112k: ProgramBank(0x12000, firmware_image.GetBank(1)); ProgramBank(0x82000, firmware_image.GetBank(8)); break; case RomSize._216k: ProgramBank(0x02000, firmware_image.GetBank(0)); ProgramBank(0x12000, firmware_image.GetBank(1)); ProgramBank(0x92000, firmware_image.GetBank(9)); ProgramBank(0x82000, firmware_image.GetBank(8)); break; } if (!Checksum()) { throw new Exception("Checksum of firmware write failed!"); } } }