6060typedef struct flash_t {
6161 uint8_t command ;
6262 uint8_t status ;
63- uint8_t pad ;
63+ uint8_t dirty ;
6464 uint8_t flags ;
6565 uint8_t * array ;
6666
@@ -180,8 +180,10 @@ flash_write(uint32_t addr, uint8_t val, void *priv)
180180 case CMD_ERASE_SETUP :
181181 if (val == CMD_ERASE_CONFIRM ) {
182182 for (uint8_t i = 0 ; i < 6 ; i ++ ) {
183- if ((i == dev -> program_addr ) && (addr >= dev -> block_start [i ]) && (addr <= dev -> block_end [i ]))
183+ if ((i == dev -> program_addr ) && (addr >= dev -> block_start [i ]) && (addr <= dev -> block_end [i ])) {
184184 memset (& (dev -> array [dev -> block_start [i ]]), 0xff , dev -> block_len [i ]);
185+ dev -> dirty = 1 ;
186+ }
185187 }
186188
187189 dev -> status = 0x80 ;
@@ -191,8 +193,10 @@ flash_write(uint32_t addr, uint8_t val, void *priv)
191193
192194 case CMD_PROGRAM_SETUP :
193195 case CMD_PROGRAM_SETUP_ALT :
194- if (((addr & bb_mask ) != (dev -> block_start [6 ] & bb_mask )) && (addr == dev -> program_addr ))
196+ if (((addr & bb_mask ) != (dev -> block_start [6 ] & bb_mask )) && (addr == dev -> program_addr )) {
195197 dev -> array [addr ] = val ;
198+ dev -> dirty = 1 ;
199+ }
196200 dev -> command = CMD_READ_STATUS ;
197201 dev -> status = 0x80 ;
198202 break ;
@@ -238,8 +242,10 @@ flash_writew(uint32_t addr, uint16_t val, void *priv)
238242 case CMD_ERASE_SETUP :
239243 if (val == CMD_ERASE_CONFIRM ) {
240244 for (uint8_t i = 0 ; i < 6 ; i ++ ) {
241- if ((i == dev -> program_addr ) && (addr >= dev -> block_start [i ]) && (addr <= dev -> block_end [i ]))
245+ if ((i == dev -> program_addr ) && (addr >= dev -> block_start [i ]) && (addr <= dev -> block_end [i ])) {
242246 memset (& (dev -> array [dev -> block_start [i ]]), 0xff , dev -> block_len [i ]);
247+ dev -> dirty = 1 ;
248+ }
243249 }
244250
245251 dev -> status = 0x80 ;
@@ -263,8 +269,10 @@ flash_writew(uint32_t addr, uint16_t val, void *priv)
263269 break ;
264270 case CMD_ERASE_SETUP :
265271 for (uint8_t i = 0 ; i < 7 ; i ++ ) {
266- if ((addr >= dev -> block_start [i ]) && (addr <= dev -> block_end [i ]))
272+ if ((addr >= dev -> block_start [i ]) && (addr <= dev -> block_end [i ])) {
267273 dev -> program_addr = i ;
274+ dev -> dirty = 1 ;
275+ }
268276 }
269277 break ;
270278 case CMD_PROGRAM_SETUP :
@@ -529,44 +537,57 @@ intel_flash_init(const device_t *info)
529537 dev -> command = CMD_READ_ARRAY ;
530538 dev -> status = 0 ;
531539
532- fp = nvr_fopen (flash_path , "rb" );
533- if (!dump_missing && (fp != NULL )) {
534- (void ) !fread (& (dev -> array [dev -> block_start [BLOCK_MAIN1 ]]), dev -> block_len [BLOCK_MAIN1 ], 1 , fp );
535- if (dev -> block_len [BLOCK_MAIN2 ])
536- (void ) !fread (& (dev -> array [dev -> block_start [BLOCK_MAIN2 ]]), dev -> block_len [BLOCK_MAIN2 ], 1 , fp );
537- if (dev -> block_len [BLOCK_MAIN3 ])
538- (void ) !fread (& (dev -> array [dev -> block_start [BLOCK_MAIN3 ]]), dev -> block_len [BLOCK_MAIN3 ], 1 , fp );
539- if (dev -> block_len [BLOCK_MAIN4 ])
540- (void ) !fread (& (dev -> array [dev -> block_start [BLOCK_MAIN4 ]]), dev -> block_len [BLOCK_MAIN4 ], 1 , fp );
541-
542- (void ) !fread (& (dev -> array [dev -> block_start [BLOCK_DATA1 ]]), dev -> block_len [BLOCK_DATA1 ], 1 , fp );
543- (void ) !fread (& (dev -> array [dev -> block_start [BLOCK_DATA2 ]]), dev -> block_len [BLOCK_DATA2 ], 1 , fp );
544- fclose (fp );
545- }
540+ if (strlen (flash_path ) != 0 ) {
541+ fp = nvr_fopen (flash_path , "rb" );
542+ if (fp != NULL ) {
543+ if (!dump_missing ) {
544+ (void ) !fread (& (dev -> array [dev -> block_start [BLOCK_MAIN1 ]]), dev -> block_len [BLOCK_MAIN1 ], 1 , fp );
545+ if (dev -> block_len [BLOCK_MAIN2 ])
546+ (void ) !fread (& (dev -> array [dev -> block_start [BLOCK_MAIN2 ]]), dev -> block_len [BLOCK_MAIN2 ], 1 , fp );
547+ if (dev -> block_len [BLOCK_MAIN3 ])
548+ (void ) !fread (& (dev -> array [dev -> block_start [BLOCK_MAIN3 ]]), dev -> block_len [BLOCK_MAIN3 ], 1 , fp );
549+ if (dev -> block_len [BLOCK_MAIN4 ])
550+ (void ) !fread (& (dev -> array [dev -> block_start [BLOCK_MAIN4 ]]), dev -> block_len [BLOCK_MAIN4 ], 1 , fp );
551+
552+ (void ) !fread (& (dev -> array [dev -> block_start [BLOCK_DATA1 ]]), dev -> block_len [BLOCK_DATA1 ], 1 , fp );
553+ (void ) !fread (& (dev -> array [dev -> block_start [BLOCK_DATA2 ]]), dev -> block_len [BLOCK_DATA2 ], 1 , fp );
554+ }
555+ fclose (fp );
556+ } else if (!dump_missing )
557+ dev -> dirty = 1 ;
558+ } else
559+ fatal ("Attempting to open the Flash file for reading with an empty invalid name\n" );
546560
547561 return dev ;
548562}
549563
550564static void
551565intel_flash_close (void * priv )
552566{
553- FILE * fp ;
554567 flash_t * dev = (flash_t * ) priv ;
555568
556- fp = nvr_fopen (flash_path , "wb" );
557- if (!dump_missing ) {
558- fwrite (& (dev -> array [dev -> block_start [BLOCK_MAIN1 ]]), dev -> block_len [BLOCK_MAIN1 ], 1 , fp );
559- if (dev -> block_len [BLOCK_MAIN2 ])
560- fwrite (& (dev -> array [dev -> block_start [BLOCK_MAIN2 ]]), dev -> block_len [BLOCK_MAIN2 ], 1 , fp );
561- if (dev -> block_len [BLOCK_MAIN3 ])
562- fwrite (& (dev -> array [dev -> block_start [BLOCK_MAIN3 ]]), dev -> block_len [BLOCK_MAIN3 ], 1 , fp );
563- if (dev -> block_len [BLOCK_MAIN4 ])
564- fwrite (& (dev -> array [dev -> block_start [BLOCK_MAIN4 ]]), dev -> block_len [BLOCK_MAIN4 ], 1 , fp );
565-
566- fwrite (& (dev -> array [dev -> block_start [BLOCK_DATA1 ]]), dev -> block_len [BLOCK_DATA1 ], 1 , fp );
567- fwrite (& (dev -> array [dev -> block_start [BLOCK_DATA2 ]]), dev -> block_len [BLOCK_DATA2 ], 1 , fp );
569+ if (dev -> dirty ) {
570+ if (strlen (flash_path ) > 0 ) {
571+ FILE * fp = nvr_fopen (flash_path , "wb" );
572+ if (fp != NULL ) {
573+ if (!dump_missing ) {
574+ fwrite (& (dev -> array [dev -> block_start [BLOCK_MAIN1 ]]), dev -> block_len [BLOCK_MAIN1 ], 1 , fp );
575+ if (dev -> block_len [BLOCK_MAIN2 ])
576+ fwrite (& (dev -> array [dev -> block_start [BLOCK_MAIN2 ]]), dev -> block_len [BLOCK_MAIN2 ], 1 , fp );
577+ if (dev -> block_len [BLOCK_MAIN3 ])
578+ fwrite (& (dev -> array [dev -> block_start [BLOCK_MAIN3 ]]), dev -> block_len [BLOCK_MAIN3 ], 1 , fp );
579+ if (dev -> block_len [BLOCK_MAIN4 ])
580+ fwrite (& (dev -> array [dev -> block_start [BLOCK_MAIN4 ]]), dev -> block_len [BLOCK_MAIN4 ], 1 , fp );
581+
582+ fwrite (& (dev -> array [dev -> block_start [BLOCK_DATA1 ]]), dev -> block_len [BLOCK_DATA1 ], 1 , fp );
583+ fwrite (& (dev -> array [dev -> block_start [BLOCK_DATA2 ]]), dev -> block_len [BLOCK_DATA2 ], 1 , fp );
584+ }
585+ fclose (fp );
586+ } else if (!dump_missing )
587+ warning ("Unable to open %s for writing, please make sure your NVR folder is writable\n" , flash_path );
588+ } else
589+ fatal ("Attempting to open the Flash file for writing with an empty invalid name\n" );
568590 }
569- fclose (fp );
570591
571592 free (dev -> array );
572593 dev -> array = NULL ;
0 commit comments