NVM3 - NVM Data Manager#

NVM3 Non-Volatile Memory Data Management driver.

Introduction#

The NVM3 driver provides a way for an application to safely store and retrieve variable-size objects in a page-based non-volatile memory (NVM). Objects are identified with 20-bit object identifiers denoted as keys.

The driver is designed to use pages in a sequential order to provide equal usage and wear. The driver is resilient to power loss or reset events, ensuring that objects retrieved from the driver are in a valid state. A valid object will always be the last successfully stored object. NVM3 can detect NVM defects and mark pages as unusable. NVM3 will continue to operate on good pages after defect pages are detected.

Objects#

An NVM3 object is data that can be stored in NVM. The object is handled as an array of bytes up to NVM3_MAX_OBJECT_SIZE in size. NVM3 can handle two types of objects.

  1. Regular data objects. Data objects can store information of any size up to maximum NVM3_MAX_OBJECT_SIZE bytes.

  2. 32-bit counter objects. Counter objects can store 32-bit counters that are accessed with a separate set of API functions. The counter object is designed to be compact while minimizing memory wear in applications that require frequent persistent counter increments.

See The API for more details on the API.

Repacking#

As the NVM fills up, it reaches a point where it can no longer store additional objects, and a repacking operation is required to release out-of-date objects to free up NVM. Because both writing data and erasing pages take a long time, the NVM3 driver does not trigger the process by itself unless free memory reaches a critical low level. As an alternative, the application can trigger the repacking process by calling the nvm3_repack() function. During the call, NVM3 will either move data to a new page or erase pages that can be reused. At most, the call will block for a period equal to a page erasure time or the time to write the largest size object (whatever is largest) plus a small execution overhead. Page erasure and flash write timing for the EFM32 or EFR32 parts can be found in the datasheet.

NVM3 uses two thresholds for repacking:

  1. Forced threshold. This is the threshold used to force automatic repacking when free memory reaches a critical low level.

  2. User threshold. This is the threshold used by nvm3_repackNeeded(). nvm3_repack() will not perform repacking unless free memory is below this threshold.

The user can define the user threshold by entering a value in the repackHeadroom member of the nvm3_Init_t structure used by the nvm3_open() function. The repackHeadroom value defines the difference between the user and forced threshold. The forced threshold is the minimum low memory threshold defined by the page size and maximum object size and can't be changed by the user. The default value for the repack headroom is 0, meaning that the forced and user thresholds are equal.

An NVM3 function that deletes or modifies data or counter object will trigger an automatic repack operation when free memory is below the forced threshold. The check is done before the object is modified, not after.

The application can use nvm3_repackNeeded() to determine if repacking is needed. To initiate repacks, call nvm3_repack(). Note that this function will perform repacks only if they are needed.

Note

  • The repack threshold can be changed to prevent multiple modifications of objects between user called repacks from causing forced repacks. Note that "high" values of the repack headroom may cause increased NVM wear from increased number of repacks.

See Execution Timing section for more details on repack timing.

Caching#

NVM3 includes an object location lookup cache to speed up object access, as searching through the entire NVM3 contents for an object could otherwise be slow. It is important to note that this cache only stores the location of the object and not the object data itself. To ensure that cache can hold all necessary information, it must be configured to a size equivalent to or larger than the number of objects stored in NVM, including those deleted, as long as they are not discarded by the repack function. If the cache is available, the driver will first look in the cache to find the position of the object in NVM. If the object position is not found in the cache, the object position will be found by searching the NVM. The search will start at the last stored object and search all the way to the oldest object. If the object is found, the cache is updated accordingly.

The application must allocate and support data for the cache. See the nvm3_open function for more details. The size of each cache element is one uint32_t and one pointer giving a total of 8 bytes (2 words) pr. entry for EFM32 and EFR32 devices.

Note

  • The cache is fully initialized by nvm3_open() and automatically updated by any subsequent write, read, or delete function call.

Global Data (variables)#

The NVM3 library uses global variables to store intermediate data during open, read, write, increment, and delete calls. Because the actual memory configuration is not defined at the time the NVM3 library is built but rather at the time the user application is built, the size of data structures must be determined by the application configuration. Also, the application must set the value of the nvm3_maxFragmentCount at run-time before any NVM3 functions are called.

NVM3 does not support overlapped calls. If there is any chance that the application can issue overlapped calls, the NVM3 locking mechanism must be present and protected from that.

Note

  • If the application uses more than one NVM3 instance, the variables will be shared between the instances. Be sure to allocate data that have a size that is large enough for the largest usage.

Stack Usage#

NVM3 library function calls are nested several levels deep. The stack usage has been measured on some EFM32, and EFR32 targets with library builds for IAR and ARM GCC. The maximum stack usage measured was 420 bytes for IAR, and 472 bytes for ARM GCC builds. The unit test used to validate the stack usage has a 10% margin and uses a stack limit of 462 bytes for IAR and 520 for ARM GCC. Note that the actual stack usage is a little different on the Cortex M0 Plus, M3, M4, and M33 versions of the library.

The API#

The NVM3 API is defined in the nvm3.h file. The application code must include the nvm3.h header file to get access to all definitions, datatypes, and function prototypes defined by NVM3.

This section contains brief descriptions of NVM3 functions. For more information about parameters and return values, see the Function documentation section. Most functions return an Ecode_t that has the value ECODE_NVM3_OK on success, or see nvm3.h for other values.

nvm3_open() and nvm3_close(). These functions open and close an NVM3 instance. nvm3_open() takes a handle of type nvm3_Handle_t and initialization data of type nvm3_Init_t. The helper macro pair NVM3_DEFINE_SECTION_STATIC_DATA() and NVM3_DEFINE_SECTION_INIT_DATA() are provided to simplify initialization data definition. For usage examples, see the Examples section.

nvm3_getObjectInfo(), nvm3_enumObjects(), nvm3_deleteObject() and nvm3_countObjects() These functions work on all objects. nvm3_enumObjects() gets a list of keys to valid objects in the NVM. The search can also be constrained by the function parameters. nvm3_countObjects() can be useful at startup to distinguish between a first startup without any valid objects present and later reboots with valid objects persistently stored in NVM.

nvm3_writeData() and nvm3_readData() Write and read data objects.

nvm3_writeCounter(), nvm3_readCounter() and nvm3_incrementCounter() Write, read, and increment 32-bit counter objects.

nvm3_eraseAll() Erase all objects in NVM.

nvm3_getEraseCount() Return the erasure count for the most erased page in NVM.

nvm3_repack() and nvm3_repackNeeded() Manage NVM3 repacking operations.

nvm3_resize() Resize the NVM area used by an open NVM3 instance.

API Locking and Interrupt handling#

Common for all NVM3 API calls is that they are not re-entrant. By default, all functions are protected with protection functions that disable interrupts.

Note

  • The default NVM3 protection functions can be substituted by the application if other synchronization functions are available and disabling interrupts for extended periods is not desired.

If the application does all the nvm3-calls from the same thread and guarantees no overlapping calls, the lock functions don't have to do anything.

Memory Placement#

The application is responsible for placing the NVM area correctly. The minimum requirements for memory placement are as follows:

  1. NVM area start address must be aligned with a page of the underlying memory system.

  2. NVM area size must be a multiple of the page size.

The minimum required NVM size is dependent on both the NVM page size and the NVM3_MAX_OBJECT_SIZE value. For a device with 2 kB page size and typical values for NVM3_MAX_OBJECT_SIZE, the following is the minimum required number of pages:

  • For NVM3_MAX_OBJECT_SIZE=208: 3 pages

  • For NVM3_MAX_OBJECT_SIZE=1900: 4 pages

  • For NVM3_MAX_OBJECT_SIZE=4096: 5 pages

NVM3_DEFINE_SECTION_STATIC_DATA() and NVM3_DEFINE_SECTION_INIT_DATA() macros are provided to support the creation of the NVM area and initialization data. A linker section called 'name'_section is defined by NVM3_DEFINE_SECTION_STATIC_DATA(). The NVM area is placed within the linker section. The application linker script must place the section according to the requirements above. An error is returned by nvm3_open() on alignment or size violation.

Note

  • When the start address and size of the data area are defined and used by an application, make sure you use the same values at every program startup and also reuse by new versions of the software after an upgrade. If an application tries to open an instance with a start address or size that does not match the previous use, it can result in permanent data loss and failure.

Configuration Options#

There are no compile-time configuration options for NVM3. All configuration parameters are contained in nvm3_Init_t.

Note

  • The Global Data (variables) must however be configured for correct size and have correct values for NVM3 to behave correctly.

Bad NVM Page Handling#

NVM3 has been designed to detect page erase and write errors during normal operation and mark failing pages as BAD. If a write operation fails, all objects that have been written to the page prior to the write error are copied to the next free page before the page is marked as BAD and the write operation resumes. If the recovery operation is successful, the operation is regarded as complete, and the function will return ECODE_NVM3_OK status.

Note

  • Erase and write errors may not be detected by NVM3 if the device is used until End-of-Life (EOL), where the failure mode can be that the NVM content is changing during a power cycle.

Error Handling#

The NVM3 error handling involves most functions returning an error code. The nvm3_countObjects is different because it returns the actual number of objects found.

The behavior and return values for most functions, such as nvm3_readData, nvm3_writeData, and so on should be self explanatory, while the nvm3_open is slightly different. nvm3_open will always try to recover from the previous state and continue without an error, if possible. In other words, if a valid NVM3 instance is established, nvm3_open will recover from brownouts and power cycles at any time in any operation and bring the system to a valid state where all pages and objects are in a known state and return success whenever possible. From this state, normal operation can resume. If nvm3_open returns an error, it's an indication of either a design or coding error or that many of the NVM pages have been marked as BAD, leaving insufficient space in the NVM to progress. Operation may not resume if nvm3_open returns an error.

Note

  • Because the nvm3_open may need to do recovery operations, the execution time will occasionally vary.

Storing Objects in Internal Flash#

NVM3 has support for writing and reading objects in internal, i.e., memory-mapped Flash memory through the nvm3_hal_flash.c "driver". nvm3_hal_flash.c is using EMLIB functions to write and erase data while using regular memory functions to read data from Flash.

The "driver" for internal Flash is selected by setting the halHandle in the nvm3_open initialization structure to point to nvm3_halFlashHandle.

NVM3 Libraries#

The NVM3 comes with pre-compiled libraries for Cortex M0, M3, M4, and M33 compiled with either Arm GCC or IAR toolchains.

Storage Capacity#

Basic storage is defined as the size of on instance of all objects, including any overhead stored with the data. For NVM3 the maximum amount of data you can store is dependent on the number of flash pages used for storage and the max object size used for NVM3. The following table shows the maximum allowed basic storage for a varying number of 2 kB or 8 kB flash pages and the minimum (208 bytes), default (254 bytes), high (1900 bytes) and maximum (4096 bytes) max object size. Note that this is a theoretical limit, and if the basic storage is at this limit, no space is left for wear-levelling, and page erases will be forced for every object written. The NVM3 instance should therefore be configured with enough flash pages to put the maximum allowed basic storage significantly higher than the actual basic storage.

Max Allowed Basic Storage with 2 kB page size#

Flash pages

Total size (bytes)

Max allowed basic storage (bytes)

Max object size = 208 bytes

Max object size = 254 bytes

Max object size = 1900 bytes

Max object size = 4096 bytes

3

6144

1596

1504

0

0

4

8192

3624

3532

240

0

5

10240

5652

5560

2268

0

6

12288

7680

7588

4296

0

7

14336

9708

9616

6324

0

8

16384

11736

11644

8352

0

9

18432

13764

13672

10380

1900

10

20480

15792

15700

12408

3928

11

22528

17820

17728

14436

5956

12

24576

19848

19756

16464

7984

13

26624

21876

21784

18492

10012

14

28672

23904

23812

20520

12040

15

30720

25932

25840

22548

14068

16

32768

27960

27868

24576

16096

17

34816

29988

29896

26604

18124

18

36864

32016

31924

28632

20152

Max Allowed Basic Storage with 8 kB page size#

Flash pages

Total size (bytes)

Max allowed basic storage (bytes)

Max object size = 208 bytes

Max object size = 254 bytes

Max object size = 1900 bytes

Max object size = 4096 bytes

3

24516

7740

7648

4356

0

4

32688

15912

15820

12528

8136

5

40860

24084

23992

20700

16308

6

49032

32256

32164

28872

24480

Default Instance#

Several NVM3 instances can be created on a device and live independently of each other, but to save memory, it is usually desirable to use only one NVM3 instance as each instance adds some overhead. For this reason, a default instance exists that is used by all Silicon Labs wireless stacks. The API to initialize the default instance and the handles to use with the regular NVM3 API are described in NVM3 Default Instance.

NVM3 in Simplicity Commander#

Simplicity Commander is a single, all-purpose tool to be used in a production environment. It is invoked using a simple Command Line Interface (CLI) that can also be scripted. Simplicity Commander supports reading out the NVM3 data area from a device and parsing the NVM3 data to extract stored values. This can be useful in a debugging scenario where you may need to find out the stored state of an application that has been running for some time.

For more information about using the Simplicity Commander with NVM3, see UG162: Simplicity Commander Reference Guide.

Execution Timing#

There are several factors that affect the execution time for NVM3 calls that can update the NVM, described below.

The primary factor when doing updates is that data must be written to flash. Writing to flash is relatively slow, and timing information for the particular device is available in the datasheet and can be used to calculate the approximately minimum execution time. Note that NVM3 will, in addition to the user data, write object headers, and the software will add some overhead. The relative overhead will be larger for smaller compared to larger objects.

When updating the flash store, repacking must be done from time to time. See the Repacking section for more details about why repacking is needed and how it works.

To minimize the time when repacks are executed, there are a few configurations that affect how NVM3 works. The most important configurations are listed below:

  1. The repackHeadroom parameter in the nvm3_Init_t structure can be used to set the number of bytes that can be written before a forced repack is triggered. To make this work, the nvm3_repack() function must be called until the nvm3_repackNeeded() returns false before the actual write.

  2. Use as small objects as possible and define the NVM3_MAX_OBJECT_SIZE accordingly. Writing and repacking large objects is time-consuming. Limiting the maximum object size will limit the time spent in both write and repack functions.

When triggered, the repack function will either copy data or erase a page. To limit the time spent when copying, the repack function will return when the NVM3_MAX_OBJECT_SIZE number of bytes have been copied. The copy operation will resume on the next call to repack, and the application may have to call the repack function several times to complete a full repack operation.

Note

Examples#

Example 1 shows initialization, usage of data objects, and repacking.

#include "nvm3.h"
#include "nvm3_hal_flash.h"

// Create a NVM area of 24kB (size must equal N * FLASH_PAGE_SIZE, N is integer). Create a cache of 10 entries.
NVM3_DEFINE_SECTION_STATIC_DATA(nvm3Data1, 24576, 10);

// This macro creates the following:
// 1. An array to hold NVM data named nvm3Data1_nvm
// 2. A section called nvm3Data1_section containing nvm3Data1_nvm. The application linker script must place this section correctly in memory.
// 3. A cache array: nvm3Data1_cache

void nvm3_example_1(void)
{
  // Declare a nvm3_Init_t struct of name nvm3Data1 with initialization data. This is passed to nvm3_open() below.
  NVM3_DEFINE_SECTION_INIT_DATA(nvm3Data1, &nvm3_halFlashHandle);

  nvm3_Handle_t handle;
  Ecode_t status;
  size_t numberOfObjects;
  unsigned char data1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  unsigned char data2[] = { 11, 12, 13, 14, 15 };
  uint32_t objectType;
  size_t dataLen1;
  size_t dataLen2;

  status = nvm3_open(&handle, &nvm3Data1);
  if (status != ECODE_NVM3_OK) {
    // Handle error
  }

  // Get the number of valid keys already in NVM3
  numberOfObjects = nvm3_countObjects(&handle);

  // Skip if we have initial keys. If not, generate objects and store
  // persistently in NVM3 before proceeding.
  if (numberOfObjects < 2) {
    // Erase all objects and write initial data to NVM3
    nvm3_eraseAll(&handle);
    nvm3_writeData(&handle, 1, data1, sizeof(data1));
    nvm3_writeData(&handle, 2, data2, sizeof(data2));
  }

  // Find size of data for object with key identifier 1 and 2 and read out
  nvm3_getObjectInfo(&handle, 1, &objectType, &dataLen1);
  if (objectType == NVM3_OBJECTTYPE_DATA) {
    nvm3_readData(&handle, 1, data1, dataLen1);
  }
  nvm3_getObjectInfo(&handle, 2, &objectType, &dataLen2);
  if (objectType == NVM3_OBJECTTYPE_DATA) {
    nvm3_readData(&handle, 2, data2, dataLen2);
  }

  // Update and write back data
  data1[0]++;
  data2[0]++;
  nvm3_writeData(&handle, 1, data1, dataLen1);
  nvm3_writeData(&handle, 2, data2, dataLen2);

  // Do repacking if needed
  if (nvm3_repackNeeded(&handle)) {
    status = nvm3_repack(&handle);
    if (status != ECODE_NVM3_OK) {
      // Handle error
    }
  }
}

Example 2 shows initialization and usage of counter objects. The counter object uses a compact way of storing a 32-bit counter value while minimizing NVM wear.

#include "nvm3.h"
#include "nvm3_hal_flash.h"

// Create a NVM area of 24kB (size must equal N * FLASH_PAGE_SIZE, N is integer). Create a cache of 10 entries.
NVM3_DEFINE_SECTION_STATIC_DATA(nvm3Data2, 24576, 10);

#define USER_KEY        1

// This macro creates the following:
// 1. An array to hold NVM data named nvm3Data2_nvm
// 2. A section called nvm3Data2_section containing nvm3Data2_nvm. The application linker script must place this section correctly in memory.
// 3. A cache array: nvm3Data2_cache

void nvm3_example_2(void)
{
  // Declare a nvm3_Init_t struct of name nvm3Data2 with initialization data. This is passed to nvm3_open() below.
  NVM3_DEFINE_SECTION_INIT_DATA(nvm3Data2, &nvm3_halFlashHandle);

  nvm3_Handle_t handle;
  Ecode_t status;
  uint32_t counter = 1;

  status = nvm3_open(&handle, &nvm3Data2);
  if (status != ECODE_NVM3_OK) {
    // Handle error
  }

  // Erase all objects
  nvm3_eraseAll(&handle);

  // Write first counter value with key 1
  nvm3_writeCounter(&handle, USER_KEY, counter);

  // Increment the counter by 1 without reading out the updated value
  nvm3_incrementCounter(&handle, USER_KEY, NULL);

  // Read the counter value
  nvm3_readCounter(&handle, USER_KEY, &counter);
}

Modules#

nvm3_CacheEntry_t

nvm3_Init_t

nvm3_ObjFrag_t

nvm3_Obj_t

NVM3 Default Instance

NVM3 HAL

NVM3 Lock

Typedefs#

typedef uint32_t

The data type for object keys. Only the 20 least significant bits are used.

Variables#

A variable used by the NVM3 functions.

A variable used by the NVM3 functions.

A variable used by the NVM3 functions.

A variable used by the NVM3 functions.

const uint8_t

A variable that must contain the maximum number of object fragments.

const size_t

A variable containing the object handle size in bytes.

Functions#

Ecode_t
nvm3_open(nvm3_Handle_t *h, const nvm3_Init_t *i)

Open an NVM3 driver instance, which is represented by a handle keeping information about the state.

Ecode_t
nvm3_close(nvm3_Handle_t *h)

Close the NVM3 driver instance.

Ecode_t
nvm3_writeData(nvm3_Handle_t *h, nvm3_ObjectKey_t key, const void *value, size_t len)

Write the object value identified with the key to NVM.

Ecode_t
nvm3_readData(nvm3_Handle_t *h, nvm3_ObjectKey_t key, void *value, size_t len)

Read the object data identified with a given key from NVM.

Ecode_t
nvm3_readPartialData(nvm3_Handle_t *h, nvm3_ObjectKey_t key, void *value, size_t ofs, size_t len)

Read parts of the object data identified with a given key from NVM.

Ecode_t
nvm3_getObjectInfo(nvm3_Handle_t *h, nvm3_ObjectKey_t key, uint32_t *type, size_t *len)

Find the type and size of an object in NVM.

size_t
nvm3_enumObjects(nvm3_Handle_t *h, nvm3_ObjectKey_t *keyListPtr, size_t keyListSize, nvm3_ObjectKey_t keyMin, nvm3_ObjectKey_t keyMax)

Create a list of object keys for valid objects in NVM.

size_t
nvm3_enumDeletedObjects(nvm3_Handle_t *h, nvm3_ObjectKey_t *keyListPtr, size_t keyListSize, nvm3_ObjectKey_t keyMin, nvm3_ObjectKey_t keyMax)

Create a list of object keys for deleted objects in NVM.

Ecode_t
nvm3_deleteObject(nvm3_Handle_t *h, nvm3_ObjectKey_t key)

Delete an object from NVM.

Ecode_t
nvm3_writeCounter(nvm3_Handle_t *h, nvm3_ObjectKey_t key, uint32_t value)

Store a counter in NVM.

Ecode_t
nvm3_readCounter(nvm3_Handle_t *h, nvm3_ObjectKey_t key, uint32_t *value)

Read a counter value from NVM.

Ecode_t
nvm3_incrementCounter(nvm3_Handle_t *h, nvm3_ObjectKey_t key, uint32_t *newValue)

Increment a counter object value by 1 and read out optionally.

Ecode_t
nvm3_eraseAll(nvm3_Handle_t *h)

Delete all objects in NVM.

Ecode_t
nvm3_getEraseCount(nvm3_Handle_t *h, uint32_t *eraseCnt)

Get the number of page erases of the most erased page in the NVM area since the first initialization.

void
nvm3_setEraseCount(uint32_t eraseCnt)

Set the page erase count.

Ecode_t
nvm3_repack(nvm3_Handle_t *h)

Execute a repack operation.

bool
nvm3_repackNeeded(nvm3_Handle_t *h)

Check the internal status of NVM3 and return true if a repack operation is required.

Ecode_t
nvm3_resize(nvm3_Handle_t *h, nvm3_HalPtr_t newAddr, size_t newSize)

Resize the NVM area used by an open NVM3 instance.

size_t
nvm3_countObjects(nvm3_Handle_t *h)

Count valid objects.

size_t
nvm3_countDeletedObjects(nvm3_Handle_t *h)

Count deleted objects.

Macros#

#define
ECODE_NVM3_OK (ECODE_OK)

Success return value.

#define
ECODE_NVM3_ERR_ALIGNMENT_INVALID (ECODE_EMDRV_NVM3_BASE | 0x00000001U)

Invalid data alignment.

#define
ECODE_NVM3_ERR_SIZE_TOO_SMALL (ECODE_EMDRV_NVM3_BASE | 0x00000002U)

Not enough NVM memory specified.

#define
ECODE_NVM3_ERR_NO_VALID_PAGES (ECODE_EMDRV_NVM3_BASE | 0x00000003U)

Initialization aborted, no valid page found.

#define
ECODE_NVM3_ERR_PAGE_SIZE_NOT_SUPPORTED (ECODE_EMDRV_NVM3_BASE | 0x00000004U)

The page size is not supported.

#define
ECODE_NVM3_ERR_OBJECT_SIZE_NOT_SUPPORTED (ECODE_EMDRV_NVM3_BASE | 0x00000005U)

The object size is not supported.

#define
ECODE_NVM3_ERR_STORAGE_FULL (ECODE_EMDRV_NVM3_BASE | 0x00000006U)

No more NVM space available.

#define
ECODE_NVM3_ERR_NOT_OPENED (ECODE_EMDRV_NVM3_BASE | 0x00000007U)

The module has not been successfully opened.

#define
ECODE_NVM3_ERR_OPENED_WITH_OTHER_PARAMETERS (ECODE_EMDRV_NVM3_BASE | 0x00000008U)

The module has already been opened with other parameters.

#define
ECODE_NVM3_ERR_PARAMETER (ECODE_EMDRV_NVM3_BASE | 0x00000009U)

Illegal parameter.

#define
ECODE_NVM3_ERR_KEY_INVALID (ECODE_EMDRV_NVM3_BASE | 0x0000000AU)

Invalid key value.

#define
ECODE_NVM3_ERR_KEY_NOT_FOUND (ECODE_EMDRV_NVM3_BASE | 0x0000000BU)

Key not found.

#define
ECODE_NVM3_ERR_OBJECT_IS_NOT_DATA (ECODE_EMDRV_NVM3_BASE | 0x0000000CU)

Trying to access a data object which is currently a counter object.

#define
ECODE_NVM3_ERR_OBJECT_IS_NOT_A_COUNTER (ECODE_EMDRV_NVM3_BASE | 0x0000000DU)

Trying to access a counter object which is currently a data object.

#define
ECODE_NVM3_ERR_ERASE_FAILED (ECODE_EMDRV_NVM3_BASE | 0x0000000EU)

Erase failed.

#define
ECODE_NVM3_ERR_WRITE_DATA_SIZE (ECODE_EMDRV_NVM3_BASE | 0x0000000FU)

The object is too large.

#define
ECODE_NVM3_ERR_WRITE_FAILED (ECODE_EMDRV_NVM3_BASE | 0x00000010U)

Error in the write operation.

#define
ECODE_NVM3_ERR_READ_DATA_SIZE (ECODE_EMDRV_NVM3_BASE | 0x00000011U)

Trying to read with a length different from actual object size.

#define
ECODE_NVM3_ERR_READ_FAILED (ECODE_EMDRV_NVM3_BASE | 0x00000012U)

Error in the read operation.

#define
ECODE_NVM3_ERR_INIT_WITH_FULL_NVM (ECODE_EMDRV_NVM3_BASE | 0x00000013U)

The module was opened with a full NVM.

#define
ECODE_NVM3_ERR_RESIZE_PARAMETER (ECODE_EMDRV_NVM3_BASE | 0x00000014U)

Illegal parameter.

#define
ECODE_NVM3_ERR_RESIZE_NOT_ENOUGH_SPACE (ECODE_EMDRV_NVM3_BASE | 0x00000015U)

Not enough NVM to complete resize.

#define
ECODE_NVM3_ERR_ERASE_COUNT_ERROR (ECODE_EMDRV_NVM3_BASE | 0x00000016U)

Erase counts are not valid.

#define
ECODE_NVM3_ERR_ADDRESS_RANGE (ECODE_EMDRV_NVM3_BASE | 0x00000017U)

Address and size is out of range of available NVM.

#define
ECODE_NVM3_ERR_NVM_ACCESS (ECODE_EMDRV_NVM3_BASE | 0x00000019U)

A NVM function call was failing.

#define
ECODE_NVM3_ERR_INT_WRITE_TO_NOT_ERASED (ECODE_EMDRV_NVM3_BASE | 0x00000020U)

Write to memory that is not erased.

#define
ECODE_NVM3_ERR_INT_ADDR_INVALID (ECODE_EMDRV_NVM3_BASE | 0x00000021U)

Internal error trying to access invalid memory.

#define
ECODE_NVM3_ERR_INT_KEY_MISMATCH (ECODE_EMDRV_NVM3_BASE | 0x00000022U)

Key validation failure.

#define
ECODE_NVM3_ERR_INT_SIZE_ERROR (ECODE_EMDRV_NVM3_BASE | 0x00000023U)

Internal size mismatch error.

#define
ECODE_NVM3_ERR_INT_EMULATOR (ECODE_EMDRV_NVM3_BASE | 0x00000024U)

Internal Emulator error.

#define
ECODE_NVM3_ERR_INT_TEST (ECODE_EMDRV_NVM3_BASE | 0x00000030U)

Internal Test error.

#define

Definitions of NVM3 constraints.

#define

The minimum value for the maximum object size.

#define

The maximum value for the maximum object size.

#define

The default value for the maximum object size.

#define
NVM3_MAX_OBJECT_SIZE NVM3_MAX_OBJECT_SIZE_DEFAULT

The maximum object size.

#define
NVM3_DEFINE_SECTION_STATIC_DATA (name, nvmSize, cacheSize)

NVM3 static data definition helper macro for applications using linker script placement of the NVM memory area.

#define
NVM3_DEFINE_SECTION_INIT_DATA (name, flashHandle)

NVM3 initialization data helper macro to be used with NVM3_DEFINE_SECTION_STATIC_DATA().

#define
NVM3_KEY_INVALID 0xFFFFFFFFU

Invalid key identifier.

#define

Unique object key identifier size in number of bits.

#define
NVM3_KEY_MASK ((1U << NVM3_KEY_SIZE) - 1U)

Unique object key identifier mask.

#define

Minimum object key value.

#define
NVM3_KEY_MAX NVM3_KEY_MASK

Maximum object key value.

#define

The object is data.

#define

The object is a counter.

#define

The minimum number of fragments.

Typedef Documentation#

nvm3_ObjectKey_t#

typedef uint32_t nvm3_ObjectKey_t

The data type for object keys. Only the 20 least significant bits are used.


Definition at line 137 of file platform/emdrv/nvm3/inc/nvm3_generic.h

Variable Documentation#

nvm3_internalObjectHandleA#

nvm3_Obj_t nvm3_internalObjectHandleA

A variable used by the NVM3 functions.


Definition at line 82 of file platform/emdrv/nvm3/inc/nvm3.h

nvm3_internalObjectHandleB#

nvm3_Obj_t nvm3_internalObjectHandleB

A variable used by the NVM3 functions.


Definition at line 84 of file platform/emdrv/nvm3/inc/nvm3.h

nvm3_internalObjectHandleC#

nvm3_Obj_t nvm3_internalObjectHandleC

A variable used by the NVM3 functions.


Definition at line 86 of file platform/emdrv/nvm3/inc/nvm3.h

nvm3_internalObjectHandleD#

nvm3_Obj_t nvm3_internalObjectHandleD

A variable used by the NVM3 functions.


Definition at line 88 of file platform/emdrv/nvm3/inc/nvm3.h

nvm3_maxFragmentCount#

const uint8_t nvm3_maxFragmentCount

A variable that must contain the maximum number of object fragments.


Definition at line 90 of file platform/emdrv/nvm3/inc/nvm3.h

nvm3_objHandleSize#

const size_t nvm3_objHandleSize

A variable containing the object handle size in bytes.


Definition at line 92 of file platform/emdrv/nvm3/inc/nvm3.h

Function Documentation#

nvm3_open#

Ecode_t nvm3_open (nvm3_Handle_t *h, const nvm3_Init_t *i)

Open an NVM3 driver instance, which is represented by a handle keeping information about the state.

Parameters
[out]h

A pointer to an NVM3 driver handle.

[in]i

A pointer to NVM3 driver initialization data.

A successful open will initialize the handle and the cache with information about the objects already in the NVM-memory. Several NVM3 instances using different handles must NOT overlap NVM-memory. To change some of the parameters, first call nvm3_close and then nvm3_open. Note

  • The driver handle must be initialized to zero before it is used the first time. The nvm3_open can be called repeatedly with the same handle and initialization data. In that case, the next calls will be regarded as a "no operation" and the function will return the same status as the previous call.

Returns


Definition at line 214 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_close#

Ecode_t nvm3_close (nvm3_Handle_t *h)

Close the NVM3 driver instance.

Parameters
[in]h

A pointer to the NVM3 driver handle.

Returns


Definition at line 226 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_writeData#

Ecode_t nvm3_writeData (nvm3_Handle_t *h, nvm3_ObjectKey_t key, const void *value, size_t len)

Write the object value identified with the key to NVM.

Parameters
[in]h

A pointer to an NVM3 driver handle.

[in]key

A 20-bit object identifier.

[in]value

A pointer to the object data to write.

[in]len

The size of the object data in number of bytes.

If the data object exists with the same length, its old content is compared with the new and only if the new content is different from the old it will be written.

Returns


Definition at line 250 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_readData#

Ecode_t nvm3_readData (nvm3_Handle_t *h, nvm3_ObjectKey_t key, void *value, size_t len)

Read the object data identified with a given key from NVM.

Parameters
[in]h

A pointer to an NVM3 driver handle.

[in]key

A 20-bit object identifier.

[out]value

A pointer to the application data buffer. The read function will copy data to this location. For best performance, the buffer should be word-aligned.

[in]len

The maximum object size in number of bytes. The nvm3_getObjectInfo() function can be used to find the actual size.

Returns


Definition at line 273 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_readPartialData#

Ecode_t nvm3_readPartialData (nvm3_Handle_t *h, nvm3_ObjectKey_t key, void *value, size_t ofs, size_t len)

Read parts of the object data identified with a given key from NVM.

Parameters
[in]h

A pointer to an NVM3 driver handle.

[in]key

A 20-bit object identifier.

[out]value

A pointer to the application data buffer. The read function will copy data to this location. For best performance, the buffer should be word-aligned.

[in]ofs

The offset where data shall be read from.

[in]len

The number of bytes to read.

Returns


Definition at line 298 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_getObjectInfo#

Ecode_t nvm3_getObjectInfo (nvm3_Handle_t *h, nvm3_ObjectKey_t key, uint32_t *type, size_t *len)

Find the type and size of an object in NVM.

Parameters
[in]h

A pointer to an NVM3 driver handle.

[in]key

A 20-bit object identifier.

[out]type

A pointer to the location where NVM3 shall write the object type. The type can be either NVM3_OBJECTTYPE_DATA or NVM3_OBJECTTYPE_COUNTER.

[out]len

A pointer to the location where NVM3 writes the object size.

Returns


Definition at line 320 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_enumObjects#

size_t nvm3_enumObjects (nvm3_Handle_t *h, nvm3_ObjectKey_t *keyListPtr, size_t keyListSize, nvm3_ObjectKey_t keyMin, nvm3_ObjectKey_t keyMax)

Create a list of object keys for valid objects in NVM.

Parameters
[in]h

A pointer to an NVM3 driver handle.

[out]keyListPtr

A pointer to a buffer for the key list.

[in]keyListSize

The number of elements in the key list buffer. If the keyListSize = 0, the keyListPtr can be NULL and the function will return the total number of objects.

[in]keyMin

The lower search key. Set to NVM3_KEY_MIN to match all keys.

[in]keyMax

The upper search key. Set to NVM3_KEY_MAX to match all keys.

Note

Returns

  • The number of keys written to the key list. This value is less than or equal to keyListSize. If the keyListSize = 0, the function will return the total number of objects matching the key Min - Max pattern.


Definition at line 353 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_enumDeletedObjects#

size_t nvm3_enumDeletedObjects (nvm3_Handle_t *h, nvm3_ObjectKey_t *keyListPtr, size_t keyListSize, nvm3_ObjectKey_t keyMin, nvm3_ObjectKey_t keyMax)

Create a list of object keys for deleted objects in NVM.

Parameters
[in]h

A pointer to an NVM3 driver handle.

[out]keyListPtr

A pointer to a buffer for the key list.

[in]keyListSize

The number of elements in the key list buffer. If the keyListSize = 0, the keyListPtr can be NULL and the function will return the total number of objects.

[in]keyMin

The lower search key. Set to NVM3_KEY_MIN to match all keys.

[in]keyMax

The upper search key. Set to NVM3_KEY_MAX to match all keys.

Note

Returns

  • The number of keys written to the key list. This value is less than or equal to keyListSize. If the keyListSize = 0, the function will return the total number of objects matching the key Min - Max pattern.


Definition at line 387 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_deleteObject#

Ecode_t nvm3_deleteObject (nvm3_Handle_t *h, nvm3_ObjectKey_t key)

Delete an object from NVM.

Parameters
[in]h

A pointer to an NVM3 driver handle.

[in]key

A 20-bit object identifier.

Returns


Definition at line 404 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_writeCounter#

Ecode_t nvm3_writeCounter (nvm3_Handle_t *h, nvm3_ObjectKey_t key, uint32_t value)

Store a counter in NVM.

Parameters
[in]h

A pointer to an NVM3 driver handle.

[in]key

A 20-bit object identifier.

[in]value

The counter value to write.

Returns


Definition at line 422 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_readCounter#

Ecode_t nvm3_readCounter (nvm3_Handle_t *h, nvm3_ObjectKey_t key, uint32_t *value)

Read a counter value from NVM.

Parameters
[in]h

A pointer to an NVM3 driver handle.

[in]key

A 20-bit object identifier.

[out]value

A pointer to the counter location. The read function will copy the counter value to this location.

Returns


Definition at line 441 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_incrementCounter#

Ecode_t nvm3_incrementCounter (nvm3_Handle_t *h, nvm3_ObjectKey_t key, uint32_t *newValue)

Increment a counter object value by 1 and read out optionally.

Parameters
[in]h

A pointer to an NVM3 driver handle.

[in]key

A 20-bit object identifier.

[out]newValue

A pointer to the counter readout location. The counter is incremented before the value is written to this location. Set this value to NULL to ignore readout.

Returns


Definition at line 460 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_eraseAll#

Ecode_t nvm3_eraseAll (nvm3_Handle_t *h)

Delete all objects in NVM.

Parameters
[in]h

A pointer to an NVM3 driver handle.

Note

  • Users don't need to call this function to get NVM3 into an initial valid state.

Warnings

  • The execution time depends on the configured NVM size and may therefore be significant.

Returns


Definition at line 480 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_getEraseCount#

Ecode_t nvm3_getEraseCount (nvm3_Handle_t *h, uint32_t *eraseCnt)

Get the number of page erases of the most erased page in the NVM area since the first initialization.

Parameters
[in]h

A pointer to an NVM3 driver handle.

[in]eraseCnt

A pointer to the location where the NVM3 shall place the page erasure counter value.

Note

  • Except for pages marked as bad, pages will have an erase count equal to the most erased or one less because of the wear leveling algorithm.

Returns


Definition at line 501 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_setEraseCount#

void nvm3_setEraseCount (uint32_t eraseCnt)

Set the page erase count.

Parameters
[in]eraseCnt

The erase count.

Normally, the application should not be concerned with the erase count value. If NVM3 is substituting a previous solution, it is possible to transfer the erase count to NVM3 when initializing the NVM for the first time. The erase count must be set before the nvm3_open is called and will only take effect if the NVM is completely erased or contains unknown data to NVM3. In that case, all pages will be initialized with the supplied erase count. After nvm3_open is called, the value will be consumed and will have no effect on further calls to nvm3_open.


Definition at line 518 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_repack#

Ecode_t nvm3_repack (nvm3_Handle_t *h)

Execute a repack operation.

Parameters
[in]h

A pointer to an NVM3 driver handle.

NVM3 will copy data or erase pages when repacking is needed. Calling nvm3_repack() may block access to the non-volatile memory for up to one page erasure time plus an small execution overhead. The exact worst-case timing characteristics can be found in the data sheet for the part.

Note

  • Calling nvm3_repack() is not mandatory because the functions that write data to NVM will trigger a repack if needed. Because a repack operation may be time consuming, the application may want to be in control of when repacking occurs by calling this function.

More information about the repack operation can be found in the Repacking section.

Returns


Definition at line 543 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_repackNeeded#

bool nvm3_repackNeeded (nvm3_Handle_t *h)

Check the internal status of NVM3 and return true if a repack operation is required.

Parameters
[in]h

A pointer to an NVM3 driver handle.

The application must call nvm3_repack() to perform the actual repack operation.

Returns

  • true if repacking is needed, false if repacking is not needed.


Definition at line 557 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_resize#

Ecode_t nvm3_resize (nvm3_Handle_t *h, nvm3_HalPtr_t newAddr, size_t newSize)

Resize the NVM area used by an open NVM3 instance.

Parameters
[in]h

A pointer to an NVM3 driver handle.

[in]newAddr

The start address of the NVM after resize.

[in]newSize

The size of the NVM after resize.

The area can be resized by changing the start or end address either up or down in memory. Because the input parameters to NVM3 are start address and size, users should be cautious. Either move the start address up or down in memory and adjust the size accordingly to keep the end address, or keep the address and change the size only. It is not possible to resize the area by doing changes in both ends of the NVM address range at the same time. If the resize operation returns ECODE_NVM3_OK, the instance is still open and can be used to access objects in the resized NVM. If the resize operation fails, the instance will still be open but with unchanged size.

Note

  • It is possible to decrease the NVM area to a new size that is not capable of keeping the already stored objects. The result is loss of data.

Returns


Definition at line 590 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_countObjects#

size_t nvm3_countObjects (nvm3_Handle_t *h)

Count valid objects.

Parameters
[in]h

A pointer to an NVM3 driver handle.

Returns

  • The number of valid objects.


Definition at line 602 of file platform/emdrv/nvm3/inc/nvm3_generic.h

nvm3_countDeletedObjects#

size_t nvm3_countDeletedObjects (nvm3_Handle_t *h)

Count deleted objects.

Parameters
[in]h

A pointer to an NVM3 driver handle.

Returns

  • The number of deleted objects.


Definition at line 617 of file platform/emdrv/nvm3/inc/nvm3_generic.h

Macro Definition Documentation#

ECODE_NVM3_OK#

#define ECODE_NVM3_OK
Value:
(ECODE_OK)

Success return value.


Definition at line 49 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_ALIGNMENT_INVALID#

#define ECODE_NVM3_ERR_ALIGNMENT_INVALID
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000001U)

Invalid data alignment.


Definition at line 50 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_SIZE_TOO_SMALL#

#define ECODE_NVM3_ERR_SIZE_TOO_SMALL
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000002U)

Not enough NVM memory specified.


Definition at line 51 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_NO_VALID_PAGES#

#define ECODE_NVM3_ERR_NO_VALID_PAGES
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000003U)

Initialization aborted, no valid page found.


Definition at line 52 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_PAGE_SIZE_NOT_SUPPORTED#

#define ECODE_NVM3_ERR_PAGE_SIZE_NOT_SUPPORTED
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000004U)

The page size is not supported.


Definition at line 53 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_OBJECT_SIZE_NOT_SUPPORTED#

#define ECODE_NVM3_ERR_OBJECT_SIZE_NOT_SUPPORTED
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000005U)

The object size is not supported.


Definition at line 54 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_STORAGE_FULL#

#define ECODE_NVM3_ERR_STORAGE_FULL
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000006U)

No more NVM space available.


Definition at line 55 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_NOT_OPENED#

#define ECODE_NVM3_ERR_NOT_OPENED
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000007U)

The module has not been successfully opened.


Definition at line 56 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_OPENED_WITH_OTHER_PARAMETERS#

#define ECODE_NVM3_ERR_OPENED_WITH_OTHER_PARAMETERS
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000008U)

The module has already been opened with other parameters.


Definition at line 57 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_PARAMETER#

#define ECODE_NVM3_ERR_PARAMETER
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000009U)

Illegal parameter.


Definition at line 58 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_KEY_INVALID#

#define ECODE_NVM3_ERR_KEY_INVALID
Value:
(ECODE_EMDRV_NVM3_BASE | 0x0000000AU)

Invalid key value.


Definition at line 59 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_KEY_NOT_FOUND#

#define ECODE_NVM3_ERR_KEY_NOT_FOUND
Value:
(ECODE_EMDRV_NVM3_BASE | 0x0000000BU)

Key not found.


Definition at line 60 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_OBJECT_IS_NOT_DATA#

#define ECODE_NVM3_ERR_OBJECT_IS_NOT_DATA
Value:
(ECODE_EMDRV_NVM3_BASE | 0x0000000CU)

Trying to access a data object which is currently a counter object.


Definition at line 61 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_OBJECT_IS_NOT_A_COUNTER#

#define ECODE_NVM3_ERR_OBJECT_IS_NOT_A_COUNTER
Value:
(ECODE_EMDRV_NVM3_BASE | 0x0000000DU)

Trying to access a counter object which is currently a data object.


Definition at line 62 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_ERASE_FAILED#

#define ECODE_NVM3_ERR_ERASE_FAILED
Value:
(ECODE_EMDRV_NVM3_BASE | 0x0000000EU)

Erase failed.


Definition at line 63 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_WRITE_DATA_SIZE#

#define ECODE_NVM3_ERR_WRITE_DATA_SIZE
Value:
(ECODE_EMDRV_NVM3_BASE | 0x0000000FU)

The object is too large.


Definition at line 64 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_WRITE_FAILED#

#define ECODE_NVM3_ERR_WRITE_FAILED
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000010U)

Error in the write operation.


Definition at line 65 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_READ_DATA_SIZE#

#define ECODE_NVM3_ERR_READ_DATA_SIZE
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000011U)

Trying to read with a length different from actual object size.


Definition at line 66 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_READ_FAILED#

#define ECODE_NVM3_ERR_READ_FAILED
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000012U)

Error in the read operation.


Definition at line 67 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_INIT_WITH_FULL_NVM#

#define ECODE_NVM3_ERR_INIT_WITH_FULL_NVM
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000013U)

The module was opened with a full NVM.


Definition at line 68 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_RESIZE_PARAMETER#

#define ECODE_NVM3_ERR_RESIZE_PARAMETER
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000014U)

Illegal parameter.


Definition at line 69 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_RESIZE_NOT_ENOUGH_SPACE#

#define ECODE_NVM3_ERR_RESIZE_NOT_ENOUGH_SPACE
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000015U)

Not enough NVM to complete resize.


Definition at line 70 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_ERASE_COUNT_ERROR#

#define ECODE_NVM3_ERR_ERASE_COUNT_ERROR
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000016U)

Erase counts are not valid.


Definition at line 71 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_ADDRESS_RANGE#

#define ECODE_NVM3_ERR_ADDRESS_RANGE
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000017U)

Address and size is out of range of available NVM.


Definition at line 72 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_NVM_ACCESS#

#define ECODE_NVM3_ERR_NVM_ACCESS
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000019U)

A NVM function call was failing.


Definition at line 73 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_INT_WRITE_TO_NOT_ERASED#

#define ECODE_NVM3_ERR_INT_WRITE_TO_NOT_ERASED
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000020U)

Write to memory that is not erased.


Definition at line 74 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_INT_ADDR_INVALID#

#define ECODE_NVM3_ERR_INT_ADDR_INVALID
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000021U)

Internal error trying to access invalid memory.


Definition at line 75 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_INT_KEY_MISMATCH#

#define ECODE_NVM3_ERR_INT_KEY_MISMATCH
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000022U)

Key validation failure.


Definition at line 76 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_INT_SIZE_ERROR#

#define ECODE_NVM3_ERR_INT_SIZE_ERROR
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000023U)

Internal size mismatch error.


Definition at line 77 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_INT_EMULATOR#

#define ECODE_NVM3_ERR_INT_EMULATOR
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000024U)

Internal Emulator error.


Definition at line 78 of file platform/emdrv/nvm3/inc/nvm3_generic.h

ECODE_NVM3_ERR_INT_TEST#

#define ECODE_NVM3_ERR_INT_TEST
Value:
(ECODE_EMDRV_NVM3_BASE | 0x00000030U)

Internal Test error.


Definition at line 79 of file platform/emdrv/nvm3/inc/nvm3_generic.h

NVM3_MIN_PAGE_SIZE#

#define NVM3_MIN_PAGE_SIZE
Value:
512U

Definitions of NVM3 constraints.

The minimum page size supported


Definition at line 84 of file platform/emdrv/nvm3/inc/nvm3_generic.h

NVM3_MAX_OBJECT_SIZE_LOW_LIMIT#

#define NVM3_MAX_OBJECT_SIZE_LOW_LIMIT
Value:
204U

The minimum value for the maximum object size.


Definition at line 85 of file platform/emdrv/nvm3/inc/nvm3_generic.h

NVM3_MAX_OBJECT_SIZE_HIGH_LIMIT#

#define NVM3_MAX_OBJECT_SIZE_HIGH_LIMIT
Value:
4096U

The maximum value for the maximum object size.


Definition at line 86 of file platform/emdrv/nvm3/inc/nvm3_generic.h

NVM3_MAX_OBJECT_SIZE_DEFAULT#

#define NVM3_MAX_OBJECT_SIZE_DEFAULT
Value:
1900U

The default value for the maximum object size.


Definition at line 87 of file platform/emdrv/nvm3/inc/nvm3_generic.h

NVM3_MAX_OBJECT_SIZE#

#define NVM3_MAX_OBJECT_SIZE
Value:
NVM3_MAX_OBJECT_SIZE_DEFAULT

The maximum object size.


Definition at line 90 of file platform/emdrv/nvm3/inc/nvm3_generic.h

NVM3_DEFINE_SECTION_STATIC_DATA#

#define NVM3_DEFINE_SECTION_STATIC_DATA
Value:
static nvm3_CacheEntry_t name##_cache[cacheSize]; \
static const uint8_t name##_nvm[nvmSize] \
SL_ATTRIBUTE_SECTION(STRINGIZE(name##_section))

NVM3 static data definition helper macro for applications using linker script placement of the NVM memory area.

This macro exports the section 'name'_section to the linker. The user must place the section name in a linker script at an address aligned with the page size of the underlying memory system. The size of the NVM area must be a multiple of the page size. This macro also allocates the static NVM3 cache. Use this macro with NVM3_DEFINE_SECTION_INIT_DATA() to create initialization data for nvm3_open(). See Examples section for usage examples.


Definition at line 103 of file platform/emdrv/nvm3/inc/nvm3_generic.h

NVM3_DEFINE_SECTION_INIT_DATA#

#define NVM3_DEFINE_SECTION_INIT_DATA
Value:
nvm3_Init_t name = \
{ \
(nvm3_HalPtr_t)name##_nvm, \
sizeof(name##_nvm), \
name##_cache, \
sizeof(name##_cache) / sizeof(nvm3_CacheEntry_t), \
NVM3_MAX_OBJECT_SIZE, \
0, \
flashHandle, \
}

NVM3 initialization data helper macro to be used with NVM3_DEFINE_SECTION_STATIC_DATA().

The name parameter in both macros must match. Call nvm3_open() after this macro to initialize NVM3. See Examples section for code examples.


Definition at line 115 of file platform/emdrv/nvm3/inc/nvm3_generic.h

NVM3_KEY_INVALID#

#define NVM3_KEY_INVALID
Value:
0xFFFFFFFFU

Invalid key identifier.


Definition at line 127 of file platform/emdrv/nvm3/inc/nvm3_generic.h

NVM3_KEY_SIZE#

#define NVM3_KEY_SIZE
Value:
20U

Unique object key identifier size in number of bits.


Definition at line 128 of file platform/emdrv/nvm3/inc/nvm3_generic.h

NVM3_KEY_MASK#

#define NVM3_KEY_MASK
Value:
((1U << NVM3_KEY_SIZE) - 1U)

Unique object key identifier mask.


Definition at line 129 of file platform/emdrv/nvm3/inc/nvm3_generic.h

NVM3_KEY_MIN#

#define NVM3_KEY_MIN
Value:
0U

Minimum object key value.


Definition at line 130 of file platform/emdrv/nvm3/inc/nvm3_generic.h

NVM3_KEY_MAX#

#define NVM3_KEY_MAX
Value:
NVM3_KEY_MASK

Maximum object key value.


Definition at line 131 of file platform/emdrv/nvm3/inc/nvm3_generic.h

NVM3_OBJECTTYPE_DATA#

#define NVM3_OBJECTTYPE_DATA
Value:
0U

The object is data.


Definition at line 133 of file platform/emdrv/nvm3/inc/nvm3_generic.h

NVM3_OBJECTTYPE_COUNTER#

#define NVM3_OBJECTTYPE_COUNTER
Value:
1U

The object is a counter.


Definition at line 134 of file platform/emdrv/nvm3/inc/nvm3_generic.h

NVM3_MIN_FRAGMENT_COUNT#

#define NVM3_MIN_FRAGMENT_COUNT
Value:
(2U)

The minimum number of fragments.


Definition at line 49 of file platform/emdrv/nvm3/inc/nvm3.h