tools, fit: add fit_info host command
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>
This commit is contained in:
parent
bf007ebb6f
commit
6bf4ca076f
1
tools/.gitignore
vendored
1
tools/.gitignore
vendored
@ -1,5 +1,6 @@
|
||||
/bmp_logo
|
||||
/envcrc
|
||||
/fit_info
|
||||
/gen_eth_addr
|
||||
/img2srec
|
||||
/kwboot
|
||||
|
@ -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.
|
||||
|
86
tools/fit_common.c
Normal file
86
tools/fit_common.c
Normal file
@ -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;
|
||||
}
|
22
tools/fit_common.h
Normal file
22
tools/fit_common.h
Normal file
@ -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_ */
|
@ -15,68 +15,13 @@
|
||||
*/
|
||||
|
||||
#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;
|
||||
|
||||
|
96
tools/fit_info.c
Normal file
96
tools/fit_info.c
Normal file
@ -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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user