2 * Copyright (c) 2013-2016 ARM Limited. All rights reserved.
\r
4 * SPDX-License-Identifier: Apache-2.0
\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
10 * http://www.apache.org/licenses/LICENSE-2.0
\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
18 * $Date: 30. May 2014
\r
21 * Project: NAND Flash Driver definitions
\r
26 * Updated ARM_NAND_ECC_INFO structure and ARM_NAND_ECC_xxx definitions
\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
35 * Changed prefix ARM_DRV -> ARM_DRIVER
\r
37 * Namespace prefix ARM_ added
\r
42 #ifndef __DRIVER_NAND_H
\r
43 #define __DRIVER_NAND_H
\r
45 #include "Driver_Common.h"
\r
47 #define ARM_NAND_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,01) /* API version */
\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
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
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
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
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
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
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
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
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
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
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
163 /****** NAND specific error codes *****/
\r
164 #define ARM_NAND_ERROR_ECC (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< ECC generation/correction failed
\r
168 \brief NAND ECC (Error Correction Code) Information
\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
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
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
199 // Function documentation
\r
201 \fn ARM_DRIVER_VERSION ARM_NAND_GetVersion (void)
\r
202 \brief Get driver version.
\r
203 \return \ref ARM_DRIVER_VERSION
\r
206 \fn ARM_NAND_CAPABILITIES ARM_NAND_GetCapabilities (void)
\r
207 \brief Get driver capabilities.
\r
208 \return \ref ARM_NAND_CAPABILITIES
\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
217 \fn int32_t ARM_NAND_Uninitialize (void)
\r
218 \brief De-initialize the NAND Interface.
\r
219 \return \ref execution_status
\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
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
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
238 - \b false Write Protect off
\r
239 - \b true Write Protect on
\r
240 \return \ref execution_status
\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
247 - \b false Chip Enable off
\r
248 - \b true Chip Enable on
\r
249 \return \ref execution_status
\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
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
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
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
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
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
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
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
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
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
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
342 typedef void (*ARM_NAND_SignalEvent_t) (uint32_t dev_num, uint32_t event); ///< Pointer to \ref ARM_NAND_SignalEvent : Signal NAND Event.
\r
346 \brief NAND Driver Capabilities.
\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
374 \brief Access structure of the NAND Driver.
\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
400 #endif /* __DRIVER_NAND_H */
\r