From 32c17dd886a5b506781b86c6227bb059ce33420b Mon Sep 17 00:00:00 2001 From: Tung Nguyen Date: Sun, 5 Sep 2021 09:22:08 +0000 Subject: [PATCH] flashcp support offset option The flashcp command from mtd-utils just support to flash from offset 0. Add offset option to specify the start offset so that firmware can be flashed correctly Signed-off-by: Tung Nguyen --- misc-utils/flashcp.c | 50 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/misc-utils/flashcp.c b/misc-utils/flashcp.c index 341c210..0a0e75b 100644 --- a/misc-utils/flashcp.c +++ b/misc-utils/flashcp.c @@ -91,7 +91,7 @@ static NORETURN void showusage(bool error) "\n" "Flash Copy - Written by Abraham van der Merwe \n" "\n" - "usage: %1$s [ -v | --verbose | -A | --erase-all ] \n" + "usage: %1$s [ -v | --verbose | -A | --erase-all ] \n" " %1$s -h | --help\n" " %1$s -V | --version\n" "\n" @@ -102,6 +102,7 @@ static NORETURN void showusage(bool error) " -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" + " The start offset. Optional, default: 0\n" "\n", PROGRAM_NAME); @@ -156,6 +157,16 @@ static void safe_rewind (int fd,const char *filename) } } +static int safe_rewind_offset(int fd, const char *filename, off_t offset) +{ + if (lseek(fd, offset, SEEK_SET) < 0) { + log_printf(LOG_ERROR, "While seeking to start of %s: %m\n", filename); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + /******************************************************************************/ static int dev_fd = -1,fil_fd = -1; @@ -169,6 +180,8 @@ static void cleanup (void) int main (int argc,char *argv[]) { const char *filename = NULL,*device = NULL; + off_t offset; + int i,flags = FLAG_NONE; ssize_t result; size_t size,written; @@ -225,6 +238,20 @@ int main (int argc,char *argv[]) showusage(true); } } + + if (optind + 3 == argc) { + flags |= FLAG_FILENAME; + filename = argv[optind]; + DEBUG("Got filename: %s\n", filename); + + flags |= FLAG_DEVICE; + device = argv[optind + 1]; + DEBUG("Got device: %s\n", device); + + offset = strtoul(argv[optind + 2], NULL, 16); + DEBUG("Got offset: 0x%x\n", offset); + } + if (optind+2 == argc) { flags |= FLAG_FILENAME; filename = argv[optind]; @@ -233,6 +260,8 @@ int main (int argc,char *argv[]) flags |= FLAG_DEVICE; device = argv[optind+1]; DEBUG("Got device: %s\n",device); + + offset = 0; } if (flags & FLAG_HELP || device == NULL) @@ -264,6 +293,12 @@ int main (int argc,char *argv[]) exit (EXIT_FAILURE); } + /* does offset is out of the mtd */ + if (offset > mtd.size) { + log_printf(LOG_ERROR, "%s offset won't fit into %s!\n", offset, device); + exit(EXIT_FAILURE); + } + /* diff block flashcp */ if (flags & FLAG_PARTITION) { @@ -284,6 +319,8 @@ int main (int argc,char *argv[]) } else { + /* Erase from the offset */ + erase.start = offset; erase.length = (filestat.st_size + mtd.erasesize - 1) / mtd.erasesize; erase.length *= mtd.erasesize; } @@ -330,6 +367,12 @@ int main (int argc,char *argv[]) size = filestat.st_size; i = BUFSIZE; written = 0; + + /* if offset is greater than 0 */ + if (offset) + if (safe_rewind_offset(dev_fd, device, offset) != EXIT_SUCCESS) + return EXIT_FAILURE; + while (size) { if (size < BUFSIZE) i = size; @@ -374,8 +417,9 @@ int main (int argc,char *argv[]) * verify that flash == file data * **********************************/ - safe_rewind (fil_fd,filename); - safe_rewind (dev_fd,device); + safe_rewind(fil_fd, filename); + safe_rewind_offset(dev_fd, device, offset); + size = filestat.st_size; i = BUFSIZE; written = 0; -- 2.25.1