changeset 669:ba9523ca6ed8

fc-loadtool code: preparations for e-program-* addition
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 08 Mar 2020 01:32:08 +0000
parents cd48bc4c5460
children 815c3f8bcff1
files loadtools/flerase.c loadtools/flmisc.c loadtools/flutil.c
diffstat 3 files changed, 62 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- 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 <stdlib.h>
 #include <time.h>
 #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);
+}
--- 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);
--- 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++)