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+
4852static bool verbose = false;
4953
5054enum device_type {
@@ -373,7 +377,7 @@ static void flash_start_read(int addr)
373377static 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