Skip to content

Commit 61997bd

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

File tree

1 file changed

+57
-21
lines changed

1 file changed

+57
-21
lines changed

ecpprog/ecpprog.c

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@
4545
#include "jtag.h"
4646
#include "lattice_cmds.h"
4747

48+
#ifndef MIN
49+
#define MIN(a,b) ((a) < (b)) ? (a) : (b)
50+
#endif
51+
4852
static bool verbose = false;
4953

5054
enum device_type {
@@ -373,7 +377,7 @@ static void flash_start_read(int addr)
373377
static void flash_continue_read(uint8_t *data, int n)
374378
{
375379
if (verbose)
376-
fprintf(stderr, "Contiune Read +0x%03X..\n", n);
380+
fprintf(stderr, "Continue Read +0x%03X..\n", n);
377381

378382
memset(data, 0, n);
379383
send_spi(data, n);
@@ -758,6 +762,9 @@ static void help(const char *progname)
758762
fprintf(stderr, " -R <size in bytes> read the specified number of bytes from flash\n");
759763
fprintf(stderr, " (append 'k' to the argument for size in kilobytes,\n");
760764
fprintf(stderr, " or 'M' for size in megabytes)\n");
765+
fprintf(stderr, " -l Verify every written page immediately after write\n");
766+
fprintf(stderr, " This make the total write/verify process slower but allows\n");
767+
fprintf(stderr, " discovery of flash programming/connection issues quicker\n");
761768
fprintf(stderr, " -c do not write flash, only verify (`check')\n");
762769
fprintf(stderr, " -S perform SRAM programming\n");
763770
fprintf(stderr, " -t just read the flash ID sequence\n");
@@ -806,6 +813,7 @@ int main(int argc, char **argv)
806813
bool reinitialize = false;
807814
bool read_mode = false;
808815
bool check_mode = false;
816+
bool interleaved_verify = false;
809817
bool erase_mode = false;
810818
bool bulk_erase = false;
811819
bool dont_erase = false;
@@ -830,7 +838,7 @@ int main(int argc, char **argv)
830838
/* Decode command line parameters */
831839
int opt;
832840
char *endptr;
833-
while ((opt = getopt_long(argc, argv, "d:i:I:rR:e:o:k:scabnStvpX", long_options, NULL)) != -1) {
841+
while ((opt = getopt_long(argc, argv, "d:i:I:rR:e:o:k:slcabnStvpX", long_options, NULL)) != -1) {
834842
switch (opt) {
835843
case 'd': /* device string */
836844
devstr = optarg;
@@ -915,6 +923,9 @@ int main(int argc, char **argv)
915923
case 's': /* use slow SPI clock */
916924
clkdiv = 30;
917925
break;
926+
case 'l': /* Check every page after write */
927+
interleaved_verify = true;
928+
break;
918929
case 'c': /* do not write just check */
919930
check_mode = true;
920931
break;
@@ -989,6 +1000,11 @@ int main(int argc, char **argv)
9891000
return EXIT_FAILURE;
9901001
}
9911002

1003+
if (interleaved_verify && (read_mode || check_mode || prog_sram || test_mode)) {
1004+
fprintf(stderr, "%s: option `-l' only valid in programming mode\n", my_name);
1005+
return EXIT_FAILURE;
1006+
}
1007+
9921008
if (optind + 1 == argc) {
9931009
if (test_mode) {
9941010
fprintf(stderr, "%s: test mode doesn't take a file name\n", my_name);
@@ -1177,6 +1193,7 @@ int main(int argc, char **argv)
11771193
// ---------------------------------------------------------
11781194
// Program
11791195
// ---------------------------------------------------------
1196+
unsigned int read_blocksize = 256 * 32;
11801197

11811198
if (!read_mode && !check_mode)
11821199
{
@@ -1227,19 +1244,38 @@ int main(int argc, char **argv)
12271244

12281245
if (!erase_mode)
12291246
{
1247+
uint8_t buffer_flash[read_blocksize], buffer_file[read_blocksize], buffer_tx[256];
12301248
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);
1249+
rc = fread(buffer_file, 1, read_blocksize, f);
12381250
if (rc <= 0)
12391251
break;
1240-
flash_write_enable();
1241-
flash_prog(rw_offset + addr, buffer, rc);
1242-
flash_wait();
1252+
1253+
for (int written, block_offset = 0; block_offset < rc; block_offset += written) {
1254+
/* Show progress */
1255+
fprintf(stderr, "\r\033[0Kprogramming.. %04u/%04lu", addr + block_offset, file_size);
1256+
1257+
int write_addr = rw_offset + addr + block_offset;
1258+
written = 256 - write_addr % 256;
1259+
if (block_offset + written > read_blocksize) {
1260+
written = read_blocksize - block_offset;
1261+
}
1262+
1263+
memcpy(buffer_tx, buffer_file + block_offset, written);
1264+
1265+
flash_write_enable();
1266+
flash_prog(write_addr, buffer_tx, written);
1267+
flash_wait();
1268+
}
1269+
1270+
if (!disable_verify && interleaved_verify) {
1271+
flash_start_read(rw_offset + addr);
1272+
flash_continue_read(buffer_flash, rc);
1273+
flash_wait();
1274+
if (memcmp(buffer_file, buffer_flash, rc)) {
1275+
fprintf(stderr, "Found difference between flash and file!\n");
1276+
jtag_error(3);
1277+
}
1278+
}
12431279

12441280
}
12451281

@@ -1256,23 +1292,23 @@ int main(int argc, char **argv)
12561292
if (read_mode) {
12571293

12581294
flash_start_read(rw_offset);
1259-
for (int addr = 0; addr < read_size; addr += 4096) {
1260-
uint8_t buffer[4096];
1295+
for (int addr = 0; addr < read_size; addr += read_blocksize) {
1296+
uint8_t buffer[read_blocksize];
12611297

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

1265-
flash_continue_read(buffer, 4096);
1266-
fwrite(buffer, read_size - addr > 4096 ? 4096 : read_size - addr, 1, f);
1301+
flash_continue_read(buffer, read_blocksize);
1302+
fwrite(buffer, read_size - addr > read_blocksize ? read_blocksize : read_size - addr, 1, f);
12671303
}
12681304
fprintf(stderr, "\n");
1269-
} else if (!erase_mode && !disable_verify) {
1305+
} else if (!erase_mode && !disable_verify && !interleaved_verify) {
12701306

12711307
flash_start_read(rw_offset);
1272-
for (int addr = 0; addr < file_size; addr += 4096) {
1273-
uint8_t buffer_flash[4096], buffer_file[4096];
1308+
for (int addr = 0; addr < file_size; addr += read_blocksize) {
1309+
uint8_t buffer_flash[read_blocksize], buffer_file[read_blocksize];
12741310

1275-
int rc = fread(buffer_file, 1, 4096, f);
1311+
int rc = fread(buffer_file, 1, read_blocksize, f);
12761312
if (rc <= 0)
12771313
break;
12781314

0 commit comments

Comments
 (0)