static int cmd_eraseflash_run( chain_t *chain, char *params[] ) { uint32_t adr = 0; unsigned int number = 0; if (cmd_params( params ) != 3) return -1; if (!cmd_test_cable( chain )) return 1; if (!bus) { printf( _("Error: Bus driver missing.\n") ); return 1; } if (cmd_get_number( params[1], &adr )) return -1; if (cmd_get_number( params[2], &number )) return -1; flasherase( bus, adr, number ); return 1; }
/* _tfsclean(): * This is an alternative to the complicated defragmentation above. * It simply scans through the file list and copies all valid files * to RAM; then flash is erased and the RAM is copied back to flash. * <<< WARNING >>> * THIS FUNCTION SHOULD NOT BE INTERRUPTED AND IT WILL BLOW AWAY * ANY APPLICATION CURRENTLY IN CLIENT RAM SPACE. */ int _tfsclean(TDEV *tdp, int notused, int verbose) { ulong appramstart; TFILE *tfp, *lasttfp; uchar *tbuf, *cp1, *cp2; int dtot, nfadd, len, err, chkstat; if (TfsCleanEnable < 0) return(TFSERR_CLEANOFF); appramstart = getAppRamStart(); /* Determine how many "dead" files exist. */ dtot = 0; tfp = (TFILE *)tdp->start; while(validtfshdr(tfp)) { if (!TFS_FILEEXISTS(tfp)) dtot++; tfp = nextfp(tfp,tdp); } if (dtot == 0) return(TFS_OKAY); printf("TFS device '%s' non-powersafe defragmentation\n",tdp->prefix); tbuf = (uchar *)appramstart; lasttfp = tfp = (TFILE *)(tdp->start); nfadd = tdp->start; while(validtfshdr(tfp)) { if (TFS_FILEEXISTS(tfp)) { len = TFS_SIZE(tfp) + sizeof(struct tfshdr); if (len % TFS_FSIZEMOD) len += TFS_FSIZEMOD - (len % TFS_FSIZEMOD); nfadd += len; if (s_memcpy((char *)tbuf,(char *)tfp,len,0,0) != 0) return(TFSERR_MEMFAIL); ((struct tfshdr *)tbuf)->next = (struct tfshdr *)nfadd; tbuf += len; } lasttfp = tfp; tfp = nextfp(tfp,tdp); } /* We've now copied all of the active files from flash to ram. * Now we want to see how much of the flash space needs to be * erased. We only need to erase the sectors that have changed... */ cp1 = (uchar *)tdp->start; cp2 = (uchar *)appramstart; while(cp2 < tbuf) { if (*cp1 != *cp2) break; cp1++; cp2++; } #if INCLUDE_FLASH if ((cp2 != tbuf) || (!TFS_FILEEXISTS(lasttfp))) { int first, last; if (addrtosector(cp1,&first,0,0) == -1) return(TFSERR_FLASHFAILURE); if (addrtosector((uchar *)tdp->end,&last,0,0) == -1) return(TFSERR_FLASHFAILURE); printf("Erasing sectors %d-%d...\n",first,last); while(first<last) { if (flasherase(first++) == 0) return(TFSERR_FLASHFAILURE); } } #endif /* Copy data placed in RAM back to flash: */ printf("Restoring flash...\n"); if (TFS_DEVTYPE_ISRAM(tdp)) { memcpy((char *)(tdp->start),(char *)appramstart, (tbuf-(uchar*)appramstart)); } else { #if INCLUDE_FLASH err = AppFlashWrite((uchar *)(tdp->start),(uchar *)appramstart, (tbuf-(uchar*)appramstart)); if (err < 0) #endif return(TFSERR_FLASHFAILURE); } /* All defragmentation is done, so verify sanity of files... */ chkstat = tfscheck(tdp,verbose); return(chkstat); }