From 413b3c919c2c96d6e0224f86eb6d3d7ce3b79238 Mon Sep 17 00:00:00 2001 From: Andrij Abyzov Date: Mon, 21 Oct 2019 12:10:37 +0200 Subject: flashcp: Add option -A/--erase-all Sometimes there's a need to erase the whole device when programming an image, and not just the area under the image itself. Therefore, option -A/--erase-all has been added which erases the whole device before writing the image. Signed-off-by: Andrij Abyzov Signed-off-by: David Oberhollenzer --- misc-utils/flashcp.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'misc-utils') diff --git a/misc-utils/flashcp.c b/misc-utils/flashcp.c index c46a5b4..b6ad2f9 100644 --- a/misc-utils/flashcp.c +++ b/misc-utils/flashcp.c @@ -66,6 +66,7 @@ #define FLAG_HELP 0x02 #define FLAG_FILENAME 0x04 #define FLAG_DEVICE 0x08 +#define FLAG_ERASE_ALL 0x10 /* error levels */ #define LOG_NORMAL 1 @@ -89,12 +90,13 @@ static NORETURN void showusage(bool error) "\n" "Flash Copy - Written by Abraham van der Merwe \n" "\n" - "usage: %1$s [ -v | --verbose ] \n" + "usage: %1$s [ -v | --verbose | -A | --erase-all ] \n" " %1$s -h | --help\n" " %1$s -V | --version\n" "\n" " -h | --help Show this help message\n" " -v | --verbose Show progress reports\n" + " -A | --erase-all Erases the whole device regardless of the image size\n" " -V | --version Show version information and exit\n" " File which you want to copy to flash\n" " Flash device to write to (e.g. /dev/mtd0, /dev/mtd1, etc.)\n" @@ -179,10 +181,11 @@ int main (int argc,char *argv[]) for (;;) { int option_index = 0; - static const char *short_options = "hvV"; + static const char *short_options = "hvAV"; static const struct option long_options[] = { {"help", no_argument, 0, 'h'}, {"verbose", no_argument, 0, 'v'}, + {"erase-all", no_argument, 0, 'A'}, {"version", no_argument, 0, 'V'}, {0, 0, 0, 0}, }; @@ -202,6 +205,10 @@ int main (int argc,char *argv[]) flags |= FLAG_VERBOSE; DEBUG("Got FLAG_VERBOSE\n"); break; + case 'A': + flags |= FLAG_ERASE_ALL; + DEBUG("Got FLAG_ERASE_ALL\n"); + break; case 'V': common_print_version(); exit(EXIT_SUCCESS); @@ -257,8 +264,16 @@ int main (int argc,char *argv[]) #warning "Check for smaller erase regions" erase.start = 0; - erase.length = (filestat.st_size + mtd.erasesize - 1) / mtd.erasesize; - erase.length *= mtd.erasesize; + + if (flags & FLAG_ERASE_ALL) + { + erase.length = mtd.size; + } + else + { + erase.length = (filestat.st_size + mtd.erasesize - 1) / mtd.erasesize; + erase.length *= mtd.erasesize; + } if (flags & FLAG_VERBOSE) { -- cgit v1.2.3