xref: /OK3568_Linux_fs/u-boot/tools/fit_info.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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