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> *
6 * Partially based on drivers/mtd/nand_ids.c from Linux. *
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. *
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. *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
20 ***************************************************************************/
28 /* configured NAND devices and NAND Flash command handler */
29 struct nand_device
*nand_devices
;
31 void nand_device_add(struct nand_device
*c
)
34 struct nand_device
*p
= nand_devices
;
45 * Manufacturer, ID code, pagesize, chipsize in MegaByte, eraseblock size,
48 * Pagesize; 0, 256, 512
49 * 0 get this information from the extended chip ID
50 * 256 256 Byte page size
51 * 512 512 Byte page size
53 static struct nand_info nand_flash_ids
[] = {
54 /* Vendor Specific Entries */
55 { NAND_MFR_SAMSUNG
, 0xD5, 8192, 2048, 0x100000, LP_OPTIONS
,
56 "K9GAG08 2GB NAND 3.3V x8 MLC 2b/cell"},
57 { NAND_MFR_SAMSUNG
, 0xD7, 8192, 4096, 0x100000, LP_OPTIONS
,
58 "K9LBG08 4GB NAND 3.3V x8 MLC 2b/cell"},
60 /* start "museum" IDs */
61 { 0x0, 0x6e, 256, 1, 0x1000, 0, "NAND 1MiB 5V 8-bit"},
62 { 0x0, 0x64, 256, 2, 0x1000, 0, "NAND 2MiB 5V 8-bit"},
63 { 0x0, 0x6b, 512, 4, 0x2000, 0, "NAND 4MiB 5V 8-bit"},
64 { 0x0, 0xe8, 256, 1, 0x1000, 0, "NAND 1MiB 3.3V 8-bit"},
65 { 0x0, 0xec, 256, 1, 0x1000, 0, "NAND 1MiB 3.3V 8-bit"},
66 { 0x0, 0xea, 256, 2, 0x1000, 0, "NAND 2MiB 3.3V 8-bit"},
67 { 0x0, 0xd5, 512, 4, 0x2000, 0, "NAND 4MiB 3.3V 8-bit"},
68 { 0x0, 0xe3, 512, 4, 0x2000, 0, "NAND 4MiB 3.3V 8-bit"},
69 { 0x0, 0xe5, 512, 4, 0x2000, 0, "NAND 4MiB 3.3V 8-bit"},
70 { 0x0, 0xd6, 512, 8, 0x2000, 0, "NAND 8MiB 3.3V 8-bit"},
72 { 0x0, 0x39, 512, 8, 0x2000, 0, "NAND 8MiB 1.8V 8-bit"},
73 { 0x0, 0xe6, 512, 8, 0x2000, 0, "NAND 8MiB 3.3V 8-bit"},
74 { 0x0, 0x49, 512, 8, 0x2000, NAND_BUSWIDTH_16
, "NAND 8MiB 1.8V 16-bit"},
75 { 0x0, 0x59, 512, 8, 0x2000, NAND_BUSWIDTH_16
, "NAND 8MiB 3.3V 16-bit"},
76 /* end "museum" IDs */
78 { 0x0, 0x33, 512, 16, 0x4000, 0, "NAND 16MiB 1.8V 8-bit"},
79 { 0x0, 0x73, 512, 16, 0x4000, 0, "NAND 16MiB 3.3V 8-bit"},
80 { 0x0, 0x43, 512, 16, 0x4000, NAND_BUSWIDTH_16
, "NAND 16MiB 1.8V 16-bit"},
81 { 0x0, 0x53, 512, 16, 0x4000, NAND_BUSWIDTH_16
, "NAND 16MiB 3.3V 16-bit"},
83 { 0x0, 0x35, 512, 32, 0x4000, 0, "NAND 32MiB 1.8V 8-bit"},
84 { 0x0, 0x75, 512, 32, 0x4000, 0, "NAND 32MiB 3.3V 8-bit"},
85 { 0x0, 0x45, 512, 32, 0x4000, NAND_BUSWIDTH_16
, "NAND 32MiB 1.8V 16-bit"},
86 { 0x0, 0x55, 512, 32, 0x4000, NAND_BUSWIDTH_16
, "NAND 32MiB 3.3V 16-bit"},
88 { 0x0, 0x36, 512, 64, 0x4000, 0, "NAND 64MiB 1.8V 8-bit"},
89 { 0x0, 0x76, 512, 64, 0x4000, 0, "NAND 64MiB 3.3V 8-bit"},
90 { 0x0, 0x46, 512, 64, 0x4000, NAND_BUSWIDTH_16
, "NAND 64MiB 1.8V 16-bit"},
91 { 0x0, 0x56, 512, 64, 0x4000, NAND_BUSWIDTH_16
, "NAND 64MiB 3.3V 16-bit"},
93 { 0x0, 0x78, 512, 128, 0x4000, 0, "NAND 128MiB 1.8V 8-bit"},
94 { 0x0, 0x39, 512, 128, 0x4000, 0, "NAND 128MiB 1.8V 8-bit"},
95 { 0x0, 0x79, 512, 128, 0x4000, 0, "NAND 128MiB 3.3V 8-bit"},
96 { 0x0, 0x72, 512, 128, 0x4000, NAND_BUSWIDTH_16
, "NAND 128MiB 1.8V 16-bit"},
97 { 0x0, 0x49, 512, 128, 0x4000, NAND_BUSWIDTH_16
, "NAND 128MiB 1.8V 16-bit"},
98 { 0x0, 0x74, 512, 128, 0x4000, NAND_BUSWIDTH_16
, "NAND 128MiB 3.3V 16-bit"},
99 { 0x0, 0x59, 512, 128, 0x4000, NAND_BUSWIDTH_16
, "NAND 128MiB 3.3V 16-bit"},
101 { 0x0, 0x71, 512, 256, 0x4000, 0, "NAND 256MiB 3.3V 8-bit"},
103 { 0x0, 0xA2, 0, 64, 0, LP_OPTIONS
, "NAND 64MiB 1.8V 8-bit"},
104 { 0x0, 0xF2, 0, 64, 0, LP_OPTIONS
, "NAND 64MiB 3.3V 8-bit"},
105 { 0x0, 0xB2, 0, 64, 0, LP_OPTIONS16
, "NAND 64MiB 1.8V 16-bit"},
106 { 0x0, 0xC2, 0, 64, 0, LP_OPTIONS16
, "NAND 64MiB 3.3V 16-bit"},
108 { 0x0, 0xA1, 0, 128, 0, LP_OPTIONS
, "NAND 128MiB 1.8V 8-bit"},
109 { 0x0, 0xF1, 0, 128, 0, LP_OPTIONS
, "NAND 128MiB 3.3V 8-bit"},
110 { 0x0, 0xB1, 0, 128, 0, LP_OPTIONS16
, "NAND 128MiB 1.8V 16-bit"},
111 { 0x0, 0xC1, 0, 128, 0, LP_OPTIONS16
, "NAND 128MiB 3.3V 16-bit"},
113 { 0x0, 0xAA, 0, 256, 0, LP_OPTIONS
, "NAND 256MiB 1.8V 8-bit"},
114 { 0x0, 0xDA, 0, 256, 0, LP_OPTIONS
, "NAND 256MiB 3.3V 8-bit"},
115 { 0x0, 0xBA, 0, 256, 0, LP_OPTIONS16
, "NAND 256MiB 1.8V 16-bit"},
116 { 0x0, 0xCA, 0, 256, 0, LP_OPTIONS16
, "NAND 256MiB 3.3V 16-bit"},
118 { 0x0, 0xAC, 0, 512, 0, LP_OPTIONS
, "NAND 512MiB 1.8V 8-bit"},
119 { 0x0, 0xDC, 0, 512, 0, LP_OPTIONS
, "NAND 512MiB 3.3V 8-bit"},
120 { 0x0, 0xBC, 0, 512, 0, LP_OPTIONS16
, "NAND 512MiB 1.8V 16-bit"},
121 { 0x0, 0xCC, 0, 512, 0, LP_OPTIONS16
, "NAND 512MiB 3.3V 16-bit"},
123 { 0x0, 0xA3, 0, 1024, 0, LP_OPTIONS
, "NAND 1GiB 1.8V 8-bit"},
124 { 0x0, 0xD3, 0, 1024, 0, LP_OPTIONS
, "NAND 1GiB 3.3V 8-bit"},
125 { 0x0, 0xB3, 0, 1024, 0, LP_OPTIONS16
, "NAND 1GiB 1.8V 16-bit"},
126 { 0x0, 0xC3, 0, 1024, 0, LP_OPTIONS16
, "NAND 1GiB 3.3V 16-bit"},
128 { 0x0, 0xA5, 0, 2048, 0, LP_OPTIONS
, "NAND 2GiB 1.8V 8-bit"},
129 { 0x0, 0xD5, 0, 8192, 0, LP_OPTIONS
, "NAND 2GiB 3.3V 8-bit"},
130 { 0x0, 0xB5, 0, 2048, 0, LP_OPTIONS16
, "NAND 2GiB 1.8V 16-bit"},
131 { 0x0, 0xC5, 0, 2048, 0, LP_OPTIONS16
, "NAND 2GiB 3.3V 16-bit"},
133 { 0x0, 0x48, 0, 2048, 0, LP_OPTIONS
, "NAND 2GiB 3.3V 8-bit"},
135 {0, 0, 0, 0, 0, 0, NULL
}
138 /* Manufacturer ID list
140 static struct nand_manufacturer nand_manuf_ids
[] = {
142 {NAND_MFR_TOSHIBA
, "Toshiba"},
143 {NAND_MFR_SAMSUNG
, "Samsung"},
144 {NAND_MFR_FUJITSU
, "Fujitsu"},
145 {NAND_MFR_NATIONAL
, "National"},
146 {NAND_MFR_RENESAS
, "Renesas"},
147 {NAND_MFR_STMICRO
, "ST Micro"},
148 {NAND_MFR_HYNIX
, "Hynix"},
149 {NAND_MFR_MICRON
, "Micron"},
154 * Define default oob placement schemes for large and small page devices
158 static struct nand_ecclayout nand_oob_8
= {
171 * Returns the flash bank specified by @a name, which matches the
172 * driver name and a suffix (option) specify the driver-specific
173 * bank number. The suffix consists of the '.' and the driver-specific
174 * bank number: when two davinci banks are defined, then 'davinci.1' refers
175 * to the second (e.g. DM355EVM).
177 static struct nand_device
*get_nand_device_by_name(const char *name
)
179 unsigned requested
= get_flash_name_index(name
);
182 struct nand_device
*nand
;
183 for (nand
= nand_devices
; NULL
!= nand
; nand
= nand
->next
) {
184 if (strcmp(nand
->name
, name
) == 0)
186 if (!flash_driver_name_matches(nand
->controller
->name
, name
))
188 if (++found
< requested
)
195 struct nand_device
*get_nand_device_by_num(int num
)
197 struct nand_device
*p
;
200 for (p
= nand_devices
; p
; p
= p
->next
) {
208 COMMAND_HELPER(nand_command_get_device
, unsigned name_index
,
209 struct nand_device
**nand
)
211 const char *str
= CMD_ARGV
[name_index
];
212 *nand
= get_nand_device_by_name(str
);
217 COMMAND_PARSE_NUMBER(uint
, str
, num
);
218 *nand
= get_nand_device_by_num(num
);
220 command_print(CMD
, "NAND flash device '%s' not found", str
);
221 return ERROR_COMMAND_SYNTAX_ERROR
;
226 int nand_build_bbt(struct nand_device
*nand
, int first
, int last
)
230 int pages_per_block
= (nand
->erase_size
/ nand
->page_size
);
234 if ((first
< 0) || (first
>= nand
->num_blocks
))
237 if ((last
>= nand
->num_blocks
) || (last
== -1))
238 last
= nand
->num_blocks
- 1;
240 page
= first
* pages_per_block
;
241 for (i
= first
; i
<= last
; i
++) {
242 ret
= nand_read_page(nand
, page
, NULL
, 0, oob
, 6);
246 if (((nand
->device
->options
& NAND_BUSWIDTH_16
) && ((oob
[0] & oob
[1]) != 0xff))
247 || (((nand
->page_size
== 512) && (oob
[5] != 0xff)) ||
248 ((nand
->page_size
== 2048) && (oob
[0] != 0xff)))) {
249 LOG_WARNING("bad block: %i", i
);
250 nand
->blocks
[i
].is_bad
= 1;
252 nand
->blocks
[i
].is_bad
= 0;
254 page
+= pages_per_block
;
260 int nand_read_status(struct nand_device
*nand
, uint8_t *status
)
263 return ERROR_NAND_DEVICE_NOT_PROBED
;
265 /* Send read status command */
266 /* FIXME: errors returned from nand->controller are mostly ignored! */
267 nand
->controller
->command(nand
, NAND_CMD_STATUS
);
272 if (nand
->device
->options
& NAND_BUSWIDTH_16
) {
274 nand
->controller
->read_data(nand
, &data
);
275 *status
= data
& 0xff;
277 nand
->controller
->read_data(nand
, status
);
282 static int nand_poll_ready(struct nand_device
*nand
, int timeout
)
286 nand
->controller
->command(nand
, NAND_CMD_STATUS
);
288 if (nand
->device
->options
& NAND_BUSWIDTH_16
) {
290 nand
->controller
->read_data(nand
, &data
);
291 status
= data
& 0xff;
293 nand
->controller
->read_data(nand
, &status
);
294 if (status
& NAND_STATUS_READY
)
299 return (status
& NAND_STATUS_READY
) != 0;
302 int nand_probe(struct nand_device
*nand
)
304 uint8_t manufacturer_id
, device_id
;
305 uint8_t id_buff
[6] = { 0 }; /* zero buff to silence false warning
306 * from clang static analyzer */
310 /* clear device data */
312 nand
->manufacturer
= NULL
;
314 /* clear device parameters */
316 nand
->address_cycles
= 0;
318 nand
->erase_size
= 0;
320 /* initialize controller (device parameters are zero, use controller default) */
321 retval
= nand
->controller
->init(nand
);
322 if (retval
!= ERROR_OK
) {
324 case ERROR_NAND_OPERATION_FAILED
:
325 LOG_DEBUG("controller initialization failed");
326 return ERROR_NAND_OPERATION_FAILED
;
327 case ERROR_NAND_OPERATION_NOT_SUPPORTED
:
329 "BUG: controller reported that it doesn't support default parameters");
330 return ERROR_NAND_OPERATION_FAILED
;
332 LOG_ERROR("BUG: unknown controller initialization failure");
333 return ERROR_NAND_OPERATION_FAILED
;
337 nand
->controller
->command(nand
, NAND_CMD_RESET
);
338 nand
->controller
->reset(nand
);
340 nand
->controller
->command(nand
, NAND_CMD_READID
);
341 nand
->controller
->address(nand
, 0x0);
343 if (nand
->bus_width
== 8) {
344 nand
->controller
->read_data(nand
, &manufacturer_id
);
345 nand
->controller
->read_data(nand
, &device_id
);
348 nand
->controller
->read_data(nand
, &data_buf
);
349 manufacturer_id
= data_buf
& 0xff;
350 nand
->controller
->read_data(nand
, &data_buf
);
351 device_id
= data_buf
& 0xff;
354 for (i
= 0; nand_flash_ids
[i
].name
; i
++) {
355 if (nand_flash_ids
[i
].id
== device_id
&&
356 (nand_flash_ids
[i
].mfr_id
== manufacturer_id
||
357 nand_flash_ids
[i
].mfr_id
== 0)) {
358 nand
->device
= &nand_flash_ids
[i
];
363 for (i
= 0; nand_manuf_ids
[i
].name
; i
++) {
364 if (nand_manuf_ids
[i
].id
== manufacturer_id
) {
365 nand
->manufacturer
= &nand_manuf_ids
[i
];
370 if (!nand
->manufacturer
) {
371 nand
->manufacturer
= &nand_manuf_ids
[0];
372 nand
->manufacturer
->id
= manufacturer_id
;
377 "unknown NAND flash device found, manufacturer id: 0x%2.2x device id: 0x%2.2x",
380 return ERROR_NAND_OPERATION_FAILED
;
383 LOG_DEBUG("found %s (%s)", nand
->device
->name
, nand
->manufacturer
->name
);
385 /* initialize device parameters */
388 if (nand
->device
->options
& NAND_BUSWIDTH_16
)
389 nand
->bus_width
= 16;
393 /* Do we need extended device probe information? */
394 if (nand
->device
->page_size
== 0 ||
395 nand
->device
->erase_size
== 0) {
396 if (nand
->bus_width
== 8) {
397 retval
= nand
->controller
->read_data(nand
, id_buff
+ 3);
398 if (retval
!= ERROR_OK
)
401 retval
= nand
->controller
->read_data(nand
, id_buff
+ 4);
402 if (retval
!= ERROR_OK
)
405 retval
= nand
->controller
->read_data(nand
, id_buff
+ 5);
406 if (retval
!= ERROR_OK
)
412 retval
= nand
->controller
->read_data(nand
, &data_buf
);
413 if (retval
!= ERROR_OK
)
415 id_buff
[3] = data_buf
;
417 retval
= nand
->controller
->read_data(nand
, &data_buf
);
418 if (retval
!= ERROR_OK
)
420 id_buff
[4] = data_buf
;
422 retval
= nand
->controller
->read_data(nand
, &data_buf
);
423 if (retval
!= ERROR_OK
)
425 id_buff
[5] = data_buf
>> 8;
430 if (nand
->device
->page_size
== 0)
431 nand
->page_size
= 1 << (10 + (id_buff
[4] & 3));
432 else if (nand
->device
->page_size
== 256) {
433 LOG_ERROR("NAND flashes with 256 byte pagesize are not supported");
434 return ERROR_NAND_OPERATION_FAILED
;
436 nand
->page_size
= nand
->device
->page_size
;
438 /* number of address cycles */
439 if (nand
->page_size
<= 512) {
440 /* small page devices */
441 if (nand
->device
->chip_size
<= 32)
442 nand
->address_cycles
= 3;
443 else if (nand
->device
->chip_size
<= 8*1024)
444 nand
->address_cycles
= 4;
446 LOG_ERROR("BUG: small page NAND device with more than 8 GiB encountered");
447 nand
->address_cycles
= 5;
450 /* large page devices */
451 if (nand
->device
->chip_size
<= 128)
452 nand
->address_cycles
= 4;
453 else if (nand
->device
->chip_size
<= 32*1024)
454 nand
->address_cycles
= 5;
456 LOG_ERROR("BUG: large page NAND device with more than 32 GiB encountered");
457 nand
->address_cycles
= 6;
462 if (nand
->device
->erase_size
== 0) {
463 switch ((id_buff
[4] >> 4) & 3) {
465 nand
->erase_size
= 64 << 10;
468 nand
->erase_size
= 128 << 10;
471 nand
->erase_size
= 256 << 10;
474 nand
->erase_size
= 512 << 10;
478 nand
->erase_size
= nand
->device
->erase_size
;
480 /* initialize controller, but leave parameters at the controllers default */
481 retval
= nand
->controller
->init(nand
);
482 if (retval
!= ERROR_OK
) {
484 case ERROR_NAND_OPERATION_FAILED
:
485 LOG_DEBUG("controller initialization failed");
486 return ERROR_NAND_OPERATION_FAILED
;
487 case ERROR_NAND_OPERATION_NOT_SUPPORTED
:
489 "controller doesn't support requested parameters (buswidth: %i, address cycles: %i, page size: %i)",
491 nand
->address_cycles
,
493 return ERROR_NAND_OPERATION_FAILED
;
495 LOG_ERROR("BUG: unknown controller initialization failure");
496 return ERROR_NAND_OPERATION_FAILED
;
500 nand
->num_blocks
= (nand
->device
->chip_size
* 1024) / (nand
->erase_size
/ 1024);
501 nand
->blocks
= malloc(sizeof(struct nand_block
) * nand
->num_blocks
);
503 for (i
= 0; i
< nand
->num_blocks
; i
++) {
504 nand
->blocks
[i
].size
= nand
->erase_size
;
505 nand
->blocks
[i
].offset
= i
* nand
->erase_size
;
506 nand
->blocks
[i
].is_erased
= -1;
507 nand
->blocks
[i
].is_bad
= -1;
513 int nand_erase(struct nand_device
*nand
, int first_block
, int last_block
)
521 return ERROR_NAND_DEVICE_NOT_PROBED
;
523 if ((first_block
< 0) || (last_block
>= nand
->num_blocks
))
524 return ERROR_COMMAND_SYNTAX_ERROR
;
526 /* make sure we know if a block is bad before erasing it */
527 for (i
= first_block
; i
<= last_block
; i
++) {
528 if (nand
->blocks
[i
].is_bad
== -1) {
529 nand_build_bbt(nand
, i
, last_block
);
534 for (i
= first_block
; i
<= last_block
; i
++) {
535 /* Send erase setup command */
536 nand
->controller
->command(nand
, NAND_CMD_ERASE1
);
538 page
= i
* (nand
->erase_size
/ nand
->page_size
);
540 /* Send page address */
541 if (nand
->page_size
<= 512) {
543 nand
->controller
->address(nand
, page
& 0xff);
544 nand
->controller
->address(nand
, (page
>> 8) & 0xff);
546 /* 3rd cycle only on devices with more than 32 MiB */
547 if (nand
->address_cycles
>= 4)
548 nand
->controller
->address(nand
, (page
>> 16) & 0xff);
550 /* 4th cycle only on devices with more than 8 GiB */
551 if (nand
->address_cycles
>= 5)
552 nand
->controller
->address(nand
, (page
>> 24) & 0xff);
555 nand
->controller
->address(nand
, page
& 0xff);
556 nand
->controller
->address(nand
, (page
>> 8) & 0xff);
558 /* 3rd cycle only on devices with more than 128 MiB */
559 if (nand
->address_cycles
>= 5)
560 nand
->controller
->address(nand
, (page
>> 16) & 0xff);
563 /* Send erase confirm command */
564 nand
->controller
->command(nand
, NAND_CMD_ERASE2
);
566 retval
= nand
->controller
->nand_ready
?
567 nand
->controller
->nand_ready(nand
, 1000) :
568 nand_poll_ready(nand
, 1000);
570 LOG_ERROR("timeout waiting for NAND flash block erase to complete");
571 return ERROR_NAND_OPERATION_TIMEOUT
;
574 retval
= nand_read_status(nand
, &status
);
575 if (retval
!= ERROR_OK
) {
576 LOG_ERROR("couldn't read status");
577 return ERROR_NAND_OPERATION_FAILED
;
581 LOG_ERROR("didn't erase %sblock %d; status: 0x%2.2x",
582 (nand
->blocks
[i
].is_bad
== 1)
585 /* continue; other blocks might still be erasable */
588 nand
->blocks
[i
].is_erased
= 1;
595 static int nand_read_plain(struct nand_device
*nand
,
603 return ERROR_NAND_DEVICE_NOT_PROBED
;
605 if (address
% nand
->page_size
) {
606 LOG_ERROR("reads need to be page aligned");
607 return ERROR_NAND_OPERATION_FAILED
;
610 page
= malloc(nand
->page_size
);
612 while (data_size
> 0) {
613 uint32_t thisrun_size
= (data_size
> nand
->page_size
) ? nand
->page_size
: data_size
;
614 uint32_t page_address
;
617 page_address
= address
/ nand
->page_size
;
619 nand_read_page(nand
, page_address
, page
, nand
->page_size
, NULL
, 0);
621 memcpy(data
, page
, thisrun_size
);
623 address
+= thisrun_size
;
624 data
+= thisrun_size
;
625 data_size
-= thisrun_size
;
633 static int nand_write_plain(struct nand_device
*nand
,
641 return ERROR_NAND_DEVICE_NOT_PROBED
;
643 if (address
% nand
->page_size
) {
644 LOG_ERROR("writes need to be page aligned");
645 return ERROR_NAND_OPERATION_FAILED
;
648 page
= malloc(nand
->page_size
);
650 while (data_size
> 0) {
651 uint32_t thisrun_size
= (data_size
> nand
->page_size
) ? nand
->page_size
: data_size
;
652 uint32_t page_address
;
654 memset(page
, 0xff, nand
->page_size
);
655 memcpy(page
, data
, thisrun_size
);
657 page_address
= address
/ nand
->page_size
;
659 nand_write_page(nand
, page_address
, page
, nand
->page_size
, NULL
, 0);
661 address
+= thisrun_size
;
662 data
+= thisrun_size
;
663 data_size
-= thisrun_size
;
672 int nand_write_page(struct nand_device
*nand
, uint32_t page
,
673 uint8_t *data
, uint32_t data_size
,
674 uint8_t *oob
, uint32_t oob_size
)
679 return ERROR_NAND_DEVICE_NOT_PROBED
;
681 block
= page
/ (nand
->erase_size
/ nand
->page_size
);
682 if (nand
->blocks
[block
].is_erased
== 1)
683 nand
->blocks
[block
].is_erased
= 0;
685 if (nand
->use_raw
|| nand
->controller
->write_page
== NULL
)
686 return nand_write_page_raw(nand
, page
, data
, data_size
, oob
, oob_size
);
688 return nand
->controller
->write_page(nand
, page
, data
, data_size
, oob
, oob_size
);
691 int nand_read_page(struct nand_device
*nand
, uint32_t page
,
692 uint8_t *data
, uint32_t data_size
,
693 uint8_t *oob
, uint32_t oob_size
)
696 return ERROR_NAND_DEVICE_NOT_PROBED
;
698 if (nand
->use_raw
|| nand
->controller
->read_page
== NULL
)
699 return nand_read_page_raw(nand
, page
, data
, data_size
, oob
, oob_size
);
701 return nand
->controller
->read_page(nand
, page
, data
, data_size
, oob
, oob_size
);
704 int nand_page_command(struct nand_device
*nand
, uint32_t page
,
705 uint8_t cmd
, bool oob_only
)
708 return ERROR_NAND_DEVICE_NOT_PROBED
;
710 if (oob_only
&& NAND_CMD_READ0
== cmd
&& nand
->page_size
<= 512)
711 cmd
= NAND_CMD_READOOB
;
713 nand
->controller
->command(nand
, cmd
);
715 if (nand
->page_size
<= 512) {
716 /* small page device */
718 /* column (always 0, we start at the beginning of a page/OOB area) */
719 nand
->controller
->address(nand
, 0x0);
722 nand
->controller
->address(nand
, page
& 0xff);
723 nand
->controller
->address(nand
, (page
>> 8) & 0xff);
725 /* 4th cycle only on devices with more than 32 MiB */
726 if (nand
->address_cycles
>= 4)
727 nand
->controller
->address(nand
, (page
>> 16) & 0xff);
729 /* 5th cycle only on devices with more than 8 GiB */
730 if (nand
->address_cycles
>= 5)
731 nand
->controller
->address(nand
, (page
>> 24) & 0xff);
733 /* large page device */
735 /* column (0 when we start at the beginning of a page,
736 * or 2048 for the beginning of OOB area)
738 nand
->controller
->address(nand
, 0x0);
740 nand
->controller
->address(nand
, 0x8);
742 nand
->controller
->address(nand
, 0x0);
745 nand
->controller
->address(nand
, page
& 0xff);
746 nand
->controller
->address(nand
, (page
>> 8) & 0xff);
748 /* 5th cycle only on devices with more than 128 MiB */
749 if (nand
->address_cycles
>= 5)
750 nand
->controller
->address(nand
, (page
>> 16) & 0xff);
752 /* large page devices need a start command if reading */
753 if (NAND_CMD_READ0
== cmd
)
754 nand
->controller
->command(nand
, NAND_CMD_READSTART
);
757 if (nand
->controller
->nand_ready
) {
758 if (!nand
->controller
->nand_ready(nand
, 100))
759 return ERROR_NAND_OPERATION_TIMEOUT
;
761 /* nand_poll_read() cannot be used during nand read */
768 int nand_read_data_page(struct nand_device
*nand
, uint8_t *data
, uint32_t size
)
770 int retval
= ERROR_NAND_NO_BUFFER
;
772 if (nand
->controller
->read_block_data
!= NULL
)
773 retval
= (nand
->controller
->read_block_data
)(nand
, data
, size
);
775 if (ERROR_NAND_NO_BUFFER
== retval
) {
777 int incr
= (nand
->device
->options
& NAND_BUSWIDTH_16
) ? 2 : 1;
780 for (i
= 0; retval
== ERROR_OK
&& i
< size
; i
+= incr
) {
781 retval
= nand
->controller
->read_data(nand
, data
);
789 int nand_read_page_raw(struct nand_device
*nand
, uint32_t page
,
790 uint8_t *data
, uint32_t data_size
,
791 uint8_t *oob
, uint32_t oob_size
)
795 retval
= nand_page_command(nand
, page
, NAND_CMD_READ0
, !data
);
796 if (ERROR_OK
!= retval
)
800 nand_read_data_page(nand
, data
, data_size
);
803 nand_read_data_page(nand
, oob
, oob_size
);
808 int nand_write_data_page(struct nand_device
*nand
, uint8_t *data
, uint32_t size
)
810 int retval
= ERROR_NAND_NO_BUFFER
;
812 if (nand
->controller
->write_block_data
!= NULL
)
813 retval
= (nand
->controller
->write_block_data
)(nand
, data
, size
);
815 if (ERROR_NAND_NO_BUFFER
== retval
) {
816 bool is16bit
= nand
->device
->options
& NAND_BUSWIDTH_16
;
817 uint32_t incr
= is16bit
? 2 : 1;
821 for (i
= 0; i
< size
; i
+= incr
) {
823 write_data
= le_to_h_u16(data
);
827 retval
= nand
->controller
->write_data(nand
, write_data
);
828 if (ERROR_OK
!= retval
)
838 int nand_write_finish(struct nand_device
*nand
)
843 nand
->controller
->command(nand
, NAND_CMD_PAGEPROG
);
845 retval
= nand
->controller
->nand_ready
?
846 nand
->controller
->nand_ready(nand
, 100) :
847 nand_poll_ready(nand
, 100);
849 return ERROR_NAND_OPERATION_TIMEOUT
;
851 retval
= nand_read_status(nand
, &status
);
852 if (ERROR_OK
!= retval
) {
853 LOG_ERROR("couldn't read status");
854 return ERROR_NAND_OPERATION_FAILED
;
857 if (status
& NAND_STATUS_FAIL
) {
858 LOG_ERROR("write operation didn't pass, status: 0x%2.2x",
860 return ERROR_NAND_OPERATION_FAILED
;
866 int nand_write_page_raw(struct nand_device
*nand
, uint32_t page
,
867 uint8_t *data
, uint32_t data_size
,
868 uint8_t *oob
, uint32_t oob_size
)
872 retval
= nand_page_command(nand
, page
, NAND_CMD_SEQIN
, !data
);
873 if (ERROR_OK
!= retval
)
877 retval
= nand_write_data_page(nand
, data
, data_size
);
878 if (ERROR_OK
!= retval
) {
879 LOG_ERROR("Unable to write data to NAND device");
885 retval
= nand_write_data_page(nand
, oob
, oob_size
);
886 if (ERROR_OK
!= retval
) {
887 LOG_ERROR("Unable to write OOB data to NAND device");
892 return nand_write_finish(nand
);
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)