1 /**
2 \defgroup nand_interface_gr NAND Interface
3 \brief Driver API for NAND Flash Device Interface (%Driver_NAND.h).
4
5 \details
6 <b>NAND</b> devices are a type of non-volatile storage and do not require power to hold data.
7 Wikipedia offers more information about
8 the <a href="https://en.wikipedia.org/wiki/Flash_memory#ARM_NAND_memories" target="_blank"><b>Flash Memories</b></a>, including NAND.
9
10 <b>Block Diagram</b>
11
12 <p> </p>
13 \image html NAND_Schematics.png "Simplified NAND Flash Schematic"
14 <p> </p>
15
16
17 <b>NAND API</b>
18
19 The following header files define the Application Programming Interface (API) for the NAND interface:
20 - \b %Driver_NAND.h : Driver API for NAND Flash Device Interface
21
22 The driver implementation is a typical part of the Device Family Pack (DFP) that supports the
23 peripherals of the microcontroller family.
24
25 NAND Flash is organized in pages, grouped into blocks as the smallest erasable unit. The addressing
26 of data is achieved by `byte_address = block * block_size + page_in_block * page_size + offset_in_page`.
27 In terms of this NAND API blocks and pages are referred to as `row` and the byte offset within the page as `col`.
28 Thus one can calculate the `byte_address = row * page_size + col`. The parameters `page_size` and `block_size`
29 are device specific and must be handled by the driver user appropriately.
30
31 <b>Driver Functions</b>
32
33 The driver functions are published in the access struct as explained in \ref DriverFunctions
34 - \ref ARM_DRIVER_NAND : access struct for NAND driver functions
35
36 @{
37 \anchor nand_example <b>Example Code:</b>
38
39 \include NAND_Demo.c
40 */
41 /*******************************************************************************************************************/
42
43
44 /**
45 \defgroup nand_execution_status NAND Status Error Codes
46 \ingroup nand_interface_gr
47 \brief Negative values indicate errors (NAND has specific codes in addition to common \ref execution_status).
48 \details
49 The NAND driver has additional status error codes that are listed below.
50 Note that the NAND driver also returns the common \ref execution_status.
51
52 @{
53 \def ARM_NAND_ERROR_ECC
54 ECC generation or correction failed during \ref ARM_NAND_ReadData, \ref ARM_NAND_WriteData or \ref ARM_NAND_ExecuteSequence.
55 @}
56 */
57
58
59 /**
60 \defgroup NAND_events NAND Events
61 \ingroup nand_interface_gr
62 \brief The NAND driver generates call back events that are notified via the function \ref ARM_NAND_SignalEvent.
63 \details
64 This section provides the event values for the \ref ARM_NAND_SignalEvent callback function.
65
66 The following call back notification events are generated:
67 @{
68 \def ARM_NAND_EVENT_DEVICE_READY
69 \def ARM_NAND_EVENT_DRIVER_READY
70 \def ARM_NAND_EVENT_DRIVER_DONE
71 \def ARM_NAND_EVENT_ECC_ERROR
72 @}
73 */
74
75
76 /**
77 \defgroup nand_driver_flag_codes NAND Flags
78 \ingroup nand_interface_gr
79 \brief Specify Flag codes.
80 \details
81 The defines can be used in the function \ref ARM_NAND_ReadData and \ref ARM_NAND_WriteData for the parameter \em mode
82 and in the function \ref ARM_NAND_ExecuteSequence for the parameter \em code.
83 @{
84 \def ARM_NAND_DRIVER_DONE_EVENT
85 @}
86 */
87
88
89 /**
90 \defgroup nand_control_gr NAND Control Codes
91 \ingroup nand_interface_gr
92 \brief Many parameters of the NAND driver are configured using the \ref ARM_NAND_Control function.
93 @{
94 \details
95 Refer to the function \ref ARM_NAND_Control for further details.
96 */
97
98 /**
99 \defgroup nand_control_codes NAND Mode Controls
100 \ingroup nand_control_gr
101 \brief Specify operation modes of the NAND interface.
102 \details
103 These controls can be used in the function \ref ARM_NAND_Control for the parameter \em control.
104 @{
105 \def ARM_NAND_BUS_MODE
106 \def ARM_NAND_BUS_DATA_WIDTH
107 \def ARM_NAND_DRIVER_STRENGTH
108 \def ARM_NAND_DEVICE_READY_EVENT
109 \def ARM_NAND_DRIVER_READY_EVENT
110 @}
111 */
112
113 /**
114 \defgroup nand_bus_mode_codes NAND Bus Modes
115 \ingroup nand_control_gr
116 \brief Specify bus mode of the NAND interface.
117 \details
118 The defines can be used in the function \ref ARM_NAND_Control for the parameter \em arg and with the \ref ARM_NAND_BUS_MODE as the \em control code.
119 @{
120 \def ARM_NAND_BUS_SDR
121 \def ARM_NAND_BUS_DDR
122 \def ARM_NAND_BUS_DDR2
123 \def ARM_NAND_BUS_TIMING_MODE_0
124 \def ARM_NAND_BUS_TIMING_MODE_1
125 \def ARM_NAND_BUS_TIMING_MODE_2
126 \def ARM_NAND_BUS_TIMING_MODE_3
127 \def ARM_NAND_BUS_TIMING_MODE_4
128 \def ARM_NAND_BUS_TIMING_MODE_5
129 \def ARM_NAND_BUS_TIMING_MODE_6
130 \def ARM_NAND_BUS_TIMING_MODE_7
131 \def ARM_NAND_BUS_DDR2_DO_WCYC_0
132 \def ARM_NAND_BUS_DDR2_DO_WCYC_1
133 \def ARM_NAND_BUS_DDR2_DO_WCYC_2
134 \def ARM_NAND_BUS_DDR2_DO_WCYC_4
135 \def ARM_NAND_BUS_DDR2_DI_WCYC_0
136 \def ARM_NAND_BUS_DDR2_DI_WCYC_1
137 \def ARM_NAND_BUS_DDR2_DI_WCYC_2
138 \def ARM_NAND_BUS_DDR2_DI_WCYC_4
139 \def ARM_NAND_BUS_DDR2_VEN
140 \def ARM_NAND_BUS_DDR2_CMPD
141 \def ARM_NAND_BUS_DDR2_CMPR
142 @}
143 */
144
145 /**
146 \defgroup nand_data_bus_width_codes NAND Data Bus Width
147 \ingroup nand_control_gr
148 \brief Specify data bus width of the NAND interface.
149 \details
150 The defines can be used in the function \ref ARM_NAND_Control for the parameter \em arg and with the \ref ARM_NAND_BUS_DATA_WIDTH as the \em control code.
151 @{
152 \def ARM_NAND_BUS_DATA_WIDTH_8
153 \def ARM_NAND_BUS_DATA_WIDTH_16
154 @}
155 */
156
157 /**
158 \defgroup nand_driver_strength_codes NAND Driver Strength
159 \ingroup nand_control_gr
160 \brief Specify driver strength of the NAND interface.
161 \details
162 The defines can be used in the function \ref ARM_NAND_Control for the parameter \em arg and with the \ref ARM_NAND_DRIVER_STRENGTH as the \em control code.
163 @{
164 \def ARM_NAND_DRIVER_STRENGTH_18
165 \def ARM_NAND_DRIVER_STRENGTH_25
166 \def ARM_NAND_DRIVER_STRENGTH_35
167 \def ARM_NAND_DRIVER_STRENGTH_50
168 @}
169 */
170
171 /**
172 @}
173 */
174
175
176 /**
177 \defgroup nand_driver_ecc_codes NAND ECC Codes
178 \ingroup nand_interface_gr
179 \brief Specify ECC codes.
180 \details
181 The defines can be used in the function \ref ARM_NAND_ReadData and \ref ARM_NAND_WriteData for the parameter \em mode
182 and in the function \ref ARM_NAND_ExecuteSequence for the parameter \em code.
183 @{
184 \def ARM_NAND_ECC(n)
185 \def ARM_NAND_ECC0
186 \def ARM_NAND_ECC1
187 @}
188 */
189
190
191 /**
192 \defgroup nand_driver_seq_exec_codes NAND Sequence Execution Codes
193 \ingroup nand_interface_gr
194 \brief Specify execution codes
195 \details
196 The defines can be used in the function \ref ARM_NAND_ExecuteSequence for the parameter \em code.
197 @{
198 \def ARM_NAND_CODE_SEND_CMD1
199 \def ARM_NAND_CODE_SEND_ADDR_COL1
200 \def ARM_NAND_CODE_SEND_ADDR_COL2
201 \def ARM_NAND_CODE_SEND_ADDR_ROW1
202 \def ARM_NAND_CODE_SEND_ADDR_ROW2
203 \def ARM_NAND_CODE_SEND_ADDR_ROW3
204 \def ARM_NAND_CODE_INC_ADDR_ROW
205 \def ARM_NAND_CODE_WRITE_DATA
206 \def ARM_NAND_CODE_SEND_CMD2
207 \def ARM_NAND_CODE_WAIT_BUSY
208 \def ARM_NAND_CODE_READ_DATA
209 \def ARM_NAND_CODE_SEND_CMD3
210 \def ARM_NAND_CODE_READ_STATUS
211 @}
212 */
213
214
215 /*------------ Structures --------------------------------------------------------------------------------------*/
216 /**
217 \struct ARM_NAND_STATUS
218 \details
219 Structure with information about the status of a NAND. The data fields encode flags for the driver.
220
221 <b>Returned by:</b>
222 - \ref ARM_NAND_GetStatus
223 *****************************************************************************************************************/
224
225 /**
226 \struct ARM_DRIVER_NAND
227 \details
228 The functions of the NAND driver are accessed by function pointers exposed by this structure. Refer to \ref DriverFunctions for overview information.
229
230 Each instance of a NAND interface provides such an access structure.
231 The instance is identified by a postfix number in the symbol name of the access structure, for example:
232 - \b Driver_NAND0 is the name of the access struct of the first instance (no. 0).
233 - \b Driver_NAND1 is the name of the access struct of the second instance (no. 1).
234
235 A middleware configuration setting allows connecting the middleware to a specific driver instance <b>Driver_NAND<i>n</i></b>.
236 The default is \token{0}, which connects a middleware to the first instance of a driver.
237 *******************************************************************************************************************/
238
239 /**
240 \struct ARM_NAND_CAPABILITIES
241 \details
242 A NAND driver can be implemented with different capabilities. The data fields of this struct encode
243 the capabilities implemented by this driver.
244
245 <b>Returned by:</b>
246 - \ref ARM_NAND_GetCapabilities
247 *******************************************************************************************************************/
248
249
250 /**
251 \typedef ARM_NAND_SignalEvent_t
252 \details
253 Provides the typedef for the callback function \ref ARM_NAND_SignalEvent.
254
255 <b>Parameter for:</b>
256 - \ref ARM_NAND_Initialize
257 *******************************************************************************************************************/
258
259
260 /**
261 \struct ARM_NAND_ECC_INFO
262
263 \details
264 Stores the characteristics of a ECC (Error Correction Code) algorithm and provides the information about necessary
265 application data handling in order to protect stored data from NAND bit errors.
266
267 ECC algorithms applied on NAND memory typically operate on NAND device page level which is virtually divided to multiple
268 main and spare areas. Data from main and spare area is taken into account when generating ECC data which is also stored
269 into spare area. ECC codeword defines how much data will be protected and how much ECC data will be generated.
270
271 To describe how application data must be organized, ECC information structure specifies protection \em type which
272 defines the protected part of data. As main and spare are of different size, two different algorithms could be
273 provided, we can describe them as ECC0 and ECC1. Type can then have the following values:
274
275 Type| Description
276 :---|:-----------
277 0 | ECC algorithm not used
278 1 | ECC0 algorithm protects main data
279 2 | ECC0 algorithm protects main and spare data
280 3 | ECC0 algorithm protects main and ECC1 algorithm protects spare data
281
282 Virtual page division is described with page layout (\em page_layout), number of pages (\em page_count) and
283 virtual page size (\em page_size or \em virtual_page_size). Virtual page size used by ECC algorithm can be defined
284 by either \em page_size or \em virtual_page_size, depending on the \em page_size values:
285
286 Value| Main + Spare size
287 :----|:-----------
288 0 | 512 + 16
289 1 | 1024 + 32
290 2 | 2048 + 64
291 3 | 4096 + 128
292 4 | 8192 + 256
293 8 | 512 + 28
294 9 | 1024 + 56
295 10 | 2048 + 112
296 11 | 4096 + 224
297 12 | 8192 + 448
298 15 | Not used, use virtual_page_size
299
300 Structure member \em virtual_page_size is an array of two 16-bit values. First field of array (i.e. \em virtual_page_size[0])
301 contains main area size while second (i.e. \em virtual_page_size[1]) contains spare area size. Number of virtual pages N
302 is defined with \em page_count and must be calculated as N = 2 ^ page_count.
303
304 Page layout defines main and spare ordering and two different page layouts are possible. First ordering assumes that
305 spare area follows after every main area, while in second case all main areas build one contiguous region followed by
306 contiguous region of spare areas. This is defined by member \em page_layout:
307
308 Layout| Description
309 :-----|:-----------
310 0 | Single spare follows after single main: Main0,Spare0 ... MainN-1,SpareN-1
311 1 | Contiguous spare follows after contiguous main: Main0 ... MainN-1,Spare0 ... SpareN-1
312
313 ECC codeword size defines the size of data that is protected by ECC algorithm and is different for main and spare
314 area. All structure members that define the codeword are therefore arrays of two 16-bit values. Codeword offset defines
315 where ECC protected data starts in main (\em codeword_offset[0]) or spare (\em codeword_offset[1]) area, codeword
316 size (\em codeword_size) defines the number of data that is protected i.e. data over which ECC is calculated and
317 codeword gap (\em codeword_gap) defines the space between two consecutive codeword regions.
318
319 Generated ECC data is stored into spare area and is described similar as codeword, with offset from start of spare area
320 (\em ecc_offset), size of generated data (\em ecc_size) and gap (\em ecc_gap) between two consecutive ECC data regions.
321
322 Number of bits that ECC algorithm can correct per codeword is defined with \em correctable_bits.
323
324 <b>Parameter for:</b>
325 - \ref ARM_NAND_InquireECC
326 *****************************************************************************************************************/
327
328
329 //
330 // Functions
331 //
332
ARM_NAND_GetVersion(void)333 ARM_DRIVER_VERSION ARM_NAND_GetVersion (void) {
334 return { 0, 0 };
335 }
336 /**
337 \fn ARM_DRIVER_VERSION ARM_NAND_GetVersion (void)
338 \details
339 The function \b ARM_NAND_GetVersion returns version information of the driver implementation in \ref ARM_DRIVER_VERSION
340 - API version is the version of the CMSIS-Driver specification used to implement this driver.
341 - Driver version is source code version of the actual driver implementation.
342
343 Example:
344 \code
345 extern ARM_DRIVER_NAND Driver_NAND0;
346 ARM_DRIVER_NAND *drv_info;
347
348 void setup_nand (void) {
349 ARM_DRIVER_VERSION version;
350
351 drv_info = &Driver_NAND0;
352 version = drv_info->GetVersion ();
353 if (version.api < 0x10A) { // requires at minimum API version 1.10 or higher
354 // error handling
355 return;
356 }
357 }
358 \endcode
359 *******************************************************************************************************************/
360
ARM_NAND_GetCapabilities(void)361 ARM_NAND_CAPABILITIES ARM_NAND_GetCapabilities (void) {
362 return { 0 };
363 }
364 /**
365 \fn ARM_NAND_CAPABILITIES ARM_NAND_GetCapabilities (void)
366 \details
367 The function \b ARM_NAND_GetCapabilities retrieves information about capabilities in this driver implementation.
368 The data fields of the structure \ref ARM_NAND_CAPABILITIES encode various capabilities, for example
369 if a hardware is able to create signal events using the \ref ARM_NAND_SignalEvent
370 callback function.
371
372 Example:
373 \code
374 extern ARM_DRIVER_NAND Driver_NAND0;
375 ARM_DRIVER_NAND *drv_info;
376
377 void read_capabilities (void) {
378 ARM_NAND_CAPABILITIES drv_capabilities;
379
380 drv_info = &Driver_NAND0;
381 drv_capabilities = drv_info->GetCapabilities ();
382 // interrogate capabilities
383
384 }
385 \endcode
386 *******************************************************************************************************************/
387
ARM_NAND_Initialize(ARM_NAND_SignalEvent_t cb_event)388 int32_t ARM_NAND_Initialize (ARM_NAND_SignalEvent_t cb_event) {
389 return 0;
390 }
391 /**
392 \fn int32_t ARM_NAND_Initialize (ARM_NAND_SignalEvent_t cb_event)
393 \details
394 The function \b ARM_NAND_Initialize initializes the NAND interface.
395 It is called when the middleware component starts operation.
396
397 The function performs the following operations:
398 - Initializes the resources needed for the NAND interface.
399 - Registers the \ref ARM_NAND_SignalEvent callback function.
400
401 The parameter \em cb_event is a pointer to the \ref ARM_NAND_SignalEvent callback function; use a NULL pointer
402 when no callback signals are required.
403
404 \b Example:
405 - see \ref nand_interface_gr - Driver Functions
406
407 *******************************************************************************************************************/
408
ARM_NAND_Uninitialize(void)409 int32_t ARM_NAND_Uninitialize (void) {
410 return 0;
411 }
412 /**
413 \fn int32_t ARM_NAND_Uninitialize (void)
414 \details
415 The function \b ARM_NAND_Uninitialize de-initializes the resources of NAND interface.
416
417 It is called when the middleware component stops operation and releases the software resources used by the interface.
418 *******************************************************************************************************************/
419
ARM_NAND_PowerControl(ARM_POWER_STATE state)420 int32_t ARM_NAND_PowerControl (ARM_POWER_STATE state) {
421 return 0;
422 }
423 /**
424 \fn int32_t ARM_NAND_PowerControl (ARM_POWER_STATE state)
425 \details
426 The function \b ARM_NAND_PowerControl controls the power modes of the NAND interface.
427
428 The parameter \em state sets the operation and can have the following values:
429 - \ref ARM_POWER_FULL : set-up peripheral for data transfers, enable interrupts (NVIC) and optionally DMA.
430 Can be called multiple times. If the peripheral is already in this mode the function performs
431 no operation and returns with \ref ARM_DRIVER_OK.
432 - \ref ARM_POWER_LOW : may use power saving. Returns \ref ARM_DRIVER_ERROR_UNSUPPORTED when not implemented.
433 - \ref ARM_POWER_OFF : terminates any pending data transfers, disables peripheral, disables related interrupts and DMA.
434
435 Refer to \ref CallSequence for more information.
436 *******************************************************************************************************************/
437
438
ARM_NAND_DevicePower(uint32_t voltage)439 int32_t ARM_NAND_DevicePower (uint32_t voltage) {
440 return 0;
441 }
442 /**
443 \fn int32_t ARM_NAND_DevicePower (uint32_t voltage)
444 \details
445 The function \b ARM_NAND_DevicePower controls the power supply of the NAND device.
446
447 The parameter \em voltage sets the device supply voltage as defined in the table.
448
449 \b AMR_NAND_POWER_xxx_xxx specifies power settings.
450
451 Device Power Bits | Description
452 :--------------------------------|:--------------------------------------------
453 \ref ARM_NAND_POWER_VCC_OFF | Set VCC Power off
454 \ref ARM_NAND_POWER_VCC_3V3 | Set VCC = 3.3V
455 \ref ARM_NAND_POWER_VCC_1V8 | Set VCC = 1.8V
456 \ref ARM_NAND_POWER_VCCQ_OFF | Set VCCQ I/O Power off
457 \ref ARM_NAND_POWER_VCCQ_3V3 | Set VCCQ = 3.3V
458 \ref ARM_NAND_POWER_VCCQ_1V8 | Set VCCQ = 1.8V
459 \ref ARM_NAND_POWER_VPP_OFF | Set VPP off
460 \ref ARM_NAND_POWER_VPP_ON | Set VPP on
461
462 *******************************************************************************************************************/
463
ARM_NAND_WriteProtect(uint32_t dev_num,bool enable)464 int32_t ARM_NAND_WriteProtect (uint32_t dev_num, bool enable) {
465 return 0;
466 }
467 /**
468 \fn int32_t ARM_NAND_WriteProtect (uint32_t dev_num, bool enable)
469 \details
470 The function \b ARM_NAND_WriteProtect controls the Write Protect (WPn) pin of a NAND device.
471
472 The parameter \em dev_num is the device number. \n
473 The parameter \em enable specifies whether to enable or disable write protection.
474 *******************************************************************************************************************/
475
ARM_NAND_ChipEnable(uint32_t dev_num,bool enable)476 int32_t ARM_NAND_ChipEnable (uint32_t dev_num, bool enable) {
477 return 0;
478 }
479 /**
480 \fn int32_t ARM_NAND_ChipEnable (uint32_t dev_num, bool enable)
481 \details
482 The function \b ARM_NAND_ChipEnable control the Chip Enable (CEn) pin of a NAND device.
483
484 The parameter \em dev_num is the device number. \n
485 The parameter \em enable specifies whether to enable or disable the device.
486
487 This function is optional and supported only when the data field \em ce_manual = \token{1} in the structure \ref ARM_NAND_CAPABILITIES.
488 Otherwise, the Chip Enable (CEn) signal is controlled automatically by SendCommand/Address, Read/WriteData and ExecuteSequence
489 (for example when the NAND device is connected to a memory bus).
490 *******************************************************************************************************************/
491
ARM_NAND_GetDeviceBusy(uint32_t dev_num)492 int32_t ARM_NAND_GetDeviceBusy (uint32_t dev_num) {
493 return 0;
494 }
495 /**
496 \fn int32_t ARM_NAND_GetDeviceBusy (uint32_t dev_num)
497 \details
498 The function \b ARM_NAND_GetDeviceBusy returns the status of the Device Busy pin: [\token{1=busy; 0=not busy or error}].
499
500 The parameter \em dev_num is the device number.
501 *******************************************************************************************************************/
502
ARM_NAND_SendCommand(uint32_t dev_num,uint8_t cmd)503 int32_t ARM_NAND_SendCommand (uint32_t dev_num, uint8_t cmd) {
504 return 0;
505 }
506 /**
507 \fn int32_t ARM_NAND_SendCommand (uint32_t dev_num, uint8_t cmd)
508 \details
509 The function \b ARM_NAND_SendCommand sends a command to the NAND device.
510
511 The parameter \em dev_num is the device number. \n
512 The parameter \em cmd is the command sent to the NAND device.
513 *******************************************************************************************************************/
514
ARM_NAND_SendAddress(uint32_t dev_num,uint8_t addr)515 int32_t ARM_NAND_SendAddress (uint32_t dev_num, uint8_t addr) {
516 return 0;
517 }
518 /**
519 \fn int32_t ARM_NAND_SendAddress (uint32_t dev_num, uint8_t addr)
520 \details
521 Send an address to the NAND device.
522 The parameter \em dev_num is the device number.
523 The parameter \em addr is the address.
524 *******************************************************************************************************************/
525
ARM_NAND_ReadData(uint32_t dev_num,void * data,uint32_t cnt,uint32_t mode)526 int32_t ARM_NAND_ReadData (uint32_t dev_num, void *data, uint32_t cnt, uint32_t mode) {
527 return 0;
528 }
529 /**
530 \fn int32_t ARM_NAND_ReadData (uint32_t dev_num, void *data, uint32_t cnt, uint32_t mode)
531 \details
532 The function \b ARM_NAND_ReadData reads data from a NAND device.
533
534 The parameter \em dev_num is the device number. \n
535 The parameter \em data is a pointer to the buffer that stores the data read from a NAND device. \n
536 The parameter \em cnt is the number of data items to read. \n
537 The parameter \em mode defines the operation mode as listed in the table below.
538
539 Read Data Mode | Description
540 :----------------------------------|:--------------------------------------------
541 \ref ARM_NAND_ECC(n) | Select ECC
542 \ref ARM_NAND_ECC0 | Use ECC0 of selected ECC
543 \ref ARM_NAND_ECC1 | Use ECC1 of selected ECC
544 \ref ARM_NAND_DRIVER_DONE_EVENT | Generate \ref ARM_NAND_EVENT_DRIVER_DONE
545
546 The data item size is defined by the data type, which depends on the configured data bus width.
547
548 Data type is:
549 - \em uint8_t for 8-bit data bus
550 - \em uint16_t for 16-bit data bus
551
552 The function executes in the following ways:
553 - When the operation is blocking (typical for devices connected to memory bus when not using DMA),
554 then the function returns after all data is read and returns the number of data items read.
555 - When the operation is non-blocking (typical for NAND controllers), then the function only starts the operation and returns with zero number of data items read.
556 After the operation is completed, the \ref ARM_NAND_EVENT_DRIVER_DONE event is generated (if enabled by \b ARM_NAND_DRIVER_DONE_EVENT).
557 Progress of the operation can also be monitored by calling the \ref ARM_NAND_GetStatus function and checking the \em busy data field.
558 Operation is automatically aborted if ECC is used and ECC correction fails, which generates the \ref ARM_NAND_EVENT_ECC_ERROR event
559 (together with \ref ARM_NAND_DRIVER_DONE_EVENT if enabled).
560
561 *******************************************************************************************************************/
562
ARM_NAND_WriteData(uint32_t dev_num,const void * data,uint32_t cnt,uint32_t mode)563 int32_t ARM_NAND_WriteData (uint32_t dev_num, const void *data, uint32_t cnt, uint32_t mode) {
564 return 0;
565 }
566 /**
567 \fn int32_t ARM_NAND_WriteData (uint32_t dev_num, const void *data, uint32_t cnt, uint32_t mode)
568 \details
569 The function \b ARM_NAND_WriteData writes data to a NAND device.
570
571 The parameter \em dev_num is the device number. \n
572 The parameter \em data is a pointer to the buffer with data to write. \n
573 The parameter \em cnt is the number of data items to write. \n
574 The parameter \em mode defines the operation mode as listed in the table below.
575
576 Write Data Mode | Description
577 :----------------------------------|:--------------------------------------------
578 \ref ARM_NAND_ECC(n) | Select ECC
579 \ref ARM_NAND_ECC0 | Use ECC0 of selected ECC
580 \ref ARM_NAND_ECC1 | Use ECC1 of selected ECC
581 \ref ARM_NAND_DRIVER_DONE_EVENT | Generate \ref ARM_NAND_EVENT_DRIVER_DONE
582
583 The data item size is defined by the data type, which depends on the configured data bus width.
584
585 Data type is:
586 - \em uint8_t for 8-bit data bus
587 - \em uint16_t for 16-bit data bus
588
589 The function executes in the following ways:
590 - When the operation is blocking (typical for devices connected to memory bus when not using DMA),
591 then the function returns after all data is written and returns the number of data items written.
592 - When the operation is non-blocking (typical for NAND controllers), then the function only starts the operation
593 and returns with zero number of data items written. After the operation is completed,
594 the \ref ARM_NAND_EVENT_DRIVER_DONE event is generated (if enabled by \b ARM_NAND_DRIVER_DONE_EVENT).
595 Progress of the operation can also be monitored by calling the \ref ARM_NAND_GetStatus function and checking the \em busy data field.
596 Operation is automatically aborted if ECC is used and ECC generation fails,
597 which generates the \ref ARM_NAND_EVENT_ECC_ERROR event (together with \ref ARM_NAND_DRIVER_DONE_EVENT if enabled).
598 *******************************************************************************************************************/
599
ARM_NAND_ExecuteSequence(uint32_t dev_num,uint32_t code,uint32_t cmd,uint32_t addr_col,uint32_t addr_row,void * data,uint32_t data_cnt,uint8_t * status,uint32_t * count)600 int32_t ARM_NAND_ExecuteSequence (uint32_t dev_num, uint32_t code, uint32_t cmd,
601 uint32_t addr_col, uint32_t addr_row,
602 void *data, uint32_t data_cnt,
603 uint8_t *status, uint32_t *count) {
604 return 0;
605 }
606 /**
607 \fn int32_t ARM_NAND_ExecuteSequence (uint32_t dev_num, uint32_t code, uint32_t cmd, uint32_t addr_col, uint32_t addr_row, void *data, uint32_t data_cnt, uint8_t *status, uint32_t *count)
608 \details
609 The function \b ARM_NAND_ExecuteSequence executes a sequence of operations for a NAND device.
610
611 The parameter \em dev_num is the device number. \n
612 The parameter \em code is the sequence encoding as defined in the table <b>Sequence execution Code</b>. \n
613 The parameter \em cmd is the command or a series of commands. \n
614 The parameter \em addr_col is the column address. \n
615 The parameter \em addr_row is the row address. \n
616 The parameter \em data is a pointer to the buffer that stores the data to or loads the data from. \n
617 The parameter \em data_cnt is the number of data items to read or write in one iteration. \n
618 The parameter \em status is a pointer to the buffer that stores the status read. \n
619 The parameter \em count is a pointer to the number of iterations. \n
620
621 \b ARM_NAND_CODE_xxx specifies sequence execution codes.
622
623 Sequence Execution Code | Description
624 :----------------------------------|:--------------------------------------------
625 \ref ARM_NAND_CODE_SEND_CMD1 | Send Command 1 (cmd[7..0])
626 \ref ARM_NAND_CODE_SEND_ADDR_COL1 | Send Column Address 1 (addr_col[7..0])
627 \ref ARM_NAND_CODE_SEND_ADDR_COL2 | Send Column Address 2 (addr_col[15..8])
628 \ref ARM_NAND_CODE_SEND_ADDR_ROW1 | Send Row Address 1 (addr_row[7..0])
629 \ref ARM_NAND_CODE_SEND_ADDR_ROW2 | Send Row Address 2 (addr_row[15..8])
630 \ref ARM_NAND_CODE_SEND_ADDR_ROW3 | Send Row Address 3 (addr_row[23..16])
631 \ref ARM_NAND_CODE_INC_ADDR_ROW | Auto-increment Row Address
632 \ref ARM_NAND_CODE_WRITE_DATA | Write Data
633 \ref ARM_NAND_CODE_SEND_CMD2 | Send Command 2 (cmd[15..8])
634 \ref ARM_NAND_CODE_WAIT_BUSY | Wait while R/Bn busy
635 \ref ARM_NAND_CODE_READ_DATA | Read Data
636 \ref ARM_NAND_CODE_SEND_CMD3 | Send Command 3 (cmd[23..16])
637 \ref ARM_NAND_CODE_READ_STATUS | Read Status byte and check FAIL bit (bit 0)
638 \ref ARM_NAND_ECC(n) | Select ECC
639 \ref ARM_NAND_ECC0 | Use ECC0 of selected ECC
640 \ref ARM_NAND_ECC1 | Use ECC1 of selected ECC
641 \ref ARM_NAND_DRIVER_DONE_EVENT | Generate \ref ARM_NAND_EVENT_DRIVER_DONE
642
643 The data item size is defined by the data type, which depends on the configured data bus width.
644
645 Data type is:
646 - \em uint8_t for 8-bit data bus
647 - \em uint16_t for 16-bit data bus
648
649 The function is non-blocking and returns as soon as the driver has started executing the specified sequence.
650 When the operation is completed, the \ref ARM_NAND_EVENT_DRIVER_DONE event is generated (if enabled by \b ARM_NAND_DRIVER_DONE_EVENT).
651 Progress of the operation can also be monitored by calling the \ref ARM_NAND_GetStatus function and checking the \em busy data field.
652
653 Driver executes the number of specified iterations where in each iteration
654 items specified by \b ARM_NAND_CODE_xxx are executed in the order as listed in the table <b>Sequence execution Code</b>.
655 The parameter \em count is holding the current number of iterations left.
656
657 Execution is automatically aborted and \ref ARM_NAND_EVENT_DRIVER_DONE event is generated (if enabled by \b ARM_NAND_DRIVER_DONE_EVENT):
658 - if Read Status is enabled and the FAIL bit (bit 0) is set
659 - if ECC is used and ECC fails (also sets \ref ARM_NAND_EVENT_ECC_ERROR event)
660
661 \note
662 \ref ARM_NAND_CODE_WAIT_BUSY can only be specified if the Device Ready event can be generated (reported by \em event_device_ready in \ref ARM_NAND_CAPABILITIES).
663 The event \ref ARM_NAND_EVENT_DEVICE_READY is not generated during sequence execution but rather used internally by the driver.
664 *******************************************************************************************************************/
665
ARM_NAND_AbortSequence(uint32_t dev_num)666 int32_t ARM_NAND_AbortSequence (uint32_t dev_num) {
667 return 0;
668 }
669 /**
670 \fn int32_t ARM_NAND_AbortSequence (uint32_t dev_num)
671 \details
672 The function \b ARM_NAND_AbortSequence aborts execution of the current sequence for a NAND device.
673
674 The parameter \em dev_num is the device number.
675 *******************************************************************************************************************/
676
ARM_NAND_Control(uint32_t dev_num,uint32_t control,uint32_t arg)677 int32_t ARM_NAND_Control (uint32_t dev_num, uint32_t control, uint32_t arg) {
678 return 0;
679 }
680 /**
681 \fn int32_t ARM_NAND_Control (uint32_t dev_num, uint32_t control, uint32_t arg)
682 \details
683 The function \b ARM_NAND_Control controls the NAND interface and executes operations.
684
685 The parameter \em dev_num is the device number. \n
686 The parameter \em control specifies the operation. \n
687 The parameter \em arg provides (depending on the \em control) additional information or sets values.
688
689 The table lists the operations for the parameter \em control.
690
691 Parameter \em control | Operation
692 :--------------------------------|:--------------------------------------------
693 \ref ARM_NAND_BUS_MODE | Set the bus mode. The parameter \em arg sets the \ref bus_mode_tab "\b Bus Mode".
694 \ref ARM_NAND_BUS_DATA_WIDTH | Set the data bus width. The parameter \em arg sets the \ref bus_data_width_tab "\b Bus Data Width".
695 \ref ARM_NAND_DRIVER_STRENGTH | Set the driver strength. The parameter \em arg sets the \ref driver_strength_tab "\b Driver Strength".
696 \ref ARM_NAND_DRIVER_READY_EVENT | Control generation of callback event \ref ARM_NAND_EVENT_DRIVER_READY. Enable: \em arg = \token{1}. Disable: \em arg = \token{0}.
697 \ref ARM_NAND_DEVICE_READY_EVENT | Control generation of callback event \ref ARM_NAND_EVENT_DEVICE_READY; Enable: \em arg = \token{1}. Disable: \em arg = \token{0}.
698
699 <b>See Also</b>
700 - \ref ARM_NAND_GetCapabilities returns information about supported operations, which are stored in the structure \ref ARM_NAND_CAPABILITIES.
701 - \ref ARM_NAND_SignalEvent provides information about the callback events \ref ARM_NAND_EVENT_DRIVER_READY and \ref ARM_NAND_EVENT_DEVICE_READY
702
703 The table lists values for the parameter \em arg used with the \em control operation \ref ARM_NAND_BUS_MODE, \ref ARM_NAND_BUS_DATA_WIDTH, and
704 \ref ARM_NAND_DRIVER_STRENGTH. Values from different categories can be ORed.
705
706 \anchor bus_mode_tab
707 <table class="cmtable" summary="">
708 <tr><th> Parameter \em arg <br> for <i>control</i> = \ref ARM_NAND_BUS_MODE </th>
709 <th> Bit </th>
710 <th> Category </th>
711 <th> Description </th>
712 <th width="30%"> Supported when \ref ARM_NAND_CAPABILITIES </th></tr>
713 <tr><td> \ref ARM_NAND_BUS_TIMING_MODE_0 (default) </td>
714 <td rowspan="8" style="text-align:right"> 0..3 </td>
715 <td rowspan="8"> \anchor bus_timing_tab Bus Timing Mode </td>
716 <td> \token{0} </td>
717 <td rowspan="8"> The maximum timing mode that can be applied to a specific \ref bus_data_interface_tab "\b Bus Data Interface"
718 is stored in the data fields: <br><br>
719 <i>sdr_timing_mode</i> - for SDR <br>
720 <i>ddr_timing_mode</i> - for NV-DDR <br>
721 <i>ddr2_timing_mode</i> - for NV_DDR2 </td></tr>
722 <tr><td> \ref ARM_NAND_BUS_TIMING_MODE_1 </td><td> \token{1} </td></tr>
723 <tr><td> \ref ARM_NAND_BUS_TIMING_MODE_2 </td><td> \token{2} </td></tr>
724 <tr><td> \ref ARM_NAND_BUS_TIMING_MODE_3 </td><td> \token{3} </td></tr>
725 <tr><td> \ref ARM_NAND_BUS_TIMING_MODE_4 </td><td> \token{4} (SDR EDO capable) </td></tr>
726 <tr><td> \ref ARM_NAND_BUS_TIMING_MODE_5 </td><td> \token{5} (SDR EDO capable) </td></tr>
727 <tr><td> \ref ARM_NAND_BUS_TIMING_MODE_6 </td><td> \token{6} (NV-DDR2 only) </td></tr>
728 <tr><td> \ref ARM_NAND_BUS_TIMING_MODE_7 </td><td> \token{7} (NV-DDR2 only) </td></tr>
729 <tr><td> \ref ARM_NAND_BUS_SDR (default) \anchor bus_data_interface_tab </td>
730 <td rowspan="3" style="text-align:right"> 4..7 </td>
731 <td rowspan="3"> Bus Data Interface </td>
732 <td> SDR (Single Data Rate) - Traditional interface </td>
733 <td> <i>always supported</i> </td></tr>
734 <tr><td> \ref ARM_NAND_BUS_DDR </td><td> NV-DDR (Double Data Rate) </td><td> data field <i>ddr</i> = \token{1} </td></tr>
735 <tr><td> \ref ARM_NAND_BUS_DDR2 </td><td> NV-DDR2 (Double Data Rate) </td><td> data field <i>ddr2</i> = \token{1} </td></tr>
736 <tr><td style="white-space: nowrap"> \ref ARM_NAND_BUS_DDR2_DO_WCYC_0 (default) </td>
737 <td rowspan="4" style="text-align:right"> 8..11 </td>
738 <td rowspan="4" style="white-space: nowrap"> Data Output Warm-up \anchor bus_output_tab </td>
739 <td> Set the DDR2 Data Output Warm-up to \token{0} cycles </td>
740 <td rowspan="4"> <b>Data Output Warm-up</b> cycles are dummy cycles for interface calibration with no incremental data transfer
741 and apply to NV-DDR2 of the \ref bus_data_interface_tab "\b Bus Data Interface".
742 </td></tr>
743 <tr><td> \ref ARM_NAND_BUS_DDR2_DO_WCYC_1 </td><td> Set the DDR2 Data Output Warm-up to \token{1} cycles </td></tr>
744 <tr><td> \ref ARM_NAND_BUS_DDR2_DO_WCYC_2 </td><td> Set the DDR2 Data Output Warm-up to \token{2} cycles </td></tr>
745 <tr><td> \ref ARM_NAND_BUS_DDR2_DO_WCYC_4 </td><td> Set the DDR2 Data Output Warm-up to \token{4} cycles </td></tr>
746 <tr><td style="white-space: nowrap"> \ref ARM_NAND_BUS_DDR2_DI_WCYC_0 (default) \anchor bus_input_tab</td>
747 <td rowspan="4" style="text-align:right"> 12..15 </td>
748 <td rowspan="4" style="white-space: nowrap"> Data Input Warm-up </td>
749 <td> Set the DDR2 Data Input Warm-up to \token{0} cycles </td>
750 <td rowspan="4"> <b>Data Input Warm-up</b> cycles are dummy cycles for interface calibration with no incremental data transfer
751 and apply to NV-DDR2 of the \ref bus_data_interface_tab "\b Bus Data Interface".
752 </td></tr>
753 <tr><td> \ref ARM_NAND_BUS_DDR2_DI_WCYC_1 </td><td> Set the DDR2 Data Input Warm-up to \token{1} cycles </td></tr>
754 <tr><td> \ref ARM_NAND_BUS_DDR2_DI_WCYC_2 </td><td> Set the DDR2 Data Input Warm-up to \token{2} cycles </td></tr>
755 <tr><td> \ref ARM_NAND_BUS_DDR2_DI_WCYC_4 </td><td> Set the DDR2 Data Input Warm-up to \token{4} cycles </td></tr>
756 <tr><td style="white-space: nowrap"> \ref ARM_NAND_BUS_DDR2_VEN \anchor bus_misc_tab </td>
757 <td style="text-align:right"> 16 </td>
758 <td rowspan="3" style="white-space: nowrap"> Miscellaneous </td>
759 <td> Set the DDR2 Enable external VREFQ as reference </td>
760 <td rowspan="3">
761 </td></tr>
762 <tr><td> \ref ARM_NAND_BUS_DDR2_CMPD </td><td style="text-align:right"> 17 </td><td> Set the DDR2 Enable complementary DQS (DQS_c) signal </td></tr>
763 <tr><td> \ref ARM_NAND_BUS_DDR2_CMPR </td><td style="text-align:right"> 18 </td><td> Set the DDR2 Enable complementary RE_n (RE_c) signal </td></tr>
764 <tr><th> Parameter \em arg <br> for <i>control</i> = \ref ARM_NAND_BUS_DATA_WIDTH </th>
765 <th> Bit </th>
766 <th> Category \anchor bus_data_width_tab </th>
767 <th> Description </th>
768 <th width="30%"> Supported when \ref ARM_NAND_CAPABILITIES </th></tr>
769 <tr><td style="white-space: nowrap"> \ref ARM_NAND_BUS_DATA_WIDTH_8 (default) </td>
770 <td rowspan="2" style="text-align:right"> 0..1 </td>
771 <td rowspan="2" style="white-space: nowrap"> Bus Data Width </td>
772 <td> Set to \token{8 bit} </td>
773 <td> <i>always supported</i>
774 </td></tr>
775 <tr><td> \ref ARM_NAND_BUS_DATA_WIDTH_16 </td><td> Set to \token{16 bit} </td><td> data field <i>data_width_16</i> = \token{1} </td></tr>
776 <tr><th style="white-space: nowrap"> Parameter \em arg <br> for <i>control</i> = \ref ARM_NAND_DRIVER_STRENGTH </th>
777 <th> Bit </th>
778 <th> Category \anchor driver_strength_tab </th>
779 <th> Description </th>
780 <th width="30%"> Supported when \ref ARM_NAND_CAPABILITIES </th></tr>
781 <tr><td style="white-space: nowrap"> \ref ARM_NAND_DRIVER_STRENGTH_18 </td>
782 <td rowspan="4" style="text-align:right"> 0..3 </td>
783 <td rowspan="4" style="white-space: nowrap"> Driver Strength </td>
784 <td> Set the Driver Strength 2.0x = 18 Ohms </td>
785 <td> data field <i>driver_strength_18</i> = \token{1}
786 </td></tr>
787 <tr><td> \ref ARM_NAND_DRIVER_STRENGTH_25 </td><td> Set the Driver Strength 1.4x = 25 Ohms </td><td> data field <i>driver_strength_25</i> = \token{1} </td></tr>
788 <tr><td> \ref ARM_NAND_DRIVER_STRENGTH_35 (default) </td><td> Set the Driver Strength 1.0x = 35 Ohms </td><td> <i>always supported</i> </td></tr>
789 <tr><td> \ref ARM_NAND_DRIVER_STRENGTH_50 </td><td> Set the Driver Strength 0.7x = 50 Ohms </td><td> data field <i>driver_strength_50</i> = \token{1} </td></tr>
790 </table>
791
792 <b>Example</b>
793 \code
794 extern ARM_DRIVER_NAND Driver_NAND0;
795
796 status = Driver_NAND0.Control (0, ARM_NAND_BUS_MODE, ARM_NAND_BUS_TIMING_MODE_5 |
797 ARM_NAND_BUS_DDR2 |
798 ARM_NAND_BUS_DDR2_VEN);
799
800 status = Driver_NAND0.Control (0, ARM_NAND_BUS_DATA_WIDTH, ARM_NAND_BUS_DATA_WIDTH_16);
801
802 status = Driver_NAND0.Control (0, ARM_NAND_DRIVER_STRENGTH, ARM_NAND_DRIVER_STRENGTH_50);
803 \endcode
804
805 *******************************************************************************************************************/
806
ARM_NAND_GetStatus(uint32_t dev_num)807 ARM_NAND_STATUS ARM_NAND_GetStatus (uint32_t dev_num) {
808 return 0;
809 }
810 /**
811 \fn ARM_NAND_STATUS ARM_NAND_GetStatus (uint32_t dev_num)
812 \details
813 The function \b ARM_NAND_GetStatus returns the current NAND device status.
814
815 The parameter \em dev_num is the device number.
816 *******************************************************************************************************************/
817
ARM_NAND_InquireECC(int32_t index,ARM_NAND_ECC_INFO * info)818 int32_t ARM_NAND_InquireECC (int32_t index, ARM_NAND_ECC_INFO *info) {
819 return 0;
820 }
821 /**
822 \fn int32_t ARM_NAND_InquireECC (int32_t index, ARM_NAND_ECC_INFO *info)
823 \details
824 The function \b ARM_NAND_InquireECC reads error correction code information.
825
826 The parameter \em index is the ECC index and is used to retrieve different ECC configurations. \n
827 The parameter \em info is a pointer of type \ref ARM_NAND_ECC_INFO. The data fields store the information.
828
829 When multiple different ECC configurations exist, ARM_NAND_ECC_INFO structure exists for each configuration. Parameter
830 \em index denotes which configuration will be retrieved. Value of index should start with zero to retrieve first ECC
831 configuration and should be incremented in order to retrieve next ECC configuration. When index is out of range function
832 ARM_NAND_InquireECC returns with error.
833
834 Parameter \em index is used by \ref ARM_NAND_ECC(n) in \ref ARM_NAND_ReadData, \ref ARM_NAND_WriteData and
835 \ref ARM_NAND_ExecuteSequence to select suitable ECC configuration.
836
837 <b>Example</b>
838 \code
839 extern ARM_DRIVER_NAND Driver_NAND0;
840
841 ARM_NAND_ECC_INFO ecc;
842 int32_t idx;
843
844 idx = 0;
845 while (Driver_NAND0.InquireECC (idx, &ecc) == ARM_DRIVER_OK) {
846 // Examine retrieved ECC configuration
847 if (ecc.type == 2) {
848 // Algorithm ECC0 protects Main+Spare
849 }
850 // ..
851 idx++;
852 }
853 \endcode
854 *******************************************************************************************************************/
855
ARM_NAND_SignalEvent(uint32_t dev_num,uint32_t event)856 void ARM_NAND_SignalEvent (uint32_t dev_num, uint32_t event) {
857 return 0;
858 }
859 /**
860 \fn void ARM_NAND_SignalEvent (uint32_t dev_num, uint32_t event)
861 \details
862 The function \b ARM_NAND_SignalEvent is a callback function registered by the function \ref ARM_NAND_Initialize.
863
864 The parameter \em dev_num is the device number. \n
865 The parameter \em event indicates one or more events that occurred during driver operation.
866 Each event is encoded in a separate bit and therefore it is possible to signal multiple events within the same call.
867
868 Not every event is necessarily generated by the driver. This depends on the implemented capabilities stored in the
869 data fields of the structure \ref ARM_NAND_CAPABILITIES, which can be retrieved with the function \ref ARM_NAND_GetCapabilities.
870
871 The following events can be generated:
872
873 Parameter \em event | Bit | Description
874 :---------------------------------|-----|:---------------------------
875 \ref ARM_NAND_EVENT_DEVICE_READY | 0 | Occurs when rising edge is detected on R/Bn (Ready/Busy) pin indicating that the device is ready.
876 \ref ARM_NAND_EVENT_DRIVER_READY | 1 | Occurs to indicate that commands can be executed (after previously being busy and not able to start the requested operation).
877 \ref ARM_NAND_EVENT_DRIVER_DONE | 2 | Occurs after an operation completes. An operation was successfully started before with \ref ARM_NAND_ReadData, \ref ARM_NAND_WriteData, \ref ARM_NAND_ExecuteSequence.
878 \ref ARM_NAND_EVENT_ECC_ERROR | 3 | Occurs when ECC generation failed or ECC correction failed. An operation was successfully started before with \ref ARM_NAND_ReadData, \ref ARM_NAND_WriteData, \ref ARM_NAND_ExecuteSequence.
879
880 The event \ref ARM_NAND_EVENT_DEVICE_READY occurs after complete execution of commands
881 (initiated with the functions \ref ARM_NAND_SendCommand, \ref ARM_NAND_SendAddress, \ref ARM_NAND_ReadData, \ref ARM_NAND_WriteData, \ref ARM_NAND_ExecuteSequence).
882 It is useful to indicate completion of complex operations (such as erase).
883 The event is only generated when \ref ARM_NAND_GetCapabilities returns data field \em event_device_ready = \token{1}
884 and was enabled by calling \ref ARM_NAND_Control (\ref ARM_NAND_DEVICE_READY_EVENT, 1).
885 If the event is not available, poll the \em busy data field using the function \ref ARM_NAND_GetStatus.
886
887 The event \ref ARM_NAND_EVENT_DRIVER_READY occurs when previously a function
888 (\ref ARM_NAND_SendCommand, \ref ARM_NAND_SendAddress, \ref ARM_NAND_ReadData, \ref ARM_NAND_WriteData, \ref ARM_NAND_ExecuteSequence)
889 returned with \ref ARM_DRIVER_ERROR_BUSY. It is useful when functions are called simultaneously from independent threads
890 (for example to control multiple devices) and the threads have no knowledge about each other (driver rejects reentrant calls with return of \ref ARM_DRIVER_ERROR_BUSY).
891 \em dev_num indicates the device that returned previously busy.
892 *******************************************************************************************************************/
893
894 /**
895 @}
896 */
897 // End NAND Interface
898