Skip to content

Commit 6a0274b

Browse files
committed
Add interleaved verify mode
1 parent 8af8863 commit 6a0274b

File tree

1 file changed

+30
-7
lines changed

1 file changed

+30
-7
lines changed

ecpprog/ecpprog.c

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ static void flash_start_read(int addr)
373373
static void flash_continue_read(uint8_t *data, int n)
374374
{
375375
if (verbose)
376-
fprintf(stderr, "Contiune Read +0x%03X..\n", n);
376+
fprintf(stderr, "Continue Read +0x%03X..\n", n);
377377

378378
memset(data, 0, n);
379379
send_spi(data, n);
@@ -758,6 +758,9 @@ static void help(const char *progname)
758758
fprintf(stderr, " -R <size in bytes> read the specified number of bytes from flash\n");
759759
fprintf(stderr, " (append 'k' to the argument for size in kilobytes,\n");
760760
fprintf(stderr, " or 'M' for size in megabytes)\n");
761+
fprintf(stderr, " -l Verify every written page immediatly after write\n");
762+
fprintf(stderr, " This make the total write/verify process slower but allows to\n");
763+
fprintf(stderr, " discover flash programming issues\n");
761764
fprintf(stderr, " -c do not write flash, only verify (`check')\n");
762765
fprintf(stderr, " -S perform SRAM programming\n");
763766
fprintf(stderr, " -t just read the flash ID sequence\n");
@@ -806,6 +809,7 @@ int main(int argc, char **argv)
806809
bool reinitialize = false;
807810
bool read_mode = false;
808811
bool check_mode = false;
812+
bool interleaved_verify = false;
809813
bool erase_mode = false;
810814
bool bulk_erase = false;
811815
bool dont_erase = false;
@@ -830,7 +834,7 @@ int main(int argc, char **argv)
830834
/* Decode command line parameters */
831835
int opt;
832836
char *endptr;
833-
while ((opt = getopt_long(argc, argv, "d:i:I:rR:e:o:k:scabnStvpX", long_options, NULL)) != -1) {
837+
while ((opt = getopt_long(argc, argv, "d:i:I:rR:e:o:k:slcabnStvpX", long_options, NULL)) != -1) {
834838
switch (opt) {
835839
case 'd': /* device string */
836840
devstr = optarg;
@@ -915,6 +919,9 @@ int main(int argc, char **argv)
915919
case 's': /* use slow SPI clock */
916920
clkdiv = 30;
917921
break;
922+
case 'l': /* Check every page after write */
923+
interleaved_verify = true;
924+
break;
918925
case 'c': /* do not write just check */
919926
check_mode = true;
920927
break;
@@ -989,6 +996,11 @@ int main(int argc, char **argv)
989996
return EXIT_FAILURE;
990997
}
991998

999+
if (interleaved_verify && (read_mode || check_mode || prog_sram || test_mode)) {
1000+
fprintf(stderr, "%s: option `-l' only valid in programming mode\n", my_name);
1001+
return EXIT_FAILURE;
1002+
}
1003+
9921004
if (optind + 1 == argc) {
9931005
if (test_mode) {
9941006
fprintf(stderr, "%s: test mode doesn't take a file name\n", my_name);
@@ -1227,20 +1239,31 @@ int main(int argc, char **argv)
12271239

12281240
if (!erase_mode)
12291241
{
1242+
uint8_t buffer_flash[256], buffer_file[256], buffer_tx[256];
12301243
for (int rc, addr = 0; true; addr += rc) {
1231-
uint8_t buffer[256];
1232-
12331244
/* Show progress */
12341245
fprintf(stderr, "\r\033[0Kprogramming.. %04u/%04lu", addr, file_size);
12351246

12361247
int page_size = 256 - (rw_offset + addr) % 256;
1237-
rc = fread(buffer, 1, page_size, f);
1248+
rc = fread(buffer_file, 1, page_size, f);
12381249
if (rc <= 0)
12391250
break;
1251+
memcpy(buffer_tx, buffer_file, rc);
1252+
12401253
flash_write_enable();
1241-
flash_prog(rw_offset + addr, buffer, rc);
1254+
flash_prog(rw_offset + addr, buffer_tx, rc);
12421255
flash_wait();
12431256

1257+
if (!disable_verify && interleaved_verify) {
1258+
flash_start_read(rw_offset + addr);
1259+
flash_continue_read(buffer_flash, rc);
1260+
flash_wait();
1261+
if (memcmp(buffer_file, buffer_flash, rc)) {
1262+
fprintf(stderr, "Found difference between flash and file!\n");
1263+
jtag_error(3);
1264+
}
1265+
}
1266+
12441267
}
12451268

12461269
fprintf(stderr, "\n");
@@ -1266,7 +1289,7 @@ int main(int argc, char **argv)
12661289
fwrite(buffer, read_size - addr > 4096 ? 4096 : read_size - addr, 1, f);
12671290
}
12681291
fprintf(stderr, "\n");
1269-
} else if (!erase_mode && !disable_verify) {
1292+
} else if (!erase_mode && !disable_verify && !interleaved_verify) {
12701293

12711294
flash_start_read(rw_offset);
12721295
for (int addr = 0; addr < file_size; addr += 4096) {

0 commit comments

Comments
 (0)