blob: 0edae05f8888b5bac2bb50d2113cb7e4a11cbe47 [file] [log] [blame]
From 32c17dd886a5b506781b86c6227bb059ce33420b Mon Sep 17 00:00:00 2001
From: Tung Nguyen <tung.nguyen@amperecomputing.com>
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 <tung.nguyen@amperecomputing.com>
---
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 <abraham@2d3d.co.za>\n"
"\n"
- "usage: %1$s [ -v | --verbose | -A | --erase-all ] <filename> <device>\n"
+ "usage: %1$s [ -v | --verbose | -A | --erase-all ] <filename> <device> <offset>\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"
" <filename> File which you want to copy to flash\n"
" <device> Flash device to write to (e.g. /dev/mtd0, /dev/mtd1, etc.)\n"
+ " <offset> 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