split NAND driver handling into nand/driver.[ch]
[openocd.git] / src / flash / nand / core.c
1 /***************************************************************************
2 * Copyright (C) 2007 by Dominic Rath <Dominic.Rath@gmx.de> *
3 * Copyright (C) 2002 Thomas Gleixner <tglx@linutronix.de> *
4 * Copyright (C) 2009 Zachary T Welch <zw@superlucidity.net> *
5 * *
6 * Partially based on drivers/mtd/nand_ids.c from Linux. *
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 ***************************************************************************/
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26
27 #include <flash/nand.h>
28 #include <flash/common.h>
29 #include "imp.h"
30
31 /* configured NAND devices and NAND Flash command handler */
32 struct nand_device *nand_devices = NULL;
33
34 void nand_device_add(struct nand_device *c)
35 {
36 if (nand_devices) {
37 struct nand_device *p = nand_devices;
38 while (p && p->next) p = p->next;
39 p->next = c;
40 } else
41 nand_devices = c;
42 }
43
44
45 /* Chip ID list
46 *
47 * Name, ID code, pagesize, chipsize in MegaByte, eraseblock size,
48 * options
49 *
50 * Pagesize; 0, 256, 512
51 * 0 get this information from the extended chip ID
52 * 256 256 Byte page size
53 * 512 512 Byte page size
54 */
55 static struct nand_info nand_flash_ids[] =
56 {
57 /* start "museum" IDs */
58 {"NAND 1MiB 5V 8-bit", 0x6e, 256, 1, 0x1000, 0},
59 {"NAND 2MiB 5V 8-bit", 0x64, 256, 2, 0x1000, 0},
60 {"NAND 4MiB 5V 8-bit", 0x6b, 512, 4, 0x2000, 0},
61 {"NAND 1MiB 3,3V 8-bit", 0xe8, 256, 1, 0x1000, 0},
62 {"NAND 1MiB 3,3V 8-bit", 0xec, 256, 1, 0x1000, 0},
63 {"NAND 2MiB 3,3V 8-bit", 0xea, 256, 2, 0x1000, 0},
64 {"NAND 4MiB 3,3V 8-bit", 0xd5, 512, 4, 0x2000, 0},
65 {"NAND 4MiB 3,3V 8-bit", 0xe3, 512, 4, 0x2000, 0},
66 {"NAND 4MiB 3,3V 8-bit", 0xe5, 512, 4, 0x2000, 0},
67 {"NAND 8MiB 3,3V 8-bit", 0xd6, 512, 8, 0x2000, 0},
68
69 {"NAND 8MiB 1,8V 8-bit", 0x39, 512, 8, 0x2000, 0},
70 {"NAND 8MiB 3,3V 8-bit", 0xe6, 512, 8, 0x2000, 0},
71 {"NAND 8MiB 1,8V 16-bit", 0x49, 512, 8, 0x2000, NAND_BUSWIDTH_16},
72 {"NAND 8MiB 3,3V 16-bit", 0x59, 512, 8, 0x2000, NAND_BUSWIDTH_16},
73 /* end "museum" IDs */
74
75 {"NAND 16MiB 1,8V 8-bit", 0x33, 512, 16, 0x4000, 0},
76 {"NAND 16MiB 3,3V 8-bit", 0x73, 512, 16, 0x4000, 0},
77 {"NAND 16MiB 1,8V 16-bit", 0x43, 512, 16, 0x4000, NAND_BUSWIDTH_16},
78 {"NAND 16MiB 3,3V 16-bit", 0x53, 512, 16, 0x4000, NAND_BUSWIDTH_16},
79
80 {"NAND 32MiB 1,8V 8-bit", 0x35, 512, 32, 0x4000, 0},
81 {"NAND 32MiB 3,3V 8-bit", 0x75, 512, 32, 0x4000, 0},
82 {"NAND 32MiB 1,8V 16-bit", 0x45, 512, 32, 0x4000, NAND_BUSWIDTH_16},
83 {"NAND 32MiB 3,3V 16-bit", 0x55, 512, 32, 0x4000, NAND_BUSWIDTH_16},
84
85 {"NAND 64MiB 1,8V 8-bit", 0x36, 512, 64, 0x4000, 0},
86 {"NAND 64MiB 3,3V 8-bit", 0x76, 512, 64, 0x4000, 0},
87 {"NAND 64MiB 1,8V 16-bit", 0x46, 512, 64, 0x4000, NAND_BUSWIDTH_16},
88 {"NAND 64MiB 3,3V 16-bit", 0x56, 512, 64, 0x4000, NAND_BUSWIDTH_16},
89
90 {"NAND 128MiB 1,8V 8-bit", 0x78, 512, 128, 0x4000, 0},
91 {"NAND 128MiB 1,8V 8-bit", 0x39, 512, 128, 0x4000, 0},
92 {"NAND 128MiB 3,3V 8-bit", 0x79, 512, 128, 0x4000, 0},
93 {"NAND 128MiB 1,8V 16-bit", 0x72, 512, 128, 0x4000, NAND_BUSWIDTH_16},
94 {"NAND 128MiB 1,8V 16-bit", 0x49, 512, 128, 0x4000, NAND_BUSWIDTH_16},
95 {"NAND 128MiB 3,3V 16-bit", 0x74, 512, 128, 0x4000, NAND_BUSWIDTH_16},
96 {"NAND 128MiB 3,3V 16-bit", 0x59, 512, 128, 0x4000, NAND_BUSWIDTH_16},
97
98 {"NAND 256MiB 3,3V 8-bit", 0x71, 512, 256, 0x4000, 0},
99
100 {"NAND 64MiB 1,8V 8-bit", 0xA2, 0, 64, 0, LP_OPTIONS},
101 {"NAND 64MiB 3,3V 8-bit", 0xF2, 0, 64, 0, LP_OPTIONS},
102 {"NAND 64MiB 1,8V 16-bit", 0xB2, 0, 64, 0, LP_OPTIONS16},
103 {"NAND 64MiB 3,3V 16-bit", 0xC2, 0, 64, 0, LP_OPTIONS16},
104
105 {"NAND 128MiB 1,8V 8-bit", 0xA1, 0, 128, 0, LP_OPTIONS},
106 {"NAND 128MiB 3,3V 8-bit", 0xF1, 0, 128, 0, LP_OPTIONS},
107 {"NAND 128MiB 1,8V 16-bit", 0xB1, 0, 128, 0, LP_OPTIONS16},
108 {"NAND 128MiB 3,3V 16-bit", 0xC1, 0, 128, 0, LP_OPTIONS16},
109
110 {"NAND 256MiB 1,8V 8-bit", 0xAA, 0, 256, 0, LP_OPTIONS},
111 {"NAND 256MiB 3,3V 8-bit", 0xDA, 0, 256, 0, LP_OPTIONS},
112 {"NAND 256MiB 1,8V 16-bit", 0xBA, 0, 256, 0, LP_OPTIONS16},
113 {"NAND 256MiB 3,3V 16-bit", 0xCA, 0, 256, 0, LP_OPTIONS16},
114
115 {"NAND 512MiB 1,8V 8-bit", 0xAC, 0, 512, 0, LP_OPTIONS},
116 {"NAND 512MiB 3,3V 8-bit", 0xDC, 0, 512, 0, LP_OPTIONS},
117 {"NAND 512MiB 1,8V 16-bit", 0xBC, 0, 512, 0, LP_OPTIONS16},
118 {"NAND 512MiB 3,3V 16-bit", 0xCC, 0, 512, 0, LP_OPTIONS16},
119
120 {"NAND 1GiB 1,8V 8-bit", 0xA3, 0, 1024, 0, LP_OPTIONS},
121 {"NAND 1GiB 3,3V 8-bit", 0xD3, 0, 1024, 0, LP_OPTIONS},
122 {"NAND 1GiB 1,8V 16-bit", 0xB3, 0, 1024, 0, LP_OPTIONS16},
123 {"NAND 1GiB 3,3V 16-bit", 0xC3, 0, 1024, 0, LP_OPTIONS16},
124
125 {"NAND 2GiB 1,8V 8-bit", 0xA5, 0, 2048, 0, LP_OPTIONS},
126 {"NAND 2GiB 3,3V 8-bit", 0xD5, 0, 2048, 0, LP_OPTIONS},
127 {"NAND 2GiB 1,8V 16-bit", 0xB5, 0, 2048, 0, LP_OPTIONS16},
128 {"NAND 2GiB 3,3V 16-bit", 0xC5, 0, 2048, 0, LP_OPTIONS16},
129
130 {NULL, 0, 0, 0, 0, 0 }
131 };
132
133 /* Manufacturer ID list
134 */
135 static struct nand_manufacturer nand_manuf_ids[] =
136 {
137 {0x0, "unknown"},
138 {NAND_MFR_TOSHIBA, "Toshiba"},
139 {NAND_MFR_SAMSUNG, "Samsung"},
140 {NAND_MFR_FUJITSU, "Fujitsu"},
141 {NAND_MFR_NATIONAL, "National"},
142 {NAND_MFR_RENESAS, "Renesas"},
143 {NAND_MFR_STMICRO, "ST Micro"},
144 {NAND_MFR_HYNIX, "Hynix"},
145 {NAND_MFR_MICRON, "Micron"},
146 {0x0, NULL},
147 };
148
149 /*
150 * Define default oob placement schemes for large and small page devices
151 */
152
153 #if 0
154 static struct nand_ecclayout nand_oob_8 = {
155 .eccbytes = 3,
156 .eccpos = {0, 1, 2},
157 .oobfree = {
158 {.offset = 3,
159 .length = 2},
160 {.offset = 6,
161 .length = 2}}
162 };
163 #endif
164
165 struct nand_device *get_nand_device_by_name(const char *name)
166 {
167 unsigned requested = get_flash_name_index(name);
168 unsigned found = 0;
169
170 struct nand_device *nand;
171 for (nand = nand_devices; NULL != nand; nand = nand->next)
172 {
173 if (strcmp(nand->name, name) == 0)
174 return nand;
175 if (!flash_driver_name_matches(nand->controller->name, name))
176 continue;
177 if (++found < requested)
178 continue;
179 return nand;
180 }
181 return NULL;
182 }
183
184 struct nand_device *get_nand_device_by_num(int num)
185 {
186 struct nand_device *p;
187 int i = 0;
188
189 for (p = nand_devices; p; p = p->next)
190 {
191 if (i++ == num)
192 {
193 return p;
194 }
195 }
196
197 return NULL;
198 }
199
200 COMMAND_HELPER(nand_command_get_device, unsigned name_index,
201 struct nand_device **nand)
202 {
203 const char *str = CMD_ARGV[name_index];
204 *nand = get_nand_device_by_name(str);
205 if (*nand)
206 return ERROR_OK;
207
208 unsigned num;
209 COMMAND_PARSE_NUMBER(uint, str, num);
210 *nand = get_nand_device_by_num(num);
211 if (!*nand) {
212 command_print(CMD_CTX, "NAND flash device '%s' not found", str);
213 return ERROR_INVALID_ARGUMENTS;
214 }
215 return ERROR_OK;
216 }
217
218 int nand_build_bbt(struct nand_device *nand, int first, int last)
219 {
220 uint32_t page = 0x0;
221 int i;
222 uint8_t oob[6];
223
224 if ((first < 0) || (first >= nand->num_blocks))
225 first = 0;
226
227 if ((last >= nand->num_blocks) || (last == -1))
228 last = nand->num_blocks - 1;
229
230 for (i = first; i < last; i++)
231 {
232 nand_read_page(nand, page, NULL, 0, oob, 6);
233
234 if (((nand->device->options & NAND_BUSWIDTH_16) && ((oob[0] & oob[1]) != 0xff))
235 || (((nand->page_size == 512) && (oob[5] != 0xff)) ||
236 ((nand->page_size == 2048) && (oob[0] != 0xff))))
237 {
238 LOG_WARNING("bad block: %i", i);
239 nand->blocks[i].is_bad = 1;
240 }
241 else
242 {
243 nand->blocks[i].is_bad = 0;
244 }
245
246 page += (nand->erase_size / nand->page_size);
247 }
248
249 return ERROR_OK;
250 }
251
252 int nand_read_status(struct nand_device *nand, uint8_t *status)
253 {
254 if (!nand->device)
255 return ERROR_NAND_DEVICE_NOT_PROBED;
256
257 /* Send read status command */
258 nand->controller->command(nand, NAND_CMD_STATUS);
259
260 alive_sleep(1);
261
262 /* read status */
263 if (nand->device->options & NAND_BUSWIDTH_16)
264 {
265 uint16_t data;
266 nand->controller->read_data(nand, &data);
267 *status = data & 0xff;
268 }
269 else
270 {
271 nand->controller->read_data(nand, status);
272 }
273
274 return ERROR_OK;
275 }
276
277 static int nand_poll_ready(struct nand_device *nand, int timeout)
278 {
279 uint8_t status;
280
281 nand->controller->command(nand, NAND_CMD_STATUS);
282 do {
283 if (nand->device->options & NAND_BUSWIDTH_16) {
284 uint16_t data;
285 nand->controller->read_data(nand, &data);
286 status = data & 0xff;
287 } else {
288 nand->controller->read_data(nand, &status);
289 }
290 if (status & NAND_STATUS_READY)
291 break;
292 alive_sleep(1);
293 } while (timeout--);
294
295 return (status & NAND_STATUS_READY) != 0;
296 }
297
298 int nand_probe(struct nand_device *nand)
299 {
300 uint8_t manufacturer_id, device_id;
301 uint8_t id_buff[6];
302 int retval;
303 int i;
304
305 /* clear device data */
306 nand->device = NULL;
307 nand->manufacturer = NULL;
308
309 /* clear device parameters */
310 nand->bus_width = 0;
311 nand->address_cycles = 0;
312 nand->page_size = 0;
313 nand->erase_size = 0;
314
315 /* initialize controller (device parameters are zero, use controller default) */
316 if ((retval = nand->controller->init(nand) != ERROR_OK))
317 {
318 switch (retval)
319 {
320 case ERROR_NAND_OPERATION_FAILED:
321 LOG_DEBUG("controller initialization failed");
322 return ERROR_NAND_OPERATION_FAILED;
323 case ERROR_NAND_OPERATION_NOT_SUPPORTED:
324 LOG_ERROR("BUG: controller reported that it doesn't support default parameters");
325 return ERROR_NAND_OPERATION_FAILED;
326 default:
327 LOG_ERROR("BUG: unknown controller initialization failure");
328 return ERROR_NAND_OPERATION_FAILED;
329 }
330 }
331
332 nand->controller->command(nand, NAND_CMD_RESET);
333 nand->controller->reset(nand);
334
335 nand->controller->command(nand, NAND_CMD_READID);
336 nand->controller->address(nand, 0x0);
337
338 if (nand->bus_width == 8)
339 {
340 nand->controller->read_data(nand, &manufacturer_id);
341 nand->controller->read_data(nand, &device_id);
342 }
343 else
344 {
345 uint16_t data_buf;
346 nand->controller->read_data(nand, &data_buf);
347 manufacturer_id = data_buf & 0xff;
348 nand->controller->read_data(nand, &data_buf);
349 device_id = data_buf & 0xff;
350 }
351
352 for (i = 0; nand_flash_ids[i].name; i++)
353 {
354 if (nand_flash_ids[i].id == device_id)
355 {
356 nand->device = &nand_flash_ids[i];
357 break;
358 }
359 }
360
361 for (i = 0; nand_manuf_ids[i].name; i++)
362 {
363 if (nand_manuf_ids[i].id == manufacturer_id)
364 {
365 nand->manufacturer = &nand_manuf_ids[i];
366 break;
367 }
368 }
369
370 if (!nand->manufacturer)
371 {
372 nand->manufacturer = &nand_manuf_ids[0];
373 nand->manufacturer->id = manufacturer_id;
374 }
375
376 if (!nand->device)
377 {
378 LOG_ERROR("unknown NAND flash device found, manufacturer id: 0x%2.2x device id: 0x%2.2x",
379 manufacturer_id, device_id);
380 return ERROR_NAND_OPERATION_FAILED;
381 }
382
383 LOG_DEBUG("found %s (%s)", nand->device->name, nand->manufacturer->name);
384
385 /* initialize device parameters */
386
387 /* bus width */
388 if (nand->device->options & NAND_BUSWIDTH_16)
389 nand->bus_width = 16;
390 else
391 nand->bus_width = 8;
392
393 /* Do we need extended device probe information? */
394 if (nand->device->page_size == 0 ||
395 nand->device->erase_size == 0)
396 {
397 if (nand->bus_width == 8)
398 {
399 nand->controller->read_data(nand, id_buff + 3);
400 nand->controller->read_data(nand, id_buff + 4);
401 nand->controller->read_data(nand, id_buff + 5);
402 }
403 else
404 {
405 uint16_t data_buf;
406
407 nand->controller->read_data(nand, &data_buf);
408 id_buff[3] = data_buf;
409
410 nand->controller->read_data(nand, &data_buf);
411 id_buff[4] = data_buf;
412
413 nand->controller->read_data(nand, &data_buf);
414 id_buff[5] = data_buf >> 8;
415 }
416 }
417
418 /* page size */
419 if (nand->device->page_size == 0)
420 {
421 nand->page_size = 1 << (10 + (id_buff[4] & 3));
422 }
423 else if (nand->device->page_size == 256)
424 {
425 LOG_ERROR("NAND flashes with 256 byte pagesize are not supported");
426 return ERROR_NAND_OPERATION_FAILED;
427 }
428 else
429 {
430 nand->page_size = nand->device->page_size;
431 }
432
433 /* number of address cycles */
434 if (nand->page_size <= 512)
435 {
436 /* small page devices */
437 if (nand->device->chip_size <= 32)
438 nand->address_cycles = 3;
439 else if (nand->device->chip_size <= 8*1024)
440 nand->address_cycles = 4;
441 else
442 {
443 LOG_ERROR("BUG: small page NAND device with more than 8 GiB encountered");
444 nand->address_cycles = 5;
445 }
446 }
447 else
448 {
449 /* large page devices */
450 if (nand->device->chip_size <= 128)
451 nand->address_cycles = 4;
452 else if (nand->device->chip_size <= 32*1024)
453 nand->address_cycles = 5;
454 else
455 {
456 LOG_ERROR("BUG: large page NAND device with more than 32 GiB encountered");
457 nand->address_cycles = 6;
458 }
459 }
460
461 /* erase size */
462 if (nand->device->erase_size == 0)
463 {
464 switch ((id_buff[4] >> 4) & 3) {
465 case 0:
466 nand->erase_size = 64 << 10;
467 break;
468 case 1:
469 nand->erase_size = 128 << 10;
470 break;
471 case 2:
472 nand->erase_size = 256 << 10;
473 break;
474 case 3:
475 nand->erase_size =512 << 10;
476 break;
477 }
478 }
479 else
480 {
481 nand->erase_size = nand->device->erase_size;
482 }
483
484 /* initialize controller, but leave parameters at the controllers default */
485 if ((retval = nand->controller->init(nand) != ERROR_OK))
486 {
487 switch (retval)
488 {
489 case ERROR_NAND_OPERATION_FAILED:
490 LOG_DEBUG("controller initialization failed");
491 return ERROR_NAND_OPERATION_FAILED;
492 case ERROR_NAND_OPERATION_NOT_SUPPORTED:
493 LOG_ERROR("controller doesn't support requested parameters (buswidth: %i, address cycles: %i, page size: %i)",
494 nand->bus_width, nand->address_cycles, nand->page_size);
495 return ERROR_NAND_OPERATION_FAILED;
496 default:
497 LOG_ERROR("BUG: unknown controller initialization failure");
498 return ERROR_NAND_OPERATION_FAILED;
499 }
500 }
501
502 nand->num_blocks = (nand->device->chip_size * 1024) / (nand->erase_size / 1024);
503 nand->blocks = malloc(sizeof(struct nand_block) * nand->num_blocks);
504
505 for (i = 0; i < nand->num_blocks; i++)
506 {
507 nand->blocks[i].size = nand->erase_size;
508 nand->blocks[i].offset = i * nand->erase_size;
509 nand->blocks[i].is_erased = -1;
510 nand->blocks[i].is_bad = -1;
511 }
512
513 return ERROR_OK;
514 }
515
516 int nand_erase(struct nand_device *nand, int first_block, int last_block)
517 {
518 int i;
519 uint32_t page;
520 uint8_t status;
521 int retval;
522
523 if (!nand->device)
524 return ERROR_NAND_DEVICE_NOT_PROBED;
525
526 if ((first_block < 0) || (last_block > nand->num_blocks))
527 return ERROR_INVALID_ARGUMENTS;
528
529 /* make sure we know if a block is bad before erasing it */
530 for (i = first_block; i <= last_block; i++)
531 {
532 if (nand->blocks[i].is_bad == -1)
533 {
534 nand_build_bbt(nand, i, last_block);
535 break;
536 }
537 }
538
539 for (i = first_block; i <= last_block; i++)
540 {
541 /* Send erase setup command */
542 nand->controller->command(nand, NAND_CMD_ERASE1);
543
544 page = i * (nand->erase_size / nand->page_size);
545
546 /* Send page address */
547 if (nand->page_size <= 512)
548 {
549 /* row */
550 nand->controller->address(nand, page & 0xff);
551 nand->controller->address(nand, (page >> 8) & 0xff);
552
553 /* 3rd cycle only on devices with more than 32 MiB */
554 if (nand->address_cycles >= 4)
555 nand->controller->address(nand, (page >> 16) & 0xff);
556
557 /* 4th cycle only on devices with more than 8 GiB */
558 if (nand->address_cycles >= 5)
559 nand->controller->address(nand, (page >> 24) & 0xff);
560 }
561 else
562 {
563 /* row */
564 nand->controller->address(nand, page & 0xff);
565 nand->controller->address(nand, (page >> 8) & 0xff);
566
567 /* 3rd cycle only on devices with more than 128 MiB */
568 if (nand->address_cycles >= 5)
569 nand->controller->address(nand, (page >> 16) & 0xff);
570 }
571
572 /* Send erase confirm command */
573 nand->controller->command(nand, NAND_CMD_ERASE2);
574
575 retval = nand->controller->nand_ready ?
576 nand->controller->nand_ready(nand, 1000) :
577 nand_poll_ready(nand, 1000);
578 if (!retval) {
579 LOG_ERROR("timeout waiting for NAND flash block erase to complete");
580 return ERROR_NAND_OPERATION_TIMEOUT;
581 }
582
583 if ((retval = nand_read_status(nand, &status)) != ERROR_OK)
584 {
585 LOG_ERROR("couldn't read status");
586 return ERROR_NAND_OPERATION_FAILED;
587 }
588
589 if (status & 0x1)
590 {
591 LOG_ERROR("didn't erase %sblock %d; status: 0x%2.2x",
592 (nand->blocks[i].is_bad == 1)
593 ? "bad " : "",
594 i, status);
595 /* continue; other blocks might still be erasable */
596 }
597
598 nand->blocks[i].is_erased = 1;
599 }
600
601 return ERROR_OK;
602 }
603
604 #if 0
605 static int nand_read_plain(struct nand_device *nand, uint32_t address, uint8_t *data, uint32_t data_size)
606 {
607 uint8_t *page;
608
609 if (!nand->device)
610 return ERROR_NAND_DEVICE_NOT_PROBED;
611
612 if (address % nand->page_size)
613 {
614 LOG_ERROR("reads need to be page aligned");
615 return ERROR_NAND_OPERATION_FAILED;
616 }
617
618 page = malloc(nand->page_size);
619
620 while (data_size > 0)
621 {
622 uint32_t thisrun_size = (data_size > nand->page_size) ? nand->page_size : data_size;
623 uint32_t page_address;
624
625
626 page_address = address / nand->page_size;
627
628 nand_read_page(nand, page_address, page, nand->page_size, NULL, 0);
629
630 memcpy(data, page, thisrun_size);
631
632 address += thisrun_size;
633 data += thisrun_size;
634 data_size -= thisrun_size;
635 }
636
637 free(page);
638
639 return ERROR_OK;
640 }
641
642 static int nand_write_plain(struct nand_device *nand, uint32_t address, uint8_t *data, uint32_t data_size)
643 {
644 uint8_t *page;
645
646 if (!nand->device)
647 return ERROR_NAND_DEVICE_NOT_PROBED;
648
649 if (address % nand->page_size)
650 {
651 LOG_ERROR("writes need to be page aligned");
652 return ERROR_NAND_OPERATION_FAILED;
653 }
654
655 page = malloc(nand->page_size);
656
657 while (data_size > 0)
658 {
659 uint32_t thisrun_size = (data_size > nand->page_size) ? nand->page_size : data_size;
660 uint32_t page_address;
661
662 memset(page, 0xff, nand->page_size);
663 memcpy(page, data, thisrun_size);
664
665 page_address = address / nand->page_size;
666
667 nand_write_page(nand, page_address, page, nand->page_size, NULL, 0);
668
669 address += thisrun_size;
670 data += thisrun_size;
671 data_size -= thisrun_size;
672 }
673
674 free(page);
675
676 return ERROR_OK;
677 }
678 #endif
679
680 int nand_write_page(struct nand_device *nand, uint32_t page, uint8_t *data, uint32_t data_size, uint8_t *oob, uint32_t oob_size)
681 {
682 uint32_t block;
683
684 if (!nand->device)
685 return ERROR_NAND_DEVICE_NOT_PROBED;
686
687 block = page / (nand->erase_size / nand->page_size);
688 if (nand->blocks[block].is_erased == 1)
689 nand->blocks[block].is_erased = 0;
690
691 if (nand->use_raw || nand->controller->write_page == NULL)
692 return nand_write_page_raw(nand, page, data, data_size, oob, oob_size);
693 else
694 return nand->controller->write_page(nand, page, data, data_size, oob, oob_size);
695 }
696
697 int nand_read_page(struct nand_device *nand, uint32_t page,
698 uint8_t *data, uint32_t data_size,
699 uint8_t *oob, uint32_t oob_size)
700 {
701 if (!nand->device)
702 return ERROR_NAND_DEVICE_NOT_PROBED;
703
704 if (nand->use_raw || nand->controller->read_page == NULL)
705 return nand_read_page_raw(nand, page, data, data_size, oob, oob_size);
706 else
707 return nand->controller->read_page(nand, page, data, data_size, oob, oob_size);
708 }
709
710 int nand_page_command(struct nand_device *nand, uint32_t page,
711 uint8_t cmd, bool oob_only)
712 {
713 if (!nand->device)
714 return ERROR_NAND_DEVICE_NOT_PROBED;
715
716 if (oob_only && NAND_CMD_READ0 == cmd && nand->page_size <= 512)
717 cmd = NAND_CMD_READOOB;
718
719 nand->controller->command(nand, cmd);
720
721 if (nand->page_size <= 512) {
722 /* small page device */
723
724 /* column (always 0, we start at the beginning of a page/OOB area) */
725 nand->controller->address(nand, 0x0);
726
727 /* row */
728 nand->controller->address(nand, page & 0xff);
729 nand->controller->address(nand, (page >> 8) & 0xff);
730
731 /* 4th cycle only on devices with more than 32 MiB */
732 if (nand->address_cycles >= 4)
733 nand->controller->address(nand, (page >> 16) & 0xff);
734
735 /* 5th cycle only on devices with more than 8 GiB */
736 if (nand->address_cycles >= 5)
737 nand->controller->address(nand, (page >> 24) & 0xff);
738 } else {
739 /* large page device */
740
741 /* column (0 when we start at the beginning of a page,
742 * or 2048 for the beginning of OOB area)
743 */
744 nand->controller->address(nand, 0x0);
745 if (oob_only)
746 nand->controller->address(nand, 0x8);
747 else
748 nand->controller->address(nand, 0x0);
749
750 /* row */
751 nand->controller->address(nand, page & 0xff);
752 nand->controller->address(nand, (page >> 8) & 0xff);
753
754 /* 5th cycle only on devices with more than 128 MiB */
755 if (nand->address_cycles >= 5)
756 nand->controller->address(nand, (page >> 16) & 0xff);
757
758 /* large page devices need a start command if reading */
759 if (NAND_CMD_READ0 == cmd)
760 nand->controller->command(nand, NAND_CMD_READSTART);
761 }
762
763 if (nand->controller->nand_ready) {
764 if (!nand->controller->nand_ready(nand, 100))
765 return ERROR_NAND_OPERATION_TIMEOUT;
766 } else {
767 alive_sleep(1);
768 }
769
770 return ERROR_OK;
771 }
772
773 int nand_read_page_raw(struct nand_device *nand, uint32_t page,
774 uint8_t *data, uint32_t data_size,
775 uint8_t *oob, uint32_t oob_size)
776 {
777 uint32_t i;
778 int retval;
779
780 retval = nand_page_command(nand, page, NAND_CMD_READ0, !data);
781 if (ERROR_OK != retval)
782 return retval;
783
784 if (data)
785 {
786 if (nand->controller->read_block_data != NULL)
787 (nand->controller->read_block_data)(nand, data, data_size);
788 else
789 {
790 for (i = 0; i < data_size;)
791 {
792 if (nand->device->options & NAND_BUSWIDTH_16)
793 {
794 nand->controller->read_data(nand, data);
795 data += 2;
796 i += 2;
797 }
798 else
799 {
800 nand->controller->read_data(nand, data);
801 data += 1;
802 i += 1;
803 }
804 }
805 }
806 }
807
808 if (oob)
809 {
810 if (nand->controller->read_block_data != NULL)
811 (nand->controller->read_block_data)(nand, oob, oob_size);
812 else
813 {
814 for (i = 0; i < oob_size;)
815 {
816 if (nand->device->options & NAND_BUSWIDTH_16)
817 {
818 nand->controller->read_data(nand, oob);
819 oob += 2;
820 i += 2;
821 }
822 else
823 {
824 nand->controller->read_data(nand, oob);
825 oob += 1;
826 i += 1;
827 }
828 }
829 }
830 }
831
832 return ERROR_OK;
833 }
834
835 int nand_write_page_raw(struct nand_device *nand, uint32_t page, uint8_t *data, uint32_t data_size, uint8_t *oob, uint32_t oob_size)
836 {
837 uint32_t i;
838 int retval;
839 uint8_t status;
840
841 retval = nand_page_command(nand, page, NAND_CMD_SEQIN, !data);
842 if (ERROR_OK != retval)
843 return retval;
844
845 if (data)
846 {
847 if (nand->controller->write_block_data != NULL)
848 (nand->controller->write_block_data)(nand, data, data_size);
849 else
850 {
851 for (i = 0; i < data_size;)
852 {
853 if (nand->device->options & NAND_BUSWIDTH_16)
854 {
855 uint16_t data_buf = le_to_h_u16(data);
856 nand->controller->write_data(nand, data_buf);
857 data += 2;
858 i += 2;
859 }
860 else
861 {
862 nand->controller->write_data(nand, *data);
863 data += 1;
864 i += 1;
865 }
866 }
867 }
868 }
869
870 if (oob)
871 {
872 if (nand->controller->write_block_data != NULL)
873 (nand->controller->write_block_data)(nand, oob, oob_size);
874 else
875 {
876 for (i = 0; i < oob_size;)
877 {
878 if (nand->device->options & NAND_BUSWIDTH_16)
879 {
880 uint16_t oob_buf = le_to_h_u16(data);
881 nand->controller->write_data(nand, oob_buf);
882 oob += 2;
883 i += 2;
884 }
885 else
886 {
887 nand->controller->write_data(nand, *oob);
888 oob += 1;
889 i += 1;
890 }
891 }
892 }
893 }
894
895 nand->controller->command(nand, NAND_CMD_PAGEPROG);
896
897 retval = nand->controller->nand_ready ?
898 nand->controller->nand_ready(nand, 100) :
899 nand_poll_ready(nand, 100);
900 if (!retval)
901 return ERROR_NAND_OPERATION_TIMEOUT;
902
903 if ((retval = nand_read_status(nand, &status)) != ERROR_OK)
904 {
905 LOG_ERROR("couldn't read status");
906 return ERROR_NAND_OPERATION_FAILED;
907 }
908
909 if (status & NAND_STATUS_FAIL)
910 {
911 LOG_ERROR("write operation didn't pass, status: 0x%2.2x", status);
912 return ERROR_NAND_OPERATION_FAILED;
913 }
914
915 return ERROR_OK;
916 }
917

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)