# HG changeset patch # User Mychaela Falconia # Date 1583631128 0 # Node ID ba9523ca6ed8955db1c1f0eba90cc8f80b985175 # Parent cd48bc4c54600086ba5a4435f7e82e35ffbfdbb4 fc-loadtool code: preparations for e-program-* addition diff -r cd48bc4c5460 -r ba9523ca6ed8 loadtools/flerase.c --- a/loadtools/flerase.c Sun Mar 08 00:29:11 2020 +0000 +++ b/loadtools/flerase.c Sun Mar 08 01:32:08 2020 +0000 @@ -10,6 +10,7 @@ #include #include #include "flash.h" +#include "discontig.h" extern struct flash_bank_info flash_bank_info[2]; @@ -55,7 +56,7 @@ return(0); } /* now enforce sector alignment for both offset and length */ - if (get_flash_sector_table(bank) < 0) + if (get_flash_sector_table(bi) < 0) return(-1); if (get_flash_sector_range(bi, offset, len, &startsec, &endsec) < 0) return(-1); @@ -76,3 +77,56 @@ printf("Operation completed in %um%us\n", mm, ss); return(0); } + +erase_sectors_for_prog(bi, regions, nregions) + struct flash_bank_info *bi; + struct discontig_prog *regions; + unsigned nregions; +{ + struct sector_info *seclist[256], **seclp, **secendp, *sp; + struct discontig_prog *regp, *regendp; + uint32_t endaddr, secendaddr; + int flag, stat; + time_t start_time, finish_time; + unsigned duration, mm, ss; + + if (get_flash_sector_table(bi) < 0) + return(-1); + seclp = seclist; + endaddr = regions[nregions-1].end; + regendp = regions + nregions; + for (sp = bi->sectors; sp->size; sp++) { + if (sp->start >= endaddr) + break; + secendaddr = sp->start + sp->size; + flag = 0; + for (regp = regions; regp < regendp; regp++) { + if (regp->start >= secendaddr) + break; + if (sp->start >= regp->end) + continue; + flag = 1; + break; + } + if (flag) + *seclp++ = sp; + } + secendp = seclp; + printf("Erasing %d sector(s)\n", secendp - seclist); + time(&start_time); + for (seclp = seclist; seclp < secendp; seclp++) { + sp = *seclp; + stat = bi->ops->erase_sector(bi, sp); + if (stat) + return(stat); + putchar('.'); + fflush(stdout); + } + time(&finish_time); + putchar('\n'); + duration = finish_time - start_time; + mm = duration / 60; + ss = duration - mm * 60; + printf("Operation completed in %um%us\n", mm, ss); + return(0); +} diff -r cd48bc4c5460 -r ba9523ca6ed8 loadtools/flmisc.c --- a/loadtools/flmisc.c Sun Mar 08 00:29:11 2020 +0000 +++ b/loadtools/flmisc.c Sun Mar 08 01:32:08 2020 +0000 @@ -235,7 +235,7 @@ return(0); } /* now enforce sector alignment for both offset and length */ - if (get_flash_sector_table(bank) < 0) + if (get_flash_sector_table(bi) < 0) return(-1); if (get_flash_sector_range(bi, offset, len, &startsec, &endsec) < 0) return(-1); diff -r cd48bc4c5460 -r ba9523ca6ed8 loadtools/flutil.c --- a/loadtools/flutil.c Sun Mar 08 00:29:11 2020 +0000 +++ b/loadtools/flutil.c Sun Mar 08 01:32:08 2020 +0000 @@ -10,28 +10,23 @@ extern struct flash_bank_info flash_bank_info[2]; -get_flash_sector_table(bank) +get_flash_sector_table(bi) + struct flash_bank_info *bi; { - struct flash_bank_info *bi; struct flash_geom *geom; struct flash_region_desc *reg; struct sector_info *sp; uint32_t offset; int nr, i; - bi = flash_bank_info + bank; if (bi->sectors) return(0); - i = flash_detect(bank, 0); - if (i < 0) - return(i); geom = bi->geom; sp = (struct sector_info *) malloc(sizeof(struct sector_info) * (geom->total_sectors + 1)); if (!sp) { fprintf(stderr, - "unable to malloc buffer for flash bank %d sector table\n", - bank); + "unable to malloc buffer for flash sector table\n"); return(-1); } bi->sectors = sp; @@ -73,9 +68,11 @@ fprintf(stderr, "error: too many arguments\n"); return(-1); } - if (get_flash_sector_table(bank) < 0) + if (flash_detect(bank, 0) < 0) return(-1); bi = flash_bank_info + bank; + if (get_flash_sector_table(bi) < 0) + return(-1); printf("%u sectors in flash bank %d:\n", bi->geom->total_sectors, bank); printf("Offset Size\n"); for (sp = bi->sectors; sp->size; sp++)