@@ -132,6 +132,11 @@ def mark_all_pages_not_same(self):
132
132
for page in self .page_list :
133
133
page .same = False
134
134
135
+ def mark_all_pages_unknown (self ):
136
+ """@brief Sets the same flag to False for all pages in this sector."""
137
+ for page in self .page_list :
138
+ page .same = None
139
+
135
140
def __repr__ (self ):
136
141
return "<_FlashSector@%x addr=%x size=%x wgt=%g pages=%s, subsectors=%d>" % (
137
142
id (self ), self .addr , self .size , self .erase_weight , self .page_list , self .n_subsectors )
@@ -417,7 +422,7 @@ def add_page_with_existing_data():
417
422
page = add_page_with_existing_data ()
418
423
sector_page_addr += page .size
419
424
420
- def program (self , chip_erase = None , progress_cb = None , smart_flash = True , fast_verify = False , keep_unwritten = True , no_reset = False ):
425
+ def program (self , chip_erase = None , progress_cb = None , smart_flash = True , fast_verify = False , keep_unwritten = True , no_reset = False , verify = True ):
421
426
"""@brief Determine fastest method of flashing and then run flash programming.
422
427
423
428
Data must have already been added with add_data().
@@ -444,6 +449,8 @@ def program(self, chip_erase=None, progress_cb=None, smart_flash=True, fast_veri
444
449
be read from memory and restored while programming.
445
450
@param no_reset Boolean indicating whether if the device should not be reset after the
446
451
programming process has finished.
452
+ @param verify Boolean indicating whether a verify pass should be performed after the
453
+ programming process has finished.
447
454
"""
448
455
449
456
# Send notification that we're about to program flash.
@@ -535,12 +542,6 @@ def program(self, chip_erase=None, progress_cb=None, smart_flash=True, fast_veri
535
542
else :
536
543
flash_operation = self ._sector_erase_program (progress_cb )
537
544
538
- # Cleanup flash algo and reset target after programming.
539
- self .flash .cleanup ()
540
-
541
- if no_reset is not True :
542
- self .flash .target .reset_and_halt ()
543
-
544
545
program_finish = time ()
545
546
self .perf .program_time = program_finish - program_start
546
547
self .perf .program_type = flash_operation
@@ -571,6 +572,23 @@ def program(self, chip_erase=None, progress_cb=None, smart_flash=True, fast_veri
571
572
self .perf .skipped_byte_count = skipped_byte_count
572
573
self .perf .skipped_page_count = skipped_page_count
573
574
575
+ if verify :
576
+ LOG .info ("Verifying" )
577
+ # Reset same flag for all pages to enable rescanning
578
+ for sector in self .sector_list :
579
+ sector .mark_all_pages_unknown ()
580
+ self ._scan_pages_for_same (progress_cb )
581
+ failed_pages = [page for page in self .page_list if page .same is False ]
582
+ if failed_pages :
583
+ LOG .debug ("Verify failed for pages {}" .format (failed_pages ))
584
+ raise FlashProgramFailure ('flash verify failure' , address = failed_pages [0 ].addr )
585
+
586
+ # Cleanup flash algo and reset target after programming.
587
+ self .flash .cleanup ()
588
+
589
+ if no_reset is not True :
590
+ self .flash .target .reset_and_halt ()
591
+
574
592
if self .log_performance :
575
593
if chip_erase :
576
594
LOG .info ("Erased chip, programmed %d bytes (%s), skipped %d bytes (%s) at %.02f kB/s" ,
@@ -899,12 +917,6 @@ def _scan_pages_for_same(self, progress_cb=_stub_progress):
899
917
if self .sector_erase_weight > 0 :
900
918
progress_cb (float (progress ) / float (self .sector_erase_weight ))
901
919
902
- # If we have to program any pages of a sector, then mark all pages of that sector
903
- # as needing to be programmed, since the sector will be erased.
904
- for sector in self .sector_list :
905
- if sector .are_any_pages_not_same ():
906
- sector .mark_all_pages_not_same ()
907
-
908
920
return progress
909
921
910
922
def _next_nonsame_page (self , i ):
@@ -937,6 +949,8 @@ def _sector_erase_program_double_buffer(self, progress_cb=_stub_progress):
937
949
self .flash .init (self .flash .Operation .ERASE )
938
950
for sector in self .sector_list :
939
951
if sector .are_any_pages_not_same ():
952
+ # If the sector is erased, all its pages must be programmed
953
+ sector .mark_all_pages_not_same ()
940
954
# Erase the sector
941
955
for addr in sector .addrs :
942
956
self .flash .erase_sector (addr )
0 commit comments