diff loadtools/flashops.c @ 325:545e1718f5fb

fc-loadtool: support for 28F640W30B flash chip with partition quirks
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 20 Jan 2018 05:20:40 +0000
parents e7502631a0f9
children 0dd2c87c1b63
line wrap: on
line diff
--- a/loadtools/flashops.c	Fri Dec 29 20:38:39 2017 +0000
+++ b/loadtools/flashops.c	Sat Jan 20 05:20:40 2018 +0000
@@ -108,6 +108,21 @@
 	return(0);
 }
 
+intel_w30_reset_cmd(bi)
+	struct flash_bank_info *bi;
+{
+	uint32_t part;
+
+	for (part = 0; part < bi->geom->total_size; part += 0x80000) {
+		if (do_w16(bi->base_addr + part, 0xFF)) {
+			fprintf(stderr,
+	"unexpected response to w16 when resetting flash to read mode!\n");
+			return(-1);
+		}
+	}
+	return(0);
+}
+
 intel_status_cmd(bi)
 	struct flash_bank_info *bi;
 {
@@ -129,6 +144,31 @@
 	return(0);
 }
 
+intel_w30_status_cmd(bi)
+	struct flash_bank_info *bi;
+{
+	uint32_t part;
+	int stat;
+	uint16_t sr;
+
+	for (part = 0; part < bi->geom->total_size; part += 0x80000) {
+		/* issue Read SR command */
+		stat = do_w16(bi->base_addr + part, 0x70);
+		if (stat) {
+			fprintf(stderr,
+			"unexpected response to w16 for Read SR command\n");
+			return(-1);
+		}
+		stat = do_r16(bi->base_addr + part, &sr);
+		if (stat)
+			return(stat);	/* error msg already printed */
+		sr &= 0xFF;
+		printf("Status Register for partition %08lX: %02X\n",
+			(u_long) part, sr);
+	}
+	return(0);
+}
+
 intel_sector_unlock(bi, sp)
 	struct flash_bank_info *bi;
 	struct sector_info *sp;
@@ -205,6 +245,22 @@
 	return(0);
 }
 
+intel_w30_clear_sr(bi)
+	struct flash_bank_info *bi;
+{
+	uint32_t part;
+
+	printf("Clearing Intel flash SR\n");
+	for (part = 0; part < bi->geom->total_size; part += 0x80000) {
+		if (do_w16(bi->base_addr + part, 0x50)) {
+			fprintf(stderr,
+			"unexpected response to w16 for Clear SR command\n");
+			return(-1);
+		}
+	}
+	return(0);
+}
+
 struct flash_cmdset flash_cmdset_intel = {
 	.cmdset_name		= "Intel",
 	.reset_cmd		= intel_reset_cmd,
@@ -216,3 +272,15 @@
 	.loadagent_program_cmd	= "INFW",
 	.needs_unlock		= 1,
 };
+
+struct flash_cmdset flash_cmdset_intel_w30 = {
+	.cmdset_name		= "Intel",
+	.reset_cmd		= intel_w30_reset_cmd,
+	.status_cmd		= intel_w30_status_cmd,
+	.unlock_sector		= intel_sector_unlock,
+	.erase_sector		= intel_sector_erase,
+	.prep_for_program	= intel_w30_clear_sr,
+	.loadagent_setbase_cmd	= "INFB",
+	.loadagent_program_cmd	= "INFW",
+	.needs_unlock		= 1,
+};