mirror of
https://github.com/sanni/cartreader.git
synced 2024-12-24 12:01:53 +01:00
Verify MPK file after reading
This commit is contained in:
parent
07a38f30c2
commit
b7cbe8e8d9
@ -4,7 +4,7 @@
|
|||||||
This project represents a community-driven effort to provide
|
This project represents a community-driven effort to provide
|
||||||
an easy to build and easy to modify cartridge dumper.
|
an easy to build and easy to modify cartridge dumper.
|
||||||
|
|
||||||
Date: 09.09.2022
|
Date: 10.09.2022
|
||||||
Version: 9.7
|
Version: 9.7
|
||||||
|
|
||||||
SD lib: https://github.com/greiman/SdFat
|
SD lib: https://github.com/greiman/SdFat
|
||||||
|
@ -196,7 +196,8 @@ void n64ControllerMenu() {
|
|||||||
display_Clear();
|
display_Clear();
|
||||||
display_Update();
|
display_Update();
|
||||||
readMPK();
|
readMPK();
|
||||||
checksumMPK();
|
verifyCRC();
|
||||||
|
validateMPK();
|
||||||
println_Msg(F(""));
|
println_Msg(F(""));
|
||||||
println_Msg(F("Press Button..."));
|
println_Msg(F("Press Button..."));
|
||||||
display_Update();
|
display_Update();
|
||||||
@ -2004,7 +2005,7 @@ void checkController() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// read 32bytes from controller pak and calculate CRC
|
// read 32bytes from controller pak and calculate CRC
|
||||||
void readBlock(word myAddress) {
|
byte readBlock(word myAddress) {
|
||||||
// Calculate the address CRC
|
// Calculate the address CRC
|
||||||
word myAddressCRC = addrCRC(myAddress);
|
word myAddressCRC = addrCRC(myAddress);
|
||||||
|
|
||||||
@ -2076,8 +2077,14 @@ void readBlock(word myAddress) {
|
|||||||
// Compare
|
// Compare
|
||||||
if (blockCRC != myCRC) {
|
if (blockCRC != myCRC) {
|
||||||
display_Clear();
|
display_Clear();
|
||||||
print_Error(F("CRC ERROR"), true);
|
// Close the file:
|
||||||
|
myFile.close();
|
||||||
|
println_Msg(F("Controller Pak was"));
|
||||||
|
println_Msg(F("not dumped due to a"));
|
||||||
|
print_Error(F("protocol CRC error"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return blockCRC;
|
||||||
}
|
}
|
||||||
|
|
||||||
// reads the MPK file to the sd card
|
// reads the MPK file to the sd card
|
||||||
@ -2098,7 +2105,15 @@ void readMPK() {
|
|||||||
foldern = foldern + 1;
|
foldern = foldern + 1;
|
||||||
EEPROM_writeAnything(0, foldern);
|
EEPROM_writeAnything(0, foldern);
|
||||||
|
|
||||||
//open file on sd card
|
//open crc file on sd card
|
||||||
|
sprintf(filePath, "%d", foldern - 1);
|
||||||
|
strcat(filePath, ".crc");
|
||||||
|
FsFile crcFile;
|
||||||
|
if (!crcFile.open(filePath, O_RDWR | O_CREAT)) {
|
||||||
|
print_Error(F("Can't open file on SD"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//open mpk file on sd card
|
||||||
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
|
||||||
print_Error(F("Can't open file on SD"), true);
|
print_Error(F("Can't open file on SD"), true);
|
||||||
}
|
}
|
||||||
@ -2123,8 +2138,8 @@ void readMPK() {
|
|||||||
for (word currSdBuffer = 0x0000; currSdBuffer < 0x8000; currSdBuffer += 512) {
|
for (word currSdBuffer = 0x0000; currSdBuffer < 0x8000; currSdBuffer += 512) {
|
||||||
// Read 32 byte block
|
// Read 32 byte block
|
||||||
for (word currBlock = 0; currBlock < 512; currBlock += 32) {
|
for (word currBlock = 0; currBlock < 512; currBlock += 32) {
|
||||||
// Read one block of the Controller Pak into array myBlock
|
// Read one block of the Controller Pak into array myBlock and write CRC of that block to crc file
|
||||||
readBlock(currSdBuffer + currBlock);
|
crcFile.write(readBlock(currSdBuffer + currBlock));
|
||||||
|
|
||||||
// Copy block to SdBuffer
|
// Copy block to SdBuffer
|
||||||
for (byte currByte = 0; currByte < 32; currByte++) {
|
for (byte currByte = 0; currByte < 32; currByte++) {
|
||||||
@ -2146,6 +2161,64 @@ void readMPK() {
|
|||||||
}
|
}
|
||||||
// Close the file:
|
// Close the file:
|
||||||
myFile.close();
|
myFile.close();
|
||||||
|
crcFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// verifies if read was successful
|
||||||
|
void verifyCRC() {
|
||||||
|
writeErrors = 0;
|
||||||
|
|
||||||
|
println_Msg(F("Verifying..."));
|
||||||
|
display_Update();
|
||||||
|
|
||||||
|
//open CRC file on sd card
|
||||||
|
FsFile crcFile;
|
||||||
|
if (!crcFile.open(filePath, O_READ)) {
|
||||||
|
print_Error(F("Can't open file on SD"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//open MPK file on sd card
|
||||||
|
if (!myFile.open(fileName, O_READ)) {
|
||||||
|
print_Error(F("Can't open file on SD"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Initialize progress bar
|
||||||
|
uint32_t processedProgressBar = 0;
|
||||||
|
uint32_t totalProgressBar = (uint32_t)(0x7FFF);
|
||||||
|
draw_progressbar(0, totalProgressBar);
|
||||||
|
|
||||||
|
// Controller paks, which all have 32kB of space, are mapped between 0x0000 – 0x7FFF
|
||||||
|
for (word currSdBuffer = 0x0000; currSdBuffer < 0x8000; currSdBuffer += 512) {
|
||||||
|
// Read 32 bytes into SD buffer
|
||||||
|
myFile.read(sdBuffer, 512);
|
||||||
|
|
||||||
|
// Compare 32 byte block CRC to CRC from file
|
||||||
|
for (word currBlock = 0; currBlock < 512; currBlock += 32) {
|
||||||
|
// Calculate CRC of block and compare against crc file
|
||||||
|
if (dataCRC(&sdBuffer[currBlock]) != crcFile.read())
|
||||||
|
writeErrors++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Blink led
|
||||||
|
blinkLED();
|
||||||
|
// Update progress bar
|
||||||
|
processedProgressBar += 512;
|
||||||
|
draw_progressbar(processedProgressBar, totalProgressBar);
|
||||||
|
}
|
||||||
|
// Close the file:
|
||||||
|
myFile.close();
|
||||||
|
crcFile.close();
|
||||||
|
|
||||||
|
if (writeErrors == 0) {
|
||||||
|
println_Msg(F("Read successfully"));
|
||||||
|
display_Update();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
print_Msg(F("Error: "));
|
||||||
|
print_Msg(writeErrors);
|
||||||
|
println_Msg(F(" blocks "));
|
||||||
|
print_Error(F("did not verify."), false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculates the checksum of the header
|
// Calculates the checksum of the header
|
||||||
@ -2167,11 +2240,7 @@ boolean checkHeader(byte startAddress) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// verifies if Controller Pak holds valid header data
|
// verifies if Controller Pak holds valid header data
|
||||||
void checksumMPK() {
|
void validateMPK() {
|
||||||
println_Msg(F(""));
|
|
||||||
print_Msg(F("Header..."));
|
|
||||||
display_Update();
|
|
||||||
|
|
||||||
//open file on sd card
|
//open file on sd card
|
||||||
if (!myFile.open(fileName, O_READ)) {
|
if (!myFile.open(fileName, O_READ)) {
|
||||||
print_Error(F("Can't open file"), true);
|
print_Error(F("Can't open file"), true);
|
||||||
@ -2180,17 +2249,24 @@ void checksumMPK() {
|
|||||||
// Read first 256 byte which contains the header including checksum and reverse checksum and three copies of it
|
// Read first 256 byte which contains the header including checksum and reverse checksum and three copies of it
|
||||||
myFile.read(sdBuffer, 256);
|
myFile.read(sdBuffer, 256);
|
||||||
|
|
||||||
// At least one header copy needs to be ok
|
//Check all four header copies
|
||||||
if ((checkHeader(0x20)) || (checkHeader(0x60)) || (checkHeader(0x80)) || (checkHeader(0xC0)))
|
writeErrors = 0;
|
||||||
println_Msg(F("OK"));
|
if (!checkHeader(0x20))
|
||||||
else
|
writeErrors++;
|
||||||
println_Msg(F("Error"));
|
if (!checkHeader(0x60))
|
||||||
|
writeErrors++;
|
||||||
|
if (!checkHeader(0x80))
|
||||||
|
writeErrors++;
|
||||||
|
if (!checkHeader(0xC0))
|
||||||
|
writeErrors++;
|
||||||
|
|
||||||
|
print_Msg(F("Header: "));
|
||||||
|
print_Msg(4 - writeErrors);
|
||||||
|
print_Msg(F("/4 - "));
|
||||||
display_Update();
|
display_Update();
|
||||||
|
|
||||||
// Check both TOC copies
|
// Check both TOC copies
|
||||||
writeErrors = 0;
|
writeErrors = 0;
|
||||||
print_Msg(F("TOC..."));
|
|
||||||
display_Update();
|
|
||||||
word sum = 0;
|
word sum = 0;
|
||||||
|
|
||||||
// Read 2nd and 3rd 256 byte page with TOC info
|
// Read 2nd and 3rd 256 byte page with TOC info
|
||||||
@ -2204,15 +2280,12 @@ void checksumMPK() {
|
|||||||
for (int i = 5; i < 128; i++ ) {
|
for (int i = 5; i < 128; i++ ) {
|
||||||
sum += sdBuffer[(i << 1) + 1];
|
sum += sdBuffer[(i << 1) + 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sdBuffer[1] != (sum & 0xFF))
|
if (sdBuffer[1] != (sum & 0xFF))
|
||||||
writeErrors++;
|
writeErrors++;
|
||||||
}
|
}
|
||||||
// Both TOCs damaged
|
print_Msg(F("ToC: "));
|
||||||
if (writeErrors > 1)
|
print_Msg(2 - writeErrors);
|
||||||
println_Msg("Error");
|
println_Msg(F("/2"));
|
||||||
else
|
|
||||||
println_Msg("OK");
|
|
||||||
display_Update();
|
display_Update();
|
||||||
|
|
||||||
// Close the file:
|
// Close the file:
|
||||||
|
Loading…
Reference in New Issue
Block a user