jtag: linuxgpiod: drop extra parenthesis
[openocd.git] / src / flash / nand / mxc.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2
3 /***************************************************************************
4 * Copyright (C) 2009 by Alexei Babich *
5 * Rezonans plc., Chelyabinsk, Russia *
6 * impatt@mail.ru *
7 * *
8 * Copyright (C) 2010 by Gaetan CARLIER *
9 * Trump s.a., Belgium *
10 * *
11 * Copyright (C) 2011 by Erik Ahlen *
12 * Avalon Innovation, Sweden *
13 ***************************************************************************/
14
15 /*
16 * Freescale iMX OpenOCD NAND Flash controller support.
17 * based on Freescale iMX2* and iMX3* OpenOCD NAND Flash controller support.
18 */
19
20 /*
21 * driver tested with Samsung K9F2G08UXA and Numonyx/ST NAND02G-B2D @mxc
22 * tested "nand probe #", "nand erase # 0 #", "nand dump # file 0 #",
23 * "nand write # file 0", "nand verify"
24 *
25 * get_next_halfword_from_sram_buffer() not tested
26 * !! all function only tested with 2k page nand device; mxc_write_page
27 * writes the 4 MAIN_BUFFER's and is not compatible with < 2k page
28 * !! oob must be be used due to NFS bug
29 * !! oob must be 64 bytes per 2KiB page
30 */
31 #ifdef HAVE_CONFIG_H
32 #include "config.h"
33 #endif
34
35 #include "imp.h"
36 #include "mxc.h"
37 #include <target/target.h>
38
39 #define OOB_SIZE 64
40
41 #define nfc_is_v1() (mxc_nf_info->mxc_version == MXC_VERSION_MX27 || \
42 mxc_nf_info->mxc_version == MXC_VERSION_MX31)
43 #define nfc_is_v2() (mxc_nf_info->mxc_version == MXC_VERSION_MX25 || \
44 mxc_nf_info->mxc_version == MXC_VERSION_MX35)
45
46 /* This permits to print (in LOG_INFO) how much bytes
47 * has been written after a page read or write.
48 * This is useful when OpenOCD is used with a graphical
49 * front-end to estimate progression of the global read/write
50 */
51 #undef _MXC_PRINT_STAT
52 /* #define _MXC_PRINT_STAT */
53
54 static const char target_not_halted_err_msg[] =
55 "target must be halted to use mxc NAND flash controller";
56 static const char data_block_size_err_msg[] =
57 "minimal granularity is one half-word, %" PRIu32 " is incorrect";
58 static const char sram_buffer_bounds_err_msg[] =
59 "trying to access out of SRAM buffer bound (addr=0x%" PRIx32 ")";
60 static const char get_status_register_err_msg[] = "can't get NAND status";
61 static uint32_t in_sram_address;
62 static unsigned char sign_of_sequental_byte_read;
63
64 static uint32_t align_address_v2(struct nand_device *nand, uint32_t addr);
65 static int initialize_nf_controller(struct nand_device *nand);
66 static int get_next_byte_from_sram_buffer(struct nand_device *nand, uint8_t *value);
67 static int get_next_halfword_from_sram_buffer(struct nand_device *nand, uint16_t *value);
68 static int poll_for_complete_op(struct nand_device *nand, const char *text);
69 static int validate_target_state(struct nand_device *nand);
70 static int do_data_output(struct nand_device *nand);
71
72 static int mxc_command(struct nand_device *nand, uint8_t command);
73 static int mxc_address(struct nand_device *nand, uint8_t address);
74
75 NAND_DEVICE_COMMAND_HANDLER(mxc_nand_device_command)
76 {
77 struct mxc_nf_controller *mxc_nf_info;
78 int hwecc_needed;
79
80 mxc_nf_info = malloc(sizeof(struct mxc_nf_controller));
81 if (!mxc_nf_info) {
82 LOG_ERROR("no memory for nand controller");
83 return ERROR_FAIL;
84 }
85 nand->controller_priv = mxc_nf_info;
86
87 if (CMD_ARGC < 4) {
88 LOG_ERROR("use \"nand device mxc target mx25|mx27|mx31|mx35 noecc|hwecc [biswap]\"");
89 return ERROR_FAIL;
90 }
91
92 /*
93 * check board type
94 */
95 if (strcmp(CMD_ARGV[2], "mx25") == 0) {
96 mxc_nf_info->mxc_version = MXC_VERSION_MX25;
97 mxc_nf_info->mxc_base_addr = 0xBB000000;
98 mxc_nf_info->mxc_regs_addr = mxc_nf_info->mxc_base_addr + 0x1E00;
99 } else if (strcmp(CMD_ARGV[2], "mx27") == 0) {
100 mxc_nf_info->mxc_version = MXC_VERSION_MX27;
101 mxc_nf_info->mxc_base_addr = 0xD8000000;
102 mxc_nf_info->mxc_regs_addr = mxc_nf_info->mxc_base_addr + 0x0E00;
103 } else if (strcmp(CMD_ARGV[2], "mx31") == 0) {
104 mxc_nf_info->mxc_version = MXC_VERSION_MX31;
105 mxc_nf_info->mxc_base_addr = 0xB8000000;
106 mxc_nf_info->mxc_regs_addr = mxc_nf_info->mxc_base_addr + 0x0E00;
107 } else if (strcmp(CMD_ARGV[2], "mx35") == 0) {
108 mxc_nf_info->mxc_version = MXC_VERSION_MX35;
109 mxc_nf_info->mxc_base_addr = 0xBB000000;
110 mxc_nf_info->mxc_regs_addr = mxc_nf_info->mxc_base_addr + 0x1E00;
111 }
112
113 /*
114 * check hwecc requirements
115 */
116 hwecc_needed = strcmp(CMD_ARGV[3], "hwecc");
117 if (hwecc_needed == 0)
118 mxc_nf_info->flags.hw_ecc_enabled = 1;
119 else
120 mxc_nf_info->flags.hw_ecc_enabled = 0;
121
122 mxc_nf_info->optype = MXC_NF_DATAOUT_PAGE;
123 mxc_nf_info->fin = MXC_NF_FIN_NONE;
124 mxc_nf_info->flags.target_little_endian =
125 (nand->target->endianness == TARGET_LITTLE_ENDIAN);
126
127 /*
128 * should factory bad block indicator be swapped
129 * as a workaround for how the nfc handles pages.
130 */
131 if (CMD_ARGC > 4 && strcmp(CMD_ARGV[4], "biswap") == 0) {
132 LOG_DEBUG("BI-swap enabled");
133 mxc_nf_info->flags.biswap_enabled = 1;
134 }
135
136 return ERROR_OK;
137 }
138
139 COMMAND_HANDLER(handle_mxc_biswap_command)
140 {
141 struct nand_device *nand = NULL;
142 struct mxc_nf_controller *mxc_nf_info = NULL;
143
144 if (CMD_ARGC < 1 || CMD_ARGC > 2)
145 return ERROR_COMMAND_SYNTAX_ERROR;
146
147 int retval = CALL_COMMAND_HANDLER(nand_command_get_device, 0, &nand);
148 if (retval != ERROR_OK) {
149 command_print(CMD, "invalid nand device number or name: %s", CMD_ARGV[0]);
150 return ERROR_COMMAND_ARGUMENT_INVALID;
151 }
152
153 mxc_nf_info = nand->controller_priv;
154 if (CMD_ARGC == 2) {
155 if (strcmp(CMD_ARGV[1], "enable") == 0)
156 mxc_nf_info->flags.biswap_enabled = true;
157 else
158 mxc_nf_info->flags.biswap_enabled = false;
159 }
160 if (mxc_nf_info->flags.biswap_enabled)
161 command_print(CMD, "BI-swapping enabled on %s", nand->name);
162 else
163 command_print(CMD, "BI-swapping disabled on %s", nand->name);
164
165 return ERROR_OK;
166 }
167
168 static const struct command_registration mxc_sub_command_handlers[] = {
169 {
170 .name = "biswap",
171 .mode = COMMAND_EXEC,
172 .handler = handle_mxc_biswap_command,
173 .help = "Turns on/off bad block information swapping from main area, "
174 "without parameter query status.",
175 .usage = "bank_id ['enable'|'disable']",
176 },
177 COMMAND_REGISTRATION_DONE
178 };
179
180 static const struct command_registration mxc_nand_command_handler[] = {
181 {
182 .name = "mxc",
183 .mode = COMMAND_ANY,
184 .help = "MXC NAND flash controller commands",
185 .chain = mxc_sub_command_handlers,
186 .usage = "",
187 },
188 COMMAND_REGISTRATION_DONE
189 };
190
191 static int mxc_init(struct nand_device *nand)
192 {
193 struct mxc_nf_controller *mxc_nf_info = nand->controller_priv;
194 struct target *target = nand->target;
195
196 int validate_target_result;
197 uint16_t buffsize_register_content;
198 uint32_t sreg_content;
199 uint32_t sreg = MX2_FMCR;
200 uint32_t sel_16bit = MX2_FMCR_NF_16BIT_SEL;
201 uint32_t sel_fms = MX2_FMCR_NF_FMS;
202 int retval;
203 uint16_t nand_status_content;
204 /*
205 * validate target state
206 */
207 validate_target_result = validate_target_state(nand);
208 if (validate_target_result != ERROR_OK)
209 return validate_target_result;
210
211 if (nfc_is_v1()) {
212 target_read_u16(target, MXC_NF_BUFSIZ, &buffsize_register_content);
213 mxc_nf_info->flags.one_kb_sram = !(buffsize_register_content & 0x000f);
214 } else
215 mxc_nf_info->flags.one_kb_sram = 0;
216
217 if (mxc_nf_info->mxc_version == MXC_VERSION_MX31) {
218 sreg = MX3_PCSR;
219 sel_16bit = MX3_PCSR_NF_16BIT_SEL;
220 sel_fms = MX3_PCSR_NF_FMS;
221 } else if (mxc_nf_info->mxc_version == MXC_VERSION_MX25) {
222 sreg = MX25_RCSR;
223 sel_16bit = MX25_RCSR_NF_16BIT_SEL;
224 sel_fms = MX25_RCSR_NF_FMS;
225 } else if (mxc_nf_info->mxc_version == MXC_VERSION_MX35) {
226 sreg = MX35_RCSR;
227 sel_16bit = MX35_RCSR_NF_16BIT_SEL;
228 sel_fms = MX35_RCSR_NF_FMS;
229 }
230
231 target_read_u32(target, sreg, &sreg_content);
232 if (!nand->bus_width) {
233 /* bus_width not yet defined. Read it from MXC_FMCR */
234 nand->bus_width = (sreg_content & sel_16bit) ? 16 : 8;
235 } else {
236 /* bus_width forced in soft. Sync it to MXC_FMCR */
237 sreg_content |= ((nand->bus_width == 16) ? sel_16bit : 0x00000000);
238 target_write_u32(target, sreg, sreg_content);
239 }
240 if (nand->bus_width == 16)
241 LOG_DEBUG("MXC_NF : bus is 16-bit width");
242 else
243 LOG_DEBUG("MXC_NF : bus is 8-bit width");
244
245 if (!nand->page_size)
246 nand->page_size = (sreg_content & sel_fms) ? 2048 : 512;
247 else {
248 sreg_content |= ((nand->page_size == 2048) ? sel_fms : 0x00000000);
249 target_write_u32(target, sreg, sreg_content);
250 }
251 if (mxc_nf_info->flags.one_kb_sram && (nand->page_size == 2048)) {
252 LOG_ERROR("NAND controller have only 1 kb SRAM, so "
253 "pagesize 2048 is incompatible with it");
254 } else
255 LOG_DEBUG("MXC_NF : NAND controller can handle pagesize of 2048");
256
257 if (nfc_is_v2() && sreg_content & MX35_RCSR_NF_4K)
258 LOG_ERROR("MXC driver does not have support for 4k pagesize.");
259
260 initialize_nf_controller(nand);
261
262 retval = ERROR_OK;
263 retval |= mxc_command(nand, NAND_CMD_STATUS);
264 retval |= mxc_address(nand, 0x00);
265 retval |= do_data_output(nand);
266 if (retval != ERROR_OK) {
267 LOG_ERROR(get_status_register_err_msg);
268 return ERROR_FAIL;
269 }
270 target_read_u16(target, MXC_NF_MAIN_BUFFER0, &nand_status_content);
271 if (!(nand_status_content & 0x0080)) {
272 LOG_INFO("NAND read-only");
273 mxc_nf_info->flags.nand_readonly = 1;
274 } else
275 mxc_nf_info->flags.nand_readonly = 0;
276 return ERROR_OK;
277 }
278
279 static int mxc_read_data(struct nand_device *nand, void *data)
280 {
281 int validate_target_result;
282 int try_data_output_from_nand_chip;
283 /*
284 * validate target state
285 */
286 validate_target_result = validate_target_state(nand);
287 if (validate_target_result != ERROR_OK)
288 return validate_target_result;
289
290 /*
291 * get data from nand chip
292 */
293 try_data_output_from_nand_chip = do_data_output(nand);
294 if (try_data_output_from_nand_chip != ERROR_OK) {
295 LOG_ERROR("mxc_read_data : read data failed : '%x'",
296 try_data_output_from_nand_chip);
297 return try_data_output_from_nand_chip;
298 }
299
300 if (nand->bus_width == 16)
301 get_next_halfword_from_sram_buffer(nand, data);
302 else
303 get_next_byte_from_sram_buffer(nand, data);
304
305 return ERROR_OK;
306 }
307
308 static int mxc_write_data(struct nand_device *nand, uint16_t data)
309 {
310 LOG_ERROR("write_data() not implemented");
311 return ERROR_NAND_OPERATION_FAILED;
312 }
313
314 static int mxc_reset(struct nand_device *nand)
315 {
316 /*
317 * validate target state
318 */
319 int validate_target_result;
320 validate_target_result = validate_target_state(nand);
321 if (validate_target_result != ERROR_OK)
322 return validate_target_result;
323 initialize_nf_controller(nand);
324 return ERROR_OK;
325 }
326
327 static int mxc_command(struct nand_device *nand, uint8_t command)
328 {
329 struct mxc_nf_controller *mxc_nf_info = nand->controller_priv;
330 struct target *target = nand->target;
331 int validate_target_result;
332 int poll_result;
333 /*
334 * validate target state
335 */
336 validate_target_result = validate_target_state(nand);
337 if (validate_target_result != ERROR_OK)
338 return validate_target_result;
339
340 switch (command) {
341 case NAND_CMD_READOOB:
342 command = NAND_CMD_READ0;
343 /* set read point for data_read() and read_block_data() to
344 * spare area in SRAM buffer
345 */
346 if (nfc_is_v1())
347 in_sram_address = MXC_NF_V1_SPARE_BUFFER0;
348 else
349 in_sram_address = MXC_NF_V2_SPARE_BUFFER0;
350 break;
351 case NAND_CMD_READ1:
352 command = NAND_CMD_READ0;
353 /*
354 * offset == one half of page size
355 */
356 in_sram_address = MXC_NF_MAIN_BUFFER0 + (nand->page_size >> 1);
357 break;
358 default:
359 in_sram_address = MXC_NF_MAIN_BUFFER0;
360 break;
361 }
362
363 target_write_u16(target, MXC_NF_FCMD, command);
364 /*
365 * start command input operation (set MXC_NF_BIT_OP_DONE==0)
366 */
367 target_write_u16(target, MXC_NF_CFG2, MXC_NF_BIT_OP_FCI);
368 poll_result = poll_for_complete_op(nand, "command");
369 if (poll_result != ERROR_OK)
370 return poll_result;
371 /*
372 * reset cursor to begin of the buffer
373 */
374 sign_of_sequental_byte_read = 0;
375 /* Handle special read command and adjust NF_CFG2(FDO) */
376 switch (command) {
377 case NAND_CMD_READID:
378 mxc_nf_info->optype = MXC_NF_DATAOUT_NANDID;
379 mxc_nf_info->fin = MXC_NF_FIN_DATAOUT;
380 break;
381 case NAND_CMD_STATUS:
382 mxc_nf_info->optype = MXC_NF_DATAOUT_NANDSTATUS;
383 mxc_nf_info->fin = MXC_NF_FIN_DATAOUT;
384 target_write_u16 (target, MXC_NF_BUFADDR, 0);
385 in_sram_address = 0;
386 break;
387 case NAND_CMD_READ0:
388 mxc_nf_info->fin = MXC_NF_FIN_DATAOUT;
389 mxc_nf_info->optype = MXC_NF_DATAOUT_PAGE;
390 break;
391 default:
392 /* Other command use the default 'One page data out' FDO */
393 mxc_nf_info->optype = MXC_NF_DATAOUT_PAGE;
394 break;
395 }
396 return ERROR_OK;
397 }
398
399 static int mxc_address(struct nand_device *nand, uint8_t address)
400 {
401 struct mxc_nf_controller *mxc_nf_info = nand->controller_priv;
402 struct target *target = nand->target;
403 int validate_target_result;
404 int poll_result;
405 /*
406 * validate target state
407 */
408 validate_target_result = validate_target_state(nand);
409 if (validate_target_result != ERROR_OK)
410 return validate_target_result;
411
412 target_write_u16(target, MXC_NF_FADDR, address);
413 /*
414 * start address input operation (set MXC_NF_BIT_OP_DONE==0)
415 */
416 target_write_u16(target, MXC_NF_CFG2, MXC_NF_BIT_OP_FAI);
417 poll_result = poll_for_complete_op(nand, "address");
418 if (poll_result != ERROR_OK)
419 return poll_result;
420
421 return ERROR_OK;
422 }
423
424 static int mxc_nand_ready(struct nand_device *nand, int tout)
425 {
426 struct mxc_nf_controller *mxc_nf_info = nand->controller_priv;
427 struct target *target = nand->target;
428 uint16_t poll_complete_status;
429 int validate_target_result;
430
431 /*
432 * validate target state
433 */
434 validate_target_result = validate_target_state(nand);
435 if (validate_target_result != ERROR_OK)
436 return validate_target_result;
437
438 do {
439 target_read_u16(target, MXC_NF_CFG2, &poll_complete_status);
440 if (poll_complete_status & MXC_NF_BIT_OP_DONE)
441 return tout;
442
443 alive_sleep(1);
444 } while (tout-- > 0);
445 return tout;
446 }
447
448 static int mxc_write_page(struct nand_device *nand, uint32_t page,
449 uint8_t *data, uint32_t data_size,
450 uint8_t *oob, uint32_t oob_size)
451 {
452 struct mxc_nf_controller *mxc_nf_info = nand->controller_priv;
453 struct target *target = nand->target;
454 int retval;
455 uint16_t nand_status_content;
456 uint16_t swap1, swap2, new_swap1;
457 uint8_t bufs;
458 int poll_result;
459
460 if (data_size % 2) {
461 LOG_ERROR(data_block_size_err_msg, data_size);
462 return ERROR_NAND_OPERATION_FAILED;
463 }
464 if (oob_size % 2) {
465 LOG_ERROR(data_block_size_err_msg, oob_size);
466 return ERROR_NAND_OPERATION_FAILED;
467 }
468 if (!data) {
469 LOG_ERROR("nothing to program");
470 return ERROR_NAND_OPERATION_FAILED;
471 }
472
473 /*
474 * validate target state
475 */
476 retval = validate_target_state(nand);
477 if (retval != ERROR_OK)
478 return retval;
479
480 in_sram_address = MXC_NF_MAIN_BUFFER0;
481 sign_of_sequental_byte_read = 0;
482 retval = ERROR_OK;
483 retval |= mxc_command(nand, NAND_CMD_SEQIN);
484 retval |= mxc_address(nand, 0); /* col */
485 retval |= mxc_address(nand, 0); /* col */
486 retval |= mxc_address(nand, page & 0xff); /* page address */
487 retval |= mxc_address(nand, (page >> 8) & 0xff);/* page address */
488 retval |= mxc_address(nand, (page >> 16) & 0xff); /* page address */
489
490 target_write_buffer(target, MXC_NF_MAIN_BUFFER0, data_size, data);
491 if (oob) {
492 if (mxc_nf_info->flags.hw_ecc_enabled) {
493 /*
494 * part of spare block will be overridden by hardware
495 * ECC generator
496 */
497 LOG_DEBUG("part of spare block will be overridden "
498 "by hardware ECC generator");
499 }
500 if (nfc_is_v1())
501 target_write_buffer(target, MXC_NF_V1_SPARE_BUFFER0, oob_size, oob);
502 else {
503 uint32_t addr = MXC_NF_V2_SPARE_BUFFER0;
504 while (oob_size > 0) {
505 uint8_t len = MIN(oob_size, MXC_NF_SPARE_BUFFER_LEN);
506 target_write_buffer(target, addr, len, oob);
507 addr = align_address_v2(nand, addr + len);
508 oob += len;
509 oob_size -= len;
510 }
511 }
512 }
513
514 if (nand->page_size > 512 && mxc_nf_info->flags.biswap_enabled) {
515 /* BI-swap - work-around of i.MX NFC for NAND device with page == 2kb*/
516 target_read_u16(target, MXC_NF_MAIN_BUFFER3 + 464, &swap1);
517 if (oob) {
518 LOG_ERROR("Due to NFC Bug, oob is not correctly implemented in mxc driver");
519 return ERROR_NAND_OPERATION_FAILED;
520 }
521 swap2 = 0xffff; /* Spare buffer unused forced to 0xffff */
522 new_swap1 = (swap1 & 0xFF00) | (swap2 >> 8);
523 swap2 = (swap1 << 8) | (swap2 & 0xFF);
524 target_write_u16(target, MXC_NF_MAIN_BUFFER3 + 464, new_swap1);
525 if (nfc_is_v1())
526 target_write_u16(target, MXC_NF_V1_SPARE_BUFFER3 + 4, swap2);
527 else
528 target_write_u16(target, MXC_NF_V2_SPARE_BUFFER3, swap2);
529 }
530
531 /*
532 * start data input operation (set MXC_NF_BIT_OP_DONE==0)
533 */
534 if (nfc_is_v1() && nand->page_size > 512)
535 bufs = 4;
536 else
537 bufs = 1;
538
539 for (uint8_t i = 0; i < bufs; ++i) {
540 target_write_u16(target, MXC_NF_BUFADDR, i);
541 target_write_u16(target, MXC_NF_CFG2, MXC_NF_BIT_OP_FDI);
542 poll_result = poll_for_complete_op(nand, "data input");
543 if (poll_result != ERROR_OK)
544 return poll_result;
545 }
546
547 retval |= mxc_command(nand, NAND_CMD_PAGEPROG);
548 if (retval != ERROR_OK)
549 return retval;
550
551 /*
552 * check status register
553 */
554 retval = ERROR_OK;
555 retval |= mxc_command(nand, NAND_CMD_STATUS);
556 target_write_u16 (target, MXC_NF_BUFADDR, 0);
557 mxc_nf_info->optype = MXC_NF_DATAOUT_NANDSTATUS;
558 mxc_nf_info->fin = MXC_NF_FIN_DATAOUT;
559 retval |= do_data_output(nand);
560 if (retval != ERROR_OK) {
561 LOG_ERROR(get_status_register_err_msg);
562 return retval;
563 }
564 target_read_u16(target, MXC_NF_MAIN_BUFFER0, &nand_status_content);
565 if (nand_status_content & 0x0001) {
566 /*
567 * page not correctly written
568 */
569 return ERROR_NAND_OPERATION_FAILED;
570 }
571 #ifdef _MXC_PRINT_STAT
572 LOG_INFO("%d bytes newly written", data_size);
573 #endif
574 return ERROR_OK;
575 }
576
577 static int mxc_read_page(struct nand_device *nand, uint32_t page,
578 uint8_t *data, uint32_t data_size,
579 uint8_t *oob, uint32_t oob_size)
580 {
581 struct mxc_nf_controller *mxc_nf_info = nand->controller_priv;
582 struct target *target = nand->target;
583 int retval;
584 uint8_t bufs;
585 uint16_t swap1, swap2, new_swap1;
586
587 if (data_size % 2) {
588 LOG_ERROR(data_block_size_err_msg, data_size);
589 return ERROR_NAND_OPERATION_FAILED;
590 }
591 if (oob_size % 2) {
592 LOG_ERROR(data_block_size_err_msg, oob_size);
593 return ERROR_NAND_OPERATION_FAILED;
594 }
595
596 /*
597 * validate target state
598 */
599 retval = validate_target_state(nand);
600 if (retval != ERROR_OK)
601 return retval;
602 /* Reset address_cycles before mxc_command ?? */
603 retval = mxc_command(nand, NAND_CMD_READ0);
604 if (retval != ERROR_OK)
605 return retval;
606 retval = mxc_address(nand, 0); /* col */
607 if (retval != ERROR_OK)
608 return retval;
609 retval = mxc_address(nand, 0); /* col */
610 if (retval != ERROR_OK)
611 return retval;
612 retval = mxc_address(nand, page & 0xff);/* page address */
613 if (retval != ERROR_OK)
614 return retval;
615 retval = mxc_address(nand, (page >> 8) & 0xff); /* page address */
616 if (retval != ERROR_OK)
617 return retval;
618 retval = mxc_address(nand, (page >> 16) & 0xff);/* page address */
619 if (retval != ERROR_OK)
620 return retval;
621 retval = mxc_command(nand, NAND_CMD_READSTART);
622 if (retval != ERROR_OK)
623 return retval;
624
625 if (nfc_is_v1() && nand->page_size > 512)
626 bufs = 4;
627 else
628 bufs = 1;
629
630 for (uint8_t i = 0; i < bufs; ++i) {
631 target_write_u16(target, MXC_NF_BUFADDR, i);
632 mxc_nf_info->fin = MXC_NF_FIN_DATAOUT;
633 retval = do_data_output(nand);
634 if (retval != ERROR_OK) {
635 LOG_ERROR("MXC_NF : Error reading page %d", i);
636 return retval;
637 }
638 }
639
640 if (nand->page_size > 512 && mxc_nf_info->flags.biswap_enabled) {
641 uint32_t spare_buffer3;
642 /* BI-swap - work-around of mxc NFC for NAND device with page == 2k */
643 target_read_u16(target, MXC_NF_MAIN_BUFFER3 + 464, &swap1);
644 if (nfc_is_v1())
645 spare_buffer3 = MXC_NF_V1_SPARE_BUFFER3 + 4;
646 else
647 spare_buffer3 = MXC_NF_V2_SPARE_BUFFER3;
648 target_read_u16(target, spare_buffer3, &swap2);
649 new_swap1 = (swap1 & 0xFF00) | (swap2 >> 8);
650 swap2 = (swap1 << 8) | (swap2 & 0xFF);
651 target_write_u16(target, MXC_NF_MAIN_BUFFER3 + 464, new_swap1);
652 target_write_u16(target, spare_buffer3, swap2);
653 }
654
655 if (data)
656 target_read_buffer(target, MXC_NF_MAIN_BUFFER0, data_size, data);
657 if (oob) {
658 if (nfc_is_v1())
659 target_read_buffer(target, MXC_NF_V1_SPARE_BUFFER0, oob_size, oob);
660 else {
661 uint32_t addr = MXC_NF_V2_SPARE_BUFFER0;
662 while (oob_size > 0) {
663 uint8_t len = MIN(oob_size, MXC_NF_SPARE_BUFFER_LEN);
664 target_read_buffer(target, addr, len, oob);
665 addr = align_address_v2(nand, addr + len);
666 oob += len;
667 oob_size -= len;
668 }
669 }
670 }
671
672 #ifdef _MXC_PRINT_STAT
673 if (data_size > 0) {
674 /* When Operation Status is read (when page is erased),
675 * this function is used but data_size is null.
676 */
677 LOG_INFO("%d bytes newly read", data_size);
678 }
679 #endif
680 return ERROR_OK;
681 }
682
683 static uint32_t align_address_v2(struct nand_device *nand, uint32_t addr)
684 {
685 struct mxc_nf_controller *mxc_nf_info = nand->controller_priv;
686 uint32_t ret = addr;
687 if (addr > MXC_NF_V2_SPARE_BUFFER0 &&
688 (addr & 0x1F) == MXC_NF_SPARE_BUFFER_LEN)
689 ret += MXC_NF_SPARE_BUFFER_MAX - MXC_NF_SPARE_BUFFER_LEN;
690 else if (addr >= (mxc_nf_info->mxc_base_addr + (uint32_t)nand->page_size))
691 ret = MXC_NF_V2_SPARE_BUFFER0;
692 return ret;
693 }
694
695 static int initialize_nf_controller(struct nand_device *nand)
696 {
697 struct mxc_nf_controller *mxc_nf_info = nand->controller_priv;
698 struct target *target = nand->target;
699 uint16_t work_mode = 0;
700 uint16_t temp;
701 /*
702 * resets NAND flash controller in zero time ? I don't know.
703 */
704 target_write_u16(target, MXC_NF_CFG1, MXC_NF_BIT_RESET_EN);
705 if (mxc_nf_info->mxc_version == MXC_VERSION_MX27)
706 work_mode = MXC_NF_BIT_INT_DIS; /* disable interrupt */
707
708 if (target->endianness == TARGET_BIG_ENDIAN) {
709 LOG_DEBUG("MXC_NF : work in Big Endian mode");
710 work_mode |= MXC_NF_BIT_BE_EN;
711 } else
712 LOG_DEBUG("MXC_NF : work in Little Endian mode");
713 if (mxc_nf_info->flags.hw_ecc_enabled) {
714 LOG_DEBUG("MXC_NF : work with ECC mode");
715 work_mode |= MXC_NF_BIT_ECC_EN;
716 } else
717 LOG_DEBUG("MXC_NF : work without ECC mode");
718 if (nfc_is_v2()) {
719 target_write_u16(target, MXC_NF_V2_SPAS, OOB_SIZE / 2);
720 if (nand->page_size) {
721 uint16_t pages_per_block = nand->erase_size / nand->page_size;
722 work_mode |= MXC_NF_V2_CFG1_PPB(ffs(pages_per_block) - 6);
723 }
724 work_mode |= MXC_NF_BIT_ECC_4BIT;
725 }
726 target_write_u16(target, MXC_NF_CFG1, work_mode);
727
728 /*
729 * unlock SRAM buffer for write; 2 mean "Unlock", other values means "Lock"
730 */
731 target_write_u16(target, MXC_NF_BUFCFG, 2);
732 target_read_u16(target, MXC_NF_FWP, &temp);
733 if ((temp & 0x0007) == 1) {
734 LOG_ERROR("NAND flash is tight-locked, reset needed");
735 return ERROR_FAIL;
736 }
737
738 /*
739 * unlock NAND flash for write
740 */
741 if (nfc_is_v1()) {
742 target_write_u16(target, MXC_NF_V1_UNLOCKSTART, 0x0000);
743 target_write_u16(target, MXC_NF_V1_UNLOCKEND, 0xFFFF);
744 } else {
745 target_write_u16(target, MXC_NF_V2_UNLOCKSTART0, 0x0000);
746 target_write_u16(target, MXC_NF_V2_UNLOCKSTART1, 0x0000);
747 target_write_u16(target, MXC_NF_V2_UNLOCKSTART2, 0x0000);
748 target_write_u16(target, MXC_NF_V2_UNLOCKSTART3, 0x0000);
749 target_write_u16(target, MXC_NF_V2_UNLOCKEND0, 0xFFFF);
750 target_write_u16(target, MXC_NF_V2_UNLOCKEND1, 0xFFFF);
751 target_write_u16(target, MXC_NF_V2_UNLOCKEND2, 0xFFFF);
752 target_write_u16(target, MXC_NF_V2_UNLOCKEND3, 0xFFFF);
753 }
754 target_write_u16(target, MXC_NF_FWP, 4);
755
756 /*
757 * 0x0000 means that first SRAM buffer @base_addr will be used
758 */
759 target_write_u16(target, MXC_NF_BUFADDR, 0x0000);
760 /*
761 * address of SRAM buffer
762 */
763 in_sram_address = MXC_NF_MAIN_BUFFER0;
764 sign_of_sequental_byte_read = 0;
765 return ERROR_OK;
766 }
767
768 static int get_next_byte_from_sram_buffer(struct nand_device *nand, uint8_t *value)
769 {
770 struct mxc_nf_controller *mxc_nf_info = nand->controller_priv;
771 struct target *target = nand->target;
772 static uint8_t even_byte;
773 uint16_t temp;
774 /*
775 * host-big_endian ??
776 */
777 if (sign_of_sequental_byte_read == 0)
778 even_byte = 0;
779
780 if (in_sram_address > (nfc_is_v1() ? MXC_NF_V1_LAST_BUFFADDR : MXC_NF_V2_LAST_BUFFADDR)) {
781 LOG_ERROR(sram_buffer_bounds_err_msg, in_sram_address);
782 *value = 0;
783 sign_of_sequental_byte_read = 0;
784 even_byte = 0;
785 return ERROR_NAND_OPERATION_FAILED;
786 } else {
787 if (nfc_is_v2())
788 in_sram_address = align_address_v2(nand, in_sram_address);
789
790 target_read_u16(target, in_sram_address, &temp);
791 if (even_byte) {
792 *value = temp >> 8;
793 even_byte = 0;
794 in_sram_address += 2;
795 } else {
796 *value = temp & 0xff;
797 even_byte = 1;
798 }
799 }
800 sign_of_sequental_byte_read = 1;
801 return ERROR_OK;
802 }
803
804 static int get_next_halfword_from_sram_buffer(struct nand_device *nand, uint16_t *value)
805 {
806 struct mxc_nf_controller *mxc_nf_info = nand->controller_priv;
807 struct target *target = nand->target;
808
809 if (in_sram_address > (nfc_is_v1() ? MXC_NF_V1_LAST_BUFFADDR : MXC_NF_V2_LAST_BUFFADDR)) {
810 LOG_ERROR(sram_buffer_bounds_err_msg, in_sram_address);
811 *value = 0;
812 return ERROR_NAND_OPERATION_FAILED;
813 } else {
814 if (nfc_is_v2())
815 in_sram_address = align_address_v2(nand, in_sram_address);
816
817 target_read_u16(target, in_sram_address, value);
818 in_sram_address += 2;
819 }
820 return ERROR_OK;
821 }
822
823 static int poll_for_complete_op(struct nand_device *nand, const char *text)
824 {
825 if (mxc_nand_ready(nand, 1000) == -1) {
826 LOG_ERROR("%s sending timeout", text);
827 return ERROR_NAND_OPERATION_FAILED;
828 }
829 return ERROR_OK;
830 }
831
832 static int validate_target_state(struct nand_device *nand)
833 {
834 struct mxc_nf_controller *mxc_nf_info = nand->controller_priv;
835 struct target *target = nand->target;
836
837 if (target->state != TARGET_HALTED) {
838 LOG_ERROR(target_not_halted_err_msg);
839 return ERROR_NAND_OPERATION_FAILED;
840 }
841
842 if (mxc_nf_info->flags.target_little_endian !=
843 (target->endianness == TARGET_LITTLE_ENDIAN)) {
844 /*
845 * endianness changed after NAND controller probed
846 */
847 return ERROR_NAND_OPERATION_FAILED;
848 }
849 return ERROR_OK;
850 }
851
852 static int ecc_status_v1(struct nand_device *nand)
853 {
854 struct mxc_nf_controller *mxc_nf_info = nand->controller_priv;
855 struct target *target = nand->target;
856 uint16_t ecc_status;
857
858 target_read_u16(target, MXC_NF_ECCSTATUS, &ecc_status);
859 switch (ecc_status & 0x000c) {
860 case 1 << 2:
861 LOG_INFO("main area read with 1 (correctable) error");
862 break;
863 case 2 << 2:
864 LOG_INFO("main area read with more than 1 (incorrectable) error");
865 return ERROR_NAND_OPERATION_FAILED;
866 }
867 switch (ecc_status & 0x0003) {
868 case 1:
869 LOG_INFO("spare area read with 1 (correctable) error");
870 break;
871 case 2:
872 LOG_INFO("main area read with more than 1 (incorrectable) error");
873 return ERROR_NAND_OPERATION_FAILED;
874 }
875 return ERROR_OK;
876 }
877
878 static int ecc_status_v2(struct nand_device *nand)
879 {
880 struct mxc_nf_controller *mxc_nf_info = nand->controller_priv;
881 struct target *target = nand->target;
882 uint16_t ecc_status;
883 uint8_t no_subpages;
884 uint8_t err;
885
886 no_subpages = nand->page_size >> 9;
887
888 target_read_u16(target, MXC_NF_ECCSTATUS, &ecc_status);
889 do {
890 err = ecc_status & 0xF;
891 if (err > 4) {
892 LOG_INFO("UnCorrectable RS-ECC Error");
893 return ERROR_NAND_OPERATION_FAILED;
894 } else if (err > 0)
895 LOG_INFO("%d Symbol Correctable RS-ECC Error", err);
896 ecc_status >>= 4;
897 } while (--no_subpages);
898 return ERROR_OK;
899 }
900
901 static int do_data_output(struct nand_device *nand)
902 {
903 struct mxc_nf_controller *mxc_nf_info = nand->controller_priv;
904 struct target *target = nand->target;
905 int poll_result;
906 switch (mxc_nf_info->fin) {
907 case MXC_NF_FIN_DATAOUT:
908 /*
909 * start data output operation (set MXC_NF_BIT_OP_DONE==0)
910 */
911 target_write_u16(target, MXC_NF_CFG2, MXC_NF_BIT_DATAOUT_TYPE(mxc_nf_info->optype));
912 poll_result = poll_for_complete_op(nand, "data output");
913 if (poll_result != ERROR_OK)
914 return poll_result;
915
916 mxc_nf_info->fin = MXC_NF_FIN_NONE;
917 /*
918 * ECC stuff
919 */
920 if (mxc_nf_info->optype == MXC_NF_DATAOUT_PAGE && mxc_nf_info->flags.hw_ecc_enabled) {
921 int ecc_status;
922 if (nfc_is_v1())
923 ecc_status = ecc_status_v1(nand);
924 else
925 ecc_status = ecc_status_v2(nand);
926 if (ecc_status != ERROR_OK)
927 return ecc_status;
928 }
929 break;
930 case MXC_NF_FIN_NONE:
931 break;
932 }
933 return ERROR_OK;
934 }
935
936 struct nand_flash_controller mxc_nand_flash_controller = {
937 .name = "mxc",
938 .nand_device_command = &mxc_nand_device_command,
939 .commands = mxc_nand_command_handler,
940 .init = &mxc_init,
941 .reset = &mxc_reset,
942 .command = &mxc_command,
943 .address = &mxc_address,
944 .write_data = &mxc_write_data,
945 .read_data = &mxc_read_data,
946 .write_page = &mxc_write_page,
947 .read_page = &mxc_read_page,
948 .nand_ready = &mxc_nand_ready,
949 };

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)