@@ -143,6 +143,28 @@ static void write_boot_data(const flash_ctrl_info_page_t *page, size_t index,
143143 "Flash write failed." );
144144}
145145
146+ /**
147+ * Writes a boot data entry at the given page multiple times.
148+
149+ * This function is used to write the same boot data entry to multiple indices
150+ * of a flash info page, as specified by a bitmap.
151+ *
152+ * @param page Flash info page.
153+ * @param bitmap A bitmap where each bit represents an index in the page.
154+ * @param boot_data A boot data entry.
155+ */
156+ static void write_dup_boot_data (const flash_ctrl_info_page_t * page ,
157+ uint32_t bitmap , const boot_data_t * boot_data ) {
158+ boot_data_t invalid = {0 };
159+ for (size_t i = 0 ; i < kBootDataEntriesPerPage ; ++ i ) {
160+ if ((bitmap >> i ) & 1 ) {
161+ write_boot_data (page , i , boot_data );
162+ } else {
163+ write_boot_data (page , i , & invalid );
164+ }
165+ }
166+ }
167+
146168/**
147169 * Reads the boot data entry at the given page and index.
148170 *
@@ -374,66 +396,78 @@ rom_error_t write_empty_test(void) {
374396}
375397
376398rom_error_t write_page_0_first_test (void ) {
377- erase_boot_data_pages ();
378- write_boot_data (kPages [0 ], 0 , & kTestBootData );
379- write_boot_data (kPages [1 ], 0 , & kTestBootDataDual ); // active page
380- RETURN_IF_ERROR (boot_data_redundancy_check ());
381-
382- RETURN_IF_ERROR (boot_data_write (& kTestBootData ));
383- RETURN_IF_ERROR (check_boot_data_redundency (kTestBootData .counter + 2 ));
399+ for (uint32_t bitmap = 1 ; bitmap <= 3 ; ++ bitmap ) {
400+ erase_boot_data_pages ();
401+ write_dup_boot_data (kPages [0 ], bitmap , & kTestBootData );
402+ write_dup_boot_data (kPages [1 ], bitmap , & kTestBootDataDual ); // active page
403+ RETURN_IF_ERROR (boot_data_redundancy_check ());
404+
405+ RETURN_IF_ERROR (boot_data_write (& kTestBootData ));
406+ RETURN_IF_ERROR (check_boot_data_redundency (kTestBootData .counter + 2 ));
407+ }
384408 return kErrorOk ;
385409}
386410
387411rom_error_t write_page_1_first_test (void ) {
388- erase_boot_data_pages ();
389- write_boot_data (kPages [0 ], 0 , & kTestBootDataDual ); // active page
390- write_boot_data (kPages [1 ], 0 , & kTestBootData );
391- RETURN_IF_ERROR (boot_data_redundancy_check ());
392-
393- RETURN_IF_ERROR (boot_data_write (& kTestBootData ));
394- RETURN_IF_ERROR (check_boot_data_redundency (kTestBootData .counter + 2 ^ 1 ));
412+ for (uint32_t bitmap = 1 ; bitmap <= 3 ; ++ bitmap ) {
413+ erase_boot_data_pages ();
414+ write_dup_boot_data (kPages [0 ], bitmap , & kTestBootDataDual ); // active page
415+ write_dup_boot_data (kPages [1 ], bitmap , & kTestBootData );
416+ RETURN_IF_ERROR (boot_data_redundancy_check ());
417+
418+ RETURN_IF_ERROR (boot_data_write (& kTestBootData ));
419+ RETURN_IF_ERROR (check_boot_data_redundency (kTestBootData .counter + 2 ^ 1 ));
420+ }
395421 return kErrorOk ;
396422}
397423
398424rom_error_t write_page_0_missing_test (void ) {
399- erase_boot_data_pages ();
400- write_boot_data (kPages [1 ], 0 , & kTestBootDataDual ); // active page
401- CHECK (boot_data_redundancy_check () == kErrorBootDataInvalid );
425+ for (uint32_t bitmap = 1 ; bitmap <= 3 ; ++ bitmap ) {
426+ erase_boot_data_pages ();
427+ write_dup_boot_data (kPages [1 ], bitmap , & kTestBootDataDual ); // active page
428+ CHECK (boot_data_redundancy_check () == kErrorBootDataInvalid );
402429
403- RETURN_IF_ERROR (boot_data_write (& kTestBootData ));
404- RETURN_IF_ERROR (check_boot_data_redundency (kTestBootData .counter + 2 ));
430+ RETURN_IF_ERROR (boot_data_write (& kTestBootData ));
431+ RETURN_IF_ERROR (check_boot_data_redundency (kTestBootData .counter + 2 ));
432+ }
405433 return kErrorOk ;
406434}
407435
408436rom_error_t write_page_1_missing_test (void ) {
409- erase_boot_data_pages ();
410- write_boot_data (kPages [0 ], 0 , & kTestBootData ); // active page
411- CHECK (boot_data_redundancy_check () == kErrorBootDataInvalid );
437+ for (uint32_t bitmap = 1 ; bitmap <= 3 ; ++ bitmap ) {
438+ erase_boot_data_pages ();
439+ write_dup_boot_data (kPages [0 ], bitmap , & kTestBootData ); // active page
440+ CHECK (boot_data_redundancy_check () == kErrorBootDataInvalid );
412441
413- RETURN_IF_ERROR (boot_data_write (& kTestBootData ));
414- RETURN_IF_ERROR (check_boot_data_redundency (kTestBootData .counter + 2 ^ 1 ));
442+ RETURN_IF_ERROR (boot_data_write (& kTestBootData ));
443+ RETURN_IF_ERROR (check_boot_data_redundency (kTestBootData .counter + 2 ^ 1 ));
444+ }
415445 return kErrorOk ;
416446}
417447
418448rom_error_t write_page_0_invalid_test (void ) {
419- erase_boot_data_pages ();
420- write_boot_data (kPages [1 ], 0 , & kTestBootDataDual ); // active page
421- fill_with_invalidated_boot_data (kPages [0 ], 2 , & kTestBootData );
422- CHECK (boot_data_redundancy_check () == kErrorBootDataInvalid );
449+ for (uint32_t bitmap = 1 ; bitmap <= 3 ; ++ bitmap ) {
450+ erase_boot_data_pages ();
451+ write_dup_boot_data (kPages [1 ], bitmap , & kTestBootDataDual ); // active page
452+ fill_with_invalidated_boot_data (kPages [0 ], 2 , & kTestBootData );
453+ CHECK (boot_data_redundancy_check () == kErrorBootDataInvalid );
423454
424- RETURN_IF_ERROR (boot_data_write (& kTestBootData ));
425- RETURN_IF_ERROR (check_boot_data_redundency (kTestBootData .counter + 2 ));
455+ RETURN_IF_ERROR (boot_data_write (& kTestBootData ));
456+ RETURN_IF_ERROR (check_boot_data_redundency (kTestBootData .counter + 2 ));
457+ }
426458 return kErrorOk ;
427459}
428460
429461rom_error_t write_page_1_invalid_test (void ) {
430- erase_boot_data_pages ();
431- write_boot_data (kPages [0 ], 0 , & kTestBootData ); // active page
432- fill_with_invalidated_boot_data (kPages [1 ], 2 , & kTestBootData );
433- CHECK (boot_data_redundancy_check () == kErrorBootDataInvalid );
462+ for (uint32_t bitmap = 1 ; bitmap <= 3 ; ++ bitmap ) {
463+ erase_boot_data_pages ();
464+ write_dup_boot_data (kPages [0 ], bitmap , & kTestBootData ); // active page
465+ fill_with_invalidated_boot_data (kPages [1 ], 2 , & kTestBootData );
466+ CHECK (boot_data_redundancy_check () == kErrorBootDataInvalid );
434467
435- RETURN_IF_ERROR (boot_data_write (& kTestBootData ));
436- RETURN_IF_ERROR (check_boot_data_redundency (kTestBootData .counter + 2 ^ 1 ));
468+ RETURN_IF_ERROR (boot_data_write (& kTestBootData ));
469+ RETURN_IF_ERROR (check_boot_data_redundency (kTestBootData .counter + 2 ^ 1 ));
470+ }
437471 return kErrorOk ;
438472}
439473
0 commit comments