]> git.sur5r.net Git - u-boot/commitdiff
tools, fit: add fit_info host command
authorHeiko Schocher <hs@denx.de>
Mon, 3 Mar 2014 11:19:29 +0000 (12:19 +0100)
committerTom Rini <trini@ti.com>
Fri, 21 Mar 2014 20:39:37 +0000 (16:39 -0400)
add fit_info command to the host tools. This command prints
the name, offset and the len from a property from a node in
a fit file. This info can be used to extract a properties
data with linux tools, for example "dd".

Signed-off-by: Heiko Schocher <hs@denx.de>
Acked-by: Simon Glass <sjg@chromium.org>
tools/.gitignore
tools/Makefile
tools/fit_common.c [new file with mode: 0644]
tools/fit_common.h [new file with mode: 0644]
tools/fit_image.c
tools/fit_info.c [new file with mode: 0644]

index 2a90dfe83a52339e2434207f192e475bdaa245d0..2f6ecc740a99675c58ede7e266c1c076acafc1fb 100644 (file)
@@ -1,5 +1,6 @@
 /bmp_logo
 /envcrc
+/fit_info
 /gen_eth_addr
 /img2srec
 /kwboot
index 528d1adc2d97d55f217b13ea883a02c40f099da5..52fb69eae9dc94d4887c637675ee6be5c32dc034 100644 (file)
@@ -60,6 +60,9 @@ hostprogs-y += mkenvimage$(SFX)
 mkenvimage$(SFX)-objs := crc32.o mkenvimage.o os_support.o
 
 hostprogs-y += dumpimage$(SFX) mkimage$(SFX)
+ifdef CONFIG_FIT_SIGNATURE
+hostprogs-y += fit_info$(SFX)
+endif
 
 FIT_SIG_OBJS-$(CONFIG_FIT_SIGNATURE) := image-sig.o
 # Flattened device tree objects
@@ -71,6 +74,8 @@ dumpimage-mkimage-objs := aisimage.o \
                        $(FIT_SIG_OBJS-y) \
                        crc32.o \
                        default_image.o \
+                       fdtdec.o \
+                       fit_common.o \
                        fit_image.o \
                        image-fit.o \
                        image-host.o \
@@ -91,6 +96,7 @@ dumpimage-mkimage-objs := aisimage.o \
 
 dumpimage$(SFX)-objs := $(dumpimage-mkimage-objs) dumpimage.o
 mkimage$(SFX)-objs   := $(dumpimage-mkimage-objs) mkimage.o
+fit_info$(SFX)-objs   := $(dumpimage-mkimage-objs) fit_info.o
 
 # TODO(sjg@chromium.org): Is this correct on Mac OS?
 
@@ -98,6 +104,7 @@ mkimage$(SFX)-objs   := $(dumpimage-mkimage-objs) mkimage.o
 ifneq ($(CONFIG_MX23)$(CONFIG_MX28),)
 HOSTLOADLIBES_dumpimage$(SFX) := -lssl -lcrypto
 HOSTLOADLIBES_mkimage$(SFX) := -lssl -lcrypto
+HOSTLOADLIBES_fit_info$(SFX) := -lssl -lcrypto
 # Add CONFIG_MXS into host CFLAGS, so we can check whether or not register
 # the mxsimage support within tools/mxsimage.c .
 HOSTCFLAGS_mxsimage.o += -DCONFIG_MXS
@@ -106,6 +113,7 @@ endif
 ifdef CONFIG_FIT_SIGNATURE
 HOSTLOADLIBES_dumpimage$(SFX) := -lssl -lcrypto
 HOSTLOADLIBES_mkimage$(SFX) := -lssl -lcrypto
+HOSTLOADLIBES_fit_info$(SFX) := -lssl -lcrypto
 
 # This affects include/image.h, but including the board config file
 # is tricky, so manually define this options here.
diff --git a/tools/fit_common.c b/tools/fit_common.c
new file mode 100644 (file)
index 0000000..ee1767b
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * (C) Copyright 2014
+ * DENX Software Engineering
+ * Heiko Schocher <hs@denx.de>
+ *
+ * (C) Copyright 2008 Semihalf
+ *
+ * (C) Copyright 2000-2004
+ * DENX Software Engineering
+ * Wolfgang Denk, wd@denx.de
+ *
+ * Updated-by: Prafulla Wadaskar <prafulla@marvell.com>
+ *             FIT image specific code abstracted from mkimage.c
+ *             some functions added to address abstraction
+ *
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include "imagetool.h"
+#include "mkimage.h"
+#include "fit_common.h"
+#include <image.h>
+#include <u-boot/crc.h>
+
+int fit_verify_header(unsigned char *ptr, int image_size,
+                       struct image_tool_params *params)
+{
+       return fdt_check_header(ptr);
+}
+
+int fit_check_image_types(uint8_t type)
+{
+       if (type == IH_TYPE_FLATDT)
+               return EXIT_SUCCESS;
+       else
+               return EXIT_FAILURE;
+}
+
+int mmap_fdt(char *cmdname, const char *fname, void **blobp,
+               struct stat *sbuf, int useunlink)
+{
+       void *ptr;
+       int fd;
+
+       /* Load FIT blob into memory (we need to write hashes/signatures) */
+       fd = open(fname, O_RDWR | O_BINARY);
+
+       if (fd < 0) {
+               fprintf(stderr, "%s: Can't open %s: %s\n",
+                       cmdname, fname, strerror(errno));
+               if (useunlink)
+                       unlink(fname);
+               return -1;
+       }
+
+       if (fstat(fd, sbuf) < 0) {
+               fprintf(stderr, "%s: Can't stat %s: %s\n",
+                       cmdname, fname, strerror(errno));
+               if (useunlink)
+                       unlink(fname);
+               return -1;
+       }
+
+       errno = 0;
+       ptr = mmap(0, sbuf->st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
+       if ((ptr == MAP_FAILED) || (errno != 0)) {
+               fprintf(stderr, "%s: Can't read %s: %s\n",
+                       cmdname, fname, strerror(errno));
+               if (useunlink)
+                       unlink(fname);
+               return -1;
+       }
+
+       /* check if ptr has a valid blob */
+       if (fdt_check_header(ptr)) {
+               fprintf(stderr, "%s: Invalid FIT blob\n", cmdname);
+               if (useunlink)
+                       unlink(fname);
+               return -1;
+       }
+
+       *blobp = ptr;
+       return fd;
+}
diff --git a/tools/fit_common.h b/tools/fit_common.h
new file mode 100644 (file)
index 0000000..adf4404
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * (C) Copyright 2014
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _FIT_COMMON_H_
+#define _FIT_COMMON_H_
+
+#include "imagetool.h"
+#include "mkimage.h"
+#include <image.h>
+
+int fit_verify_header(unsigned char *ptr, int image_size,
+                       struct image_tool_params *params);
+
+int fit_check_image_types(uint8_t type);
+
+int mmap_fdt(char *cmdname, const char *fname, void **blobp,
+               struct stat *sbuf, int useunlink);
+
+#endif /* _FIT_COMMON_H_ */
index 1466164f0ae067e643e5cddf54d6da26a32dc12e..eeee484cdec096eecda45ad9942fc8354f38f4f3 100644 (file)
  */
 
 #include "imagetool.h"
+#include "fit_common.h"
 #include "mkimage.h"
 #include <image.h>
 #include <u-boot/crc.h>
 
 static image_header_t header;
 
-static int fit_verify_header (unsigned char *ptr, int image_size,
-                       struct image_tool_params *params)
-{
-       return fdt_check_header(ptr);
-}
-
-static int fit_check_image_types (uint8_t type)
-{
-       if (type == IH_TYPE_FLATDT)
-               return EXIT_SUCCESS;
-       else
-               return EXIT_FAILURE;
-}
-
-int mmap_fdt(struct image_tool_params *params, const char *fname, void **blobp,
-               struct stat *sbuf)
-{
-       void *ptr;
-       int fd;
-
-       /* Load FIT blob into memory (we need to write hashes/signatures) */
-       fd = open(fname, O_RDWR | O_BINARY);
-
-       if (fd < 0) {
-               fprintf(stderr, "%s: Can't open %s: %s\n",
-                       params->cmdname, fname, strerror(errno));
-               unlink(fname);
-               return -1;
-       }
-
-       if (fstat(fd, sbuf) < 0) {
-               fprintf(stderr, "%s: Can't stat %s: %s\n",
-                       params->cmdname, fname, strerror(errno));
-               unlink(fname);
-               return -1;
-       }
-
-       ptr = mmap(0, sbuf->st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
-       if (ptr == MAP_FAILED) {
-               fprintf(stderr, "%s: Can't read %s: %s\n",
-                       params->cmdname, fname, strerror(errno));
-               unlink(fname);
-               return -1;
-       }
-
-       /* check if ptr has a valid blob */
-       if (fdt_check_header(ptr)) {
-               fprintf(stderr, "%s: Invalid FIT blob\n", params->cmdname);
-               unlink(fname);
-               return -1;
-       }
-
-       *blobp = ptr;
-       return fd;
-}
-
 /**
  * fit_handle_file - main FIT file processing function
  *
@@ -129,13 +74,14 @@ static int fit_handle_file(struct image_tool_params *params)
        }
 
        if (params->keydest) {
-               destfd = mmap_fdt(params, params->keydest, &dest_blob, &sbuf);
+               destfd = mmap_fdt(params->cmdname, params->keydest,
+                                 &dest_blob, &sbuf, 1);
                if (destfd < 0)
                        goto err_keydest;
                destfd_size = sbuf.st_size;
        }
 
-       tfd = mmap_fdt(params, tmpfile, &ptr, &sbuf);
+       tfd = mmap_fdt(params->cmdname, tmpfile, &ptr, &sbuf, 1);
        if (tfd < 0)
                goto err_mmap;
 
diff --git a/tools/fit_info.c b/tools/fit_info.c
new file mode 100644 (file)
index 0000000..50f3c8e
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * (C) Copyright 2014
+ * DENX Software Engineering
+ * Heiko Schocher <hs@denx.de>
+ *
+ * fit_info: print the offset and the len of a property from
+ *          node in a fit file.
+ *
+ * Based on:
+ * (C) Copyright 2008 Semihalf
+ *
+ * (C) Copyright 2000-2004
+ * DENX Software Engineering
+ * Wolfgang Denk, wd@denx.de
+ *
+ * Updated-by: Prafulla Wadaskar <prafulla@marvell.com>
+ *             FIT image specific code abstracted from mkimage.c
+ *             some functions added to address abstraction
+ *
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include "mkimage.h"
+#include "fit_common.h"
+#include <image.h>
+#include <u-boot/crc.h>
+
+void usage(char *cmdname)
+{
+       fprintf(stderr, "Usage: %s -f fit file -n node -p property\n"
+                        "          -f ==> set fit file which is used'\n"
+                        "          -n ==> set node name'\n"
+                        "          -p ==> set property name'\n",
+               cmdname);
+       exit(EXIT_FAILURE);
+}
+
+int main(int argc, char **argv)
+{
+       int ffd = -1;
+       struct stat fsbuf;
+       void *fit_blob;
+       int len;
+       int  nodeoffset;        /* node offset from libfdt */
+       const void *nodep;      /* property node pointer */
+       char *fdtfile = NULL;
+       char *nodename = NULL;
+       char *propertyname = NULL;
+       char cmdname[50];
+       int c;
+
+       strcpy(cmdname, *argv);
+       while ((c = getopt(argc, argv, "f:n:p:")) != -1)
+               switch (c) {
+               case 'f':
+                       fdtfile = optarg;
+                       break;
+               case 'n':
+                       nodename = optarg;
+                       break;
+               case 'p':
+                       propertyname = optarg;
+                       break;
+               default:
+                       usage(cmdname);
+                       break;
+               }
+
+       ffd = mmap_fdt(cmdname, fdtfile, &fit_blob, &fsbuf, 0);
+
+       if (ffd < 0) {
+               printf("Could not open %s\n", fdtfile);
+               exit(EXIT_FAILURE);
+       }
+
+       nodeoffset = fdt_path_offset(fit_blob, nodename);
+       if (nodeoffset < 0) {
+               printf("%s not found.", nodename);
+               exit(EXIT_FAILURE);
+       }
+       nodep = fdt_getprop(fit_blob, nodeoffset, propertyname, &len);
+       if (len == 0) {
+               printf("len == 0 %s\n", propertyname);
+               exit(EXIT_FAILURE);
+       }
+
+       printf("NAME: %s\n", fit_get_name(fit_blob, nodeoffset, NULL));
+       printf("LEN: %d\n", len);
+       printf("OFF: %d\n", (int)(nodep - fit_blob));
+       (void) munmap((void *)fit_blob, fsbuf.st_size);
+
+       close(ffd);
+       exit(EXIT_SUCCESS);
+}