a44f3c21e23e2282a71ee6dd6aaaf031c93112c3
[openocd.git] / src / flash / nand / lpc3180.c
bloba44f3c21e23e2282a71ee6dd6aaaf031c93112c3
1 /***************************************************************************
2 * Copyright (C) 2007 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2010 richard vegh <vegh.ricsi@gmail.com> *
6 * Copyright (C) 2010 Oyvind Harboe <oyvind.harboe@zylin.com> *
7 * *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
12 * *
13 * This program is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU General Public License for more details. *
17 * *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program; if not, write to the *
20 * Free Software Foundation, Inc., *
21 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
22 ***************************************************************************/
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
28 #include "imp.h"
29 #include "lpc3180.h"
30 #include <target/target.h>
32 static int lpc3180_reset(struct nand_device *nand);
33 static int lpc3180_controller_ready(struct nand_device *nand, int timeout);
34 static int lpc3180_tc_ready(struct nand_device *nand, int timeout);
36 #define ECC_OFFS 0x120
37 #define SPARE_OFFS 0x140
38 #define DATA_OFFS 0x200
40 /* nand device lpc3180 <target#> <oscillator_frequency>
42 NAND_DEVICE_COMMAND_HANDLER(lpc3180_nand_device_command)
44 if (CMD_ARGC < 3)
45 return ERROR_COMMAND_SYNTAX_ERROR;
47 uint32_t osc_freq;
48 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], osc_freq);
50 struct lpc3180_nand_controller *lpc3180_info;
51 lpc3180_info = malloc(sizeof(struct lpc3180_nand_controller));
52 nand->controller_priv = lpc3180_info;
54 lpc3180_info->osc_freq = osc_freq;
56 if ((lpc3180_info->osc_freq < 1000) || (lpc3180_info->osc_freq > 20000))
57 LOG_WARNING(
58 "LPC3180 oscillator frequency should be between 1000 and 20000 kHz, was %i",
59 lpc3180_info->osc_freq);
60 lpc3180_info->selected_controller = LPC3180_NO_CONTROLLER;
61 lpc3180_info->sw_write_protection = 0;
62 lpc3180_info->sw_wp_lower_bound = 0x0;
63 lpc3180_info->sw_wp_upper_bound = 0x0;
65 return ERROR_OK;
68 static int lpc3180_pll(int fclkin, uint32_t pll_ctrl)
70 int bypass = (pll_ctrl & 0x8000) >> 15;
71 int direct = (pll_ctrl & 0x4000) >> 14;
72 int feedback = (pll_ctrl & 0x2000) >> 13;
73 int p = (1 << ((pll_ctrl & 0x1800) >> 11) * 2);
74 int n = ((pll_ctrl & 0x0600) >> 9) + 1;
75 int m = ((pll_ctrl & 0x01fe) >> 1) + 1;
76 int lock = (pll_ctrl & 0x1);
78 if (!lock)
79 LOG_WARNING("PLL is not locked");
81 if (!bypass && direct) /* direct mode */
82 return (m * fclkin) / n;
84 if (bypass && !direct) /* bypass mode */
85 return fclkin / (2 * p);
87 if (bypass & direct) /* direct bypass mode */
88 return fclkin;
90 if (feedback) /* integer mode */
91 return m * (fclkin / n);
92 else /* non-integer mode */
93 return (m / (2 * p)) * (fclkin / n);
96 static float lpc3180_cycle_time(struct nand_device *nand)
98 struct lpc3180_nand_controller *lpc3180_info = nand->controller_priv;
99 struct target *target = nand->target;
100 uint32_t sysclk_ctrl, pwr_ctrl, hclkdiv_ctrl, hclkpll_ctrl;
101 int sysclk;
102 int hclk;
103 int hclk_pll;
104 float cycle;
106 /* calculate timings */
108 /* determine current SYSCLK (13'MHz or main oscillator) */
109 target_read_u32(target, 0x40004050, &sysclk_ctrl);
111 if ((sysclk_ctrl & 1) == 0)
112 sysclk = lpc3180_info->osc_freq;
113 else
114 sysclk = 13000;
116 /* determine selected HCLK source */
117 target_read_u32(target, 0x40004044, &pwr_ctrl);
119 if ((pwr_ctrl & (1 << 2)) == 0) /* DIRECT RUN mode */
120 hclk = sysclk;
121 else {
122 target_read_u32(target, 0x40004058, &hclkpll_ctrl);
123 hclk_pll = lpc3180_pll(sysclk, hclkpll_ctrl);
125 target_read_u32(target, 0x40004040, &hclkdiv_ctrl);
127 if (pwr_ctrl & (1 << 10)) /* ARM_CLK and HCLK use PERIPH_CLK */
128 hclk = hclk_pll / (((hclkdiv_ctrl & 0x7c) >> 2) + 1);
129 else /* HCLK uses HCLK_PLL */
130 hclk = hclk_pll / (1 << (hclkdiv_ctrl & 0x3));
133 LOG_DEBUG("LPC3180 HCLK currently clocked at %i kHz", hclk);
135 cycle = (1.0 / hclk) * 1000000.0;
137 return cycle;
140 static int lpc3180_init(struct nand_device *nand)
142 struct lpc3180_nand_controller *lpc3180_info = nand->controller_priv;
143 struct target *target = nand->target;
144 int bus_width = nand->bus_width ? : 8;
145 int address_cycles = nand->address_cycles ? : 3;
146 int page_size = nand->page_size ? : 512;
148 if (target->state != TARGET_HALTED) {
149 LOG_ERROR("target must be halted to use LPC3180 NAND flash controller");
150 return ERROR_NAND_OPERATION_FAILED;
153 /* sanitize arguments */
154 if ((bus_width != 8) && (bus_width != 16)) {
155 LOG_ERROR("LPC3180 only supports 8 or 16 bit bus width, not %i", bus_width);
156 return ERROR_NAND_OPERATION_NOT_SUPPORTED;
159 /* The LPC3180 only brings out 8 bit NAND data bus, but the controller
160 * would support 16 bit, too, so we just warn about this for now
162 if (bus_width == 16)
163 LOG_WARNING("LPC3180 only supports 8 bit bus width");
165 /* inform calling code about selected bus width */
166 nand->bus_width = bus_width;
168 if ((address_cycles != 3) && (address_cycles != 4)) {
169 LOG_ERROR("LPC3180 only supports 3 or 4 address cycles, not %i", address_cycles);
170 return ERROR_NAND_OPERATION_NOT_SUPPORTED;
173 if ((page_size != 512) && (page_size != 2048)) {
174 LOG_ERROR("LPC3180 only supports 512 or 2048 byte pages, not %i", page_size);
175 return ERROR_NAND_OPERATION_NOT_SUPPORTED;
178 /* select MLC controller if none is currently selected */
179 if (lpc3180_info->selected_controller == LPC3180_NO_CONTROLLER) {
180 LOG_DEBUG("no LPC3180 NAND flash controller selected, using default 'mlc'");
181 lpc3180_info->selected_controller = LPC3180_MLC_CONTROLLER;
184 if (lpc3180_info->selected_controller == LPC3180_MLC_CONTROLLER) {
185 uint32_t mlc_icr_value = 0x0;
186 float cycle;
187 int twp, twh, trp, treh, trhz, trbwb, tcea;
189 /* FLASHCLK_CTRL = 0x22 (enable clock for MLC flash controller) */
190 target_write_u32(target, 0x400040c8, 0x22);
192 /* MLC_CEH = 0x0 (Force nCE assert) */
193 target_write_u32(target, 0x200b804c, 0x0);
195 /* MLC_LOCK = 0xa25e (unlock protected registers) */
196 target_write_u32(target, 0x200b8044, 0xa25e);
198 /* MLC_ICR = configuration */
199 if (lpc3180_info->sw_write_protection)
200 mlc_icr_value |= 0x8;
201 if (page_size == 2048)
202 mlc_icr_value |= 0x4;
203 if (address_cycles == 4)
204 mlc_icr_value |= 0x2;
205 if (bus_width == 16)
206 mlc_icr_value |= 0x1;
207 target_write_u32(target, 0x200b8030, mlc_icr_value);
209 /* calculate NAND controller timings */
210 cycle = lpc3180_cycle_time(nand);
212 twp = ((40 / cycle) + 1);
213 twh = ((20 / cycle) + 1);
214 trp = ((30 / cycle) + 1);
215 treh = ((15 / cycle) + 1);
216 trhz = ((30 / cycle) + 1);
217 trbwb = ((100 / cycle) + 1);
218 tcea = ((45 / cycle) + 1);
220 /* MLC_LOCK = 0xa25e (unlock protected registers) */
221 target_write_u32(target, 0x200b8044, 0xa25e);
223 /* MLC_TIME_REG */
224 target_write_u32(target, 0x200b8034, (twp & 0xf) | ((twh & 0xf) << 4) |
225 ((trp & 0xf) << 8) | ((treh & 0xf) << 12) | ((trhz & 0x7) << 16) |
226 ((trbwb & 0x1f) << 19) | ((tcea & 0x3) << 24));
228 lpc3180_reset(nand);
229 } else if (lpc3180_info->selected_controller == LPC3180_SLC_CONTROLLER) {
230 float cycle;
231 int r_setup, r_hold, r_width, r_rdy;
232 int w_setup, w_hold, w_width, w_rdy;
234 /* FLASHCLK_CTRL = 0x05 (enable clock for SLC flash controller) */
235 target_write_u32(target, 0x400040c8, 0x05);
237 /* after reset set other registers of SLC so reset calling is here at the begining*/
238 lpc3180_reset(nand);
240 /* SLC_CFG = 0x (Force nCE assert, DMA ECC enabled, ECC enabled, DMA burst enabled,
241 *DMA read from SLC, WIDTH = bus_width) */
242 target_write_u32(target, 0x20020014, 0x3e | (bus_width == 16) ? 1 : 0);
244 /* SLC_IEN = 3 (INT_RDY_EN = 1) ,(INT_TC_STAT = 1) */
245 target_write_u32(target, 0x20020020, 0x03);
247 /* DMA configuration
248 * DMACLK_CTRL = 0x01 (enable clock for DMA controller) */
249 target_write_u32(target, 0x400040e8, 0x01);
250 /* DMACConfig = DMA enabled*/
251 target_write_u32(target, 0x31000030, 0x01);
254 /* calculate NAND controller timings */
255 cycle = lpc3180_cycle_time(nand);
257 r_setup = w_setup = 0;
258 r_hold = w_hold = 10 / cycle;
259 r_width = 30 / cycle;
260 w_width = 40 / cycle;
261 r_rdy = w_rdy = 100 / cycle;
263 /* SLC_TAC: SLC timing arcs register */
264 target_write_u32(target, 0x2002002c, (r_setup & 0xf) | ((r_hold & 0xf) << 4) |
265 ((r_width & 0xf) << 8) | ((r_rdy & 0xf) << 12) | ((w_setup & 0xf) << 16) |
266 ((w_hold & 0xf) << 20) | ((w_width & 0xf) << 24) | ((w_rdy & 0xf) << 28));
270 return ERROR_OK;
273 static int lpc3180_reset(struct nand_device *nand)
275 struct lpc3180_nand_controller *lpc3180_info = nand->controller_priv;
276 struct target *target = nand->target;
278 if (target->state != TARGET_HALTED) {
279 LOG_ERROR("target must be halted to use LPC3180 NAND flash controller");
280 return ERROR_NAND_OPERATION_FAILED;
283 if (lpc3180_info->selected_controller == LPC3180_NO_CONTROLLER) {
284 LOG_ERROR("BUG: no LPC3180 NAND flash controller selected");
285 return ERROR_NAND_OPERATION_FAILED;
286 } else if (lpc3180_info->selected_controller == LPC3180_MLC_CONTROLLER) {
287 /* MLC_CMD = 0xff (reset controller and NAND device) */
288 target_write_u32(target, 0x200b8000, 0xff);
290 if (!lpc3180_controller_ready(nand, 100)) {
291 LOG_ERROR("LPC3180 NAND controller timed out after reset");
292 return ERROR_NAND_OPERATION_TIMEOUT;
294 } else if (lpc3180_info->selected_controller == LPC3180_SLC_CONTROLLER) {
295 /* SLC_CTRL = 0x6 (ECC_CLEAR, SW_RESET) */
296 target_write_u32(target, 0x20020010, 0x6);
298 if (!lpc3180_controller_ready(nand, 100)) {
299 LOG_ERROR("LPC3180 NAND controller timed out after reset");
300 return ERROR_NAND_OPERATION_TIMEOUT;
304 return ERROR_OK;
307 static int lpc3180_command(struct nand_device *nand, uint8_t command)
309 struct lpc3180_nand_controller *lpc3180_info = nand->controller_priv;
310 struct target *target = nand->target;
312 if (target->state != TARGET_HALTED) {
313 LOG_ERROR("target must be halted to use LPC3180 NAND flash controller");
314 return ERROR_NAND_OPERATION_FAILED;
317 if (lpc3180_info->selected_controller == LPC3180_NO_CONTROLLER) {
318 LOG_ERROR("BUG: no LPC3180 NAND flash controller selected");
319 return ERROR_NAND_OPERATION_FAILED;
320 } else if (lpc3180_info->selected_controller == LPC3180_MLC_CONTROLLER) {
321 /* MLC_CMD = command */
322 target_write_u32(target, 0x200b8000, command);
323 } else if (lpc3180_info->selected_controller == LPC3180_SLC_CONTROLLER) {
324 /* SLC_CMD = command */
325 target_write_u32(target, 0x20020008, command);
328 return ERROR_OK;
331 static int lpc3180_address(struct nand_device *nand, uint8_t address)
333 struct lpc3180_nand_controller *lpc3180_info = nand->controller_priv;
334 struct target *target = nand->target;
336 if (target->state != TARGET_HALTED) {
337 LOG_ERROR("target must be halted to use LPC3180 NAND flash controller");
338 return ERROR_NAND_OPERATION_FAILED;
341 if (lpc3180_info->selected_controller == LPC3180_NO_CONTROLLER) {
342 LOG_ERROR("BUG: no LPC3180 NAND flash controller selected");
343 return ERROR_NAND_OPERATION_FAILED;
344 } else if (lpc3180_info->selected_controller == LPC3180_MLC_CONTROLLER) {
345 /* MLC_ADDR = address */
346 target_write_u32(target, 0x200b8004, address);
347 } else if (lpc3180_info->selected_controller == LPC3180_SLC_CONTROLLER) {
348 /* SLC_ADDR = address */
349 target_write_u32(target, 0x20020004, address);
352 return ERROR_OK;
355 static int lpc3180_write_data(struct nand_device *nand, uint16_t data)
357 struct lpc3180_nand_controller *lpc3180_info = nand->controller_priv;
358 struct target *target = nand->target;
360 if (target->state != TARGET_HALTED) {
361 LOG_ERROR("target must be halted to use LPC3180 NAND flash controller");
362 return ERROR_NAND_OPERATION_FAILED;
365 if (lpc3180_info->selected_controller == LPC3180_NO_CONTROLLER) {
366 LOG_ERROR("BUG: no LPC3180 NAND flash controller selected");
367 return ERROR_NAND_OPERATION_FAILED;
368 } else if (lpc3180_info->selected_controller == LPC3180_MLC_CONTROLLER) {
369 /* MLC_DATA = data */
370 target_write_u32(target, 0x200b0000, data);
371 } else if (lpc3180_info->selected_controller == LPC3180_SLC_CONTROLLER) {
372 /* SLC_DATA = data */
373 target_write_u32(target, 0x20020000, data);
376 return ERROR_OK;
379 static int lpc3180_read_data(struct nand_device *nand, void *data)
381 struct lpc3180_nand_controller *lpc3180_info = nand->controller_priv;
382 struct target *target = nand->target;
384 if (target->state != TARGET_HALTED) {
385 LOG_ERROR("target must be halted to use LPC3180 NAND flash controller");
386 return ERROR_NAND_OPERATION_FAILED;
389 if (lpc3180_info->selected_controller == LPC3180_NO_CONTROLLER) {
390 LOG_ERROR("BUG: no LPC3180 NAND flash controller selected");
391 return ERROR_NAND_OPERATION_FAILED;
392 } else if (lpc3180_info->selected_controller == LPC3180_MLC_CONTROLLER) {
393 /* data = MLC_DATA, use sized access */
394 if (nand->bus_width == 8) {
395 uint8_t *data8 = data;
396 target_read_u8(target, 0x200b0000, data8);
397 } else if (nand->bus_width == 16) {
398 uint16_t *data16 = data;
399 target_read_u16(target, 0x200b0000, data16);
400 } else {
401 LOG_ERROR("BUG: bus_width neither 8 nor 16 bit");
402 return ERROR_NAND_OPERATION_FAILED;
404 } else if (lpc3180_info->selected_controller == LPC3180_SLC_CONTROLLER) {
405 uint32_t data32;
407 /* data = SLC_DATA, must use 32-bit access */
408 target_read_u32(target, 0x20020000, &data32);
410 if (nand->bus_width == 8) {
411 uint8_t *data8 = data;
412 *data8 = data32 & 0xff;
413 } else if (nand->bus_width == 16) {
414 uint16_t *data16 = data;
415 *data16 = data32 & 0xffff;
416 } else {
417 LOG_ERROR("BUG: bus_width neither 8 nor 16 bit");
418 return ERROR_NAND_OPERATION_FAILED;
422 return ERROR_OK;
425 static int lpc3180_write_page(struct nand_device *nand,
426 uint32_t page,
427 uint8_t *data,
428 uint32_t data_size,
429 uint8_t *oob,
430 uint32_t oob_size)
432 struct lpc3180_nand_controller *lpc3180_info = nand->controller_priv;
433 struct target *target = nand->target;
434 int retval;
435 uint8_t status;
436 uint8_t *page_buffer;
438 if (target->state != TARGET_HALTED) {
439 LOG_ERROR("target must be halted to use LPC3180 NAND flash controller");
440 return ERROR_NAND_OPERATION_FAILED;
443 if (lpc3180_info->selected_controller == LPC3180_NO_CONTROLLER) {
444 LOG_ERROR("BUG: no LPC3180 NAND flash controller selected");
445 return ERROR_NAND_OPERATION_FAILED;
446 } else if (lpc3180_info->selected_controller == LPC3180_MLC_CONTROLLER) {
447 uint8_t *oob_buffer;
448 int quarter, num_quarters;
450 if (!data && oob) {
451 LOG_ERROR("LPC3180 MLC controller can't write OOB data only");
452 return ERROR_NAND_OPERATION_NOT_SUPPORTED;
455 if (oob && (oob_size > 24)) {
456 LOG_ERROR("LPC3180 MLC controller can't write more "
457 "than 6 bytes for each quarter's OOB data");
458 return ERROR_NAND_OPERATION_NOT_SUPPORTED;
461 if (data_size > (uint32_t)nand->page_size) {
462 LOG_ERROR("data size exceeds page size");
463 return ERROR_NAND_OPERATION_NOT_SUPPORTED;
466 /* MLC_CMD = sequential input */
467 target_write_u32(target, 0x200b8000, NAND_CMD_SEQIN);
469 page_buffer = malloc(512);
470 oob_buffer = malloc(6);
472 if (nand->page_size == 512) {
473 /* MLC_ADDR = 0x0 (one column cycle) */
474 target_write_u32(target, 0x200b8004, 0x0);
476 /* MLC_ADDR = row */
477 target_write_u32(target, 0x200b8004, page & 0xff);
478 target_write_u32(target, 0x200b8004, (page >> 8) & 0xff);
480 if (nand->address_cycles == 4)
481 target_write_u32(target, 0x200b8004, (page >> 16) & 0xff);
482 } else {
483 /* MLC_ADDR = 0x0 (two column cycles) */
484 target_write_u32(target, 0x200b8004, 0x0);
485 target_write_u32(target, 0x200b8004, 0x0);
487 /* MLC_ADDR = row */
488 target_write_u32(target, 0x200b8004, page & 0xff);
489 target_write_u32(target, 0x200b8004, (page >> 8) & 0xff);
492 /* when using the MLC controller, we have to treat a large page device
493 * as being made out of four quarters, each the size of a small page device
495 num_quarters = (nand->page_size == 2048) ? 4 : 1;
497 for (quarter = 0; quarter < num_quarters; quarter++) {
498 int thisrun_data_size = (data_size > 512) ? 512 : data_size;
499 int thisrun_oob_size = (oob_size > 6) ? 6 : oob_size;
501 memset(page_buffer, 0xff, 512);
502 if (data) {
503 memcpy(page_buffer, data, thisrun_data_size);
504 data_size -= thisrun_data_size;
505 data += thisrun_data_size;
508 memset(oob_buffer, 0xff, 6);
509 if (oob) {
510 memcpy(oob_buffer, oob, thisrun_oob_size);
511 oob_size -= thisrun_oob_size;
512 oob += thisrun_oob_size;
515 /* write MLC_ECC_ENC_REG to start encode cycle */
516 target_write_u32(target, 0x200b8008, 0x0);
518 target_write_memory(target, 0x200a8000,
519 4, 128, page_buffer);
520 target_write_memory(target, 0x200a8000,
521 1, 6, oob_buffer);
523 /* write MLC_ECC_AUTO_ENC_REG to start auto encode */
524 target_write_u32(target, 0x200b8010, 0x0);
526 if (!lpc3180_controller_ready(nand, 1000)) {
527 LOG_ERROR("timeout while waiting for completion of auto encode cycle");
528 free(page_buffer);
529 free(oob_buffer);
530 return ERROR_NAND_OPERATION_FAILED;
534 /* MLC_CMD = auto program command */
535 target_write_u32(target, 0x200b8000, NAND_CMD_PAGEPROG);
537 retval = nand_read_status(nand, &status);
538 if (retval != ERROR_OK) {
539 LOG_ERROR("couldn't read status");
540 free(page_buffer);
541 free(oob_buffer);
542 return ERROR_NAND_OPERATION_FAILED;
545 if (status & NAND_STATUS_FAIL) {
546 LOG_ERROR("write operation didn't pass, status: 0x%2.2x", status);
547 free(page_buffer);
548 free(oob_buffer);
549 return ERROR_NAND_OPERATION_FAILED;
552 free(page_buffer);
553 free(oob_buffer);
554 } else if (lpc3180_info->selected_controller == LPC3180_SLC_CONTROLLER) {
556 /**********************************************************************
557 * Write both SLC NAND flash page main area and spare area.
558 * Small page -
559 * ------------------------------------------
560 * | 512 bytes main | 16 bytes spare |
561 * ------------------------------------------
562 * Large page -
563 * ------------------------------------------
564 * | 2048 bytes main | 64 bytes spare |
565 * ------------------------------------------
566 * If DMA & ECC enabled, then the ECC generated for the 1st 256-byte
567 * data is written to the 3rd word of the spare area. The ECC
568 * generated for the 2nd 256-byte data is written to the 4th word
569 * of the spare area. The ECC generated for the 3rd 256-byte data is
570 * written to the 7th word of the spare area. The ECC generated
571 * for the 4th 256-byte data is written to the 8th word of the
572 * spare area and so on.
574 **********************************************************************/
576 int i = 0, target_mem_base;
577 uint8_t *ecc_flash_buffer;
578 struct working_area *pworking_area;
580 if (lpc3180_info->is_bulk) {
582 if (!data && oob) {
583 /*if oob only mode is active original method is used as SLC
584 *controller hangs during DMA interworking. Anyway the code supports
585 *the oob only mode below. */
586 return nand_write_page_raw(nand,
587 page,
588 data,
589 data_size,
590 oob,
591 oob_size);
593 retval = nand_page_command(nand, page, NAND_CMD_SEQIN, !data);
594 if (ERROR_OK != retval)
595 return retval;
597 /* allocate a working area */
598 if (target->working_area_size < (uint32_t) nand->page_size + 0x200) {
599 LOG_ERROR("Reserve at least 0x%x physical target working area",
600 nand->page_size + 0x200);
601 return ERROR_FLASH_OPERATION_FAILED;
603 if (target->working_area_phys%4) {
604 LOG_ERROR(
605 "Reserve the physical target working area at word boundary");
606 return ERROR_FLASH_OPERATION_FAILED;
608 if (target_alloc_working_area(target, target->working_area_size,
609 &pworking_area) != ERROR_OK) {
610 LOG_ERROR("no working area specified, can't read LPC internal flash");
611 return ERROR_FLASH_OPERATION_FAILED;
613 target_mem_base = target->working_area_phys;
615 if (nand->page_size == 2048)
616 page_buffer = malloc(2048);
617 else
618 page_buffer = malloc(512);
620 ecc_flash_buffer = malloc(64);
622 /* SLC_CFG = 0x (Force nCE assert, DMA ECC enabled, ECC enabled, DMA burst
623 *enabled, DMA write to SLC, WIDTH = bus_width) */
624 target_write_u32(target, 0x20020014, 0x3c);
626 if (data && !oob) {
627 /* set DMA LLI-s in target memory and in DMA*/
628 for (i = 0; i < nand->page_size/0x100; i++) {
630 int tmp;
631 /* -------LLI for 256 byte block---------
632 * DMACC0SrcAddr = SRAM */
633 target_write_u32(target,
634 target_mem_base+0+i*32,
635 target_mem_base+DATA_OFFS+i*256);
636 if (i == 0)
637 target_write_u32(target,
638 0x31000100,
639 target_mem_base+DATA_OFFS);
640 /* DMACCxDestAddr = SLC_DMA_DATA */
641 target_write_u32(target, target_mem_base+4+i*32, 0x20020038);
642 if (i == 0)
643 target_write_u32(target, 0x31000104, 0x20020038);
644 /* DMACCxLLI = next element */
645 tmp = (target_mem_base+(1+i*2)*16)&0xfffffffc;
646 target_write_u32(target, target_mem_base+8+i*32, tmp);
647 if (i == 0)
648 target_write_u32(target, 0x31000108, tmp);
649 /* DMACCxControl = TransferSize =64, Source burst size =16,
650 * Destination burst size = 16, Source transfer width = 32 bit,
651 * Destination transfer width = 32 bit, Source AHB master select = M0,
652 * Destination AHB master select = M0, Source increment = 1,
653 * Destination increment = 0, Terminal count interrupt enable bit = 0*/
654 target_write_u32(target,
655 target_mem_base+12+i*32,
656 0x40 | 3<<12 | 3<<15 | 2<<18 | 2<<21 | 0<<24 | 0<<25 | 1<<26 |
657 0<<27 | 0<<31);
658 if (i == 0)
659 target_write_u32(target,
660 0x3100010c,
661 0x40 | 3<<12 | 3<<15 | 2<<18 | 2<<21 | 0<<24 | 0<<25 | 1<<26 |
662 0<<27 | 0<<31);
664 /* -------LLI for 3 byte ECC---------
665 * DMACC0SrcAddr = SLC_ECC*/
666 target_write_u32(target, target_mem_base+16+i*32, 0x20020034);
667 /* DMACCxDestAddr = SRAM */
668 target_write_u32(target,
669 target_mem_base+20+i*32,
670 target_mem_base+SPARE_OFFS+8+16*(i>>1)+(i%2)*4);
671 /* DMACCxLLI = next element */
672 tmp = (target_mem_base+(2+i*2)*16)&0xfffffffc;
673 target_write_u32(target, target_mem_base+24+i*32, tmp);
674 /* DMACCxControl = TransferSize =1, Source burst size =4,
675 * Destination burst size = 4, Source transfer width = 32 bit,
676 * Destination transfer width = 32 bit, Source AHB master select = M0,
677 * Destination AHB master select = M0, Source increment = 0,
678 * Destination increment = 1, Terminal count interrupt enable bit = 0*/
679 target_write_u32(target,
680 target_mem_base+28+i*32,
681 0x01 | 1<<12 | 1<<15 | 2<<18 | 2<<21 | 0<<24 | 0<<25 | 0<<26 | 1<<27 | 0<<
682 31);
684 } else if (data && oob) {
685 /* -------LLI for 512 or 2048 bytes page---------
686 * DMACC0SrcAddr = SRAM */
687 target_write_u32(target, target_mem_base, target_mem_base+DATA_OFFS);
688 target_write_u32(target, 0x31000100, target_mem_base+DATA_OFFS);
689 /* DMACCxDestAddr = SLC_DMA_DATA */
690 target_write_u32(target, target_mem_base+4, 0x20020038);
691 target_write_u32(target, 0x31000104, 0x20020038);
692 /* DMACCxLLI = next element */
693 target_write_u32(target,
694 target_mem_base+8,
695 (target_mem_base+32)&0xfffffffc);
696 target_write_u32(target, 0x31000108,
697 (target_mem_base+32)&0xfffffffc);
698 /* DMACCxControl = TransferSize =512 or 128, Source burst size =16,
699 * Destination burst size = 16, Source transfer width = 32 bit,
700 * Destination transfer width = 32 bit, Source AHB master select = M0,
701 * Destination AHB master select = M0, Source increment = 1,
702 * Destination increment = 0, Terminal count interrupt enable bit = 0*/
703 target_write_u32(target,
704 target_mem_base+12,
705 (nand->page_size ==
706 2048 ? 512 : 128) | 3<<12 | 3<<15 | 2<<18 | 2<<21 | 0<<24 | 0<<25 |
707 1<<26 | 0<<27 | 0<<31);
708 target_write_u32(target,
709 0x3100010c,
710 (nand->page_size ==
711 2048 ? 512 : 128) | 3<<12 | 3<<15 | 2<<18 | 2<<21 | 0<<24 | 0<<25 |
712 1<<26 | 0<<27 | 0<<31);
713 i = 1;
714 } else if (!data && oob)
715 i = 0;
717 /* -------LLI for spare area---------
718 * DMACC0SrcAddr = SRAM*/
719 target_write_u32(target, target_mem_base+0+i*32, target_mem_base+SPARE_OFFS);
720 if (i == 0)
721 target_write_u32(target, 0x31000100, target_mem_base+SPARE_OFFS);
722 /* DMACCxDestAddr = SLC_DMA_DATA */
723 target_write_u32(target, target_mem_base+4+i*32, 0x20020038);
724 if (i == 0)
725 target_write_u32(target, 0x31000104, 0x20020038);
726 /* DMACCxLLI = next element = NULL */
727 target_write_u32(target, target_mem_base+8+i*32, 0);
728 if (i == 0)
729 target_write_u32(target, 0x31000108, 0);
730 /* DMACCxControl = TransferSize =16 for large page or 4 for small page,
731 * Source burst size =16, Destination burst size = 16, Source transfer width = 32 bit,
732 * Destination transfer width = 32 bit, Source AHB master select = M0,
733 * Destination AHB master select = M0, Source increment = 1,
734 * Destination increment = 0, Terminal count interrupt enable bit = 0*/
735 target_write_u32(target,
736 target_mem_base+12+i*32,
737 (nand->page_size ==
738 2048 ? 0x10 : 0x04) | 3<<12 | 3<<15 | 2<<18 | 2<<21 | 0<<24 | 0<<25 | 1<<26 |
739 0<<27 | 0<<31);
740 if (i == 0)
741 target_write_u32(target, 0x3100010c,
742 (nand->page_size == 2048 ?
743 0x10 : 0x04) | 3<<12 | 3<<15 | 2<<18 | 2<<21 | 0<<24 |
744 0<<25 | 1<<26 | 0<<27 | 0<<31);
746 memset(ecc_flash_buffer, 0xff, 64);
747 if (oob)
748 memcpy(ecc_flash_buffer, oob, oob_size);
749 target_write_memory(target,
750 target_mem_base+SPARE_OFFS,
753 ecc_flash_buffer);
755 if (data) {
756 memset(page_buffer, 0xff, nand->page_size == 2048 ? 2048 : 512);
757 memcpy(page_buffer, data, data_size);
758 target_write_memory(target,
759 target_mem_base+DATA_OFFS,
761 nand->page_size == 2048 ? 512 : 128,
762 page_buffer);
765 free(page_buffer);
766 free(ecc_flash_buffer);
768 /* Enable DMA after channel set up !
769 LLI only works when DMA is the flow controller!
771 /* DMACCxConfig= E=1, SrcPeripheral = 1 (SLC), DestPeripheral = 1 (SLC),
772 *FlowCntrl = 2 (Pher -> Mem, DMA), IE = 0, ITC = 0, L= 0, H=0*/
773 target_write_u32(target,
774 0x31000110,
775 1 | 1<<1 | 1<<6 | 2<<11 | 0<<14 | 0<<15 | 0<<16 | 0<<18);
777 /* SLC_CTRL = 3 (START DMA), ECC_CLEAR */
778 target_write_u32(target, 0x20020010, 0x3);
780 /* SLC_ICR = 2, INT_TC_CLR, clear pending TC*/
781 target_write_u32(target, 0x20020028, 2);
783 /* SLC_TC */
784 if (!data && oob)
785 target_write_u32(target, 0x20020030,
786 (nand->page_size == 2048 ? 0x10 : 0x04));
787 else
788 target_write_u32(target, 0x20020030,
789 (nand->page_size == 2048 ? 0x840 : 0x210));
791 nand_write_finish(nand);
793 if (!lpc3180_tc_ready(nand, 1000)) {
794 LOG_ERROR("timeout while waiting for completion of DMA");
795 return ERROR_NAND_OPERATION_FAILED;
798 target_free_working_area(target, pworking_area);
800 LOG_INFO("Page = 0x%" PRIx32 " was written.", page);
802 } else
803 return nand_write_page_raw(nand, page, data, data_size, oob, oob_size);
806 return ERROR_OK;
809 static int lpc3180_read_page(struct nand_device *nand,
810 uint32_t page,
811 uint8_t *data,
812 uint32_t data_size,
813 uint8_t *oob,
814 uint32_t oob_size)
816 struct lpc3180_nand_controller *lpc3180_info = nand->controller_priv;
817 struct target *target = nand->target;
818 uint8_t *page_buffer;
820 if (target->state != TARGET_HALTED) {
821 LOG_ERROR("target must be halted to use LPC3180 NAND flash controller");
822 return ERROR_NAND_OPERATION_FAILED;
825 if (lpc3180_info->selected_controller == LPC3180_NO_CONTROLLER) {
826 LOG_ERROR("BUG: no LPC3180 NAND flash controller selected");
827 return ERROR_NAND_OPERATION_FAILED;
828 } else if (lpc3180_info->selected_controller == LPC3180_MLC_CONTROLLER) {
829 uint8_t *oob_buffer;
830 uint32_t page_bytes_done = 0;
831 uint32_t oob_bytes_done = 0;
832 uint32_t mlc_isr;
834 #if 0
835 if (oob && (oob_size > 6)) {
836 LOG_ERROR("LPC3180 MLC controller can't read more than 6 bytes of OOB data");
837 return ERROR_NAND_OPERATION_NOT_SUPPORTED;
839 #endif
841 if (data_size > (uint32_t)nand->page_size) {
842 LOG_ERROR("data size exceeds page size");
843 return ERROR_NAND_OPERATION_NOT_SUPPORTED;
846 if (nand->page_size == 2048) {
847 page_buffer = malloc(2048);
848 oob_buffer = malloc(64);
849 } else {
850 page_buffer = malloc(512);
851 oob_buffer = malloc(16);
854 if (!data && oob) {
855 /* MLC_CMD = Read OOB
856 * we can use the READOOB command on both small and large page devices,
857 * as the controller translates the 0x50 command to a 0x0 with appropriate
858 * positioning of the serial buffer read pointer
860 target_write_u32(target, 0x200b8000, NAND_CMD_READOOB);
861 } else {
862 /* MLC_CMD = Read0 */
863 target_write_u32(target, 0x200b8000, NAND_CMD_READ0);
866 if (nand->page_size == 512) {
867 /* small page device
868 * MLC_ADDR = 0x0 (one column cycle) */
869 target_write_u32(target, 0x200b8004, 0x0);
871 /* MLC_ADDR = row */
872 target_write_u32(target, 0x200b8004, page & 0xff);
873 target_write_u32(target, 0x200b8004, (page >> 8) & 0xff);
875 if (nand->address_cycles == 4)
876 target_write_u32(target, 0x200b8004, (page >> 16) & 0xff);
877 } else {
878 /* large page device
879 * MLC_ADDR = 0x0 (two column cycles) */
880 target_write_u32(target, 0x200b8004, 0x0);
881 target_write_u32(target, 0x200b8004, 0x0);
883 /* MLC_ADDR = row */
884 target_write_u32(target, 0x200b8004, page & 0xff);
885 target_write_u32(target, 0x200b8004, (page >> 8) & 0xff);
887 /* MLC_CMD = Read Start */
888 target_write_u32(target, 0x200b8000, NAND_CMD_READSTART);
891 while (page_bytes_done < (uint32_t)nand->page_size) {
892 /* MLC_ECC_AUTO_DEC_REG = dummy */
893 target_write_u32(target, 0x200b8014, 0xaa55aa55);
895 if (!lpc3180_controller_ready(nand, 1000)) {
896 LOG_ERROR("timeout while waiting for completion of auto decode cycle");
897 free(page_buffer);
898 free(oob_buffer);
899 return ERROR_NAND_OPERATION_FAILED;
902 target_read_u32(target, 0x200b8048, &mlc_isr);
904 if (mlc_isr & 0x8) {
905 if (mlc_isr & 0x40) {
906 LOG_ERROR("uncorrectable error detected: 0x%2.2x",
907 (unsigned)mlc_isr);
908 free(page_buffer);
909 free(oob_buffer);
910 return ERROR_NAND_OPERATION_FAILED;
913 LOG_WARNING("%i symbol error detected and corrected",
914 ((int)(((mlc_isr & 0x30) >> 4) + 1)));
917 if (data)
918 target_read_memory(target,
919 0x200a8000,
921 128,
922 page_buffer + page_bytes_done);
924 if (oob)
925 target_read_memory(target,
926 0x200a8000,
929 oob_buffer + oob_bytes_done);
931 page_bytes_done += 512;
932 oob_bytes_done += 16;
935 if (data)
936 memcpy(data, page_buffer, data_size);
938 if (oob)
939 memcpy(oob, oob_buffer, oob_size);
941 free(page_buffer);
942 free(oob_buffer);
943 } else if (lpc3180_info->selected_controller == LPC3180_SLC_CONTROLLER) {
945 /**********************************************************************
946 * Read both SLC NAND flash page main area and spare area.
947 * Small page -
948 * ------------------------------------------
949 * | 512 bytes main | 16 bytes spare |
950 * ------------------------------------------
951 * Large page -
952 * ------------------------------------------
953 * | 2048 bytes main | 64 bytes spare |
954 * ------------------------------------------
955 * If DMA & ECC enabled, then the ECC generated for the 1st 256-byte
956 * data is compared with the 3rd word of the spare area. The ECC
957 * generated for the 2nd 256-byte data is compared with the 4th word
958 * of the spare area. The ECC generated for the 3rd 256-byte data is
959 * compared with the 7th word of the spare area. The ECC generated
960 * for the 4th 256-byte data is compared with the 8th word of the
961 * spare area and so on.
963 **********************************************************************/
965 int retval, i, target_mem_base;
966 uint8_t *ecc_hw_buffer;
967 uint8_t *ecc_flash_buffer;
968 struct working_area *pworking_area;
970 if (lpc3180_info->is_bulk) {
972 /* read always the data and also oob areas*/
974 retval = nand_page_command(nand, page, NAND_CMD_READ0, 0);
975 if (ERROR_OK != retval)
976 return retval;
978 /* allocate a working area */
979 if (target->working_area_size < (uint32_t) nand->page_size + 0x200) {
980 LOG_ERROR("Reserve at least 0x%x physical target working area",
981 nand->page_size + 0x200);
982 return ERROR_FLASH_OPERATION_FAILED;
984 if (target->working_area_phys%4) {
985 LOG_ERROR(
986 "Reserve the physical target working area at word boundary");
987 return ERROR_FLASH_OPERATION_FAILED;
989 if (target_alloc_working_area(target, target->working_area_size,
990 &pworking_area) != ERROR_OK) {
991 LOG_ERROR("no working area specified, can't read LPC internal flash");
992 return ERROR_FLASH_OPERATION_FAILED;
994 target_mem_base = target->working_area_phys;
996 if (nand->page_size == 2048)
997 page_buffer = malloc(2048);
998 else
999 page_buffer = malloc(512);
1001 ecc_hw_buffer = malloc(32);
1002 ecc_flash_buffer = malloc(64);
1004 /* SLC_CFG = 0x (Force nCE assert, DMA ECC enabled, ECC enabled, DMA burst
1005 *enabled, DMA read from SLC, WIDTH = bus_width) */
1006 target_write_u32(target, 0x20020014, 0x3e);
1008 /* set DMA LLI-s in target memory and in DMA*/
1009 for (i = 0; i < nand->page_size/0x100; i++) {
1010 int tmp;
1011 /* -------LLI for 256 byte block---------
1012 * DMACC0SrcAddr = SLC_DMA_DATA*/
1013 target_write_u32(target, target_mem_base+0+i*32, 0x20020038);
1014 if (i == 0)
1015 target_write_u32(target, 0x31000100, 0x20020038);
1016 /* DMACCxDestAddr = SRAM */
1017 target_write_u32(target,
1018 target_mem_base+4+i*32,
1019 target_mem_base+DATA_OFFS+i*256);
1020 if (i == 0)
1021 target_write_u32(target,
1022 0x31000104,
1023 target_mem_base+DATA_OFFS);
1024 /* DMACCxLLI = next element */
1025 tmp = (target_mem_base+(1+i*2)*16)&0xfffffffc;
1026 target_write_u32(target, target_mem_base+8+i*32, tmp);
1027 if (i == 0)
1028 target_write_u32(target, 0x31000108, tmp);
1029 /* DMACCxControl = TransferSize =64, Source burst size =16,
1030 * Destination burst size = 16, Source transfer width = 32 bit,
1031 * Destination transfer width = 32 bit, Source AHB master select = M0,
1032 * Destination AHB master select = M0, Source increment = 0,
1033 * Destination increment = 1, Terminal count interrupt enable bit = 0*/
1034 target_write_u32(target,
1035 target_mem_base+12+i*32,
1036 0x40 | 3<<12 | 3<<15 | 2<<18 | 2<<21 | 0<<24 | 0<<25 | 0<<26 | 1<<27 | 0<<
1037 31);
1038 if (i == 0)
1039 target_write_u32(target,
1040 0x3100010c,
1041 0x40 | 3<<12 | 3<<15 | 2<<18 | 2<<21 | 0<<24 | 0<<25 | 0<<26 | 1<<27 | 0<<
1042 31);
1044 /* -------LLI for 3 byte ECC---------
1045 * DMACC0SrcAddr = SLC_ECC*/
1046 target_write_u32(target, target_mem_base+16+i*32, 0x20020034);
1047 /* DMACCxDestAddr = SRAM */
1048 target_write_u32(target,
1049 target_mem_base+20+i*32,
1050 target_mem_base+ECC_OFFS+i*4);
1051 /* DMACCxLLI = next element */
1052 tmp = (target_mem_base+(2+i*2)*16)&0xfffffffc;
1053 target_write_u32(target, target_mem_base+24+i*32, tmp);
1054 /* DMACCxControl = TransferSize =1, Source burst size =4,
1055 * Destination burst size = 4, Source transfer width = 32 bit,
1056 * Destination transfer width = 32 bit, Source AHB master select = M0,
1057 * Destination AHB master select = M0, Source increment = 0,
1058 * Destination increment = 1, Terminal count interrupt enable bit = 0*/
1059 target_write_u32(target,
1060 target_mem_base+28+i*32,
1061 0x01 | 1<<12 | 1<<15 | 2<<18 | 2<<21 | 0<<24 | 0<<25 | 0<<26 | 1<<27 | 0<<
1062 31);
1065 /* -------LLI for spare area---------
1066 * DMACC0SrcAddr = SLC_DMA_DATA*/
1067 target_write_u32(target, target_mem_base+0+i*32, 0x20020038);
1068 /* DMACCxDestAddr = SRAM */
1069 target_write_u32(target, target_mem_base+4+i*32, target_mem_base+SPARE_OFFS);
1070 /* DMACCxLLI = next element = NULL */
1071 target_write_u32(target, target_mem_base+8+i*32, 0);
1072 /* DMACCxControl = TransferSize =16 for large page or 4 for small page,
1073 * Source burst size =16, Destination burst size = 16, Source transfer width = 32 bit,
1074 * Destination transfer width = 32 bit, Source AHB master select = M0,
1075 * Destination AHB master select = M0, Source increment = 0,
1076 * Destination increment = 1, Terminal count interrupt enable bit = 0*/
1077 target_write_u32(target,
1078 target_mem_base + 12 + i * 32,
1079 (nand->page_size == 2048 ? 0x10 : 0x04) | 3<<12 | 3<<15 | 2<<18 | 2<<21 |
1080 0<<24 | 0<<25 | 0<<26 | 1<<27 | 0<<31);
1082 /* Enable DMA after channel set up !
1083 LLI only works when DMA is the flow controller!
1085 /* DMACCxConfig= E=1, SrcPeripheral = 1 (SLC), DestPeripheral = 1 (SLC),
1086 *FlowCntrl = 2 (Pher-> Mem, DMA), IE = 0, ITC = 0, L= 0, H=0*/
1087 target_write_u32(target,
1088 0x31000110,
1089 1 | 1<<1 | 1<<6 | 2<<11 | 0<<14 | 0<<15 | 0<<16 | 0<<18);
1091 /* SLC_CTRL = 3 (START DMA), ECC_CLEAR */
1092 target_write_u32(target, 0x20020010, 0x3);
1094 /* SLC_ICR = 2, INT_TC_CLR, clear pending TC*/
1095 target_write_u32(target, 0x20020028, 2);
1097 /* SLC_TC */
1098 target_write_u32(target, 0x20020030,
1099 (nand->page_size == 2048 ? 0x840 : 0x210));
1101 if (!lpc3180_tc_ready(nand, 1000)) {
1102 LOG_ERROR("timeout while waiting for completion of DMA");
1103 free(page_buffer);
1104 free(ecc_hw_buffer);
1105 free(ecc_flash_buffer);
1106 target_free_working_area(target, pworking_area);
1107 return ERROR_NAND_OPERATION_FAILED;
1110 if (data) {
1111 target_read_memory(target,
1112 target_mem_base+DATA_OFFS,
1114 nand->page_size == 2048 ? 512 : 128,
1115 page_buffer);
1116 memcpy(data, page_buffer, data_size);
1118 LOG_INFO("Page = 0x%" PRIx32 " was read.", page);
1120 /* check hw generated ECC for each 256 bytes block with the saved
1121 *ECC in flash spare area*/
1122 int idx = nand->page_size/0x200;
1123 target_read_memory(target,
1124 target_mem_base+SPARE_OFFS,
1127 ecc_flash_buffer);
1128 target_read_memory(target,
1129 target_mem_base+ECC_OFFS,
1132 ecc_hw_buffer);
1133 for (i = 0; i < idx; i++) {
1134 if ((0x00ffffff & *(uint32_t *)(void *)(ecc_hw_buffer+i*8)) !=
1135 (0x00ffffff & *(uint32_t *)(void *)(ecc_flash_buffer+8+i*16)))
1136 LOG_WARNING(
1137 "ECC mismatch at 256 bytes size block= %d at page= 0x%" PRIx32,
1138 i * 2 + 1, page);
1139 if ((0x00ffffff & *(uint32_t *)(void *)(ecc_hw_buffer+4+i*8)) !=
1140 (0x00ffffff & *(uint32_t *)(void *)(ecc_flash_buffer+12+i*16)))
1141 LOG_WARNING(
1142 "ECC mismatch at 256 bytes size block= %d at page= 0x%" PRIx32,
1143 i * 2 + 2, page);
1147 if (oob)
1148 memcpy(oob, ecc_flash_buffer, oob_size);
1150 free(page_buffer);
1151 free(ecc_hw_buffer);
1152 free(ecc_flash_buffer);
1154 target_free_working_area(target, pworking_area);
1156 } else
1157 return nand_read_page_raw(nand, page, data, data_size, oob, oob_size);
1160 return ERROR_OK;
1163 static int lpc3180_controller_ready(struct nand_device *nand, int timeout)
1165 struct lpc3180_nand_controller *lpc3180_info = nand->controller_priv;
1166 struct target *target = nand->target;
1168 if (target->state != TARGET_HALTED) {
1169 LOG_ERROR("target must be halted to use LPC3180 NAND flash controller");
1170 return ERROR_NAND_OPERATION_FAILED;
1173 LOG_DEBUG("lpc3180_controller_ready count start=%d", timeout);
1175 do {
1176 if (lpc3180_info->selected_controller == LPC3180_MLC_CONTROLLER) {
1177 uint8_t status;
1179 /* Read MLC_ISR, wait for controller to become ready */
1180 target_read_u8(target, 0x200b8048, &status);
1182 if (status & 2) {
1183 LOG_DEBUG("lpc3180_controller_ready count=%d",
1184 timeout);
1185 return 1;
1187 } else if (lpc3180_info->selected_controller == LPC3180_SLC_CONTROLLER) {
1188 uint32_t status;
1190 /* Read SLC_STAT and check READY bit */
1191 target_read_u32(target, 0x20020018, &status);
1193 if (status & 1) {
1194 LOG_DEBUG("lpc3180_controller_ready count=%d",
1195 timeout);
1196 return 1;
1200 alive_sleep(1);
1201 } while (timeout-- > 0);
1203 return 0;
1206 static int lpc3180_nand_ready(struct nand_device *nand, int timeout)
1208 struct lpc3180_nand_controller *lpc3180_info = nand->controller_priv;
1209 struct target *target = nand->target;
1211 if (target->state != TARGET_HALTED) {
1212 LOG_ERROR("target must be halted to use LPC3180 NAND flash controller");
1213 return ERROR_NAND_OPERATION_FAILED;
1216 LOG_DEBUG("lpc3180_nand_ready count start=%d", timeout);
1218 do {
1219 if (lpc3180_info->selected_controller == LPC3180_MLC_CONTROLLER) {
1220 uint8_t status = 0x0;
1222 /* Read MLC_ISR, wait for NAND flash device to become ready */
1223 target_read_u8(target, 0x200b8048, &status);
1225 if (status & 1) {
1226 LOG_DEBUG("lpc3180_nand_ready count end=%d",
1227 timeout);
1228 return 1;
1230 } else if (lpc3180_info->selected_controller == LPC3180_SLC_CONTROLLER) {
1231 uint32_t status = 0x0;
1233 /* Read SLC_STAT and check READY bit */
1234 target_read_u32(target, 0x20020018, &status);
1236 if (status & 1) {
1237 LOG_DEBUG("lpc3180_nand_ready count end=%d",
1238 timeout);
1239 return 1;
1243 alive_sleep(1);
1244 } while (timeout-- > 0);
1246 return 0;
1249 static int lpc3180_tc_ready(struct nand_device *nand, int timeout)
1251 struct lpc3180_nand_controller *lpc3180_info = nand->controller_priv;
1252 struct target *target = nand->target;
1254 if (target->state != TARGET_HALTED) {
1255 LOG_ERROR("target must be halted to use LPC3180 NAND flash controller");
1256 return ERROR_NAND_OPERATION_FAILED;
1259 LOG_DEBUG("lpc3180_tc_ready count start=%d",
1260 timeout);
1262 do {
1263 if (lpc3180_info->selected_controller == LPC3180_SLC_CONTROLLER) {
1264 uint32_t status = 0x0;
1265 /* Read SLC_INT_STAT and check INT_TC_STAT bit */
1266 target_read_u32(target, 0x2002001c, &status);
1268 if (status & 2) {
1269 LOG_DEBUG("lpc3180_tc_ready count=%d",
1270 timeout);
1271 return 1;
1275 alive_sleep(1);
1276 } while (timeout-- > 0);
1278 return 0;
1281 COMMAND_HANDLER(handle_lpc3180_select_command)
1283 struct lpc3180_nand_controller *lpc3180_info = NULL;
1284 char *selected[] = {
1285 "no", "mlc", "slc"
1288 if ((CMD_ARGC < 1) || (CMD_ARGC > 3))
1289 return ERROR_COMMAND_SYNTAX_ERROR;
1291 unsigned num;
1292 COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], num);
1293 struct nand_device *nand = get_nand_device_by_num(num);
1294 if (!nand) {
1295 command_print(CMD_CTX, "nand device '#%s' is out of bounds", CMD_ARGV[0]);
1296 return ERROR_OK;
1299 lpc3180_info = nand->controller_priv;
1301 if (CMD_ARGC >= 2) {
1302 if (strcmp(CMD_ARGV[1], "mlc") == 0)
1303 lpc3180_info->selected_controller = LPC3180_MLC_CONTROLLER;
1304 else if (strcmp(CMD_ARGV[1], "slc") == 0) {
1305 lpc3180_info->selected_controller = LPC3180_SLC_CONTROLLER;
1306 if (CMD_ARGC == 3 && strcmp(CMD_ARGV[2], "bulk") == 0)
1307 lpc3180_info->is_bulk = 1;
1308 else
1309 lpc3180_info->is_bulk = 0;
1310 } else
1311 return ERROR_COMMAND_SYNTAX_ERROR;
1314 if (lpc3180_info->selected_controller == LPC3180_MLC_CONTROLLER)
1315 command_print(CMD_CTX, "%s controller selected",
1316 selected[lpc3180_info->selected_controller]);
1317 else
1318 command_print(CMD_CTX,
1319 lpc3180_info->is_bulk ? "%s controller selected bulk mode is available" :
1320 "%s controller selected bulk mode is not available",
1321 selected[lpc3180_info->selected_controller]);
1323 return ERROR_OK;
1326 static const struct command_registration lpc3180_exec_command_handlers[] = {
1328 .name = "select",
1329 .handler = handle_lpc3180_select_command,
1330 .mode = COMMAND_EXEC,
1331 .help =
1332 "select MLC or SLC controller (default is MLC), SLC can be set to bulk mode",
1333 .usage = "bank_id ['mlc'|'slc' ['bulk'] ]",
1335 COMMAND_REGISTRATION_DONE
1337 static const struct command_registration lpc3180_command_handler[] = {
1339 .name = "lpc3180",
1340 .mode = COMMAND_ANY,
1341 .help = "LPC3180 NAND flash controller commands",
1342 .usage = "",
1343 .chain = lpc3180_exec_command_handlers,
1345 COMMAND_REGISTRATION_DONE
1348 struct nand_flash_controller lpc3180_nand_controller = {
1349 .name = "lpc3180",
1350 .commands = lpc3180_command_handler,
1351 .nand_device_command = lpc3180_nand_device_command,
1352 .init = lpc3180_init,
1353 .reset = lpc3180_reset,
1354 .command = lpc3180_command,
1355 .address = lpc3180_address,
1356 .write_data = lpc3180_write_data,
1357 .read_data = lpc3180_read_data,
1358 .write_page = lpc3180_write_page,
1359 .read_page = lpc3180_read_page,
1360 .nand_ready = lpc3180_nand_ready,