summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Walle <michael@walle.cc>2020-01-09 00:23:59 +0100
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2020-01-13 10:37:33 +0100
commit0a5e2fa5c1e41c6fba3bb30ac2d1d7b72d23d6bb (patch)
tree689c916526a3a64783a2907952dc3f31f18a278e
parent1312aedbe0a346999581b243324594e1abe2cebf (diff)
mtd-utils: add optional offset parameter to flash_otp_dump
There are flashes which have gaps between OTP regions and flashes where the regions don't start at 0 (for example the Winbond 25Q series, which has three 256 bytes OTP regions starting at 0x1000, 0x2000 and 0x3000). At the moment it is impossible to dump the OTP memory. Fix it by passing an optional offset parameter. Signed-off-by: Michael Walle <michael@walle.cc> Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
-rw-r--r--misc-utils/flash_otp_dump.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/misc-utils/flash_otp_dump.c b/misc-utils/flash_otp_dump.c
index f0c0fb9..f1e1782 100644
--- a/misc-utils/flash_otp_dump.c
+++ b/misc-utils/flash_otp_dump.c
@@ -10,16 +10,18 @@
#include <string.h>
#include <errno.h>
#include <sys/ioctl.h>
+#include <stdlib.h>
#include <mtd/mtd-user.h>
int main(int argc,char *argv[])
{
- int fd, val, i, offset, ret;
+ int fd, val, i, ret;
+ int offset = 0;
unsigned char buf[16];
- if (argc != 3 || (strcmp(argv[1], "-f") && strcmp(argv[1], "-u"))) {
- fprintf(stderr,"Usage: %s [ -f | -u ] <device>\n", PROGRAM_NAME);
+ if (argc <= 3 || (strcmp(argv[1], "-f") && strcmp(argv[1], "-u"))) {
+ fprintf(stderr,"Usage: %s [ -f | -u ] <device> [<offset>]\n", PROGRAM_NAME);
return EINVAL;
}
@@ -36,9 +38,22 @@ int main(int argc,char *argv[])
return errno;
}
+ if (argc >= 4) {
+ char *p;
+ offset = (off_t)strtoull(argv[3], &p, 0);
+ if (argv[3][0] == 0 || *p != 0) {
+ fprintf(stderr, "%s: bad offset value\n", PROGRAM_NAME);
+ return ERANGE;
+ }
+ }
+
+ if (lseek(fd, offset, SEEK_SET) == (off_t)-1) {
+ perror("lseek()");
+ return errno;
+ }
+
printf("OTP %s data for %s\n",
argv[1][1] == 'f' ? "factory" : "user", argv[2]);
- offset = 0;
while ((ret = read(fd, buf, sizeof(buf)))) {
if (ret < 0) {
perror("read()");