/** * Test nvm_eeprom_load_byte_to_buffer(), nvm_eeprom_flush_buffer() and * nvm_eeprom_atomic_write_page() * * Test procedure: * - Erase the TEST_ATOMIC_WRITE_PAGE page. * - Load byte and then flush the buffer at one location. * - Load two more bytes at a different location. * - Write the page. * - Verify that only two bytes are written and the rest of the page is erased. * * \return STATUS_OK if test succeeded, otherwise ERR_BAD_DATA */ static status_code_t test_atomic_write(void) { nvm_eeprom_erase_page(TEST_ATOMIC_WRITE_PAGE); /* Load a dummy byte and then flush the buffer to remove the byte from * the buffer. The byte should not be written to the EEPROM. */ nvm_eeprom_load_byte_to_buffer(0, 55); nvm_eeprom_flush_buffer(); /* Load some additional bytes */ set_buffer(buffer, EEPROM_ERASED); buffer[1] = 0xaa; buffer[2] = 0x19; nvm_eeprom_load_byte_to_buffer(1, buffer[1]); nvm_eeprom_load_byte_to_buffer(2, buffer[2]); /* Erase and then write page */ nvm_eeprom_atomic_write_page(TEST_ATOMIC_WRITE_PAGE); if (is_eeprom_page_equal_to_buffer(TEST_ATOMIC_WRITE_PAGE, buffer)) { return STATUS_OK; } return ERR_BAD_DATA; }
/** * \brief Test EEPROM atomic write * * This test erases test page \ref TEST_ATOMIC_WRITE_PAGE, then writes the first * byte in the page buffer before flushing it -- this byte should then not be * written to the EEPROM -- and writing different values to the two successive * bytes. An atomic write is then executed before the write of the latter two * bytes is verified. * * \param test Current test case. */ static void run_eeprom_atomic_write_test(const struct test_case *test) { uint8_t buffer[EEPROM_PAGE_SIZE]; bool success; nvm_eeprom_erase_page(TEST_ATOMIC_WRITE_PAGE); /* Load a dummy byte and then flush the buffer to remove the byte from * the buffer. The byte should not be written to the EEPROM. */ nvm_eeprom_load_byte_to_buffer(0, 55); nvm_eeprom_flush_buffer(); /* Load some additional bytes */ set_buffer(buffer, EEPROM_ERASED); buffer[1] = 0xaa; buffer[2] = 0x19; nvm_eeprom_load_byte_to_buffer(1, buffer[1]); nvm_eeprom_load_byte_to_buffer(2, buffer[2]); /* Erase and then write page */ nvm_eeprom_atomic_write_page(TEST_ATOMIC_WRITE_PAGE); success = is_eeprom_page_equal_to_buffer(TEST_ATOMIC_WRITE_PAGE, buffer); test_assert_true(test, success, "Page buffer flush, byte load or atomic write failed"); }
status_code_t nvm_page_erase(mem_type_t mem, uint32_t page_number) { switch (mem) { case INT_FLASH: if ((page_number >= 0) && (page_number < (BOOT_SECTION_START / FLASH_PAGE_SIZE))) { nvm_flash_erase_app_page((flash_addr_t)(page_number * FLASH_PAGE_SIZE)); } else if ((page_number >= 0) && (page_number < (BOOT_SECTION_END / FLASH_PAGE_SIZE))) { nvm_flash_erase_boot_page((flash_addr_t)(page_number * FLASH_PAGE_SIZE)); } else { return ERR_INVALID_ARG; } break; case INT_USERPAGE: nvm_flash_erase_user_section(); break; case INT_EEPROM: nvm_eeprom_erase_page((uint8_t)page_number); break; default: return ERR_INVALID_ARG; } return STATUS_OK; }
/** * \brief Test EEPROM write * * This test erases test page \ref TEST_WRITE_PAGE, then writes a single byte to * it and verifies that the write succeeded. * * \param test Current test case. */ static void run_eeprom_write_test(const struct test_case *test) { uint8_t buffer[EEPROM_PAGE_SIZE]; bool success; nvm_eeprom_erase_page(TEST_WRITE_PAGE); set_buffer(buffer, EEPROM_ERASED); buffer[0] = 0xaa; nvm_eeprom_write_byte(TEST_WRITE_PAGE * EEPROM_PAGE_SIZE, buffer[0]); success = is_eeprom_page_equal_to_buffer(TEST_WRITE_PAGE, buffer); test_assert_true(test, success, "Byte write failed"); }
/** * Test nvm_eeprom_erase_page() and nvm_eeprom_write_byte(). * * Test procedure: * - Erase TEST_WRITE_PAGE * - Write one byte * - Verify that the byte is written and that all other bytes are erased. * * \return STATUS_OK if test succeeded, otherwise ERR_BAD_DATA */ static status_code_t test_write(void) { // Test write nvm_eeprom_erase_page(TEST_WRITE_PAGE); set_buffer(buffer, EEPROM_ERASED); buffer[0] = 0xaa; nvm_eeprom_write_byte(TEST_WRITE_PAGE*EEPROM_PAGE_SIZE, buffer[0]); if (is_eeprom_page_equal_to_buffer(TEST_WRITE_PAGE, buffer)) { return STATUS_OK; } return ERR_BAD_DATA; }