Skip to content

Commit 8218991

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

File tree

1 file changed

+53
-21
lines changed

1 file changed

+53
-21
lines changed

ecpprog/ecpprog.c

Lines changed: 53 additions & 21 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 immediately after write\n");
762+
fprintf(stderr, " This make the total write/verify process slower but allows\n");
763+
fprintf(stderr, " discovery of flash programming/connection issues quicker\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);
@@ -1177,6 +1189,7 @@ int main(int argc, char **argv)
11771189
// ---------------------------------------------------------
11781190
// Program
11791191
// ---------------------------------------------------------
1192+
unsigned int read_blocksize = 256 * 32;
11801193

11811194
if (!read_mode && !check_mode)
11821195
{
@@ -1227,19 +1240,38 @@ int main(int argc, char **argv)
12271240

12281241
if (!erase_mode)
12291242
{
1243+
uint8_t buffer_flash[read_blocksize], buffer_file[read_blocksize], buffer_tx[256];
12301244
for (int rc, addr = 0; true; addr += rc) {
1231-
uint8_t buffer[256];
1232-
1233-
/* Show progress */
1234-
fprintf(stderr, "\r\033[0Kprogramming.. %04u/%04lu", addr, file_size);
1235-
1236-
int page_size = 256 - (rw_offset + addr) % 256;
1237-
rc = fread(buffer, 1, page_size, f);
1245+
rc = fread(buffer_file, 1, read_blocksize, f);
12381246
if (rc <= 0)
12391247
break;
1240-
flash_write_enable();
1241-
flash_prog(rw_offset + addr, buffer, rc);
1242-
flash_wait();
1248+
1249+
for (int written, block_offset = 0; block_offset < rc; block_offset += written) {
1250+
/* Show progress */
1251+
fprintf(stderr, "\r\033[0Kprogramming.. %04u/%04lu", addr + block_offset, file_size);
1252+
1253+
int write_addr = rw_offset + addr + block_offset;
1254+
written = 256 - write_addr % 256;
1255+
if (block_offset + written > read_blocksize) {
1256+
written = read_blocksize - block_offset;
1257+
}
1258+
1259+
memcpy(buffer_tx, buffer_file + block_offset, written);
1260+
1261+
flash_write_enable();
1262+
flash_prog(write_addr, buffer_tx, written);
1263+
flash_wait();
1264+
}
1265+
1266+
if (!disable_verify && interleaved_verify) {
1267+
flash_start_read(rw_offset + addr);
1268+
flash_continue_read(buffer_flash, rc);
1269+
flash_wait();
1270+
if (memcmp(buffer_file, buffer_flash, rc)) {
1271+
fprintf(stderr, "Found difference between flash and file!\n");
1272+
jtag_error(3);
1273+
}
1274+
}
12431275

12441276
}
12451277

@@ -1256,23 +1288,23 @@ int main(int argc, char **argv)
12561288
if (read_mode) {
12571289

12581290
flash_start_read(rw_offset);
1259-
for (int addr = 0; addr < read_size; addr += 4096) {
1260-
uint8_t buffer[4096];
1291+
for (int addr = 0; addr < read_size; addr += read_blocksize) {
1292+
uint8_t buffer[read_blocksize];
12611293

12621294
/* Show progress */
1263-
fprintf(stderr, "\r\033[0Kreading.. %04u/%04u", addr + 4096, read_size);
1295+
fprintf(stderr, "\r\033[0Kreading.. %04u/%04u", addr + read_blocksize, read_size);
12641296

1265-
flash_continue_read(buffer, 4096);
1266-
fwrite(buffer, read_size - addr > 4096 ? 4096 : read_size - addr, 1, f);
1297+
flash_continue_read(buffer, read_blocksize);
1298+
fwrite(buffer, read_size - addr > read_blocksize ? read_blocksize : read_size - addr, 1, f);
12671299
}
12681300
fprintf(stderr, "\n");
1269-
} else if (!erase_mode && !disable_verify) {
1301+
} else if (!erase_mode && !disable_verify && !interleaved_verify) {
12701302

12711303
flash_start_read(rw_offset);
1272-
for (int addr = 0; addr < file_size; addr += 4096) {
1273-
uint8_t buffer_flash[4096], buffer_file[4096];
1304+
for (int addr = 0; addr < file_size; addr += read_blocksize) {
1305+
uint8_t buffer_flash[read_blocksize], buffer_file[read_blocksize];
12741306

1275-
int rc = fread(buffer_file, 1, 4096, f);
1307+
int rc = fread(buffer_file, 1, read_blocksize, f);
12761308
if (rc <= 0)
12771309
break;
12781310

0 commit comments

Comments
 (0)