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
|
/bmp_logo
|
||||||
/envcrc
|
/envcrc
|
||||||
|
/fit_info
|
||||||
/gen_eth_addr
|
/gen_eth_addr
|
||||||
/img2srec
|
/img2srec
|
||||||
/kwboot
|
/kwboot
|
||||||
|
@ -60,6 +60,9 @@ hostprogs-y += mkenvimage$(SFX)
|
|||||||
mkenvimage$(SFX)-objs := crc32.o mkenvimage.o os_support.o
|
mkenvimage$(SFX)-objs := crc32.o mkenvimage.o os_support.o
|
||||||
|
|
||||||
hostprogs-y += dumpimage$(SFX) mkimage$(SFX)
|
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
|
FIT_SIG_OBJS-$(CONFIG_FIT_SIGNATURE) := image-sig.o
|
||||||
# Flattened device tree objects
|
# Flattened device tree objects
|
||||||
@ -71,6 +74,8 @@ dumpimage-mkimage-objs := aisimage.o \
|
|||||||
$(FIT_SIG_OBJS-y) \
|
$(FIT_SIG_OBJS-y) \
|
||||||
crc32.o \
|
crc32.o \
|
||||||
default_image.o \
|
default_image.o \
|
||||||
|
fdtdec.o \
|
||||||
|
fit_common.o \
|
||||||
fit_image.o \
|
fit_image.o \
|
||||||
image-fit.o \
|
image-fit.o \
|
||||||
image-host.o \
|
image-host.o \
|
||||||
@ -91,6 +96,7 @@ dumpimage-mkimage-objs := aisimage.o \
|
|||||||
|
|
||||||
dumpimage$(SFX)-objs := $(dumpimage-mkimage-objs) dumpimage.o
|
dumpimage$(SFX)-objs := $(dumpimage-mkimage-objs) dumpimage.o
|
||||||
mkimage$(SFX)-objs := $(dumpimage-mkimage-objs) mkimage.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?
|
# 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),)
|
ifneq ($(CONFIG_MX23)$(CONFIG_MX28),)
|
||||||
HOSTLOADLIBES_dumpimage$(SFX) := -lssl -lcrypto
|
HOSTLOADLIBES_dumpimage$(SFX) := -lssl -lcrypto
|
||||||
HOSTLOADLIBES_mkimage$(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
|
# Add CONFIG_MXS into host CFLAGS, so we can check whether or not register
|
||||||
# the mxsimage support within tools/mxsimage.c .
|
# the mxsimage support within tools/mxsimage.c .
|
||||||
HOSTCFLAGS_mxsimage.o += -DCONFIG_MXS
|
HOSTCFLAGS_mxsimage.o += -DCONFIG_MXS
|
||||||
@ -106,6 +113,7 @@ endif
|
|||||||
ifdef CONFIG_FIT_SIGNATURE
|
ifdef CONFIG_FIT_SIGNATURE
|
||||||
HOSTLOADLIBES_dumpimage$(SFX) := -lssl -lcrypto
|
HOSTLOADLIBES_dumpimage$(SFX) := -lssl -lcrypto
|
||||||
HOSTLOADLIBES_mkimage$(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
|
# This affects include/image.h, but including the board config file
|
||||||
# is tricky, so manually define this options here.
|
# 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 "imagetool.h"
|
||||||
|
#include "fit_common.h"
|
||||||
#include "mkimage.h"
|
#include "mkimage.h"
|
||||||
#include <image.h>
|
#include <image.h>
|
||||||
#include <u-boot/crc.h>
|
#include <u-boot/crc.h>
|
||||||
|
|
||||||
static image_header_t header;
|
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
|
* 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) {
|
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)
|
if (destfd < 0)
|
||||||
goto err_keydest;
|
goto err_keydest;
|
||||||
destfd_size = sbuf.st_size;
|
destfd_size = sbuf.st_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
tfd = mmap_fdt(params, tmpfile, &ptr, &sbuf);
|
tfd = mmap_fdt(params->cmdname, tmpfile, &ptr, &sbuf, 1);
|
||||||
if (tfd < 0)
|
if (tfd < 0)
|
||||||
goto err_mmap;
|
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