mirror of
https://github.com/sanni/cartreader.git
synced 2024-11-10 23:15:08 +01:00
Rebase code to 12.3
Reformat code
This commit is contained in:
parent
79f2a2b16a
commit
7356b5db19
@ -147,7 +147,7 @@ char ver[5] = "12.3";
|
|||||||
//#define enable_WS
|
//#define enable_WS
|
||||||
|
|
||||||
// Super A'can
|
// Super A'can
|
||||||
// #define enable_SUPRACAN
|
//#define enable_SUPRACAN
|
||||||
|
|
||||||
//******************************************
|
//******************************************
|
||||||
// HW CONFIGS
|
// HW CONFIGS
|
||||||
@ -411,8 +411,7 @@ void print_STR(byte string_number, boolean newline) {
|
|||||||
#define mode_ODY2 29
|
#define mode_ODY2 29
|
||||||
#define mode_ARC 30
|
#define mode_ARC 30
|
||||||
#define mode_FAIRCHILD 31
|
#define mode_FAIRCHILD 31
|
||||||
|
#define mode_SUPRACAN 32
|
||||||
#define mode_SUPRACAN 99
|
|
||||||
|
|
||||||
// optimization-safe nop delay
|
// optimization-safe nop delay
|
||||||
#define NOP __asm__ __volatile__("nop\n\t")
|
#define NOP __asm__ __volatile__("nop\n\t")
|
||||||
@ -1007,9 +1006,9 @@ static const char modeItem16[] PROGMEM = "Magnavox Odyssey 2";
|
|||||||
static const char modeItem17[] PROGMEM = "Arcadia 2001";
|
static const char modeItem17[] PROGMEM = "Arcadia 2001";
|
||||||
static const char modeItem18[] PROGMEM = "Fairchild Channel F";
|
static const char modeItem18[] PROGMEM = "Fairchild Channel F";
|
||||||
static const char modeItem19[] PROGMEM = "Flashrom Programmer";
|
static const char modeItem19[] PROGMEM = "Flashrom Programmer";
|
||||||
static const char modeItem20[] PROGMEM = "About";
|
static const char modeItem20[] PROGMEM = "Super A'can";
|
||||||
static const char modeItem99[] PROGMEM = "Super A'can";
|
static const char modeItem21[] PROGMEM = "About";
|
||||||
static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeItem3, modeItem4, modeItem5, modeItem6, modeItem7, modeItem8, modeItem9, modeItem10, modeItem11, modeItem12, modeItem13, modeItem14, modeItem15, modeItem16, modeItem17, modeItem18, modeItem19, modeItem20, modeItem99 };
|
static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeItem3, modeItem4, modeItem5, modeItem6, modeItem7, modeItem8, modeItem9, modeItem10, modeItem11, modeItem12, modeItem13, modeItem14, modeItem15, modeItem16, modeItem17, modeItem18, modeItem19, modeItem20, modeItem21 };
|
||||||
|
|
||||||
// All included slots
|
// All included slots
|
||||||
void mainMenu() {
|
void mainMenu() {
|
||||||
@ -1190,16 +1189,16 @@ void mainMenu() {
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case 19:
|
|
||||||
aboutScreen();
|
|
||||||
break;
|
|
||||||
|
|
||||||
#ifdef enable_SUPRACAN
|
#ifdef enable_SUPRACAN
|
||||||
case 20:
|
case 19:
|
||||||
setup_SuprAcan();
|
setup_SuprAcan();
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
case 20:
|
||||||
|
aboutScreen();
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
print_MissingModule(); // does not return
|
print_MissingModule(); // does not return
|
||||||
}
|
}
|
||||||
@ -1226,11 +1225,11 @@ static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeIte
|
|||||||
// Add-ons submenu
|
// Add-ons submenu
|
||||||
static const char addonsItem1[] PROGMEM = "70s Consoles";
|
static const char addonsItem1[] PROGMEM = "70s Consoles";
|
||||||
static const char addonsItem2[] PROGMEM = "80s Consoles";
|
static const char addonsItem2[] PROGMEM = "80s Consoles";
|
||||||
static const char addonsItem3[] PROGMEM = "Handhelds";
|
static const char addonsItem3[] PROGMEM = "90s Consoles";
|
||||||
static const char addonsItem4[] PROGMEM = "Flashrom Programmer";
|
static const char addonsItem4[] PROGMEM = "Handhelds";
|
||||||
static const char addonsItem5[] PROGMEM = "90s Consoles";
|
static const char addonsItem5[] PROGMEM = "Flashrom Programmer";
|
||||||
//static const char addonsItem5[] PROGMEM = "Reset"; (stored in common strings array)
|
//static const char addonsItem5[] PROGMEM = "Reset"; (stored in common strings array)
|
||||||
static const char* const addonsOptions[] PROGMEM = { addonsItem1, addonsItem2, addonsItem3, addonsItem4, string_reset2, addonsItem5 };
|
static const char* const addonsOptions[] PROGMEM = { addonsItem1, addonsItem2, addonsItem3, addonsItem4, addonsItem5, string_reset2 };
|
||||||
|
|
||||||
// 70s Consoles submenu
|
// 70s Consoles submenu
|
||||||
static const char consoles70Item1[] PROGMEM = "Atari 2600";
|
static const char consoles70Item1[] PROGMEM = "Atari 2600";
|
||||||
@ -1333,13 +1332,17 @@ void addonMenu() {
|
|||||||
consoles80Menu();
|
consoles80Menu();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Handhelds
|
|
||||||
case 2:
|
case 2:
|
||||||
|
consoles90Menu();
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Handhelds
|
||||||
|
case 3:
|
||||||
handheldMenu();
|
handheldMenu();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef enable_FLASH
|
#ifdef enable_FLASH
|
||||||
case 3:
|
case 4:
|
||||||
#ifdef enable_FLASH16
|
#ifdef enable_FLASH16
|
||||||
flashMenu();
|
flashMenu();
|
||||||
#else
|
#else
|
||||||
@ -1348,12 +1351,8 @@ void addonMenu() {
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case 4:
|
|
||||||
resetArduino();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
consoles90Menu();
|
resetArduino();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
//******************************************
|
//******************************************
|
||||||
// Super A'can MODULE
|
// Super A'can MODULE
|
||||||
|
// Only tested with HW3 and HW5
|
||||||
//******************************************
|
//******************************************
|
||||||
#ifdef enable_SUPRACAN
|
#ifdef enable_SUPRACAN
|
||||||
|
|
||||||
@ -11,12 +12,13 @@ static const char acanMenuItem2[] PROGMEM = "Read Save";
|
|||||||
static const char acanMenuItem3[] PROGMEM = "Write Save";
|
static const char acanMenuItem3[] PROGMEM = "Write Save";
|
||||||
static const char acanMenuItem4[] PROGMEM = "Read UM6650";
|
static const char acanMenuItem4[] PROGMEM = "Read UM6650";
|
||||||
static const char acanMenuItem5[] PROGMEM = "Write UM6650";
|
static const char acanMenuItem5[] PROGMEM = "Write UM6650";
|
||||||
static const char acanMenuItem6[] PROGMEM = "Flash...";
|
static const char acanMenuItem6[] PROGMEM = "Flash repro";
|
||||||
|
|
||||||
static const char* const menuOptionsAcan[] PROGMEM = {acanMenuItem1, acanMenuItem2, acanMenuItem3, acanMenuItem4, acanMenuItem5, string_reset2, acanMenuItem6};
|
static const char *const menuOptionsAcan[] PROGMEM = { acanMenuItem1, acanMenuItem2, acanMenuItem3, acanMenuItem4, acanMenuItem5, string_reset2, acanMenuItem6 };
|
||||||
|
|
||||||
|
void setup_SuprAcan() {
|
||||||
|
vselect(false);
|
||||||
|
|
||||||
void setup_SuprAcan()
|
|
||||||
{
|
|
||||||
// addr as output
|
// addr as output
|
||||||
DDRF = 0xff; // A0 - A7
|
DDRF = 0xff; // A0 - A7
|
||||||
DDRK = 0xff; // A8 - A15
|
DDRK = 0xff; // A8 - A15
|
||||||
@ -25,7 +27,7 @@ void setup_SuprAcan()
|
|||||||
// data as input
|
// data as input
|
||||||
DDRC = 0xff;
|
DDRC = 0xff;
|
||||||
DDRA = 0xff;
|
DDRA = 0xff;
|
||||||
PORTC = 0x00; // disable internal pull-up
|
PORTC = 0x00; // disable internal pull-up
|
||||||
PORTA = 0x00;
|
PORTA = 0x00;
|
||||||
DDRC = 0x00; // D0 - D7
|
DDRC = 0x00; // D0 - D7
|
||||||
DDRA = 0x00; // D8 - D15
|
DDRA = 0x00; // D8 - D15
|
||||||
@ -42,7 +44,7 @@ void setup_SuprAcan()
|
|||||||
PORTG |= (1 << 5);
|
PORTG |= (1 << 5);
|
||||||
DDRG |= (1 << 5);
|
DDRG |= (1 << 5);
|
||||||
PORTG |= (1 << 5);
|
PORTG |= (1 << 5);
|
||||||
|
|
||||||
dataOut_MD();
|
dataOut_MD();
|
||||||
writeWord_Acan(0xaaaa, 0xaaaa);
|
writeWord_Acan(0xaaaa, 0xaaaa);
|
||||||
writeWord_Acan(0x5555, 0x5555);
|
writeWord_Acan(0x5555, 0x5555);
|
||||||
@ -60,17 +62,16 @@ void setup_SuprAcan()
|
|||||||
PORTG &= ~(1 << 5);
|
PORTG &= ~(1 << 5);
|
||||||
DDRG &= ~(1 << 5);
|
DDRG &= ~(1 << 5);
|
||||||
|
|
||||||
*((uint32_t*)(eepbit + 4)) = getFlashChipSize_Acan(*((uint16_t*)eepbit));
|
*((uint32_t *)(eepbit + 4)) = getFlashChipSize_Acan(*((uint16_t *)eepbit));
|
||||||
|
|
||||||
display_Clear();
|
display_Clear();
|
||||||
initializeClockOffset();
|
initializeClockOffset();
|
||||||
|
|
||||||
// clockgen
|
// clockgen
|
||||||
if (i2c_found)
|
if (i2c_found) {
|
||||||
{
|
clockgen.set_freq(1073863500ULL, SI5351_CLK1); // cpu
|
||||||
clockgen.set_freq(1073863500ULL, SI5351_CLK1); // cpu
|
clockgen.set_freq(357954500ULL, SI5351_CLK2); // subcarrier
|
||||||
clockgen.set_freq(357954500ULL, SI5351_CLK2); // subcarrier
|
clockgen.set_freq(5369317500ULL, SI5351_CLK0); // master clock
|
||||||
clockgen.set_freq(5369317500ULL, SI5351_CLK0); // master clock
|
|
||||||
|
|
||||||
clockgen.output_enable(SI5351_CLK1, 1);
|
clockgen.output_enable(SI5351_CLK1, 1);
|
||||||
clockgen.output_enable(SI5351_CLK2, 1);
|
clockgen.output_enable(SI5351_CLK2, 1);
|
||||||
@ -81,82 +82,63 @@ void setup_SuprAcan()
|
|||||||
delay(500);
|
delay(500);
|
||||||
}
|
}
|
||||||
#ifdef clockgen_installed
|
#ifdef clockgen_installed
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
print_FatalError(F("Clock Generator not found"));
|
print_FatalError(F("Clock Generator not found"));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// /RST to 1
|
checkRomExist_Acan();
|
||||||
PORTH |= (1 << 0);
|
|
||||||
|
|
||||||
cartSize = checkRomSize_Acan();
|
|
||||||
romSize = cartSize >> 17;
|
|
||||||
mode = mode_SUPRACAN;
|
|
||||||
|
|
||||||
if (cartSize == 0)
|
|
||||||
print_Error(F("Unable to find rom signature..."));
|
|
||||||
else
|
|
||||||
{
|
|
||||||
print_Msg(F("ROM Size: "));
|
|
||||||
print_Msg(romSize);
|
|
||||||
println_Msg(F(" Mb"));
|
|
||||||
}
|
|
||||||
|
|
||||||
display_Update();
|
|
||||||
wait();
|
wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
void suprAcanMenu()
|
void suprAcanMenu() {
|
||||||
{
|
|
||||||
uint8_t mainMenu = 6;
|
uint8_t mainMenu = 6;
|
||||||
|
|
||||||
if (*((uint32_t*)(eepbit + 4)) > 0)
|
if (*((uint32_t *)(eepbit + 4)) > 0)
|
||||||
mainMenu = 7;
|
mainMenu = 7;
|
||||||
|
|
||||||
convertPgm(menuOptionsAcan, mainMenu);
|
convertPgm(menuOptionsAcan, mainMenu);
|
||||||
mainMenu = question_box(F("Super A'can Menu"), menuOptions, mainMenu, 0);
|
mainMenu = question_box(F("Super A'can Menu"), menuOptions, mainMenu, 0);
|
||||||
|
|
||||||
switch (mainMenu)
|
switch (mainMenu) {
|
||||||
{
|
|
||||||
case 0:
|
case 0:
|
||||||
{
|
{
|
||||||
readROM_Acan();
|
readROM_Acan();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1:
|
case 1:
|
||||||
{
|
{
|
||||||
readSRAM_Acan();
|
readSRAM_Acan();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 2:
|
case 2:
|
||||||
{
|
{
|
||||||
writeSRAM_Acan();
|
writeSRAM_Acan();
|
||||||
verifySRAM_Acan();
|
verifySRAM_Acan();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 3:
|
case 3:
|
||||||
{
|
{
|
||||||
readUM6650();
|
readUM6650();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 4:
|
case 4:
|
||||||
{
|
{
|
||||||
writeUM6650();
|
writeUM6650();
|
||||||
verifyUM6650();
|
verifyUM6650();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 6:
|
case 6:
|
||||||
{
|
{
|
||||||
flashCart_Acan();
|
flashCart_Acan();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
resetCart_Acan();
|
resetCart_Acan();
|
||||||
resetArduino();
|
resetArduino();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
println_Msg(F(""));
|
println_Msg(F(""));
|
||||||
@ -165,8 +147,7 @@ void suprAcanMenu()
|
|||||||
wait();
|
wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void readROM_Acan()
|
static void readROM_Acan() {
|
||||||
{
|
|
||||||
uint32_t crc32 = 0xffffffff;
|
uint32_t crc32 = 0xffffffff;
|
||||||
|
|
||||||
EEPROM_readAnything(0, foldern);
|
EEPROM_readAnything(0, foldern);
|
||||||
@ -190,11 +171,9 @@ static void readROM_Acan()
|
|||||||
draw_progressbar(0, cartSize);
|
draw_progressbar(0, cartSize);
|
||||||
|
|
||||||
dataIn_MD();
|
dataIn_MD();
|
||||||
for (uint32_t addr = 0; addr < cartSize; addr += 512, draw_progressbar(addr, cartSize))
|
for (uint32_t addr = 0; addr < cartSize; addr += 512, draw_progressbar(addr, cartSize)) {
|
||||||
{
|
for (uint32_t i = 0; i < 512; i += 2) {
|
||||||
for (uint32_t i = 0; i < 512; i += 2)
|
*((uint16_t *)(sdBuffer + i)) = readWord_Acan(addr + i);
|
||||||
{
|
|
||||||
*((uint16_t*)(sdBuffer + i)) = readWord_Acan(addr + i);
|
|
||||||
UPDATE_CRC(crc32, sdBuffer[i]);
|
UPDATE_CRC(crc32, sdBuffer[i]);
|
||||||
UPDATE_CRC(crc32, sdBuffer[i + 1]);
|
UPDATE_CRC(crc32, sdBuffer[i + 1]);
|
||||||
}
|
}
|
||||||
@ -214,8 +193,7 @@ static void readROM_Acan()
|
|||||||
print_STR(done_STR, 1);
|
print_STR(done_STR, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void readSRAM_Acan()
|
static void readSRAM_Acan() {
|
||||||
{
|
|
||||||
// create a new folder for storing rom file
|
// create a new folder for storing rom file
|
||||||
EEPROM_readAnything(0, foldern);
|
EEPROM_readAnything(0, foldern);
|
||||||
snprintf(folder, FILEPATH_LENGTH, "/ACAN/SAVE/%d", foldern);
|
snprintf(folder, FILEPATH_LENGTH, "/ACAN/SAVE/%d", foldern);
|
||||||
@ -236,8 +214,7 @@ static void readSRAM_Acan()
|
|||||||
EEPROM_writeAnything(0, foldern);
|
EEPROM_writeAnything(0, foldern);
|
||||||
|
|
||||||
dataIn_MD();
|
dataIn_MD();
|
||||||
for (uint32_t i = 0; i < 0x10000; i += 1024)
|
for (uint32_t i = 0; i < 0x10000; i += 1024) {
|
||||||
{
|
|
||||||
for (uint32_t j = 0; j < 1024; j += 2)
|
for (uint32_t j = 0; j < 1024; j += 2)
|
||||||
sdBuffer[(j >> 1)] = readWord_Acan(0xec0000 + i + j);
|
sdBuffer[(j >> 1)] = readWord_Acan(0xec0000 + i + j);
|
||||||
|
|
||||||
@ -248,8 +225,7 @@ static void readSRAM_Acan()
|
|||||||
print_STR(done_STR, 1);
|
print_STR(done_STR, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writeSRAM_Acan()
|
static void writeSRAM_Acan() {
|
||||||
{
|
|
||||||
filePath[0] = 0;
|
filePath[0] = 0;
|
||||||
sd.chdir();
|
sd.chdir();
|
||||||
fileBrowser(F("Select a file"));
|
fileBrowser(F("Select a file"));
|
||||||
@ -257,8 +233,7 @@ static void writeSRAM_Acan()
|
|||||||
|
|
||||||
display_Clear();
|
display_Clear();
|
||||||
|
|
||||||
if (!myFile.open(filePath, O_READ))
|
if (!myFile.open(filePath, O_READ)) {
|
||||||
{
|
|
||||||
print_Error(F("File doesn't exist"));
|
print_Error(F("File doesn't exist"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -269,8 +244,7 @@ static void writeSRAM_Acan()
|
|||||||
display_Update();
|
display_Update();
|
||||||
|
|
||||||
dataOut_MD();
|
dataOut_MD();
|
||||||
for (uint32_t i = 0; i < 0x10000 && myFile.available(); i += 1024)
|
for (uint32_t i = 0; i < 0x10000 && myFile.available(); i += 1024) {
|
||||||
{
|
|
||||||
myFile.read(sdBuffer, 512);
|
myFile.read(sdBuffer, 512);
|
||||||
|
|
||||||
for (uint32_t j = 0; j < 1024; j += 2)
|
for (uint32_t j = 0; j < 1024; j += 2)
|
||||||
@ -283,13 +257,11 @@ static void writeSRAM_Acan()
|
|||||||
print_STR(done_STR, 1);
|
print_STR(done_STR, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void verifySRAM_Acan()
|
static void verifySRAM_Acan() {
|
||||||
{
|
|
||||||
print_STR(verifying_STR, 0);
|
print_STR(verifying_STR, 0);
|
||||||
display_Update();
|
display_Update();
|
||||||
|
|
||||||
if (!myFile.open(filePath, O_READ))
|
if (!myFile.open(filePath, O_READ)) {
|
||||||
{
|
|
||||||
print_Error(F("File doesn't exist"));
|
print_Error(F("File doesn't exist"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -297,12 +269,10 @@ static void verifySRAM_Acan()
|
|||||||
uint16_t write_errors = 0;
|
uint16_t write_errors = 0;
|
||||||
|
|
||||||
dataIn_MD();
|
dataIn_MD();
|
||||||
for (uint32_t i = 0; i < 0x10000 && myFile.available(); i += 1024)
|
for (uint32_t i = 0; i < 0x10000 && myFile.available(); i += 1024) {
|
||||||
{
|
|
||||||
myFile.read(sdBuffer, 512);
|
myFile.read(sdBuffer, 512);
|
||||||
|
|
||||||
for (uint32_t j = 0; j < 1024; j += 2)
|
for (uint32_t j = 0; j < 1024; j += 2) {
|
||||||
{
|
|
||||||
if (readWord_Acan(0xec0000 + i + j) != sdBuffer[(j >> 1)])
|
if (readWord_Acan(0xec0000 + i + j) != sdBuffer[(j >> 1)])
|
||||||
write_errors++;
|
write_errors++;
|
||||||
}
|
}
|
||||||
@ -310,12 +280,9 @@ static void verifySRAM_Acan()
|
|||||||
|
|
||||||
myFile.close();
|
myFile.close();
|
||||||
|
|
||||||
if (write_errors == 0)
|
if (write_errors == 0) {
|
||||||
{
|
|
||||||
println_Msg(F("passed"));
|
println_Msg(F("passed"));
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
println_Msg(F("failed"));
|
println_Msg(F("failed"));
|
||||||
print_Msg(F("Error: "));
|
print_Msg(F("Error: "));
|
||||||
print_Msg(write_errors);
|
print_Msg(write_errors);
|
||||||
@ -324,8 +291,7 @@ static void verifySRAM_Acan()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void readUM6650()
|
static void readUM6650() {
|
||||||
{
|
|
||||||
// create a new folder for storing rom file
|
// create a new folder for storing rom file
|
||||||
EEPROM_readAnything(0, foldern);
|
EEPROM_readAnything(0, foldern);
|
||||||
snprintf(folder, sizeof(folder), "/ACAN/UM6650/%d", foldern);
|
snprintf(folder, sizeof(folder), "/ACAN/UM6650/%d", foldern);
|
||||||
@ -345,8 +311,7 @@ static void readUM6650()
|
|||||||
foldern++;
|
foldern++;
|
||||||
EEPROM_writeAnything(0, foldern);
|
EEPROM_writeAnything(0, foldern);
|
||||||
|
|
||||||
for (uint16_t i = 0; i < 256; i++)
|
for (uint16_t i = 0; i < 256; i++) {
|
||||||
{
|
|
||||||
dataOut_MD();
|
dataOut_MD();
|
||||||
writeWord_Acan(0xeb0d03, i);
|
writeWord_Acan(0xeb0d03, i);
|
||||||
|
|
||||||
@ -360,13 +325,11 @@ static void readUM6650()
|
|||||||
print_STR(done_STR, 1);
|
print_STR(done_STR, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void verifyUM6650()
|
static void verifyUM6650() {
|
||||||
{
|
|
||||||
print_STR(verifying_STR, 0);
|
print_STR(verifying_STR, 0);
|
||||||
display_Update();
|
display_Update();
|
||||||
|
|
||||||
if (!myFile.open(filePath, O_READ))
|
if (!myFile.open(filePath, O_READ)) {
|
||||||
{
|
|
||||||
print_Error(F("File doesn't exist"));
|
print_Error(F("File doesn't exist"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -375,8 +338,7 @@ static void verifyUM6650()
|
|||||||
uint16_t len = myFile.read(sdBuffer, 256);
|
uint16_t len = myFile.read(sdBuffer, 256);
|
||||||
myFile.close();
|
myFile.close();
|
||||||
|
|
||||||
for (uint16_t i = 0; i < len; i++)
|
for (uint16_t i = 0; i < len; i++) {
|
||||||
{
|
|
||||||
dataOut_MD();
|
dataOut_MD();
|
||||||
writeWord_Acan(0xeb0d03, i);
|
writeWord_Acan(0xeb0d03, i);
|
||||||
|
|
||||||
@ -385,22 +347,18 @@ static void verifyUM6650()
|
|||||||
write_errors++;
|
write_errors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (write_errors)
|
if (write_errors) {
|
||||||
{
|
|
||||||
println_Msg(F("failed"));
|
println_Msg(F("failed"));
|
||||||
print_Msg(F("Error: "));
|
print_Msg(F("Error: "));
|
||||||
print_Msg(write_errors);
|
print_Msg(write_errors);
|
||||||
println_Msg(F(" bytes "));
|
println_Msg(F(" bytes "));
|
||||||
print_Error(did_not_verify_STR);
|
print_Error(did_not_verify_STR);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
println_Msg(F("passed"));
|
println_Msg(F("passed"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writeUM6650()
|
static void writeUM6650() {
|
||||||
{
|
|
||||||
filePath[0] = 0;
|
filePath[0] = 0;
|
||||||
sd.chdir("/");
|
sd.chdir("/");
|
||||||
fileBrowser(F("Select a file"));
|
fileBrowser(F("Select a file"));
|
||||||
@ -408,8 +366,7 @@ static void writeUM6650()
|
|||||||
|
|
||||||
display_Clear();
|
display_Clear();
|
||||||
|
|
||||||
if (!myFile.open(filePath, O_READ))
|
if (!myFile.open(filePath, O_READ)) {
|
||||||
{
|
|
||||||
print_Error(F("File doesn't exist"));
|
print_Error(F("File doesn't exist"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -423,8 +380,7 @@ static void writeUM6650()
|
|||||||
display_Update();
|
display_Update();
|
||||||
|
|
||||||
dataOut_MD();
|
dataOut_MD();
|
||||||
for (uint16_t i = 0; i < len; i++)
|
for (uint16_t i = 0; i < len; i++) {
|
||||||
{
|
|
||||||
writeWord_Acan(0xeb0d03, i);
|
writeWord_Acan(0xeb0d03, i);
|
||||||
writeWord_Acan(0xeb0d01, sdBuffer[i]);
|
writeWord_Acan(0xeb0d01, sdBuffer[i]);
|
||||||
|
|
||||||
@ -435,9 +391,8 @@ static void writeUM6650()
|
|||||||
print_STR(done_STR, 1);
|
print_STR(done_STR, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void flashCart_Acan()
|
static void flashCart_Acan() {
|
||||||
{
|
uint32_t *flash_size = (uint32_t *)(eepbit + 4);
|
||||||
uint32_t *flash_size = (uint32_t*)(eepbit + 4);
|
|
||||||
|
|
||||||
filePath[0] = 0;
|
filePath[0] = 0;
|
||||||
sd.chdir();
|
sd.chdir();
|
||||||
@ -446,8 +401,7 @@ static void flashCart_Acan()
|
|||||||
|
|
||||||
display_Clear();
|
display_Clear();
|
||||||
|
|
||||||
if (!myFile.open(filePath, O_READ))
|
if (!myFile.open(filePath, O_READ)) {
|
||||||
{
|
|
||||||
print_Error(F("File doesn't exist"));
|
print_Error(F("File doesn't exist"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -465,8 +419,7 @@ static void flashCart_Acan()
|
|||||||
|
|
||||||
draw_progressbar(0, file_length);
|
draw_progressbar(0, file_length);
|
||||||
|
|
||||||
for (i = 0; i < file_length; i += *flash_size)
|
for (i = 0; i < file_length; i += *flash_size) {
|
||||||
{
|
|
||||||
// erase chip
|
// erase chip
|
||||||
dataOut_MD();
|
dataOut_MD();
|
||||||
writeWord_Acan(i + 0xaaaa, 0xaaaa);
|
writeWord_Acan(i + 0xaaaa, 0xaaaa);
|
||||||
@ -477,15 +430,14 @@ static void flashCart_Acan()
|
|||||||
writeWord_Acan(i + 0xaaaa, 0x1010);
|
writeWord_Acan(i + 0xaaaa, 0x1010);
|
||||||
|
|
||||||
dataIn_MD();
|
dataIn_MD();
|
||||||
while (readWord_Acan(i) != 0xffff);
|
while (readWord_Acan(i) != 0xffff)
|
||||||
|
;
|
||||||
|
|
||||||
for (j = 0; j < *flash_size; j += 512)
|
for (j = 0; j < *flash_size; j += 512) {
|
||||||
{
|
|
||||||
myFile.read(sdBuffer, 512);
|
myFile.read(sdBuffer, 512);
|
||||||
|
|
||||||
for (k = 0; k < 512; k += 2)
|
for (k = 0; k < 512; k += 2) {
|
||||||
{
|
data = *((uint16_t *)(sdBuffer + k));
|
||||||
data = *((uint16_t*)(sdBuffer + k));
|
|
||||||
|
|
||||||
dataOut_MD();
|
dataOut_MD();
|
||||||
writeWord_Acan(i + 0xaaaa, 0xaaaa);
|
writeWord_Acan(i + 0xaaaa, 0xaaaa);
|
||||||
@ -494,7 +446,8 @@ static void flashCart_Acan()
|
|||||||
writeWord_Acan(i + j + k, data);
|
writeWord_Acan(i + j + k, data);
|
||||||
|
|
||||||
dataIn_MD();
|
dataIn_MD();
|
||||||
while (readWord_Acan(i + j + k) != data);
|
while (readWord_Acan(i + j + k) != data)
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
draw_progressbar(i + j + k, file_length);
|
draw_progressbar(i + j + k, file_length);
|
||||||
@ -508,18 +461,44 @@ static void flashCart_Acan()
|
|||||||
DDRG &= ~(1 << 5);
|
DDRG &= ~(1 << 5);
|
||||||
|
|
||||||
myFile.close();
|
myFile.close();
|
||||||
|
|
||||||
print_STR(done_STR, 1);
|
print_STR(done_STR, 1);
|
||||||
|
|
||||||
|
checkRomExist_Acan();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void checkRomExist_Acan() {
|
||||||
|
// RST to 0
|
||||||
|
PORTH &= ~(1 << 0);
|
||||||
|
NOP;
|
||||||
|
NOP;
|
||||||
|
NOP;
|
||||||
|
NOP;
|
||||||
|
NOP;
|
||||||
|
NOP;
|
||||||
|
|
||||||
|
// /RST to 1
|
||||||
|
PORTH |= (1 << 0);
|
||||||
|
|
||||||
|
cartSize = getRomSize_Acan();
|
||||||
|
romSize = cartSize >> 17;
|
||||||
|
mode = mode_SUPRACAN;
|
||||||
|
|
||||||
|
if (cartSize == 0)
|
||||||
|
print_Error(F("Unable to find rom signature..."));
|
||||||
|
else {
|
||||||
|
print_Msg(F("ROM Size: "));
|
||||||
|
print_Msg(romSize);
|
||||||
|
println_Msg(F(" Mb"));
|
||||||
|
}
|
||||||
|
|
||||||
display_Update();
|
display_Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t checkRomSize_Acan()
|
static uint32_t getRomSize_Acan() {
|
||||||
{
|
|
||||||
uint32_t addr = 0;
|
uint32_t addr = 0;
|
||||||
uint32_t crc32;
|
uint32_t crc32;
|
||||||
|
|
||||||
do
|
do {
|
||||||
{
|
|
||||||
// check if there is rom chip exists
|
// check if there is rom chip exists
|
||||||
// pull-up enable
|
// pull-up enable
|
||||||
DDRC = 0xff;
|
DDRC = 0xff;
|
||||||
@ -528,7 +507,7 @@ static uint32_t checkRomSize_Acan()
|
|||||||
PORTA = 0xff;
|
PORTA = 0xff;
|
||||||
DDRC = 0x00;
|
DDRC = 0x00;
|
||||||
DDRA = 0x00;
|
DDRA = 0x00;
|
||||||
*((uint16_t*)sdBuffer) = readWord_Acan(addr);
|
*((uint16_t *)sdBuffer) = readWord_Acan(addr);
|
||||||
|
|
||||||
// pull-up disable
|
// pull-up disable
|
||||||
DDRC = 0xff;
|
DDRC = 0xff;
|
||||||
@ -537,7 +516,7 @@ static uint32_t checkRomSize_Acan()
|
|||||||
PORTA = 0x00;
|
PORTA = 0x00;
|
||||||
DDRC = 0x00;
|
DDRC = 0x00;
|
||||||
DDRA = 0x00;
|
DDRA = 0x00;
|
||||||
*((uint16_t*)(sdBuffer + 2)) = readWord_Acan(addr);
|
*((uint16_t *)(sdBuffer + 2)) = readWord_Acan(addr);
|
||||||
|
|
||||||
// should be them same if chip exists
|
// should be them same if chip exists
|
||||||
if (sdBuffer[0] != sdBuffer[2] || sdBuffer[1] != sdBuffer[3])
|
if (sdBuffer[0] != sdBuffer[2] || sdBuffer[1] != sdBuffer[3])
|
||||||
@ -545,22 +524,18 @@ static uint32_t checkRomSize_Acan()
|
|||||||
|
|
||||||
crc32 = 0xffffffff;
|
crc32 = 0xffffffff;
|
||||||
|
|
||||||
for (uint32_t i = 0x2000; i < 0x2080; i += 2)
|
for (uint32_t i = 0x2000; i < 0x2080; i += 2) {
|
||||||
{
|
*((uint16_t *)sdBuffer) = readWord_Acan(addr + i);
|
||||||
*((uint16_t*)sdBuffer) = readWord_Acan(addr + i);
|
|
||||||
UPDATE_CRC(crc32, sdBuffer[0]);
|
UPDATE_CRC(crc32, sdBuffer[0]);
|
||||||
UPDATE_CRC(crc32, sdBuffer[1]);
|
UPDATE_CRC(crc32, sdBuffer[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
crc32 = ~crc32;
|
crc32 = ~crc32;
|
||||||
|
|
||||||
if (crc32 == 0xa2bc9d7a)
|
if (crc32 == 0xa2bc9d7a) {
|
||||||
{
|
|
||||||
if (addr > 0)
|
if (addr > 0)
|
||||||
break;
|
break;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
if (addr == 0)
|
if (addr == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -572,92 +547,82 @@ static uint32_t checkRomSize_Acan()
|
|||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void resetCart_Acan()
|
static void resetCart_Acan() {
|
||||||
{
|
|
||||||
// set /CS(PH3), R/W(PH5), /AS(PH6) high
|
// set /CS(PH3), R/W(PH5), /AS(PH6) high
|
||||||
// /RST(PH0) and C27(PH4) low
|
// /RST(PH0) and C27(PH4) low
|
||||||
PORTH |= ((1 << 3) | (1 << 5) | (1 << 6));
|
PORTH |= ((1 << 3) | (1 << 5) | (1 << 6));
|
||||||
PORTH &= ~((1 << 0) | (1 << 4));
|
PORTH &= ~((1 << 0) | (1 << 4));
|
||||||
|
|
||||||
if (i2c_found)
|
if (i2c_found) {
|
||||||
{
|
clockgen.output_enable(SI5351_CLK1, 0); // CPU clock
|
||||||
clockgen.output_enable(SI5351_CLK1, 0); // CPU clock
|
clockgen.output_enable(SI5351_CLK2, 0); // CIC clock
|
||||||
clockgen.output_enable(SI5351_CLK2, 0); // CIC clock
|
clockgen.output_enable(SI5351_CLK0, 0); // master clock
|
||||||
clockgen.output_enable(SI5351_CLK0, 0); // master clock
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writeWord_Acan(uint32_t addr, uint16_t data)
|
static void writeWord_Acan(uint32_t addr, uint16_t data) {
|
||||||
{
|
uint8_t *ptr = (uint8_t *)&addr;
|
||||||
uint8_t *ptr = (uint8_t*)&addr;
|
|
||||||
|
|
||||||
PORTF = *ptr++;
|
PORTF = *ptr++;
|
||||||
PORTK = *ptr++;
|
PORTK = *ptr++;
|
||||||
PORTL = *ptr;
|
PORTL = *ptr;
|
||||||
|
|
||||||
if (*ptr < 0xe0)
|
if (*ptr < 0xe0) {
|
||||||
{
|
|
||||||
// ROM area
|
// ROM area
|
||||||
// /CS(PH3), C27(PH4), R/W(PH5), /AS(PH6) to L
|
// /CS(PH3), C27(PH4), R/W(PH5), /AS(PH6) to L
|
||||||
PORTH &= ~((1 << 3) | (1 << 4) | (1 << 5) | (1 << 6));
|
PORTH &= ~((1 << 3) | (1 << 4) | (1 << 5) | (1 << 6));
|
||||||
}
|
} else if (*ptr == 0xec) {
|
||||||
else if (*ptr == 0xec)
|
|
||||||
{
|
|
||||||
// save area
|
// save area
|
||||||
// /CS(PH3) to H, C27(PH4), R/W(PH5), /AS(PH6) to L
|
// /CS(PH3) to H, C27(PH4), R/W(PH5), /AS(PH6) to L
|
||||||
PORTH |= (1 << 3);
|
PORTH |= (1 << 3);
|
||||||
PORTH &= ~((1 << 4) | (1 << 5) | (1 << 6));
|
PORTH &= ~((1 << 4) | (1 << 5) | (1 << 6));
|
||||||
}
|
} else if (addr == 0x00eb0d03 || addr == 0x00eb0d01) {
|
||||||
else if (addr == 0x00eb0d03 || addr == 0x00eb0d01)
|
|
||||||
{
|
|
||||||
// UM6650 area
|
// UM6650 area
|
||||||
// /CS(PH3), C27(PH4) to H, R/W(PH5), /AS(PH6) to L
|
// /CS(PH3), C27(PH4) to H, R/W(PH5), /AS(PH6) to L
|
||||||
PORTH |= ((1 << 3) | (1 << 4));
|
PORTH |= ((1 << 3) | (1 << 4));
|
||||||
PORTH &= ~((1 << 5) | (1 << 6));
|
PORTH &= ~((1 << 5) | (1 << 6));
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = (uint8_t*)&data;
|
ptr = (uint8_t *)&data;
|
||||||
PORTC = *ptr++;
|
PORTC = *ptr++;
|
||||||
PORTA = *ptr;
|
PORTA = *ptr;
|
||||||
|
|
||||||
NOP; NOP; NOP;
|
NOP;
|
||||||
|
NOP;
|
||||||
|
NOP;
|
||||||
|
|
||||||
PORTH &= ~(1 << 4);
|
PORTH &= ~(1 << 4);
|
||||||
PORTH |= ((1 << 3) | (1 << 5) | (1 << 6));
|
PORTH |= ((1 << 3) | (1 << 5) | (1 << 6));
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t readWord_Acan(uint32_t addr)
|
static uint16_t readWord_Acan(uint32_t addr) {
|
||||||
{
|
uint8_t *ptr = (uint8_t *)&addr;
|
||||||
uint8_t *ptr = (uint8_t*)&addr;
|
|
||||||
uint16_t data;
|
uint16_t data;
|
||||||
|
|
||||||
PORTF = *ptr++;
|
PORTF = *ptr++;
|
||||||
PORTK = *ptr++;
|
PORTK = *ptr++;
|
||||||
PORTL = *ptr;
|
PORTL = *ptr;
|
||||||
|
|
||||||
if (*ptr < 0xe0)
|
if (*ptr < 0xe0) {
|
||||||
{
|
|
||||||
// ROM area
|
// ROM area
|
||||||
// /CS(PH3), C27(PH4), /AS(PH6) to L
|
// /CS(PH3), C27(PH4), /AS(PH6) to L
|
||||||
PORTH &= ~((1 << 3) | (1 << 4) | (1 << 6));
|
PORTH &= ~((1 << 3) | (1 << 4) | (1 << 6));
|
||||||
}
|
} else if (*ptr == 0xec) {
|
||||||
else if (*ptr == 0xec)
|
|
||||||
{
|
|
||||||
// save area
|
// save area
|
||||||
// /CS(PH3) to H, C27(PH4), /AS(PH6) to L
|
// /CS(PH3) to H, C27(PH4), /AS(PH6) to L
|
||||||
PORTH |= (1 << 3);
|
PORTH |= (1 << 3);
|
||||||
PORTH &= ~((1 << 4) | (1 << 6));
|
PORTH &= ~((1 << 4) | (1 << 6));
|
||||||
}
|
} else if (addr == 0x00eb0d03 || addr == 0x00eb0d01) {
|
||||||
else if (addr == 0x00eb0d03 || addr == 0x00eb0d01)
|
|
||||||
{
|
|
||||||
// UM6650 area
|
// UM6650 area
|
||||||
// /CS(PH3), C27(PH4) to H, /AS(PH6) to L
|
// /CS(PH3), C27(PH4) to H, /AS(PH6) to L
|
||||||
PORTH |= ((1 << 3) | (1 << 4));
|
PORTH |= ((1 << 3) | (1 << 4));
|
||||||
PORTH &= ~(1 << 6);
|
PORTH &= ~(1 << 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = (uint8_t*)&data;
|
ptr = (uint8_t *)&data;
|
||||||
NOP; NOP; NOP;
|
NOP;
|
||||||
|
NOP;
|
||||||
|
NOP;
|
||||||
|
|
||||||
*ptr++ = PINC;
|
*ptr++ = PINC;
|
||||||
*ptr = PINA;
|
*ptr = PINA;
|
||||||
@ -668,11 +633,9 @@ static uint16_t readWord_Acan(uint32_t addr)
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t getFlashChipSize_Acan(uint16_t chip_id)
|
static uint32_t getFlashChipSize_Acan(uint16_t chip_id) {
|
||||||
{
|
|
||||||
// 0x0458 (8M), 0x01ab (4M), 0x01d8 (16M)
|
// 0x0458 (8M), 0x01ab (4M), 0x01d8 (16M)
|
||||||
switch (chip_id)
|
switch (chip_id) {
|
||||||
{
|
|
||||||
case 0x01ab: return 524288;
|
case 0x01ab: return 524288;
|
||||||
case 0x0458: return 1048576;
|
case 0x0458: return 1048576;
|
||||||
case 0x01d8: return 2097152;
|
case 0x01d8: return 2097152;
|
||||||
|
Loading…
Reference in New Issue
Block a user