status_code_t nvm_read_char(mem_type_t mem, uint32_t address, uint8_t *data) { switch (mem) { case INT_FLASH: *data = nvm_flash_read_byte((flash_addr_t)address); break; case INT_USERPAGE: nvm_user_sig_read_buffer((flash_addr_t)address, (void *)data, 1); break; case INT_EEPROM: *data = nvm_eeprom_read_byte((eeprom_addr_t)address); break; #if defined(USE_EXTMEM) && defined(CONF_BOARD_AT45DBX) case AT45DBX: if (!at45dbx_read_byte_open(address)) { return ERR_BAD_ADDRESS; } *data = at45dbx_read_byte(); at45dbx_read_close(); break; #endif default: return ERR_INVALID_ARG; } return STATUS_OK; }
/** * Test nvm_user_sig_read_buffer(). * * Test procedure: * - Write to user signature row * - Read back with nvm_user_sig_read_buffer(). * - Verify contents * * \return STATUS_OK if test succeeded, otherwise ERR_BAD_DATA */ static status_code_t test_read(void) { uint8_t i; uint8_t mybuffer[BUFFER_SIZE]; // Clear memory buffer set_buffer(buffer, FLASH_ERASED); // Set some test values buffer[0] = 0xB0; buffer[1] = 0x0B; buffer[2] = 0xB0; buffer[3] = 0x0B; buffer[4] = 0xB0; buffer[5] = 0x0B; // Erase and write test values to user signature row nvm_user_sig_write_buffer(TEST_ADDR, &buffer, BUFFER_SIZE, true); // Read back nvm_user_sig_read_buffer(TEST_ADDR, mybuffer, BUFFER_SIZE); // Verify for (i=0; i < BUFFER_SIZE; i++) { if (buffer[i] != mybuffer[i]) { return ERR_BAD_DATA; } } return STATUS_OK; }
/** \brief Read a buffer from non-volatile RAM * * This routine reads \c count Bytes from the NVRAM source pointed * to by \c src to the destination buffer pointed to by \c dst. * * \param src the read source in the NVRAM address space * \param dst the destination buffer in program data memory space * \param count the number of Bytes to read * * \return Nothing. */ void nvram_read(nvram_addr_t src, void *dst, size_t count) { #if XMEGA nvm_wait_until_ready(); nvm_user_sig_read_buffer((flash_addr_t)(src + SENSOR_NVM_OFFSET), dst, count); #elif UC3 memcpy(dst, (void *)(src + SENSOR_NVM_BASE + SENSOR_NVM_OFFSET), count); #endif }
status_code_t nvm_read(mem_type_t mem, uint32_t address, void *buffer, uint32_t len) { switch (mem) { case INT_FLASH: nvm_flash_read_buffer((flash_addr_t)address, buffer, (uint16_t)len); break; case INT_USERPAGE: nvm_user_sig_read_buffer((flash_addr_t)address, buffer, (uint16_t)len); break; case INT_EEPROM: nvm_eeprom_read_buffer((eeprom_addr_t)address, buffer, (uint16_t)len); break; #if defined(USE_EXTMEM) && defined(CONF_BOARD_AT45DBX) case AT45DBX: { uint32_t sector = address / AT45DBX_SECTOR_SIZE; if (!at45dbx_read_sector_open(sector)) { return ERR_BAD_ADDRESS; } at45dbx_read_sector_to_ram(buffer); at45dbx_read_close(); } break; #endif default: return ERR_INVALID_ARG; } return STATUS_OK; }