]> begriffs open source - cmsis/blob - CMSIS/Driver/Include/Driver_NAND.h
Ignorign DoxyGen output
[cmsis] / CMSIS / Driver / Include / Driver_NAND.h
1 /*\r
2  * Copyright (c) 2013-2016 ARM Limited. All rights reserved.\r
3  *\r
4  * SPDX-License-Identifier: Apache-2.0\r
5  *\r
6  * Licensed under the Apache License, Version 2.0 (the License); you may\r
7  * not use this file except in compliance with the License.\r
8  * You may obtain a copy of the License at\r
9  *\r
10  * http://www.apache.org/licenses/LICENSE-2.0\r
11  *\r
12  * Unless required by applicable law or agreed to in writing, software\r
13  * distributed under the License is distributed on an AS IS BASIS, WITHOUT\r
14  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
15  * See the License for the specific language governing permissions and\r
16  * limitations under the License.\r
17  *\r
18  * $Date:        30. May 2014\r
19  * $Revision:    V2.01\r
20  *\r
21  * Project:      NAND Flash Driver definitions\r
22  */\r
23 \r
24 /* History:\r
25  *  Version 2.01\r
26  *    Updated ARM_NAND_ECC_INFO structure and ARM_NAND_ECC_xxx definitions\r
27  *  Version 2.00\r
28  *    New simplified driver:\r
29  *      complexity moved to upper layer (command agnostic)\r
30  *    Added support for:\r
31  *      NV-DDR & NV-DDR2 Interface (ONFI specification)\r
32  *      VCC, VCCQ and VPP Power Supply Control\r
33  *      WP (Write Protect) Control\r
34  *  Version 1.11\r
35  *    Changed prefix ARM_DRV -> ARM_DRIVER\r
36  *  Version 1.10\r
37  *    Namespace prefix ARM_ added\r
38  *  Version 1.00\r
39  *    Initial release\r
40  */\r
41 \r
42 #ifndef __DRIVER_NAND_H\r
43 #define __DRIVER_NAND_H\r
44 \r
45 #include "Driver_Common.h"\r
46 \r
47 #define ARM_NAND_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,01)  /* API version */\r
48 \r
49 \r
50 /****** NAND Device Power *****/\r
51 #define ARM_NAND_POWER_VCC_Pos           0\r
52 #define ARM_NAND_POWER_VCC_Msk          (0x07UL << ARM_NAND_POWER_VCC_Pos)\r
53 #define ARM_NAND_POWER_VCC_OFF          (0x01UL << ARM_NAND_POWER_VCC_Pos)  ///< VCC Power off\r
54 #define ARM_NAND_POWER_VCC_3V3          (0x02UL << ARM_NAND_POWER_VCC_Pos)  ///< VCC = 3.3V\r
55 #define ARM_NAND_POWER_VCC_1V8          (0x03UL << ARM_NAND_POWER_VCC_Pos)  ///< VCC = 1.8V\r
56 #define ARM_NAND_POWER_VCCQ_Pos          3\r
57 #define ARM_NAND_POWER_VCCQ_Msk         (0x07UL << ARM_NAND_POWER_VCCQ_Pos)\r
58 #define ARM_NAND_POWER_VCCQ_OFF         (0x01UL << ARM_NAND_POWER_VCCQ_Pos) ///< VCCQ I/O Power off\r
59 #define ARM_NAND_POWER_VCCQ_3V3         (0x02UL << ARM_NAND_POWER_VCCQ_Pos) ///< VCCQ = 3.3V\r
60 #define ARM_NAND_POWER_VCCQ_1V8         (0x03UL << ARM_NAND_POWER_VCCQ_Pos) ///< VCCQ = 1.8V\r
61 #define ARM_NAND_POWER_VPP_OFF          (1UL << 6)                          ///< VPP off\r
62 #define ARM_NAND_POWER_VPP_ON           (1Ul << 7)                          ///< VPP on\r
63 \r
64 \r
65 /****** NAND Control Codes *****/\r
66 #define ARM_NAND_BUS_MODE               (0x01)      ///< Set Bus Mode as specified with arg\r
67 #define ARM_NAND_BUS_DATA_WIDTH         (0x02)      ///< Set Bus Data Width as specified with arg\r
68 #define ARM_NAND_DRIVER_STRENGTH        (0x03)      ///< Set Driver Strength as specified with arg\r
69 #define ARM_NAND_DEVICE_READY_EVENT     (0x04)      ///< Generate \ref ARM_NAND_EVENT_DEVICE_READY; arg: 0=disabled (default), 1=enabled \r
70 #define ARM_NAND_DRIVER_READY_EVENT     (0x05)      ///< Generate \ref ARM_NAND_EVENT_DRIVER_READY; arg: 0=disabled (default), 1=enabled \r
71 \r
72 /*----- NAND Bus Mode (ONFI - Open NAND Flash Interface) -----*/\r
73 #define ARM_NAND_BUS_INTERFACE_Pos       4\r
74 #define ARM_NAND_BUS_INTERFACE_Msk      (0x03UL << ARM_NAND_BUS_INTERFACE_Pos)\r
75 #define ARM_NAND_BUS_SDR                (0x00UL << ARM_NAND_BUS_INTERFACE_Pos)    ///< Data Interface:    SDR  (Single Data Rate) - Traditional interface (default)\r
76 #define ARM_NAND_BUS_DDR                (0x01UL << ARM_NAND_BUS_INTERFACE_Pos)    ///< Data Interface: NV-DDR  (Double Data Rate)\r
77 #define ARM_NAND_BUS_DDR2               (0x02UL << ARM_NAND_BUS_INTERFACE_Pos)    ///< Data Interface: NV-DDR2 (Double Data Rate)\r
78 #define ARM_NAND_BUS_TIMING_MODE_Pos     0\r
79 #define ARM_NAND_BUS_TIMING_MODE_Msk    (0x0FUL << ARM_NAND_BUS_TIMING_MODE_Pos)\r
80 #define ARM_NAND_BUS_TIMING_MODE_0      (0x00UL << ARM_NAND_BUS_TIMING_MODE_Pos)  ///< Timing Mode 0 (default)\r
81 #define ARM_NAND_BUS_TIMING_MODE_1      (0x01UL << ARM_NAND_BUS_TIMING_MODE_Pos)  ///< Timing Mode 1\r
82 #define ARM_NAND_BUS_TIMING_MODE_2      (0x02UL << ARM_NAND_BUS_TIMING_MODE_Pos)  ///< Timing Mode 2\r
83 #define ARM_NAND_BUS_TIMING_MODE_3      (0x03UL << ARM_NAND_BUS_TIMING_MODE_Pos)  ///< Timing Mode 3\r
84 #define ARM_NAND_BUS_TIMING_MODE_4      (0x04UL << ARM_NAND_BUS_TIMING_MODE_Pos)  ///< Timing Mode 4 (SDR EDO capable)\r
85 #define ARM_NAND_BUS_TIMING_MODE_5      (0x05UL << ARM_NAND_BUS_TIMING_MODE_Pos)  ///< Timing Mode 5 (SDR EDO capable)\r
86 #define ARM_NAND_BUS_TIMING_MODE_6      (0x06UL << ARM_NAND_BUS_TIMING_MODE_Pos)  ///< Timing Mode 6 (NV-DDR2 only)\r
87 #define ARM_NAND_BUS_TIMING_MODE_7      (0x07UL << ARM_NAND_BUS_TIMING_MODE_Pos)  ///< Timing Mode 7 (NV-DDR2 only)\r
88 #define ARM_NAND_BUS_DDR2_DO_WCYC_Pos    8\r
89 #define ARM_NAND_BUS_DDR2_DO_WCYC_Msk   (0x0FUL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos)\r
90 #define ARM_NAND_BUS_DDR2_DO_WCYC_0     (0x00UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 0 (default)\r
91 #define ARM_NAND_BUS_DDR2_DO_WCYC_1     (0x01UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 1\r
92 #define ARM_NAND_BUS_DDR2_DO_WCYC_2     (0x02UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 2\r
93 #define ARM_NAND_BUS_DDR2_DO_WCYC_4     (0x03UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 4\r
94 #define ARM_NAND_BUS_DDR2_DI_WCYC_Pos    12\r
95 #define ARM_NAND_BUS_DDR2_DI_WCYC_Msk   (0x0FUL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos)\r
96 #define ARM_NAND_BUS_DDR2_DI_WCYC_0     (0x00UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 0 (default)\r
97 #define ARM_NAND_BUS_DDR2_DI_WCYC_1     (0x01UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 1\r
98 #define ARM_NAND_BUS_DDR2_DI_WCYC_2     (0x02UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 2\r
99 #define ARM_NAND_BUS_DDR2_DI_WCYC_4     (0x03UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 4\r
100 #define ARM_NAND_BUS_DDR2_VEN           (1UL << 16)                               ///< DDR2 Enable external VREFQ as reference\r
101 #define ARM_NAND_BUS_DDR2_CMPD          (1UL << 17)                               ///< DDR2 Enable complementary DQS (DQS_c) signal\r
102 #define ARM_NAND_BUS_DDR2_CMPR          (1UL << 18)                               ///< DDR2 Enable complementary RE_n (RE_c) signal\r
103 \r
104 /*----- NAND Data Bus Width -----*/\r
105 #define ARM_NAND_BUS_DATA_WIDTH_8       (0x00)      ///< Bus Data Width:  8 bit (default)\r
106 #define ARM_NAND_BUS_DATA_WIDTH_16      (0x01)      ///< Bus Data Width: 16 bit\r
107 \r
108 /*----- NAND Driver Strength (ONFI - Open NAND Flash Interface) -----*/\r
109 #define ARM_NAND_DRIVER_STRENGTH_18     (0x00)      ///< Driver Strength 2.0x = 18 Ohms\r
110 #define ARM_NAND_DRIVER_STRENGTH_25     (0x01)      ///< Driver Strength 1.4x = 25 Ohms\r
111 #define ARM_NAND_DRIVER_STRENGTH_35     (0x02)      ///< Driver Strength 1.0x = 35 Ohms (default)\r
112 #define ARM_NAND_DRIVER_STRENGTH_50     (0x03)      ///< Driver Strength 0.7x = 50 Ohms\r
113 \r
114 \r
115 /****** NAND ECC for Read/Write Data Mode and Sequence Execution Code *****/\r
116 #define ARM_NAND_ECC_INDEX_Pos           0\r
117 #define ARM_NAND_ECC_INDEX_Msk          (0xFFUL << ARM_NAND_ECC_INDEX_Pos)\r
118 #define ARM_NAND_ECC(n)                 ((n) & ARM_NAND_ECC_INDEX_Msk)     ///< Select ECC\r
119 #define ARM_NAND_ECC0                   (1UL << 8)                         ///< Use ECC0 of selected ECC\r
120 #define ARM_NAND_ECC1                   (1UL << 9)                         ///< Use ECC1 of selected ECC\r
121 \r
122 /****** NAND Flag for Read/Write Data Mode and Sequence Execution Code *****/\r
123 #define ARM_NAND_DRIVER_DONE_EVENT      (1UL << 16) ///< Generate \ref ARM_NAND_EVENT_DRIVER_DONE\r
124 \r
125 /****** NAND Sequence Execution Code *****/\r
126 #define ARM_NAND_CODE_SEND_CMD1         (1UL << 17) ///< Send Command 1\r
127 #define ARM_NAND_CODE_SEND_ADDR_COL1    (1UL << 18) ///< Send Column Address 1\r
128 #define ARM_NAND_CODE_SEND_ADDR_COL2    (1UL << 19) ///< Send Column Address 2\r
129 #define ARM_NAND_CODE_SEND_ADDR_ROW1    (1UL << 20) ///< Send Row Address 1\r
130 #define ARM_NAND_CODE_SEND_ADDR_ROW2    (1UL << 21) ///< Send Row Address 2\r
131 #define ARM_NAND_CODE_SEND_ADDR_ROW3    (1UL << 22) ///< Send Row Address 3\r
132 #define ARM_NAND_CODE_INC_ADDR_ROW      (1UL << 23) ///< Auto-increment Row Address\r
133 #define ARM_NAND_CODE_WRITE_DATA        (1UL << 24) ///< Write Data\r
134 #define ARM_NAND_CODE_SEND_CMD2         (1UL << 25) ///< Send Command 2\r
135 #define ARM_NAND_CODE_WAIT_BUSY         (1UL << 26) ///< Wait while R/Bn busy\r
136 #define ARM_NAND_CODE_READ_DATA         (1UL << 27) ///< Read Data\r
137 #define ARM_NAND_CODE_SEND_CMD3         (1UL << 28) ///< Send Command 3\r
138 #define ARM_NAND_CODE_READ_STATUS       (1UL << 29) ///< Read Status byte and check FAIL bit (bit 0)\r
139 \r
140 /*----- NAND Sequence Execution Code: Command -----*/\r
141 #define ARM_NAND_CODE_CMD1_Pos           0\r
142 #define ARM_NAND_CODE_CMD1_Msk          (0xFFUL << ARM_NAND_CODE_CMD1_Pos)\r
143 #define ARM_NAND_CODE_CMD2_Pos           8\r
144 #define ARM_NAND_CODE_CMD2_Msk          (0xFFUL << ARM_NAND_CODE_CMD2_Pos)\r
145 #define ARM_NAND_CODE_CMD3_Pos           16\r
146 #define ARM_NAND_CODE_CMD3_Msk          (0xFFUL << ARM_NAND_CODE_CMD3_Pos)\r
147 \r
148 /*----- NAND Sequence Execution Code: Column Address -----*/\r
149 #define ARM_NAND_CODE_ADDR_COL1_Pos      0\r
150 #define ARM_NAND_CODE_ADDR_COL1_Msk     (0xFFUL << ARM_NAND_CODE_ADDR_COL1_Pos)\r
151 #define ARM_NAND_CODE_ADDR_COL2_Pos      8\r
152 #define ARM_NAND_CODE_ADDR_COL2_Msk     (0xFFUL << ARM_NAND_CODE_ADDR_COL2_Pos)\r
153 \r
154 /*----- NAND Sequence Execution Code: Row Address -----*/\r
155 #define ARM_NAND_CODE_ADDR_ROW1_Pos      0\r
156 #define ARM_NAND_CODE_ADDR_ROW1_Msk     (0xFFUL << ARM_NAND_CODE_ADDR_ROW1_Pos)\r
157 #define ARM_NAND_CODE_ADDR_ROW2_Pos      8\r
158 #define ARM_NAND_CODE_ADDR_ROW2_Msk     (0xFFUL << ARM_NAND_CODE_ADDR_ROW2_Pos)\r
159 #define ARM_NAND_CODE_ADDR_ROW3_Pos      16\r
160 #define ARM_NAND_CODE_ADDR_ROW3_Msk     (0xFFUL << ARM_NAND_CODE_ADDR_ROW3_Pos)\r
161 \r
162 \r
163 /****** NAND specific error codes *****/\r
164 #define ARM_NAND_ERROR_ECC              (ARM_DRIVER_ERROR_SPECIFIC - 1)     ///< ECC generation/correction failed\r
165 \r
166 \r
167 /**\r
168 \brief NAND ECC (Error Correction Code) Information\r
169 */\r
170 typedef struct _ARM_NAND_ECC_INFO {\r
171   uint32_t type             :  2;       ///< Type: 1=ECC0 over Data, 2=ECC0 over Data+Spare, 3=ECC0 over Data and ECC1 over Spare\r
172   uint32_t page_layout      :  1;       ///< Page layout: 0=|Data0|Spare0|...|DataN-1|SpareN-1|, 1=|Data0|...|DataN-1|Spare0|...|SpareN-1|\r
173   uint32_t page_count       :  3;       ///< Number of virtual pages: N = 2 ^ page_count\r
174   uint32_t page_size        :  4;       ///< Virtual Page size (Data+Spare): 0=512+16, 1=1k+32, 2=2k+64, 3=4k+128, 4=8k+256, 8=512+28, 9=1k+56, 10=2k+112, 11=4k+224, 12=8k+448\r
175   uint32_t reserved         : 14;       ///< Reserved (must be zero)\r
176   uint32_t correctable_bits :  8;       ///< Number of correctable bits (based on 512 byte codeword size)\r
177   uint16_t codeword_size [2];           ///< Number of bytes over which ECC is calculated\r
178   uint16_t ecc_size      [2];           ///< ECC size in bytes (rounded up)\r
179   uint16_t ecc_offset    [2];           ///< ECC offset in bytes (where ECC starts in Spare area) \r
180 } ARM_NAND_ECC_INFO;\r
181 \r
182 \r
183 /**\r
184 \brief NAND Status\r
185 */\r
186 typedef struct _ARM_NAND_STATUS {\r
187   uint32_t busy      : 1;               ///< Driver busy flag\r
188   uint32_t ecc_error : 1;               ///< ECC error detected (cleared on next Read/WriteData or ExecuteSequence)\r
189 } ARM_NAND_STATUS;\r
190 \r
191 \r
192 /****** NAND Event *****/\r
193 #define ARM_NAND_EVENT_DEVICE_READY     (1UL << 0)  ///< Device Ready: R/Bn rising edge\r
194 #define ARM_NAND_EVENT_DRIVER_READY     (1UL << 1)  ///< Driver Ready\r
195 #define ARM_NAND_EVENT_DRIVER_DONE      (1UL << 2)  ///< Driver operation done\r
196 #define ARM_NAND_EVENT_ECC_ERROR        (1UL << 3)  ///< ECC could not correct data\r
197 \r
198 \r
199 // Function documentation\r
200 /**\r
201   \fn            ARM_DRIVER_VERSION ARM_NAND_GetVersion (void)\r
202   \brief         Get driver version.\r
203   \return        \ref ARM_DRIVER_VERSION\r
204 */\r
205 /**\r
206   \fn            ARM_NAND_CAPABILITIES ARM_NAND_GetCapabilities (void)\r
207   \brief         Get driver capabilities.\r
208   \return        \ref ARM_NAND_CAPABILITIES\r
209 */\r
210 /**\r
211   \fn            int32_t ARM_NAND_Initialize (ARM_NAND_SignalEvent_t cb_event)\r
212   \brief         Initialize the NAND Interface.\r
213   \param[in]     cb_event  Pointer to \ref ARM_NAND_SignalEvent\r
214   \return        \ref execution_status\r
215 */\r
216 /**\r
217   \fn            int32_t ARM_NAND_Uninitialize (void)\r
218   \brief         De-initialize the NAND Interface.\r
219   \return        \ref execution_status\r
220 */\r
221 /**\r
222   \fn            int32_t ARM_NAND_PowerControl (ARM_POWER_STATE state)\r
223   \brief         Control the NAND interface power.\r
224   \param[in]     state  Power state\r
225   \return        \ref execution_status\r
226 */\r
227 /**\r
228   \fn            int32_t ARM_NAND_DevicePower (uint32_t voltage)\r
229   \brief         Set device power supply voltage.\r
230   \param[in]     voltage  NAND Device supply voltage\r
231   \return        \ref execution_status\r
232 */\r
233 /**\r
234   \fn            int32_t ARM_NAND_WriteProtect (uint32_t dev_num, bool enable)\r
235   \brief         Control WPn (Write Protect).\r
236   \param[in]     dev_num  Device number\r
237   \param[in]     enable\r
238                 - \b false Write Protect off\r
239                 - \b true  Write Protect on\r
240   \return        \ref execution_status\r
241 */\r
242 /**\r
243   \fn            int32_t ARM_NAND_ChipEnable (uint32_t dev_num, bool enable)\r
244   \brief         Control CEn (Chip Enable).\r
245   \param[in]     dev_num  Device number\r
246   \param[in]     enable\r
247                 - \b false Chip Enable off\r
248                 - \b true  Chip Enable on\r
249   \return        \ref execution_status\r
250 */\r
251 /**\r
252   \fn            int32_t ARM_NAND_GetDeviceBusy (uint32_t dev_num)\r
253   \brief         Get Device Busy pin state.\r
254   \param[in]     dev_num  Device number\r
255   \return        1=busy, 0=not busy, or error\r
256 */\r
257 /**\r
258   \fn            int32_t ARM_NAND_SendCommand (uint32_t dev_num, uint8_t cmd)\r
259   \brief         Send command to NAND device.\r
260   \param[in]     dev_num  Device number\r
261   \param[in]     cmd      Command\r
262   \return        \ref execution_status\r
263 */\r
264 /**\r
265   \fn            int32_t ARM_NAND_SendAddress (uint32_t dev_num, uint8_t addr)\r
266   \brief         Send address to NAND device.\r
267   \param[in]     dev_num  Device number\r
268   \param[in]     addr     Address\r
269   \return        \ref execution_status\r
270 */\r
271 /**\r
272   \fn            int32_t ARM_NAND_ReadData (uint32_t dev_num, void *data, uint32_t cnt, uint32_t mode)\r
273   \brief         Read data from NAND device.\r
274   \param[in]     dev_num  Device number\r
275   \param[out]    data     Pointer to buffer for data to read from NAND device\r
276   \param[in]     cnt      Number of data items to read\r
277   \param[in]     mode     Operation mode\r
278   \return        number of data items read or \ref execution_status\r
279 */\r
280 /**\r
281   \fn            int32_t ARM_NAND_WriteData (uint32_t dev_num, const void *data, uint32_t cnt, uint32_t mode)\r
282   \brief         Write data to NAND device.\r
283   \param[in]     dev_num  Device number\r
284   \param[out]    data     Pointer to buffer with data to write to NAND device\r
285   \param[in]     cnt      Number of data items to write\r
286   \param[in]     mode     Operation mode\r
287   \return        number of data items written or \ref execution_status\r
288 */\r
289 /**\r
290   \fn            int32_t ARM_NAND_ExecuteSequence (uint32_t dev_num, uint32_t code, uint32_t cmd,\r
291                                                    uint32_t addr_col, uint32_t addr_row,\r
292                                                    void *data, uint32_t data_cnt,\r
293                                                    uint8_t *status, uint32_t *count)\r
294   \brief         Execute sequence of operations.\r
295   \param[in]     dev_num  Device number\r
296   \param[in]     code     Sequence code\r
297   \param[in]     cmd      Command(s)\r
298   \param[in]     addr_col Column address\r
299   \param[in]     addr_row Row address\r
300   \param[in,out] data     Pointer to data to be written or read \r
301   \param[in]     data_cnt Number of data items in one iteration\r
302   \param[out]    status   Pointer to status read\r
303   \param[in,out] count    Number of iterations\r
304   \return        \ref execution_status\r
305 */\r
306 /**\r
307   \fn            int32_t ARM_NAND_AbortSequence (uint32_t dev_num)\r
308   \brief         Abort sequence execution.\r
309   \param[in]     dev_num  Device number\r
310   \return        \ref execution_status\r
311 */\r
312 /**\r
313   \fn            int32_t ARM_NAND_Control (uint32_t dev_num, uint32_t control, uint32_t arg)\r
314   \brief         Control NAND Interface.\r
315   \param[in]     dev_num  Device number\r
316   \param[in]     control  Operation\r
317   \param[in]     arg      Argument of operation\r
318   \return        \ref execution_status\r
319 */\r
320 /**\r
321   \fn            ARM_NAND_STATUS ARM_NAND_GetStatus (uint32_t dev_num)\r
322   \brief         Get NAND status.\r
323   \param[in]     dev_num  Device number\r
324   \return        NAND status \ref ARM_NAND_STATUS\r
325 */\r
326 /**\r
327   \fn            int32_t ARM_NAND_InquireECC (int32_t index, ARM_NAND_ECC_INFO *info)\r
328   \brief         Inquire about available ECC.\r
329   \param[in]     index   Device number\r
330   \param[out]    info    Pointer to ECC information \ref ARM_NAND_ECC_INFO retrieved\r
331   \return        \ref execution_status\r
332 */\r
333 \r
334 /**\r
335   \fn            void ARM_NAND_SignalEvent (uint32_t dev_num, uint32_t event)\r
336   \brief         Signal NAND event.\r
337   \param[in]     dev_num  Device number\r
338   \param[in]     event    Event notification mask\r
339   \return        none\r
340 */\r
341 \r
342 typedef void (*ARM_NAND_SignalEvent_t) (uint32_t dev_num, uint32_t event);    ///< Pointer to \ref ARM_NAND_SignalEvent : Signal NAND Event.\r
343 \r
344 \r
345 /**\r
346 \brief NAND Driver Capabilities.\r
347 */\r
348 typedef struct _ARM_NAND_CAPABILITIES {\r
349   uint32_t event_device_ready  : 1;     ///< Signal Device Ready event (R/Bn rising edge)\r
350   uint32_t reentrant_operation : 1;     ///< Supports re-entrant operation (SendCommand/Address, Read/WriteData)\r
351   uint32_t sequence_operation  : 1;     ///< Supports Sequence operation (ExecuteSequence, AbortSequence)\r
352   uint32_t vcc                 : 1;     ///< Supports VCC Power Supply Control\r
353   uint32_t vcc_1v8             : 1;     ///< Supports 1.8 VCC Power Supply\r
354   uint32_t vccq                : 1;     ///< Supports VCCQ I/O Power Supply Control\r
355   uint32_t vccq_1v8            : 1;     ///< Supports 1.8 VCCQ I/O Power Supply\r
356   uint32_t vpp                 : 1;     ///< Supports VPP High Voltage Power Supply Control\r
357   uint32_t wp                  : 1;     ///< Supports WPn (Write Protect) Control\r
358   uint32_t ce_lines            : 4;     ///< Number of CEn (Chip Enable) lines: ce_lines + 1\r
359   uint32_t ce_manual           : 1;     ///< Supports manual CEn (Chip Enable) Control\r
360   uint32_t rb_monitor          : 1;     ///< Supports R/Bn (Ready/Busy) Monitoring\r
361   uint32_t data_width_16       : 1;     ///< Supports 16-bit data\r
362   uint32_t ddr                 : 1;     ///< Supports NV-DDR  Data Interface (ONFI)\r
363   uint32_t ddr2                : 1;     ///< Supports NV-DDR2 Data Interface (ONFI)\r
364   uint32_t sdr_timing_mode     : 3;     ///< Fastest (highest) SDR     Timing Mode supported (ONFI)\r
365   uint32_t ddr_timing_mode     : 3;     ///< Fastest (highest) NV_DDR  Timing Mode supported (ONFI)\r
366   uint32_t ddr2_timing_mode    : 3;     ///< Fastest (highest) NV_DDR2 Timing Mode supported (ONFI)\r
367   uint32_t driver_strength_18  : 1;     ///< Supports Driver Strength 2.0x = 18 Ohms\r
368   uint32_t driver_strength_25  : 1;     ///< Supports Driver Strength 1.4x = 25 Ohms\r
369   uint32_t driver_strength_50  : 1;     ///< Supports Driver Strength 0.7x = 50 Ohms\r
370 } ARM_NAND_CAPABILITIES;\r
371 \r
372 \r
373 /**\r
374 \brief Access structure of the NAND Driver.\r
375 */\r
376 typedef struct _ARM_DRIVER_NAND {\r
377   ARM_DRIVER_VERSION    (*GetVersion)     (void);                                                             ///< Pointer to \ref ARM_NAND_GetVersion : Get driver version.\r
378   ARM_NAND_CAPABILITIES (*GetCapabilities)(void);                                                             ///< Pointer to \ref ARM_NAND_GetCapabilities : Get driver capabilities.\r
379   int32_t               (*Initialize)     (ARM_NAND_SignalEvent_t cb_event);                                  ///< Pointer to \ref ARM_NAND_Initialize : Initialize NAND Interface.\r
380   int32_t               (*Uninitialize)   (void);                                                             ///< Pointer to \ref ARM_NAND_Uninitialize : De-initialize NAND Interface.\r
381   int32_t               (*PowerControl)   (ARM_POWER_STATE state);                                            ///< Pointer to \ref ARM_NAND_PowerControl : Control NAND Interface Power.\r
382   int32_t               (*DevicePower)    (uint32_t voltage);                                                 ///< Pointer to \ref ARM_NAND_DevicePower : Set device power supply voltage.\r
383   int32_t               (*WriteProtect)   (uint32_t dev_num, bool enable);                                    ///< Pointer to \ref ARM_NAND_WriteProtect : Control WPn (Write Protect).\r
384   int32_t               (*ChipEnable)     (uint32_t dev_num, bool enable);                                    ///< Pointer to \ref ARM_NAND_ChipEnable : Control CEn (Chip Enable).\r
385   int32_t               (*GetDeviceBusy)  (uint32_t dev_num);                                                 ///< Pointer to \ref ARM_NAND_GetDeviceBusy : Get Device Busy pin state.\r
386   int32_t               (*SendCommand)    (uint32_t dev_num, uint8_t cmd);                                    ///< Pointer to \ref ARM_NAND_SendCommand : Send command to NAND device.\r
387   int32_t               (*SendAddress)    (uint32_t dev_num, uint8_t addr);                                   ///< Pointer to \ref ARM_NAND_SendAddress : Send address to NAND device.\r
388   int32_t               (*ReadData)       (uint32_t dev_num,       void *data, uint32_t cnt, uint32_t mode);  ///< Pointer to \ref ARM_NAND_ReadData : Read data from NAND device.\r
389   int32_t               (*WriteData)      (uint32_t dev_num, const void *data, uint32_t cnt, uint32_t mode);  ///< Pointer to \ref ARM_NAND_WriteData : Write data to NAND device.\r
390   int32_t               (*ExecuteSequence)(uint32_t dev_num, uint32_t code, uint32_t cmd,\r
391                                            uint32_t addr_col, uint32_t addr_row,\r
392                                            void *data, uint32_t data_cnt,\r
393                                            uint8_t *status, uint32_t *count);                                 ///< Pointer to \ref ARM_NAND_ExecuteSequence : Execute sequence of operations.\r
394   int32_t               (*AbortSequence)  (uint32_t dev_num);                                                 ///< Pointer to \ref ARM_NAND_AbortSequence : Abort sequence execution. \r
395   int32_t               (*Control)        (uint32_t dev_num, uint32_t control, uint32_t arg);                 ///< Pointer to \ref ARM_NAND_Control : Control NAND Interface.\r
396   ARM_NAND_STATUS       (*GetStatus)      (uint32_t dev_num);                                                 ///< Pointer to \ref ARM_NAND_GetStatus : Get NAND status.\r
397   int32_t               (*InquireECC)     ( int32_t index, ARM_NAND_ECC_INFO *info);                          ///< Pointer to \ref ARM_NAND_InquireECC : Inquire about available ECC. \r
398 } const ARM_DRIVER_NAND;\r
399 \r
400 #endif /* __DRIVER_NAND_H */\r