Merge git://git.denx.de/u-boot-arc
[platform/kernel/u-boot.git] / tools / fit_info.c
1 /*
2  * (C) Copyright 2014
3  * DENX Software Engineering
4  * Heiko Schocher <hs@denx.de>
5  *
6  * fit_info: print the offset and the len of a property from
7  *           node in a fit file.
8  *
9  * Based on:
10  * (C) Copyright 2008 Semihalf
11  *
12  * (C) Copyright 2000-2004
13  * DENX Software Engineering
14  * Wolfgang Denk, wd@denx.de
15  *
16  * Updated-by: Prafulla Wadaskar <prafulla@marvell.com>
17  *              FIT image specific code abstracted from mkimage.c
18  *              some functions added to address abstraction
19  *
20  * All rights reserved.
21  *
22  * SPDX-License-Identifier:     GPL-2.0+
23  */
24
25 #include "mkimage.h"
26 #include "fit_common.h"
27 #include <image.h>
28 #include <u-boot/crc.h>
29
30 void usage(char *cmdname)
31 {
32         fprintf(stderr, "Usage: %s -f fit file -n node -p property\n"
33                          "          -f ==> set fit file which is used'\n"
34                          "          -n ==> set node name'\n"
35                          "          -p ==> set property name'\n",
36                 cmdname);
37         exit(EXIT_FAILURE);
38 }
39
40 int main(int argc, char **argv)
41 {
42         int ffd = -1;
43         struct stat fsbuf;
44         void *fit_blob;
45         int len;
46         int  nodeoffset;        /* node offset from libfdt */
47         const void *nodep;      /* property node pointer */
48         char *fdtfile = NULL;
49         char *nodename = NULL;
50         char *propertyname = NULL;
51         char cmdname[256];
52         int c;
53
54         strncpy(cmdname, *argv, sizeof(cmdname) - 1);
55         cmdname[sizeof(cmdname) - 1] = '\0';
56         while ((c = getopt(argc, argv, "f:n:p:")) != -1)
57                 switch (c) {
58                 case 'f':
59                         fdtfile = optarg;
60                         break;
61                 case 'n':
62                         nodename = optarg;
63                         break;
64                 case 'p':
65                         propertyname = optarg;
66                         break;
67                 default:
68                         usage(cmdname);
69                         break;
70                 }
71
72         if (!fdtfile) {
73                 fprintf(stderr, "%s: Missing fdt file\n", *argv);
74                 usage(*argv);
75         }
76         if (!nodename) {
77                 fprintf(stderr, "%s: Missing node name\n", *argv);
78                 usage(*argv);
79         }
80         if (!propertyname) {
81                 fprintf(stderr, "%s: Missing property name\n", *argv);
82                 usage(*argv);
83         }
84         ffd = mmap_fdt(cmdname, fdtfile, 0, &fit_blob, &fsbuf, false);
85
86         if (ffd < 0) {
87                 printf("Could not open %s\n", fdtfile);
88                 exit(EXIT_FAILURE);
89         }
90
91         nodeoffset = fdt_path_offset(fit_blob, nodename);
92         if (nodeoffset < 0) {
93                 printf("%s not found.", nodename);
94                 exit(EXIT_FAILURE);
95         }
96         nodep = fdt_getprop(fit_blob, nodeoffset, propertyname, &len);
97         if (len == 0) {
98                 printf("len == 0 %s\n", propertyname);
99                 exit(EXIT_FAILURE);
100         }
101
102         printf("NAME: %s\n", fit_get_name(fit_blob, nodeoffset, NULL));
103         printf("LEN: %d\n", len);
104         printf("OFF: %d\n", (int)(nodep - fit_blob));
105         (void) munmap((void *)fit_blob, fsbuf.st_size);
106
107         close(ffd);
108         exit(EXIT_SUCCESS);
109 }