1 /**
2 \defgroup flash_interface_gr Flash Interface
3 \brief    Driver API for Flash Device Interface (%Driver_Flash.h)
4 \details
5 <a href="https://en.wikipedia.org/wiki/Flash_memory" target="_blank">Flash devices</a> based on NOR memory cells are the
6 preferred technology for embedded applications requiring a discrete non-volatile memory device. The low read latency
7 characteristic of these Flash devices allow a direct code execution
8 (<a href="https://en.wikipedia.org/wiki/Execute_in_place" target="_blank">XIP</a>) and data storage in a single memory
9 product.
10 
11 <b>Flash API</b>
12 
13 The Flash API provides a generic API suitable for Flashes with NOR memory cells independent from the actual interface
14 to the MCU (memory bus, SPI, ...). <a href="https://en.wikipedia.org/wiki/Flash_memory#Serial_flash" target="_blank">SPI</a>
15 flashes are typically not named NOR flashes but have usually same flash cell properties.
16 
17 The following header files define the Application Programming Interface (API) for the Flash interface:
18   - \b %Driver_Flash.h : Driver API for Flash Device Interface
19 
20 <b>Driver Functions</b>
21 
22 The driver functions are published in the access struct as explained in \ref DriverFunctions
23   - \ref ARM_DRIVER_FLASH : access struct for Flash driver functions
24 @{
25 
26 A typical setup sequence for the driver is shown below:
27 
28 <b>Example Code:</b>
29 
30 \include Flash_Demo.c
31 */
32 *******************************************************************************************************************/
33 
34 
35 /**
36 \defgroup Flash_events Flash Events
37 \ingroup flash_interface_gr
38 \brief The Flash driver generates call back events that are notified via the function \ref ARM_Flash_SignalEvent.
39 \details
40 This section provides the event values for the \ref ARM_Flash_SignalEvent callback function.
41 
42 The following call back notification events are generated:
43 @{
44 \def ARM_FLASH_EVENT_READY
45 \def ARM_FLASH_EVENT_ERROR
46 @}
47 */
48 
49 
50 /**
51 \struct     ARM_FLASH_SECTOR
52 \details
53 Specifies sector start and end address.
54 
55 <b>Element of</b>:
56   - \ref ARM_FLASH_INFO structure
57 *******************************************************************************************************************/
58 
59 /**
60 \struct     ARM_FLASH_INFO
61 \details
62 Stores the characteristics of a Flash device. This includes sector layout, programming size and a default value for erased memory.
63 This information can be obtained from the Flash device datasheet and is used by the middleware in order to properly interact with the Flash device.
64 
65 Sector layout is described by specifying the \em sector_info which points to an array of sector information (start and end address) and by specifying the \em sector_count which defines the number of sectors.
66 The element \em sector_size is not used in this case and needs to be \em 0.
67 Flash sectors need not to be aligned continuously. Gaps are allowed in the device memory space in order to reserve sectors for other usage (for example application code).
68 
69 When the device has uniform sector size than the sector layout can be described by specifying the \em sector_size which defines the size of a single sector and by specifying the \em sector_count which defines the number of sectors.
70 The element \em sector_info is not used in this case and needs to be \em NULL.
71 
72 The smallest programmable unit within a sector is specified by the \em program_unit. It defines the granularity for programming data.
73 
74 Optimal programming page size is specified by the \em page_size and defines the amount of data that should be programmed in one step to achieve maximum programming speed.
75 
76 Contents of erased memory is specified by the \em erased_value and is typically \em 0xFF. This value can be used before erasing a sector to check if the sector is blank and erase can be skipped.
77 
78 *******************************************************************************************************************/
79 
80 /**
81 \struct     ARM_DRIVER_FLASH
82 \details
83 The functions of the Flash driver are accessed by function pointers exposed by this structure. Refer to \ref DriverFunctions for overview information.
84 
85 Each instance of a Flash interface provides such an access structure.
86 The instance is identified by a postfix number in the symbol name of the access structure, for example:
87  - \b Driver_Flash0 is the name of the access struct of the first instance (no. 0).
88  - \b Driver_Flash1 is the name of the access struct of the second instance (no. 1).
89 
90 A middleware configuration setting allows connecting the middleware to a specific driver instance \b %Driver_Flash<i>n</i>.
91 The default is \token{0}, which connects a middleware to the first instance of a driver.
92 *******************************************************************************************************************/
93 
94 /**
95 \struct     ARM_FLASH_CAPABILITIES
96 \details
97 A Flash driver can be implemented with different capabilities. The data fields of this struct encode
98 the capabilities implemented by this driver.
99 
100 The element \em event_ready indicates that the driver is able to generate the \ref ARM_FLASH_EVENT_READY event. In case that this event is not available it is possible to poll the driver status by calling the \ref ARM_Flash_GetStatus and check the \em busy flag.
101 
102 The element \em data_width specifies the data access size and also defines the data type (uint8_t, uint16_t or uint32_t) for the \em data parameter in \ref ARM_Flash_ReadData and \ref ARM_Flash_ProgramData functions.
103 
104 The element \em erase_chip specifies that the \ref ARM_Flash_EraseChip function is supported. Typically full chip erase is much faster than erasing the whole device sector per sector.
105 
106 <b>Returned by:</b>
107   - \ref ARM_Flash_GetCapabilities
108 *******************************************************************************************************************/
109 
110 /**
111 \struct     ARM_FLASH_STATUS
112 \details
113 Structure with information about the status of the Flash.
114 
115 The flag \em busy indicates that the driver is busy executing read/program/erase operation.
116 
117 The flag \em error flag is cleared on start of read/program/erase operation and is set at the end of the current operation in case of error.
118 
119 <b>Returned by:</b>
120   - \ref ARM_Flash_GetStatus
121 *****************************************************************************************************************/
122 
123 /**
124 \typedef    ARM_Flash_SignalEvent_t
125 \details
126 Provides the typedef for the callback function \ref ARM_Flash_SignalEvent.
127 
128 <b>Parameter for:</b>
129   - \ref ARM_Flash_Initialize
130 *******************************************************************************************************************/
131 
132 
133 //
134 // Functions
135 //
136 
137 ARM_DRIVER_VERSION ARM_Flash_GetVersion (void)  {
138   return { 0, 0 };
139 }
140 /**
141 \fn ARM_DRIVER_VERSION ARM_Flash_GetVersion (void)
142 \details
143 The function \b ARM_Flash_GetVersion returns version information of the driver implementation in \ref ARM_DRIVER_VERSION
144  - API version is the version of the CMSIS-Driver specification used to implement this driver.
145  - Driver version is source code version of the actual driver implementation.
146 
147 Example:
148 \code
149 extern ARM_DRIVER_FLASH Driver_Flash0;
150 ARM_DRIVER_FLASH *drv_info;
151 
152 void read_version (void)  {
153   ARM_DRIVER_VERSION  version;
154 
155   drv_info = &Driver_Flash0;
156   version = drv_info->GetVersion ();
157   if (version.api < 0x10A)   {      // requires at minimum API version 1.10 or higher
158     // error handling
159     return;
160   }
161 }
162 \endcode
163 *******************************************************************************************************************/
164 
ARM_Flash_GetCapabilities(void)165 ARM_FLASH_CAPABILITIES ARM_Flash_GetCapabilities (void)  {
166   return { 0 };
167 }
168 /**
169 \fn ARM_FLASH_CAPABILITIES ARM_Flash_GetCapabilities (void)
170 \details
171 The function \b ARM_Flash_GetCapabilities returns information about capabilities in this driver implementation.
172 The data fields of the struct \ref ARM_FLASH_CAPABILITIES encode various capabilities, for example
173 if a hardware is able to create signal events using the \ref ARM_Flash_SignalEvent callback function.
174 
175 Example:
176 \code
177 extern ARM_DRIVER_FLASH Driver_Flash0;
178 ARM_DRIVER_FLASH *drv_info;
179 
180 void read_capabilities (void)  {
181   ARM_FLASH_CAPABILITIES drv_capabilities;
182 
183   drv_info = &Driver_Flash0;
184   drv_capabilities = drv_info->GetCapabilities ();
185   // interrogate capabilities
186 
187 }
188 \endcode
189 *******************************************************************************************************************/
190 
ARM_Flash_Initialize(ARM_Flash_SignalEvent_t cb_event)191 int32_t ARM_Flash_Initialize (ARM_Flash_SignalEvent_t cb_event)  {
192   return 0;
193 }
194 /**
195 \fn int32_t ARM_Flash_Initialize (ARM_Flash_SignalEvent_t cb_event)
196 \details
197 The function \b ARM_Flash_Initialize initializes the Flash interface.
198 It is called when the middleware component starts operation.
199 
200 The function performs the following operations:
201   - Initializes the resources needed for the Flash interface.
202   - Registers the \ref ARM_Flash_SignalEvent callback function.
203 
204 The parameter \em cb_event is a pointer to the \ref ARM_Flash_SignalEvent callback function; use a NULL pointer
205 when no callback signals are required.
206 
207 \b Example:
208  - see \ref flash_interface_gr - Driver Functions
209 
210 *******************************************************************************************************************/
211 
ARM_Flash_Uninitialize(void)212 int32_t ARM_Flash_Uninitialize (void)  {
213   return 0;
214 }
215 /**
216 \fn int32_t ARM_Flash_Uninitialize (void)
217 \details
218 The function \b ARM_Flash_Uninitialize de-initializes the resources of Flash interface.
219 
220 It is called when the middleware component stops operation and releases the software resources used by the interface.
221 *******************************************************************************************************************/
222 
ARM_Flash_PowerControl(ARM_POWER_STATE state)223 int32_t ARM_Flash_PowerControl (ARM_POWER_STATE state)  {
224   return 0;
225 }
226 /**
227 \fn int32_t ARM_Flash_PowerControl (ARM_POWER_STATE state)
228 \details
229 The function \b ARM_Flash_PowerControl operates the power modes of the Flash interface.
230 
231 The parameter \em state can have the following values:
232   - \ref ARM_POWER_FULL : set-up peripheral for data transfers, enable interrupts (NVIC) and optionally DMA. Can be called multiple times.
233                           If the peripheral is already in this mode, then the function performs no operation and returns with \ref ARM_DRIVER_OK.
234   - \ref ARM_POWER_LOW : may use power saving. Returns \ref ARM_DRIVER_ERROR_UNSUPPORTED when not implemented.
235   - \ref ARM_POWER_OFF : terminates any pending data transfers, disables peripheral, disables related interrupts and DMA.
236 
237 Refer to \ref CallSequence for more information.
238 *******************************************************************************************************************/
239 
ARM_Flash_ReadData(uint32_t addr,void * data,uint32_t cnt)240 int32_t ARM_Flash_ReadData (uint32_t addr, void *data, uint32_t cnt)  {
241   return 0;
242 }
243 /**
244 \fn int32_t ARM_Flash_ReadData (uint32_t addr, void *data, uint32_t cnt)
245 \details
246 This function \b ARM_Flash_ReadData reads data from the Flash device.
247 
248 The parameter \em addr specifies the address from where to read data (needs to be aligned to data type size). \n
249 The parameter \em data specifies the pointer to a buffer storing the data read.
250 The data type is \em uint8_t, \em uint16_t or \em uint32_t and is specified by the \em data_width in \ref ARM_FLASH_CAPABILITIES. \n
251 The parameter \em cnt specifies the number of data items to read.
252 
253 The function executes in the following ways:
254  - When the operation is non-blocking (typical for SPI Flash) then the function only starts the operation and returns with zero number of data items read.
255    When the operation is completed the \ref ARM_FLASH_EVENT_READY event is generated (if supported and reported by \ref ARM_Flash_GetCapabilities).
256    In case of errors the \ref ARM_FLASH_EVENT_ERROR event is generated at the same time.
257    Progress of the operation can also be monitored by calling the \ref ARM_Flash_GetStatus function and checking the \em busy flag.
258  - When the operation is blocking (typical for memory mapped Flash) then the function returns after the data is read and returns the number of data items read.
259 *******************************************************************************************************************/
260 
ARM_Flash_ProgramData(uint32_t addr,const void * data,uint32_t cnt)261 int32_t ARM_Flash_ProgramData (uint32_t addr, const void *data, uint32_t cnt)  {
262   return 0;
263 }
264 /**
265 \fn int32_t ARM_Flash_ProgramData (uint32_t addr, const void *data, uint32_t cnt)
266 \details
267 This function \b ARM_Flash_ProgramData programs data to the Flash device.
268 
269 The parameter \em addr specifies the address to where to program data (needs to be aligned to \em program_unit specified in \ref ARM_FLASH_INFO). \n
270 The parameter \em data specifies the pointer to a buffer containing data to be programmed.
271 The data type is \em uint8_t, \em uint16_t or \em uint32_t and is specified by the \em data_width in \ref ARM_FLASH_CAPABILITIES. \n
272 The parameter \em cnt specifies the number of data items to program (data size needs to be a multiple of \em program_unit).
273 
274 The function executes in the following ways:
275  - When the operation is non-blocking (typically) then the function only starts the operation and returns with zero number of data items programmed.
276    When the operation is completed the \ref ARM_FLASH_EVENT_READY event is generated (if supported and reported by \ref ARM_Flash_GetCapabilities).
277    In case of errors the \ref ARM_FLASH_EVENT_ERROR event is generated at the same time.
278    Progress of the operation can also be monitored by calling the \ref ARM_Flash_GetStatus function and checking the \em busy flag.
279  - When the operation is blocking then the function returns after the data is programmed and returns the number of data items programmed.
280 *******************************************************************************************************************/
281 
ARM_Flash_EraseSector(uint32_t addr)282 int32_t ARM_Flash_EraseSector (uint32_t addr)  {
283   return 0;
284 }
285 /**
286 \fn int32_t ARM_Flash_EraseSector (uint32_t addr)
287 \details
288 This function \b ARM_Flash_EraseSector erases a flash sector specified by the parameter <i>adr</i> (points to start of the sector).
289 
290 The function is non-blocking and returns as soon as the driver has started the operation.
291 When the operation is completed the \ref ARM_FLASH_EVENT_READY event is generated (if supported and reported by \ref ARM_Flash_GetCapabilities).
292 In case of errors the \ref ARM_FLASH_EVENT_ERROR event is generated at the same time.
293 Progress of the operation can also be monitored by calling the \ref ARM_Flash_GetStatus function and checking the \em busy flag.
294 *******************************************************************************************************************/
295 
ARM_Flash_EraseChip(void)296 int32_t ARM_Flash_EraseChip (void)  {
297   return 0;
298 }
299 /**
300 \fn int32_t ARM_Flash_EraseChip (void)
301 \details
302 The optional function \b ARM_Flash_EraseChip erases the complete device.
303 If the device does not support global erase or only a portion of the Flash memory space is used for storing files,
304 then the functions returns the error value \ref ARM_DRIVER_ERROR_UNSUPPORTED.
305 The data field \em eras_chip = \token{1} of the structure \ref ARM_FLASH_CAPABILITIES encodes that \b ARM_Flash_EraseChip is supported.
306 The field can be verified with the function \ref ARM_Flash_GetCapabilities.
307 
308 The function is non-blocking and returns as soon as the driver has started the operation.
309 When the operation is completed, the \ref ARM_FLASH_EVENT_READY event is generated (if supported and reported by \ref ARM_Flash_GetCapabilities).
310 In case of errors, the \ref ARM_FLASH_EVENT_ERROR event is generated at the same time.
311 Progress of the operation can also be monitored by calling the \ref ARM_Flash_GetStatus function and checking the \em busy flag.
312 
313 <b>See also:</b>
314  - ARM_Flash_SignalEvent
315 *******************************************************************************************************************/
316 
ARM_Flash_GetStatus(void)317 ARM_FLASH_STATUS ARM_Flash_GetStatus (void)  {
318   return 0;
319 }
320 /**
321 \fn ARM_FLASH_STATUS ARM_Flash_GetStatus (void)
322 \details
323 The function \b ARM_Flash_GetStatus returns the current Flash interface status stored in the structure \ref ARM_FLASH_STATUS.
324 *******************************************************************************************************************/
325 
ARM_Flash_GetInfo(void)326 ARM_FLASH_INFO * ARM_Flash_GetInfo (void)  {
327   return NULL;
328 }
329 /**
330 \fn ARM_FLASH_INFO * ARM_Flash_GetInfo (void)
331 \details
332 The function \b ARM_Flash_GetInfo returns information about the Flash device.
333 *******************************************************************************************************************/
334 
ARM_Flash_SignalEvent(uint32_t event)335 void ARM_Flash_SignalEvent (uint32_t event)  {
336   return 0;
337 }
338 /**
339 \fn void ARM_Flash_SignalEvent (uint32_t event)
340 \details
341 
342 The function \b ARM_Flash_SignalEvent is a callback function registered by the function \ref ARM_Flash_Initialize.
343 The function is called automatically after read/program/erase operation completes.
344 
345 The parameter \em event indicates one or more events that occurred during driver operation. Each event is coded in a separate bit and
346 therefore it is possible to signal multiple events in the event call back function.
347 
348 Not every event is necessarily generated by the driver. This depends on the implemented capabilities stored in the
349 data fields of the structure \ref ARM_FLASH_CAPABILITIES, which can be retrieved with the function \ref ARM_Flash_GetCapabilities.
350 
351 The following events can be generated:
352 
353 Parameter \em event                 | Bit | Description
354 :-----------------------------------|:---:|:-----------
355 \ref ARM_FLASH_EVENT_READY          |  0  | Occurs after read/program/erase operation completes.
356 \ref ARM_FLASH_EVENT_ERROR          |  1  | Occurs together with \ref ARM_FLASH_EVENT_READY when operation completes with errors.
357 
358 <b>See also:</b>
359  - \ref ARM_Flash_EraseChip
360 *******************************************************************************************************************/
361 
362 /**
363 @}
364 */
365 // End Flash Interface
366