@@ -373,7 +373,7 @@ static void flash_start_read(int addr)
373373static 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