]> www.infradead.org Git - mtd-utils.git/commitdiff
mtd-utils: add optional offset parameter to flash_otp_dump
authorMichael Walle <michael@walle.cc>
Wed, 8 Jan 2020 23:23:59 +0000 (00:23 +0100)
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>
Mon, 13 Jan 2020 09:37:33 +0000 (10:37 +0100)
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>
misc-utils/flash_otp_dump.c

index f0c0fb96764eb2268e8f6d512b5d5762e00d8daf..f1e1782fb71778a75b8ee1e837806feb021517a4 100644 (file)
 #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()");