bool FW_writeFlash(char *filename) { FILE *fp; uint8_t *buf = 0; uint32_t *buf32, chksum; int i, filesize; if ((fp = fopen(filename, "rb")) == 0) { printf("unable to open firmware '%s'\n", filename); return(false); } fseek(fp, 0, SEEK_END); filesize = ftell(fp); fseek(fp, 0, SEEK_SET); if (filesize > (0x8000 - 8)) { printf("firmware image too large\n"); fclose(fp); return(false); } buf = (uint8_t*)malloc(0x8000); buf32 = (uint32_t*)buf; memset(buf, 0, 0x8000); fread(buf, 1, filesize, fp); fclose(fp); buf32[(0x8000 - 8) / 4] = 0xDEADBEEF; chksum = 0; for (i = 0; i<(0x8000 - 4); i += 4) { chksum ^= buf32[i / 4]; } printf("firmware is %d bytes, checksum is $%08X\n", filesize, chksum); buf32[(0x8000 - 4) / 4] = chksum; printf("uploading new firmware"); if (!spi_writeFlash2(buf, 0x8000, 0x8000)) { printf("Write failed.\n"); return false; } free(buf); printf("waiting for device to reboot\n"); dev_updateFirmware(); //start update, device will reset itself sleep_ms(5000); if (!dev_open()) { printf("Open failed.\n"); return false; } printf("Updated to build %d\n", dev_fwVersion); return true; }
int main(int argc, char** argv) { setbuf(stdout,NULL); printf("FDSStick console app (" __DATE__ ")\n"); if(!dev_open() || argc<2 || argv[1][0]!='-') { help(); } bool success=false; switch(argv[1][1]) { case 'u': //update -u filename if(argc<3) help(); { if(spi_writeFile(argv[2], 0xff0000)) success=dev_updateFirmware(); break; } case 'f': //flash -f file.fds [slot] if(argc<3) help(); { int slot=1; if(argc>3) sscanf(argv[3],"%i",&slot); success=FDS_writeFlash(argv[2], slot); } break; case 's': //save -s file.fds [slot] if(argc<3) help(); { int slot=1; if(argc>3) sscanf(argv[3],"%i",&slot); //TODO - name should be optional, it's already in flash success=FDS_readFlashToFDS(argv[2], slot); } break; case 'w': if(argc<3) help(); success=FDS_writeDisk(argv[2]); break; case 'l': success=FDS_list(); break; case 'r': //readDisk -r file.fds if(argc<3) help(); success=FDS_readDisk(NULL, NULL, argv[2]); break; case 'R': //readRaw -R file.raw [file.bin] if(argc<3) help(); success=FDS_readDisk(argv[2], argc>3?argv[3]:NULL, NULL); break; case 'e': //erase -e [1..N | all] if(argc<3) help(); { if(!strcmp(argv[2],"all")) { success=true; for(int addr=0; addr<dev_flashSize; addr+=SLOTSIZE) success &= spi_erasePage(addr); } else { int slot=1; sscanf(argv[2],"%i",&slot); success=spi_erasePage(SLOTSIZE*(slot-1)); //TODO - erase all slots of a game } } break; /* case 'D': //dump -D filename addr size if(argc<3) help(); { int addr=0, size=dev_flashSize; if(argc>3) sscanf(argv[3],"%i",&addr); if(argc>4) sscanf(argv[4],"%i",&size); success=spi_dumpFlash(argv[2], addr, size); break; } case 'W': //write -W file [addr] if(argc<3) help(); { int addr=0; if(argc>3) sscanf(argv[3],"%i",&addr); success=spi_writeFile(argv[2], addr); break; } case 't': //test ... if(argc<3) help(); { FDS_rawToBin(argv[2], argc>3? argv[3]: NULL); break; } */ default: help(); } printf(success? "Ok.\n": "Failed.\n"); if(!success) dev_printLastError(); app_exit(success?0:1); }