1 /*
2  * Copyright (c) 2017-2019, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * *  Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * *  Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * *  Neither the name of Texas Instruments Incorporated nor the names of
17  *    its contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 /** ============================================================================
33  *  @file       NVSRAM.h
34  *
35  *  @brief      RAM implementation of the NVS driver
36  *
37  *  This NVS driver implementation makes use of RAM instead of FLASH memory.
38  *  It can be used for developing code which relies the NVS driver without
39  *  wearing down FLASH memory.
40  *
41  *  The NVS header file should be included in an application as follows:
42  *  @code
43  *  #include <ti/drivers/NVS.h>
44  *  #include <ti/drivers/nvs/NVSRAM.h>
45  *  @endcode
46  *
47  *  ============================================================================
48  */
49 
50 #ifndef ti_drivers_nvs_NVSRAM__include
51 #define ti_drivers_nvs_NVSRAM__include
52 
53 #include <stdint.h>
54 #include <stdbool.h>
55 
56 #if defined (__cplusplus)
57 extern "C" {
58 #endif
59 
60 /*!
61  *  @internal @brief NVS function pointer table
62  *
63  *  'NVSRAM_fxnTable' is a fully populated function pointer table
64  *  that can be referenced in the NVS_config[] array entries.
65  *
66  *  Users can minimize their application code size by providing their
67  *  own custom NVS function pointer table that contains only those APIs
68  *  used by the application.
69  *
70  *  An example of a custom NVS function table is shown below:
71  *  @code
72  *  //
73  *  // Since the application does not use the
74  *  // NVS_control(), NVS_lock(), and NVS_unlock() APIs,
75  *  // these APIs are removed from the function
76  *  // pointer table and replaced with NULL
77  *  //
78  *  const NVS_FxnTable myNVS_fxnTable = {
79  *      NVSRAM_close,
80  *      NULL,     // remove NVSRAM_control(),
81  *      NVSRAM_erase,
82  *      NVSRAM_getAttrs,
83  *      NVSRAM_init,
84  *      NULL,     // remove NVSRAM_lock(),
85  *      NVSRAM_open,
86  *      NVSRAM_read,
87  *      NULL,     // remove NVSRAM_unlock(),
88  *      NVSRAM_write
89  *  };
90  *  @endcode
91  */
92 extern const NVS_FxnTable NVSRAM_fxnTable;
93 
94 /*!
95  *  @brief      NVSRAM Hardware Attributes
96  *
97  *  The 'sectorSize' is the minimal amount of data to that is cleared on an
98  *  erase operation.  Devices which feature internal FLASH memory usually
99  *  have a 4096 byte sector size (refer to device specific documentation).  It
100  *  is recommended that the 'sectorSize' used match the FLASH memory sector
101  *  size.
102  *
103  *  The 'regionBase' field must point to the base address of the region
104  *  to be managed.  It is also required that the region be aligned on a
105  *  sectorSize boundary (example below to demonstrate how to do this).
106  *
107  *  The 'regionSize' must be an integer multiple of the 'sectorSize'.
108  *
109  *  Defining and reserving RAM memory regions can be done entirely within the
110  *  ti_drivers_config.c file.
111  *
112  *  The example below defines a char array, 'ramBuf' and uses compiler
113  *  pragmas to place 'ramBuf' at an aligned address within RAM.
114  *
115  *  @code
116  *  #define SECTORSIZE (4096)
117  *
118  *  static char ramBuf[SECTORSIZE * 4] __attribute__ ((aligned (4096)));
119  *
120  *  NVSRAM_HWAttrs NVSRAMHWAttrs[1] = {
121  *      {
122  *          .regionBase = (void *) ramBuf,
123  *          .regionSize = SECTORSIZE * 4,
124  *          .sectorSize = SECTORSIZE
125  *      }
126  *  };
127  *
128  *
129  *  @endcode
130  */
131 typedef struct
132 {
133     void   *regionBase;    /*!< Base address of RAM region */
134     size_t  regionSize;    /*!< The size of the region in bytes */
135     size_t  sectorSize;    /*!< Sector size in bytes */
136 } NVSRAM_HWAttrs;
137 
138 /*
139  *  @brief      NVSRAM Object
140  *
141  *  The application must not access any member variables of this structure!
142  */
143 typedef struct
144 {
145     size_t sectorBaseMask;
146     bool   isOpen;
147 } NVSRAM_Object;
148 
149 /*
150  *  @cond NODOC
151  *  NVSRAM driver public APIs
152  */
153 
154 extern void NVSRAM_close(NVS_Handle handle);
155 extern int_fast16_t NVSRAM_control(NVS_Handle handle, uint_fast16_t cmd,
156     uintptr_t arg);
157 extern int_fast16_t NVSRAM_erase(NVS_Handle handle, size_t offset,
158     size_t size);
159 extern void NVSRAM_getAttrs(NVS_Handle handle, NVS_Attrs *attrs);
160 extern void NVSRAM_init();
161 extern int_fast16_t NVSRAM_lock(NVS_Handle handle, uint32_t timeout);
162 extern NVS_Handle NVSRAM_open(uint_least8_t index, NVS_Params *params);
163 extern int_fast16_t NVSRAM_read(NVS_Handle handle, size_t offset,
164     void *buffer, size_t bufferSize);
165 extern void NVSRAM_unlock(NVS_Handle handle);
166 extern int_fast16_t NVSRAM_write(NVS_Handle handle, size_t offset,
167     void *buffer, size_t bufferSize, uint_fast16_t flags);
168 
169 /*! @endcond */
170 
171 #if defined (__cplusplus)
172 }
173 #endif /* defined (__cplusplus) */
174 
175 /*@}*/
176 #endif /* ti_drivers_nvs_NVSRAM__include */
177