tools: mkimage: add support for gpimage format
This patch add support for gpimage format as a preparatory
patch for porting u-boot for keystone2 devices and is
based on omapimage format. It re-uses gph header to store the
size and loadaddr as done in omapimage.c
Signed-off-by: Vitaly Andrianov <vitalya@ti.com>
Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
Acked-by: Tom Rini <trini@ti.com>
diff --git a/tools/omapimage.c b/tools/omapimage.c
index d59bc4d..1e0c164 100644
--- a/tools/omapimage.c
+++ b/tools/omapimage.c
@@ -15,57 +15,24 @@
*/
#include "imagetool.h"
+#include <compiler.h>
#include <image.h>
+#include "gpheader.h"
#include "omapimage.h"
/* Header size is CH header rounded up to 512 bytes plus GP header */
#define OMAP_CH_HDR_SIZE 512
-#define OMAP_GP_HDR_SIZE (sizeof(struct gp_header))
-#define OMAP_FILE_HDR_SIZE (OMAP_CH_HDR_SIZE+OMAP_GP_HDR_SIZE)
+#define OMAP_FILE_HDR_SIZE (OMAP_CH_HDR_SIZE + GPIMAGE_HDR_SIZE)
static int do_swap32 = 0;
-static uint32_t omapimage_swap32(uint32_t data)
-{
- uint32_t result = 0;
- result = (data & 0xFF000000) >> 24;
- result |= (data & 0x00FF0000) >> 8;
- result |= (data & 0x0000FF00) << 8;
- result |= (data & 0x000000FF) << 24;
- return result;
-}
-
static uint8_t omapimage_header[OMAP_FILE_HDR_SIZE];
static int omapimage_check_image_types(uint8_t type)
{
if (type == IH_TYPE_OMAPIMAGE)
return EXIT_SUCCESS;
- else {
- return EXIT_FAILURE;
- }
-}
-
-/*
- * Only the simplest image type is currently supported:
- * TOC pointing to CHSETTINGS
- * TOC terminator
- * CHSETTINGS
- *
- * padding to OMAP_CH_HDR_SIZE bytes
- *
- * gp header
- * size
- * load_addr
- */
-static int valid_gph_size(uint32_t size)
-{
- return size;
-}
-
-static int valid_gph_load_addr(uint32_t load_addr)
-{
- return load_addr;
+ return EXIT_FAILURE;
}
static int omapimage_verify_header(unsigned char *ptr, int image_size,
@@ -73,13 +40,13 @@
{
struct ch_toc *toc = (struct ch_toc *)ptr;
struct gp_header *gph = (struct gp_header *)(ptr+OMAP_CH_HDR_SIZE);
- uint32_t offset, size, gph_size, gph_load_addr;
+ uint32_t offset, size;
while (toc->section_offset != 0xffffffff
&& toc->section_size != 0xffffffff) {
if (do_swap32) {
- offset = omapimage_swap32(toc->section_offset);
- size = omapimage_swap32(toc->section_size);
+ offset = cpu_to_be32(toc->section_offset);
+ size = cpu_to_be32(toc->section_size);
} else {
offset = toc->section_offset;
size = toc->section_size;
@@ -92,20 +59,7 @@
toc++;
}
- if (do_swap32) {
- gph_size = omapimage_swap32(gph->size);
- gph_load_addr = omapimage_swap32(gph->load_addr);
- } else {
- gph_size = gph->size;
- gph_load_addr = gph->load_addr;
- }
-
- if (!valid_gph_size(gph_size))
- return -1;
- if (!valid_gph_load_addr(gph_load_addr))
- return -1;
-
- return 0;
+ return gph_verify_header(gph, do_swap32);
}
static void omapimage_print_section(struct ch_settings *chs)
@@ -135,13 +89,13 @@
const struct ch_toc *toc = (struct ch_toc *)ptr;
const struct gp_header *gph =
(struct gp_header *)(ptr+OMAP_CH_HDR_SIZE);
- uint32_t offset, size, gph_size, gph_load_addr;
+ uint32_t offset, size;
while (toc->section_offset != 0xffffffff
&& toc->section_size != 0xffffffff) {
if (do_swap32) {
- offset = omapimage_swap32(toc->section_offset);
- size = omapimage_swap32(toc->section_size);
+ offset = cpu_to_be32(toc->section_offset);
+ size = cpu_to_be32(toc->section_size);
} else {
offset = toc->section_offset;
size = toc->section_size;
@@ -160,26 +114,7 @@
toc++;
}
- if (do_swap32) {
- gph_size = omapimage_swap32(gph->size);
- gph_load_addr = omapimage_swap32(gph->load_addr);
- } else {
- gph_size = gph->size;
- gph_load_addr = gph->load_addr;
- }
-
- if (!valid_gph_size(gph_size)) {
- fprintf(stderr, "Error: invalid image size %x\n", gph_size);
- exit(EXIT_FAILURE);
- }
-
- if (!valid_gph_load_addr(gph_load_addr)) {
- fprintf(stderr, "Error: invalid image load address %x\n",
- gph_load_addr);
- exit(EXIT_FAILURE);
- }
-
- printf("GP Header: Size %x LoadAddr %x\n", gph_size, gph_load_addr);
+ gph_print_header(gph, do_swap32);
}
static int toc_offset(void *hdr, void *member)
@@ -208,8 +143,8 @@
toc++;
memset(toc, 0xff, sizeof(*toc));
- gph->size = sbuf->st_size - OMAP_FILE_HDR_SIZE;
- gph->load_addr = params->addr;
+ gph_set_header(gph, sbuf->st_size - OMAP_FILE_HDR_SIZE,
+ params->addr, 0);
if (strncmp(params->imagename, "byteswap", 8) == 0) {
do_swap32 = 1;
@@ -217,20 +152,13 @@
uint32_t *data = (uint32_t *)ptr;
while (swapped <= (sbuf->st_size / sizeof(uint32_t))) {
- *data = omapimage_swap32(*data);
+ *data = cpu_to_be32(*data);
swapped++;
data++;
}
}
}
-int omapimage_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));
-}
-
/*
* omapimage parameters
*/
@@ -242,7 +170,7 @@
.verify_header = omapimage_verify_header,
.print_header = omapimage_print_header,
.set_header = omapimage_set_header,
- .check_params = omapimage_check_params,
+ .check_params = gpimage_check_params,
};
void init_omap_image_type(void)