@@ -29,7 +29,7 @@
*/
#define MAX_CONSECUTIVE_BAD_BLOCKS 4
-#define PROGRAM_VERSION "1.5"
+#define PROGRAM_VERSION "1.6"
#define PROGRAM_NAME "ubiformat"
#include <sys/stat.h>
@@ -55,6 +55,7 @@ struct args {
unsigned int verbose:1;
unsigned int override_ec:1;
unsigned int novtbl:1;
+ unsigned int pristine:1;
unsigned int manual_subpage;
int subpage_size;
int vid_hdr_offs;
@@ -94,6 +95,7 @@ static const char optionsstr[] =
" (default is 1)\n"
"-Q, --image-seq=<num> 32-bit UBI image sequence number to use\n"
" (by default a random number is picked)\n"
+"-P, --pristine do not erase pristine blocks\n"
"-y, --yes assume the answer is \"yes\" for all question\n"
" this program would otherwise ask\n"
"-q, --quiet suppress progress percentage information\n"
@@ -106,7 +108,7 @@ static const char usage[] =
"\t\t\t[-f <file>] [-S <bytes>] [-e <value>] [-x <num>] [-y] [-q] [-v] [-h] [-v]\n"
"\t\t\t[--sub-page-size=<bytes>] [--vid-hdr-offset=<offs>] [--no-volume-table]\n"
"\t\t\t[--flash-image=<file>] [--image-size=<bytes>] [--erase-counter=<value>]\n"
-"\t\t\t[--ubi-ver=<num>] [--yes] [--quiet] [--verbose] [--help] [--version]\n\n"
+"\t\t\t[--ubi-ver=<num>] [--pristine] [--yes] [--quiet] [--verbose] [--help] [--version]\n\n"
"Example 1: " PROGRAM_NAME " /dev/mtd0 -y - format MTD device number 0 and do\n"
" not ask questions.\n"
"Example 2: " PROGRAM_NAME " /dev/mtd0 -q -e 0 - format MTD device number 0,\n"
@@ -125,6 +127,7 @@ static const struct option long_options[] = {
{ .name = "ubi-ver", .has_arg = 1, .flag = NULL, .val = 'x' },
{ .name = "help", .has_arg = 0, .flag = NULL, .val = 'h' },
{ .name = "version", .has_arg = 0, .flag = NULL, .val = 'V' },
+ { .name = "pristine", .has_arg = 0, .flag = NULL, .val = 'P' },
{ NULL, 0, NULL, 0},
};
@@ -138,7 +141,7 @@ static int parse_opt(int argc, char * const argv[])
char *endp;
unsigned long int image_seq;
- key = getopt_long(argc, argv, "nh?Vyqve:x:s:O:f:S:", long_options, NULL);
+ key = getopt_long(argc, argv, "nh?Vyqve:x:s:O:f:S:P:", long_options, NULL);
if (key == -1)
break;
@@ -202,6 +205,10 @@ static int parse_opt(int argc, char * const argv[])
break;
+ case 'P':
+ args.pristine = 1;
+ break;
+
case 'v':
args.verbose = 1;
break;
@@ -577,7 +584,7 @@ static int format(libmtd_t libmtd, const struct mtd_dev_info *mtd,
write_size = UBI_EC_HDR_SIZE + mtd->subpage_size - 1;
write_size /= mtd->subpage_size;
write_size *= mtd->subpage_size;
- hdr = malloc(write_size);
+ hdr = malloc(mtd->eb_size);
if (!hdr)
return sys_errmsg("cannot allocate %d bytes of memory", write_size);
memset(hdr, 0xFF, write_size);
@@ -600,7 +607,21 @@ static int format(libmtd_t libmtd, const struct mtd_dev_info *mtd,
ec = si->ec[eb] + 1;
else
ec = si->mean_ec;
- ubigen_init_ec_hdr(ui, hdr, ec);
+
+ if (args.pristine) {
+ err = mtd_read(mtd, args.node_fd, eb, 0, hdr, mtd->eb_size);
+ if (!err) {
+ int i;
+
+ for(i = 0; i != mtd->eb_size; i++) {
+ if (((unsigned char *)hdr)[i] != 0xff)
+ break;
+ }
+ if (i == mtd->eb_size)
+ goto skip_erase;
+ }
+ memset(hdr, 0xFF, write_size);
+ }
if (args.verbose) {
normsg_cont("eraseblock %d: erase", eb);
@@ -621,6 +642,9 @@ static int format(libmtd_t libmtd, const struct mtd_dev_info *mtd,
continue;
}
+skip_erase:
+ ubigen_init_ec_hdr(ui, hdr, ec);
+
if ((eb1 == -1 || eb2 == -1) && !novtbl) {
if (eb1 == -1) {
eb1 = eb;