@@ -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 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