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