openocd: src/flash: replace the GPL-2.0-or-later license tag
[openocd.git] / src / flash / nand / mx3.c
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2
3
4 /***************************************************************************
5 * Copyright (C) 2009 by Alexei Babich *
6 * Rezonans plc., Chelyabinsk, Russia *
7 * impatt@mail.ru *
8 ***************************************************************************/
9
10 /*
11 * Freescale iMX3* OpenOCD NAND Flash controller support.
12 *
13 * Many thanks to Ben Dooks for writing s3c24xx driver.
14 */
15
16 /*
17 driver tested with STMicro NAND512W3A @imx31
18 tested "nand probe #", "nand erase # 0 #", "nand dump # file 0 #", "nand write # file 0"
19 get_next_halfword_from_sram_buffer() not tested
20 */
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include "imp.h"
26 #include "mx3.h"
27 #include <target/target.h>
28
29 static const char target_not_halted_err_msg[] =
30 "target must be halted to use mx3 NAND flash controller";
31 static const char data_block_size_err_msg[] =
32 "minimal granularity is one half-word, %" PRIu32 " is incorrect";
33 static const char sram_buffer_bounds_err_msg[] =
34 "trying to access out of SRAM buffer bound (addr=0x%" PRIx32 ")";
35 static const char get_status_register_err_msg[] = "can't get NAND status";
36 static uint32_t in_sram_address;
37 static unsigned char sign_of_sequental_byte_read;
38
39 static int test_iomux_settings(struct target *target, uint32_t value,
40 uint32_t mask, const char *text);
41 static int initialize_nf_controller(struct nand_device *nand);
42 static int get_next_byte_from_sram_buffer(struct target *target, uint8_t *value);
43 static int get_next_halfword_from_sram_buffer(struct target *target,
44 uint16_t *value);
45 static int poll_for_complete_op(struct target *target, const char *text);
46 static int validate_target_state(struct nand_device *nand);
47 static int do_data_output(struct nand_device *nand);
48
49 static int imx31_command(struct nand_device *nand, uint8_t command);
50 static int imx31_address(struct nand_device *nand, uint8_t address);
51
52 NAND_DEVICE_COMMAND_HANDLER(imx31_nand_device_command)
53 {
54 struct mx3_nf_controller *mx3_nf_info;
55 mx3_nf_info = malloc(sizeof(struct mx3_nf_controller));
56 if (!mx3_nf_info) {
57 LOG_ERROR("no memory for nand controller");
58 return ERROR_FAIL;
59 }
60
61 nand->controller_priv = mx3_nf_info;
62
63 if (CMD_ARGC < 3)
64 return ERROR_COMMAND_SYNTAX_ERROR;
65 /*
66 * check hwecc requirements
67 */
68 {
69 int hwecc_needed;
70 hwecc_needed = strcmp(CMD_ARGV[2], "hwecc");
71 if (hwecc_needed == 0)
72 mx3_nf_info->flags.hw_ecc_enabled = 1;
73 else
74 mx3_nf_info->flags.hw_ecc_enabled = 0;
75 }
76
77 mx3_nf_info->optype = MX3_NF_DATAOUT_PAGE;
78 mx3_nf_info->fin = MX3_NF_FIN_NONE;
79 mx3_nf_info->flags.target_little_endian =
80 (nand->target->endianness == TARGET_LITTLE_ENDIAN);
81
82 return ERROR_OK;
83 }
84
85 static int imx31_init(struct nand_device *nand)
86 {
87 struct mx3_nf_controller *mx3_nf_info = nand->controller_priv;
88 struct target *target = nand->target;
89
90 {
91 /*
92 * validate target state
93 */
94 int validate_target_result;
95 validate_target_result = validate_target_state(nand);
96 if (validate_target_result != ERROR_OK)
97 return validate_target_result;
98 }
99
100 {
101 uint16_t buffsize_register_content;
102 target_read_u16(target, MX3_NF_BUFSIZ, &buffsize_register_content);
103 mx3_nf_info->flags.one_kb_sram = !(buffsize_register_content & 0x000f);
104 }
105
106 {
107 uint32_t pcsr_register_content;
108 target_read_u32(target, MX3_PCSR, &pcsr_register_content);
109 if (!nand->bus_width) {
110 nand->bus_width = (pcsr_register_content & 0x80000000) ? 16 : 8;
111 } else {
112 pcsr_register_content |= ((nand->bus_width == 16) ? 0x80000000 : 0x00000000);
113 target_write_u32(target, MX3_PCSR, pcsr_register_content);
114 }
115
116 if (!nand->page_size) {
117 nand->page_size = (pcsr_register_content & 0x40000000) ? 2048 : 512;
118 } else {
119 pcsr_register_content |= ((nand->page_size == 2048) ? 0x40000000 : 0x00000000);
120 target_write_u32(target, MX3_PCSR, pcsr_register_content);
121 }
122 if (mx3_nf_info->flags.one_kb_sram && (nand->page_size == 2048)) {
123 LOG_ERROR("NAND controller have only 1 kb SRAM, "
124 "so pagesize 2048 is incompatible with it");
125 }
126 }
127
128 {
129 uint32_t cgr_register_content;
130 target_read_u32(target, MX3_CCM_CGR2, &cgr_register_content);
131 if (!(cgr_register_content & 0x00000300)) {
132 LOG_ERROR("clock gating to EMI disabled");
133 return ERROR_FAIL;
134 }
135 }
136
137 {
138 uint32_t gpr_register_content;
139 target_read_u32(target, MX3_GPR, &gpr_register_content);
140 if (gpr_register_content & 0x00000060) {
141 LOG_ERROR("pins mode overridden by GPR");
142 return ERROR_FAIL;
143 }
144 }
145
146 {
147 /*
148 * testing IOMUX settings; must be in "functional-mode output and
149 * functional-mode input" mode
150 */
151 int test_iomux;
152 test_iomux = ERROR_OK;
153 test_iomux |= test_iomux_settings(target, 0x43fac0c0, 0x7f7f7f00, "d0,d1,d2");
154 test_iomux |= test_iomux_settings(target, 0x43fac0c4, 0x7f7f7f7f, "d3,d4,d5,d6");
155 test_iomux |= test_iomux_settings(target, 0x43fac0c8, 0x0000007f, "d7");
156 if (nand->bus_width == 16) {
157 test_iomux |= test_iomux_settings(target, 0x43fac0c8, 0x7f7f7f00, "d8,d9,d10");
158 test_iomux |= test_iomux_settings(target, 0x43fac0cc, 0x7f7f7f7f, "d11,d12,d13,d14");
159 test_iomux |= test_iomux_settings(target, 0x43fac0d0, 0x0000007f, "d15");
160 }
161 test_iomux |= test_iomux_settings(target, 0x43fac0d0, 0x7f7f7f00, "nfwp,nfce,nfrb");
162 test_iomux |= test_iomux_settings(target, 0x43fac0d4, 0x7f7f7f7f,
163 "nfwe,nfre,nfale,nfcle");
164 if (test_iomux != ERROR_OK)
165 return ERROR_FAIL;
166 }
167
168 initialize_nf_controller(nand);
169
170 {
171 int retval;
172 uint16_t nand_status_content;
173 retval = ERROR_OK;
174 retval |= imx31_command(nand, NAND_CMD_STATUS);
175 retval |= imx31_address(nand, 0x00);
176 retval |= do_data_output(nand);
177 if (retval != ERROR_OK) {
178 LOG_ERROR(get_status_register_err_msg);
179 return ERROR_FAIL;
180 }
181 target_read_u16(target, MX3_NF_MAIN_BUFFER0, &nand_status_content);
182 if (!(nand_status_content & 0x0080)) {
183 /*
184 * is host-big-endian correctly ??
185 */
186 LOG_INFO("NAND read-only");
187 mx3_nf_info->flags.nand_readonly = 1;
188 } else
189 mx3_nf_info->flags.nand_readonly = 0;
190 }
191 return ERROR_OK;
192 }
193
194 static int imx31_read_data(struct nand_device *nand, void *data)
195 {
196 struct target *target = nand->target;
197 {
198 /*
199 * validate target state
200 */
201 int validate_target_result;
202 validate_target_result = validate_target_state(nand);
203 if (validate_target_result != ERROR_OK)
204 return validate_target_result;
205 }
206
207 {
208 /*
209 * get data from nand chip
210 */
211 int try_data_output_from_nand_chip;
212 try_data_output_from_nand_chip = do_data_output(nand);
213 if (try_data_output_from_nand_chip != ERROR_OK)
214 return try_data_output_from_nand_chip;
215 }
216
217 if (nand->bus_width == 16)
218 get_next_halfword_from_sram_buffer(target, data);
219 else
220 get_next_byte_from_sram_buffer(target, data);
221
222 return ERROR_OK;
223 }
224
225 static int imx31_write_data(struct nand_device *nand, uint16_t data)
226 {
227 LOG_ERROR("write_data() not implemented");
228 return ERROR_NAND_OPERATION_FAILED;
229 }
230
231 static int imx31_reset(struct nand_device *nand)
232 {
233 /*
234 * validate target state
235 */
236 int validate_target_result;
237 validate_target_result = validate_target_state(nand);
238 if (validate_target_result != ERROR_OK)
239 return validate_target_result;
240 initialize_nf_controller(nand);
241 return ERROR_OK;
242 }
243
244 static int imx31_command(struct nand_device *nand, uint8_t command)
245 {
246 struct mx3_nf_controller *mx3_nf_info = nand->controller_priv;
247 struct target *target = nand->target;
248 {
249 /*
250 * validate target state
251 */
252 int validate_target_result;
253 validate_target_result = validate_target_state(nand);
254 if (validate_target_result != ERROR_OK)
255 return validate_target_result;
256 }
257
258 switch (command) {
259 case NAND_CMD_READOOB:
260 command = NAND_CMD_READ0;
261 in_sram_address = MX3_NF_SPARE_BUFFER0; /* set read point for
262 * data_read() and
263 * read_block_data() to
264 * spare area in SRAM
265 * buffer */
266 break;
267 case NAND_CMD_READ1:
268 command = NAND_CMD_READ0;
269 /*
270 * offset == one half of page size
271 */
272 in_sram_address = MX3_NF_MAIN_BUFFER0 + (nand->page_size >> 1);
273 break;
274 default:
275 in_sram_address = MX3_NF_MAIN_BUFFER0;
276 }
277
278 target_write_u16(target, MX3_NF_FCMD, command);
279 /*
280 * start command input operation (set MX3_NF_BIT_OP_DONE==0)
281 */
282 target_write_u16(target, MX3_NF_CFG2, MX3_NF_BIT_OP_FCI);
283 {
284 int poll_result;
285 poll_result = poll_for_complete_op(target, "command");
286 if (poll_result != ERROR_OK)
287 return poll_result;
288 }
289 /*
290 * reset cursor to begin of the buffer
291 */
292 sign_of_sequental_byte_read = 0;
293 switch (command) {
294 case NAND_CMD_READID:
295 mx3_nf_info->optype = MX3_NF_DATAOUT_NANDID;
296 mx3_nf_info->fin = MX3_NF_FIN_DATAOUT;
297 break;
298 case NAND_CMD_STATUS:
299 mx3_nf_info->optype = MX3_NF_DATAOUT_NANDSTATUS;
300 mx3_nf_info->fin = MX3_NF_FIN_DATAOUT;
301 break;
302 case NAND_CMD_READ0:
303 mx3_nf_info->fin = MX3_NF_FIN_DATAOUT;
304 mx3_nf_info->optype = MX3_NF_DATAOUT_PAGE;
305 break;
306 default:
307 mx3_nf_info->optype = MX3_NF_DATAOUT_PAGE;
308 }
309 return ERROR_OK;
310 }
311
312 static int imx31_address(struct nand_device *nand, uint8_t address)
313 {
314 struct target *target = nand->target;
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 }
324
325 target_write_u16(target, MX3_NF_FADDR, address);
326 /*
327 * start address input operation (set MX3_NF_BIT_OP_DONE==0)
328 */
329 target_write_u16(target, MX3_NF_CFG2, MX3_NF_BIT_OP_FAI);
330 {
331 int poll_result;
332 poll_result = poll_for_complete_op(target, "address");
333 if (poll_result != ERROR_OK)
334 return poll_result;
335 }
336 return ERROR_OK;
337 }
338
339 static int imx31_nand_ready(struct nand_device *nand, int tout)
340 {
341 uint16_t poll_complete_status;
342 struct target *target = nand->target;
343
344 {
345 /*
346 * validate target state
347 */
348 int validate_target_result;
349 validate_target_result = validate_target_state(nand);
350 if (validate_target_result != ERROR_OK)
351 return validate_target_result;
352 }
353
354 do {
355 target_read_u16(target, MX3_NF_CFG2, &poll_complete_status);
356 if (poll_complete_status & MX3_NF_BIT_OP_DONE)
357 return tout;
358 alive_sleep(1);
359 } while (tout-- > 0);
360 return tout;
361 }
362
363 static int imx31_write_page(struct nand_device *nand, uint32_t page,
364 uint8_t *data, uint32_t data_size, uint8_t *oob,
365 uint32_t oob_size)
366 {
367 struct mx3_nf_controller *mx3_nf_info = nand->controller_priv;
368 struct target *target = nand->target;
369
370 if (data_size % 2) {
371 LOG_ERROR(data_block_size_err_msg, data_size);
372 return ERROR_NAND_OPERATION_FAILED;
373 }
374 if (oob_size % 2) {
375 LOG_ERROR(data_block_size_err_msg, oob_size);
376 return ERROR_NAND_OPERATION_FAILED;
377 }
378 if (!data) {
379 LOG_ERROR("nothing to program");
380 return ERROR_NAND_OPERATION_FAILED;
381 }
382 {
383 /*
384 * validate target state
385 */
386 int retval;
387 retval = validate_target_state(nand);
388 if (retval != ERROR_OK)
389 return retval;
390 }
391 {
392 int retval = ERROR_OK;
393 retval |= imx31_command(nand, NAND_CMD_SEQIN);
394 retval |= imx31_address(nand, 0x00);
395 retval |= imx31_address(nand, page & 0xff);
396 retval |= imx31_address(nand, (page >> 8) & 0xff);
397 if (nand->address_cycles >= 4) {
398 retval |= imx31_address(nand, (page >> 16) & 0xff);
399 if (nand->address_cycles >= 5)
400 retval |= imx31_address(nand, (page >> 24) & 0xff);
401 }
402 target_write_buffer(target, MX3_NF_MAIN_BUFFER0, data_size, data);
403 if (oob) {
404 if (mx3_nf_info->flags.hw_ecc_enabled) {
405 /*
406 * part of spare block will be overridden by hardware
407 * ECC generator
408 */
409 LOG_DEBUG("part of spare block will be overridden by hardware ECC generator");
410 }
411 target_write_buffer(target, MX3_NF_SPARE_BUFFER0, oob_size, oob);
412 }
413 /*
414 * start data input operation (set MX3_NF_BIT_OP_DONE==0)
415 */
416 target_write_u16(target, MX3_NF_CFG2, MX3_NF_BIT_OP_FDI);
417 {
418 int poll_result;
419 poll_result = poll_for_complete_op(target, "data input");
420 if (poll_result != ERROR_OK)
421 return poll_result;
422 }
423 retval |= imx31_command(nand, NAND_CMD_PAGEPROG);
424 if (retval != ERROR_OK)
425 return retval;
426
427 /*
428 * check status register
429 */
430 {
431 uint16_t nand_status_content;
432 retval = ERROR_OK;
433 retval |= imx31_command(nand, NAND_CMD_STATUS);
434 retval |= imx31_address(nand, 0x00);
435 retval |= do_data_output(nand);
436 if (retval != ERROR_OK) {
437 LOG_ERROR(get_status_register_err_msg);
438 return retval;
439 }
440 target_read_u16(target, MX3_NF_MAIN_BUFFER0, &nand_status_content);
441 if (nand_status_content & 0x0001) {
442 /*
443 * is host-big-endian correctly ??
444 */
445 return ERROR_NAND_OPERATION_FAILED;
446 }
447 }
448 }
449 return ERROR_OK;
450 }
451
452 static int imx31_read_page(struct nand_device *nand, uint32_t page,
453 uint8_t *data, uint32_t data_size, uint8_t *oob,
454 uint32_t oob_size)
455 {
456 struct target *target = nand->target;
457
458 if (data_size % 2) {
459 LOG_ERROR(data_block_size_err_msg, data_size);
460 return ERROR_NAND_OPERATION_FAILED;
461 }
462 if (oob_size % 2) {
463 LOG_ERROR(data_block_size_err_msg, oob_size);
464 return ERROR_NAND_OPERATION_FAILED;
465 }
466
467 {
468 /*
469 * validate target state
470 */
471 int retval;
472 retval = validate_target_state(nand);
473 if (retval != ERROR_OK)
474 return retval;
475 }
476 {
477 int retval = ERROR_OK;
478 retval |= imx31_command(nand, NAND_CMD_READ0);
479 retval |= imx31_address(nand, 0x00);
480 retval |= imx31_address(nand, page & 0xff);
481 retval |= imx31_address(nand, (page >> 8) & 0xff);
482 if (nand->address_cycles >= 4) {
483 retval |= imx31_address(nand, (page >> 16) & 0xff);
484 if (nand->address_cycles >= 5) {
485 retval |= imx31_address(nand, (page >> 24) & 0xff);
486 retval |= imx31_command(nand, NAND_CMD_READSTART);
487 }
488 }
489 retval |= do_data_output(nand);
490 if (retval != ERROR_OK)
491 return retval;
492
493 if (data) {
494 target_read_buffer(target, MX3_NF_MAIN_BUFFER0, data_size,
495 data);
496 }
497 if (oob) {
498 target_read_buffer(target, MX3_NF_SPARE_BUFFER0, oob_size,
499 oob);
500 }
501 }
502 return ERROR_OK;
503 }
504
505 static int test_iomux_settings(struct target *target, uint32_t address,
506 uint32_t mask, const char *text)
507 {
508 uint32_t register_content;
509 target_read_u32(target, address, &register_content);
510 if ((register_content & mask) != (0x12121212 & mask)) {
511 LOG_ERROR("IOMUX for {%s} is bad", text);
512 return ERROR_FAIL;
513 }
514 return ERROR_OK;
515 }
516
517 static int initialize_nf_controller(struct nand_device *nand)
518 {
519 struct mx3_nf_controller *mx3_nf_info = nand->controller_priv;
520 struct target *target = nand->target;
521 /*
522 * resets NAND flash controller in zero time ? I don't know.
523 */
524 target_write_u16(target, MX3_NF_CFG1, MX3_NF_BIT_RESET_EN);
525 {
526 uint16_t work_mode;
527 work_mode = MX3_NF_BIT_INT_DIS; /* disable interrupt */
528 if (target->endianness == TARGET_BIG_ENDIAN)
529 work_mode |= MX3_NF_BIT_BE_EN;
530 if (mx3_nf_info->flags.hw_ecc_enabled)
531 work_mode |= MX3_NF_BIT_ECC_EN;
532 target_write_u16(target, MX3_NF_CFG1, work_mode);
533 }
534 /*
535 * unlock SRAM buffer for write; 2 mean "Unlock", other values means "Lock"
536 */
537 target_write_u16(target, MX3_NF_BUFCFG, 2);
538 {
539 uint16_t temp;
540 target_read_u16(target, MX3_NF_FWP, &temp);
541 if ((temp & 0x0007) == 1) {
542 LOG_ERROR("NAND flash is tight-locked, reset needed");
543 return ERROR_FAIL;
544 }
545
546 }
547 /*
548 * unlock NAND flash for write
549 */
550 target_write_u16(target, MX3_NF_FWP, 4);
551 target_write_u16(target, MX3_NF_LOCKSTART, 0x0000);
552 target_write_u16(target, MX3_NF_LOCKEND, 0xFFFF);
553 /*
554 * 0x0000 means that first SRAM buffer @0xB800_0000 will be used
555 */
556 target_write_u16(target, MX3_NF_BUFADDR, 0x0000);
557 /*
558 * address of SRAM buffer
559 */
560 in_sram_address = MX3_NF_MAIN_BUFFER0;
561 sign_of_sequental_byte_read = 0;
562 return ERROR_OK;
563 }
564
565 static int get_next_byte_from_sram_buffer(struct target *target, uint8_t *value)
566 {
567 static uint8_t even_byte;
568 /*
569 * host-big_endian ??
570 */
571 if (sign_of_sequental_byte_read == 0)
572 even_byte = 0;
573 if (in_sram_address > MX3_NF_LAST_BUFFER_ADDR) {
574 LOG_ERROR(sram_buffer_bounds_err_msg, in_sram_address);
575 *value = 0;
576 sign_of_sequental_byte_read = 0;
577 even_byte = 0;
578 return ERROR_NAND_OPERATION_FAILED;
579 } else {
580 uint16_t temp;
581 target_read_u16(target, in_sram_address, &temp);
582 if (even_byte) {
583 *value = temp >> 8;
584 even_byte = 0;
585 in_sram_address += 2;
586 } else {
587 *value = temp & 0xff;
588 even_byte = 1;
589 }
590 }
591 sign_of_sequental_byte_read = 1;
592 return ERROR_OK;
593 }
594
595 static int get_next_halfword_from_sram_buffer(struct target *target,
596 uint16_t *value)
597 {
598 if (in_sram_address > MX3_NF_LAST_BUFFER_ADDR) {
599 LOG_ERROR(sram_buffer_bounds_err_msg, in_sram_address);
600 *value = 0;
601 return ERROR_NAND_OPERATION_FAILED;
602 } else {
603 target_read_u16(target, in_sram_address, value);
604 in_sram_address += 2;
605 }
606 return ERROR_OK;
607 }
608
609 static int poll_for_complete_op(struct target *target, const char *text)
610 {
611 uint16_t poll_complete_status;
612 for (int poll_cycle_count = 0; poll_cycle_count < 100; poll_cycle_count++) {
613 usleep(25);
614 target_read_u16(target, MX3_NF_CFG2, &poll_complete_status);
615 if (poll_complete_status & MX3_NF_BIT_OP_DONE)
616 break;
617 }
618 if (!(poll_complete_status & MX3_NF_BIT_OP_DONE)) {
619 LOG_ERROR("%s sending timeout", text);
620 return ERROR_NAND_OPERATION_FAILED;
621 }
622 return ERROR_OK;
623 }
624
625 static int validate_target_state(struct nand_device *nand)
626 {
627 struct mx3_nf_controller *mx3_nf_info = nand->controller_priv;
628 struct target *target = nand->target;
629
630 if (target->state != TARGET_HALTED) {
631 LOG_ERROR(target_not_halted_err_msg);
632 return ERROR_NAND_OPERATION_FAILED;
633 }
634
635 if (mx3_nf_info->flags.target_little_endian !=
636 (target->endianness == TARGET_LITTLE_ENDIAN)) {
637 /*
638 * endianness changed after NAND controller probed
639 */
640 return ERROR_NAND_OPERATION_FAILED;
641 }
642 return ERROR_OK;
643 }
644
645 static int do_data_output(struct nand_device *nand)
646 {
647 struct mx3_nf_controller *mx3_nf_info = nand->controller_priv;
648 struct target *target = nand->target;
649 switch (mx3_nf_info->fin) {
650 case MX3_NF_FIN_DATAOUT:
651 /*
652 * start data output operation (set MX3_NF_BIT_OP_DONE==0)
653 */
654 target_write_u16 (target, MX3_NF_CFG2,
655 MX3_NF_BIT_DATAOUT_TYPE(mx3_nf_info->optype));
656 {
657 int poll_result;
658 poll_result = poll_for_complete_op(target, "data output");
659 if (poll_result != ERROR_OK)
660 return poll_result;
661 }
662 mx3_nf_info->fin = MX3_NF_FIN_NONE;
663 /*
664 * ECC stuff
665 */
666 if ((mx3_nf_info->optype == MX3_NF_DATAOUT_PAGE)
667 && mx3_nf_info->flags.hw_ecc_enabled) {
668 uint16_t ecc_status;
669 target_read_u16 (target, MX3_NF_ECCSTATUS, &ecc_status);
670 switch (ecc_status & 0x000c) {
671 case 1 << 2:
672 LOG_DEBUG("main area read with 1 (correctable) error");
673 break;
674 case 2 << 2:
675 LOG_DEBUG("main area read with more than 1 (incorrectable) error");
676 return ERROR_NAND_OPERATION_FAILED;
677 }
678 switch (ecc_status & 0x0003) {
679 case 1:
680 LOG_DEBUG("spare area read with 1 (correctable) error");
681 break;
682 case 2:
683 LOG_DEBUG("main area read with more than 1 (incorrectable) error");
684 return ERROR_NAND_OPERATION_FAILED;
685 }
686 }
687 break;
688 case MX3_NF_FIN_NONE:
689 break;
690 }
691 return ERROR_OK;
692 }
693
694 struct nand_flash_controller imx31_nand_flash_controller = {
695 .name = "imx31",
696 .usage = "nand device imx31 target noecc|hwecc",
697 .nand_device_command = &imx31_nand_device_command,
698 .init = &imx31_init,
699 .reset = &imx31_reset,
700 .command = &imx31_command,
701 .address = &imx31_address,
702 .write_data = &imx31_write_data,
703 .read_data = &imx31_read_data,
704 .write_page = &imx31_write_page,
705 .read_page = &imx31_read_page,
706 .nand_ready = &imx31_nand_ready,
707 };

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)