コード例 #1
0
ファイル: main.cpp プロジェクト: holodnak/FDSStick
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;
}
コード例 #2
0
ファイル: main.cpp プロジェクト: stevensmedia/FDSStick
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);
}