Skip to content

Commit

Permalink
tools: moved code common to all image tools to a separated module.
Browse files Browse the repository at this point in the history
In order to avoid duplicating code and keep only one point of modification,
the functions, structs and defines useful for "dumpimage" were moved from
"mkimage" to a common module called "imagetool".

This modification also weakens the coupling between image types (FIT, IMX, MXS,
and so on) and image tools (mkimage and dumpimage). Any tool may initialize the
"imagetool" through register_image_tool() function, while the image types
register themselves within an image tool using the register_image_type()
function:

                                                      +---------------+
                                               +------|   fit_image   |
 +--------------+          +-----------+       |      +---------------+
 |    mkimage   |--------> |           | <-----+
 +--------------+          |           |              +---------------+
                           | imagetool | <------------|    imximage   |
 +--------------+          |           |              +---------------+
 |  dumpimage   |--------> |           | <-----+
 +--------------+          +-----------+       |      +---------------+
                                               +------| default_image |
                                                      +---------------+

          register_image_tool()           register_image_type()

Also, the struct "mkimage_params" was renamed to "image_tool_params" to make
clear its general purpose.

Signed-off-by: Guilherme Maciel Ferreira <[email protected]>
Signed-off-by: Simon Glass <[email protected]>
  • Loading branch information
guilhermeferreira authored and trini committed Dec 13, 2013
1 parent f1cc458 commit f86ed6a
Show file tree
Hide file tree
Showing 14 changed files with 276 additions and 191 deletions.
2 changes: 2 additions & 0 deletions tools/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ NOPED_OBJ_FILES-y += fit_image.o
NOPED_OBJ_FILES-y += image-host.o
NOPED_OBJ_FILES-y += imximage.o
NOPED_OBJ_FILES-y += kwbimage.o
NOPED_OBJ_FILES-y += imagetool.o
NOPED_OBJ_FILES-y += mkenvimage.o
NOPED_OBJ_FILES-y += mkimage.o
NOPED_OBJ_FILES-y += mxsimage.o
Expand Down Expand Up @@ -212,6 +213,7 @@ $(obj)mkimage$(SFX): $(obj)aisimage.o \
$(obj)image-fit.o \
$(obj)image-host.o \
$(obj)image.o \
$(obj)imagetool.o \
$(obj)imximage.o \
$(obj)kwbimage.o \
$(obj)md5.o \
Expand Down
16 changes: 8 additions & 8 deletions tools/aisimage.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* SPDX-License-Identifier: GPL-2.0+
*/

#include "mkimage.h"
#include "imagetool.h"
#include "aisimage.h"
#include <image.h>

Expand Down Expand Up @@ -176,7 +176,7 @@ static uint32_t *ais_insert_cmd_header(uint32_t cmd, uint32_t nargs,

}

static uint32_t *ais_alloc_buffer(struct mkimage_params *params)
static uint32_t *ais_alloc_buffer(struct image_tool_params *params)
{
int dfd;
struct stat sbuf;
Expand Down Expand Up @@ -216,7 +216,7 @@ static uint32_t *ais_alloc_buffer(struct mkimage_params *params)
return ptr;
}

static uint32_t *ais_copy_image(struct mkimage_params *params,
static uint32_t *ais_copy_image(struct image_tool_params *params,
uint32_t *aisptr)

{
Expand Down Expand Up @@ -252,7 +252,7 @@ static uint32_t *ais_copy_image(struct mkimage_params *params,

}

static int aisimage_generate(struct mkimage_params *params,
static int aisimage_generate(struct image_tool_params *params,
struct image_type_params *tparams)
{
FILE *fd = NULL;
Expand Down Expand Up @@ -370,7 +370,7 @@ static int aisimage_check_image_types(uint8_t type)
}

static int aisimage_verify_header(unsigned char *ptr, int image_size,
struct mkimage_params *params)
struct image_tool_params *params)
{
struct ais_header *ais_hdr = (struct ais_header *)ptr;

Expand All @@ -384,11 +384,11 @@ static int aisimage_verify_header(unsigned char *ptr, int image_size,
}

static void aisimage_set_header(void *ptr, struct stat *sbuf, int ifd,
struct mkimage_params *params)
struct image_tool_params *params)
{
}

int aisimage_check_params(struct mkimage_params *params)
int aisimage_check_params(struct image_tool_params *params)
{
if (!params)
return CFG_INVALID;
Expand Down Expand Up @@ -427,5 +427,5 @@ static struct image_type_params aisimage_params = {

void init_ais_image_type(void)
{
mkimage_register(&aisimage_params);
register_image_type(&aisimage_params);
}
10 changes: 5 additions & 5 deletions tools/default_image.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* SPDX-License-Identifier: GPL-2.0+
*/

#include "mkimage.h"
#include "imagetool.h"
#include <image.h>
#include <u-boot/crc.h>

Expand All @@ -29,15 +29,15 @@ static int image_check_image_types(uint8_t type)
return EXIT_FAILURE;
}

static int image_check_params(struct mkimage_params *params)
static int image_check_params(struct image_tool_params *params)
{
return ((params->dflag && (params->fflag || params->lflag)) ||
(params->fflag && (params->dflag || params->lflag)) ||
(params->lflag && (params->dflag || params->fflag)));
}

static int image_verify_header(unsigned char *ptr, int image_size,
struct mkimage_params *params)
struct image_tool_params *params)
{
uint32_t len;
const unsigned char *data;
Expand Down Expand Up @@ -86,7 +86,7 @@ static int image_verify_header(unsigned char *ptr, int image_size,
}

static void image_set_header(void *ptr, struct stat *sbuf, int ifd,
struct mkimage_params *params)
struct image_tool_params *params)
{
uint32_t checksum;

Expand Down Expand Up @@ -133,5 +133,5 @@ static struct image_type_params defimage_params = {

void init_default_image_type(void)
{
mkimage_register(&defimage_params);
register_image_type(&defimage_params);
}
11 changes: 6 additions & 5 deletions tools/fit_image.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,15 @@
* SPDX-License-Identifier: GPL-2.0+
*/

#include "imagetool.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 mkimage_params *params)
struct image_tool_params *params)
{
return fdt_check_header(ptr);
}
Expand All @@ -34,7 +35,7 @@ static int fit_check_image_types (uint8_t type)
return EXIT_FAILURE;
}

int mmap_fdt(struct mkimage_params *params, const char *fname, void **blobp,
int mmap_fdt(struct image_tool_params *params, const char *fname, void **blobp,
struct stat *sbuf)
{
void *ptr;
Expand Down Expand Up @@ -88,7 +89,7 @@ int mmap_fdt(struct mkimage_params *params, const char *fname, void **blobp,
* returns:
* only on success, otherwise calls exit (EXIT_FAILURE);
*/
static int fit_handle_file (struct mkimage_params *params)
static int fit_handle_file(struct image_tool_params *params)
{
char tmpfile[MKIMAGE_MAX_TMPFILE_LEN];
char cmd[MKIMAGE_MAX_DTC_CMDLINE_LEN];
Expand Down Expand Up @@ -184,7 +185,7 @@ static int fit_handle_file (struct mkimage_params *params)
return -1;
}

static int fit_check_params (struct mkimage_params *params)
static int fit_check_params(struct image_tool_params *params)
{
return ((params->dflag && (params->fflag || params->lflag)) ||
(params->fflag && (params->dflag || params->lflag)) ||
Expand All @@ -205,5 +206,5 @@ static struct image_type_params fitimage_params = {

void init_fit_image_type (void)
{
mkimage_register (&fitimage_params);
register_image_type(&fitimage_params);
}
58 changes: 58 additions & 0 deletions tools/imagetool.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*
* (C) Copyright 2013
*
* Written by Guilherme Maciel Ferreira <[email protected]>
*
* SPDX-License-Identifier: GPL-2.0+
*/

#include "imagetool.h"

/*
* Callback function to register a image type within a tool
*/
static imagetool_register_t register_func;

/*
* register_image_tool -
*
* The tool provides its own registration function in order to all image
* types initialize themselves.
*/
void register_image_tool(imagetool_register_t image_register)
{
/*
* Save the image tool callback function. It will be used to register
* image types within that tool
*/
register_func = image_register;

/* Init Freescale PBL Boot image generation/list support */
init_pbl_image_type();
/* Init Kirkwood Boot image generation/list support */
init_kwb_image_type();
/* Init Freescale imx Boot image generation/list support */
init_imx_image_type();
/* Init Freescale mxs Boot image generation/list support */
init_mxs_image_type();
/* Init FIT image generation/list support */
init_fit_image_type();
/* Init TI OMAP Boot image generation/list support */
init_omap_image_type();
/* Init Default image generation/list support */
init_default_image_type();
/* Init Davinci UBL support */
init_ubl_image_type();
/* Init Davinci AIS support */
init_ais_image_type();
}

/*
* register_image_type -
*
* Register a image type within a tool
*/
void register_image_type(struct image_type_params *tparams)
{
register_func(tparams);
}
161 changes: 161 additions & 0 deletions tools/imagetool.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
/*
* (C) Copyright 2013
*
* Written by Guilherme Maciel Ferreira <[email protected]>
*
* SPDX-License-Identifier: GPL-2.0+
*/

#ifndef _IMAGETOOL_H_
#define _IMAGETOOL_H_

#include "os_support.h"
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>
#include <sha1.h>
#include "fdt_host.h"

#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))

#define IH_ARCH_DEFAULT IH_ARCH_INVALID

/*
* This structure defines all such variables those are initialized by
* mkimage and dumpimage main core and need to be referred by image
* type specific functions
*/
struct image_tool_params {
int dflag;
int eflag;
int fflag;
int lflag;
int vflag;
int xflag;
int skipcpy;
int os;
int arch;
int type;
int comp;
char *dtc;
unsigned int addr;
unsigned int ep;
char *imagename;
char *imagename2;
char *datafile;
char *imagefile;
char *cmdname;
const char *keydir; /* Directory holding private keys */
const char *keydest; /* Destination .dtb for public key */
const char *comment; /* Comment to add to signature node */
int require_keys; /* 1 to mark signing keys as 'required' */
};

/*
* image type specific variables and callback functions
*/
struct image_type_params {
/* name is an identification tag string for added support */
char *name;
/*
* header size is local to the specific image type to be supported,
* mkimage core treats this as number of bytes
*/
uint32_t header_size;
/* Image type header pointer */
void *hdr;
/*
* There are several arguments that are passed on the command line
* and are registered as flags in image_tool_params structure.
* This callback function can be used to check the passed arguments
* are in-lined with the image type to be supported
*
* Returns 1 if parameter check is successful
*/
int (*check_params) (struct image_tool_params *);
/*
* This function is used by list command (i.e. mkimage -l <filename>)
* image type verification code must be put here
*
* Returns 0 if image header verification is successful
* otherwise, returns respective negative error codes
*/
int (*verify_header) (unsigned char *, int, struct image_tool_params *);
/* Prints image information abstracting from image header */
void (*print_header) (const void *);
/*
* The header or image contents need to be set as per image type to
* be generated using this callback function.
* further output file post processing (for ex. checksum calculation,
* padding bytes etc..) can also be done in this callback function.
*/
void (*set_header) (void *, struct stat *, int,
struct image_tool_params *);
/*
* Some image generation support for ex (default image type) supports
* more than one type_ids, this callback function is used to check
* whether input (-T <image_type>) is supported by registered image
* generation/list low level code
*/
int (*check_image_type) (uint8_t);
/* This callback function will be executed if fflag is defined */
int (*fflag_handle) (struct image_tool_params *);
/*
* This callback function will be executed for variable size record
* It is expected to build this header in memory and return its length
* and a pointer to it by using image_type_params.header_size and
* image_type_params.hdr. The return value shall indicate if an
* additional padding should be used when copying the data image
* by returning the padding length.
*/
int (*vrec_header) (struct image_tool_params *,
struct image_type_params *);
/* pointer to the next registered entry in linked list */
struct image_type_params *next;
};

/*
* Tool registration function.
*/
typedef void (*imagetool_register_t)(struct image_type_params *);

/*
* Initializes all image types with the given registration callback
* function.
* An image tool uses this function to initialize all image types.
*/
void register_image_tool(imagetool_register_t image_register);

/*
* Register a image type within a tool.
* An image type uses this function to register itself within
* all tools.
*/
void register_image_type(struct image_type_params *tparams);

/*
* There is a c file associated with supported image type low level code
* for ex. default_image.c, fit_image.c
* init_xxx_type() is the only function referred by image tool core to avoid
* a single lined header file, you can define them here
*
* Supported image types init functions
*/
void init_default_image_type(void);
void init_pbl_image_type(void);
void init_ais_image_type(void);
void init_kwb_image_type(void);
void init_imx_image_type(void);
void init_mxs_image_type(void);
void init_fit_image_type(void);
void init_ubl_image_type(void);
void init_omap_image_type(void);

void pbl_load_uboot(int fd, struct image_tool_params *mparams);

#endif /* _IMAGETOOL_H_ */
Loading

0 comments on commit f86ed6a

Please sign in to comment.