| NAND FLASH commands and notes |
| |
| See NOTE below!!! |
| |
| # (C) Copyright 2003 |
| # Dave Ellis, SIXNET, dge@sixnetio.com |
| # |
| # See file CREDITS for list of people who contributed to this |
| # project. |
| # |
| # This program is free software; you can redistribute it and/or |
| # modify it under the terms of the GNU General Public License as |
| # published by the Free Software Foundation; either version 2 of |
| # the License, or (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program; if not, write to the Free Software |
| # Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
| # MA 02111-1307 USA |
| |
| Commands: |
| |
| nand bad |
| Print a list of all of the bad blocks in the current device. |
| |
| nand device |
| Print information about the current NAND device. |
| |
| nand device num |
| Make device `num' the current device and print information about it. |
| |
| nand erase off|partition size |
| nand erase clean [off|partition size] |
| Erase `size' bytes starting at offset `off'. Alternatively partition |
| name can be specified, in this case size will be eventually limited |
| to not exceed partition size (this behaviour applies also to read |
| and write commands). Only complete erase blocks can be erased. |
| |
| If `erase' is specified without an offset or size, the entire flash |
| is erased. If `erase' is specified with partition but without an |
| size, the entire partition is erased. |
| |
| If `clean' is specified, a JFFS2-style clean marker is written to |
| each block after it is erased. |
| |
| This command will not erase blocks that are marked bad. There is |
| a debug option in cmd_nand.c to allow bad blocks to be erased. |
| Please read the warning there before using it, as blocks marked |
| bad by the manufacturer must _NEVER_ be erased. |
| |
| nand info |
| Print information about all of the NAND devices found. |
| |
| nand read addr ofs|partition size |
| Read `size' bytes from `ofs' in NAND flash to `addr'. Blocks that |
| are marked bad are skipped. If a page cannot be read because an |
| uncorrectable data error is found, the command stops with an error. |
| |
| nand read.oob addr ofs|partition size |
| Read `size' bytes from the out-of-band data area corresponding to |
| `ofs' in NAND flash to `addr'. This is limited to the 16 bytes of |
| data for one 512-byte page or 2 256-byte pages. There is no check |
| for bad blocks or ECC errors. |
| |
| nand write addr ofs|partition size |
| Write `size' bytes from `addr' to `ofs' in NAND flash. Blocks that |
| are marked bad are skipped. If a page cannot be read because an |
| uncorrectable data error is found, the command stops with an error. |
| |
| As JFFS2 skips blocks similarly, this allows writing a JFFS2 image, |
| as long as the image is short enough to fit even after skipping the |
| bad blocks. Compact images, such as those produced by mkfs.jffs2 |
| should work well, but loading an image copied from another flash is |
| going to be trouble if there are any bad blocks. |
| |
| nand write.trimffs addr ofs|partition size |
| Enabled by the CONFIG_CMD_NAND_TRIMFFS macro. This command will write to |
| the NAND flash in a manner identical to the 'nand write' command |
| described above -- with the additional check that all pages at the end |
| of eraseblocks which contain only 0xff data will not be written to the |
| NAND flash. This behaviour is required when flashing UBI images |
| containing UBIFS volumes as per the UBI FAQ[1]. |
| |
| [1] http://www.linux-mtd.infradead.org/doc/ubi.html#L_flasher_algo |
| |
| nand write.oob addr ofs|partition size |
| Write `size' bytes from `addr' to the out-of-band data area |
| corresponding to `ofs' in NAND flash. This is limited to the 16 bytes |
| of data for one 512-byte page or 2 256-byte pages. There is no check |
| for bad blocks. |
| |
| nand read.raw addr ofs|partition |
| Read page from `ofs' in NAND flash to `addr'. This reads the raw page, |
| so ECC is avoided and the OOB area is read as well. |
| |
| nand write.raw addr ofs|partition |
| Write page from `addr' to `ofs' in NAND flash. This writes the raw page, |
| so ECC is avoided and the OOB area is written as well, making the whole |
| page written as-is. |
| |
| Configuration Options: |
| |
| CONFIG_CMD_NAND |
| Enables NAND support and commmands. |
| |
| CONFIG_MTD_NAND_ECC_JFFS2 |
| Define this if you want the Error Correction Code information in |
| the out-of-band data to be formatted to match the JFFS2 file system. |
| CONFIG_MTD_NAND_ECC_YAFFS would be another useful choice for |
| someone to implement. |
| |
| CONFIG_SYS_MAX_NAND_DEVICE |
| The maximum number of NAND devices you want to support. |
| |
| CONFIG_SYS_NAND_MAX_CHIPS |
| The maximum number of NAND chips per device to be supported. |
| |
| NOTE: |
| ===== |
| |
| The current NAND implementation is based on what is in recent |
| Linux kernels. The old legacy implementation has been removed. |
| |
| If you have board code which used CONFIG_NAND_LEGACY, you'll need |
| to convert to the current NAND interface for it to continue to work. |
| |
| The Disk On Chip driver is currently broken and has been for some time. |
| There is a driver in drivers/mtd/nand, taken from Linux, that works with |
| the current NAND system but has not yet been adapted to the u-boot |
| environment. |
| |
| Additional improvements to the NAND subsystem by Guido Classen, 10-10-2006 |
| |
| JFFS2 related commands: |
| |
| implement "nand erase clean" and old "nand erase" |
| using both the new code which is able to skip bad blocks |
| "nand erase clean" additionally writes JFFS2-cleanmarkers in the oob. |
| |
| Miscellaneous and testing commands: |
| "markbad [offset]" |
| create an artificial bad block (for testing bad block handling) |
| |
| "scrub [offset length]" |
| like "erase" but don't skip bad block. Instead erase them. |
| DANGEROUS!!! Factory set bad blocks will be lost. Use only |
| to remove artificial bad blocks created with the "markbad" command. |
| |
| |
| NAND locking command (for chips with active LOCKPRE pin) |
| |
| "nand lock" |
| set NAND chip to lock state (all pages locked) |
| |
| "nand lock tight" |
| set NAND chip to lock tight state (software can't change locking anymore) |
| |
| "nand lock status" |
| displays current locking status of all pages |
| |
| "nand unlock [offset] [size]" |
| unlock consecutive area (can be called multiple times for different areas) |
| |
| |
| I have tested the code with board containing 128MiB NAND large page chips |
| and 32MiB small page chips. |