cmd_nand: add nand write.trimffs command
authorBen Gardiner <bengardiner@nanometrics.ca>
Tue, 14 Jun 2011 20:35:07 +0000 (16:35 -0400)
committerScott Wood <scottwood@freescale.com>
Fri, 1 Jul 2011 20:56:51 +0000 (15:56 -0500)
Add another nand write. variant, trimffs. This command will request of
nand_write_skip_bad() that all trailing all-0xff pages will be
dropped from eraseblocks when they are written to flash as-per the
reccommended behaviour of the UBI FAQ [1].

The function that implements this timming is the drop_ffs() function
by Artem Bityutskiy, ported from the mtd-utils tree.

[1] http://www.linux-mtd.infradead.org/doc/ubi.html#L_flasher_algo

Signed-off-by: Ben Gardiner <bengardiner@nanometrics.ca>
CC: Artem Bityutskiy <dedekind1@gmail.com>
CC: Detlev Zundel <dzu@denx.de>
Acked-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: Scott Wood <scottwood@freescale.com>
common/cmd_nand.c
doc/README.nand

index 27a8879..b767cd2 100644 (file)
@@ -575,6 +575,16 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
                        else
                                ret = nand_write_skip_bad(nand, off, &rwsize,
                                                          (u_char *)addr, 0);
                        else
                                ret = nand_write_skip_bad(nand, off, &rwsize,
                                                          (u_char *)addr, 0);
+#ifdef CONFIG_CMD_NAND_TRIMFFS
+               } else if (!strcmp(s, ".trimffs")) {
+                       if (read) {
+                               printf("Unknown nand command suffix '%s'\n", s);
+                               return 1;
+                       }
+                       ret = nand_write_skip_bad(nand, off, &rwsize,
+                                               (u_char *)addr,
+                                               WITH_DROP_FFS);
+#endif
 #ifdef CONFIG_CMD_NAND_YAFFS
                } else if (!strcmp(s, ".yaffs")) {
                        if (read) {
 #ifdef CONFIG_CMD_NAND_YAFFS
                } else if (!strcmp(s, ".yaffs")) {
                        if (read) {
@@ -689,6 +699,12 @@ U_BOOT_CMD(
        "nand write - addr off|partition size\n"
        "    read/write 'size' bytes starting at offset 'off'\n"
        "    to/from memory address 'addr', skipping bad blocks.\n"
        "nand write - addr off|partition size\n"
        "    read/write 'size' bytes starting at offset 'off'\n"
        "    to/from memory address 'addr', skipping bad blocks.\n"
+#ifdef CONFIG_CMD_NAND_TRIMFFS
+       "nand write.trimffs - addr off|partition size\n"
+       "    write 'size' bytes starting at offset 'off' from memory address\n"
+       "    'addr', skipping bad blocks and dropping any pages at the end\n"
+       "    of eraseblocks that contain only 0xFF\n"
+#endif
 #ifdef CONFIG_CMD_NAND_YAFFS
        "nand write.yaffs - addr off|partition size\n"
        "    write 'size' bytes starting at offset 'off' with yaffs format\n"
 #ifdef CONFIG_CMD_NAND_YAFFS
        "nand write.yaffs - addr off|partition size\n"
        "    write 'size' bytes starting at offset 'off' with yaffs format\n"
index 8eedb6c..751b693 100644 (file)
@@ -78,6 +78,16 @@ Commands:
       should work well, but loading an image copied from another flash is
       going to be trouble if there are any bad blocks.
 
       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
    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