[U-Boot] [PATCH v2 3/4] tools: mkimage: kwbimage list command support

Prafulla Wadaskar prafulla at marvell.com
Wed Jul 22 02:01:51 CEST 2009


Signed-off-by: Prafulla Wadaskar <prafulla at marvell.com>
---
Change log:
v2: braces removed on single-line statements
coding styles func() converted to func ()
used defines for error values

 common/image.c   |    4 ++--
 tools/kwbimage.c |   41 +++++++++++++++++++++++++++++++++++++++++
 tools/kwbimage.h |    6 ++++++
 tools/mkimage.c  |    7 ++++++-
 4 files changed, 55 insertions(+), 3 deletions(-)

diff --git a/common/image.c b/common/image.c
index 845006f..e3ad3e5 100644
--- a/common/image.c
+++ b/common/image.c
@@ -159,7 +159,7 @@ static table_entry_t uimage_comp[] = {
 
 uint32_t crc32 (uint32_t, const unsigned char *, uint);
 uint32_t crc32_wd (uint32_t, const unsigned char *, uint, uint);
-static void genimg_print_size (uint32_t size);
+void genimg_print_size (uint32_t size);
 #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || defined(USE_HOSTCC)
 static void genimg_print_time (time_t timestamp);
 #endif
@@ -473,7 +473,7 @@ void memmove_wd (void *to, void *from, size_t len, ulong chunksz)
 }
 #endif /* !USE_HOSTCC */
 
-static void genimg_print_size (uint32_t size)
+void genimg_print_size (uint32_t size)
 {
 #ifndef USE_HOSTCC
 	printf ("%d Bytes = ", size);
diff --git a/tools/kwbimage.c b/tools/kwbimage.c
index f78d97a..9441a19 100644
--- a/tools/kwbimage.c
+++ b/tools/kwbimage.c
@@ -33,6 +33,8 @@
 #include <unistd.h>
 #include "kwbimage.h"
 
+extern void genimg_print_size (uint32_t size);
+
 static struct kwb_header kwbimage_header;
 static int datacmd_cnt = 0;
 
@@ -262,3 +264,42 @@ void kwbimage_set_header (struct kwb_header *hdr, struct stat *sbuf,
 	exthdr->checkSum = kwbimage_checksum8 ((void *)exthdr,
 						sizeof(extbhr_t), 0);
 }
+
+/* -l support functions */
+int kwbimage_check_header (struct kwb_header *hdr)
+{
+	bhr_t *mhdr = &hdr->kwb_hdr;
+	extbhr_t *exthdr = &hdr->kwb_exthdr;
+	uint8_t calc_hdrcsum;
+	uint8_t calc_exthdrcsum;
+
+	calc_hdrcsum = kwbimage_checksum8 ((void *)mhdr,
+			sizeof(bhr_t) - sizeof(uint8_t), 0);
+	if (calc_hdrcsum != mhdr->checkSum)
+		return MHDR_CSUM_NOT_MATCHED;
+
+	calc_exthdrcsum = kwbimage_checksum8 ((void *)exthdr,
+			sizeof(extbhr_t) - sizeof(uint8_t), 0);
+	if (calc_hdrcsum != mhdr->checkSum)
+		return MHDR_CSUM_NOT_MATCHED;
+
+	return HDR_CSUM_MATCHED;
+}
+
+void kwbimage_print_contents (struct kwb_header *hdr) {
+	bhr_t *mhdr = &hdr->kwb_hdr;
+	char * bootdev = "Unknown";
+
+	if (mhdr->blockid == IBR_HDR_SPI_ID)
+		bootdev = "spi";
+	if (mhdr->blockid == IBR_HDR_NAND_ID)
+		bootdev = "nand";
+	if (mhdr->blockid == IBR_HDR_SATA_ID)
+		bootdev = "sata";
+
+	printf ("Image Type:   Kirkwood Boot from %s Image\n", bootdev);
+	printf ("Data Size:    ");
+	genimg_print_size (mhdr->blocksize - sizeof(uint32_t));
+	printf ("Load Address: %08x\n", mhdr->destaddr);
+	printf ("Entry Point:  %08x\n", mhdr->execaddr);
+}
diff --git a/tools/kwbimage.h b/tools/kwbimage.h
index 57db29f..d32f293 100644
--- a/tools/kwbimage.h
+++ b/tools/kwbimage.h
@@ -55,6 +55,12 @@ enum kwbimage_cmd {
 	CMD_DDR_DATA
 };
 
+enum kwbimage_err {
+	EHDR_CSUM_NOT_MATCHED = -2,
+	MHDR_CSUM_NOT_MATCHED,
+	HDR_CSUM_MATCHED
+};
+
 /* typedefs */
 typedef struct bhr_t {
 	uint8_t blockid;		/*0     */
diff --git a/tools/mkimage.c b/tools/mkimage.c
index d77d1d6..71076fa 100644
--- a/tools/mkimage.c
+++ b/tools/mkimage.c
@@ -166,7 +166,7 @@ NXTARG:		;
 		usage();
 
 	if (((argc != 1) && (opt_type == IH_TYPE_KWBIMAGE)) &&
-		(xflag || lflag))
+		(xflag))
 		usage();
 
 	if (!eflag) {
@@ -231,6 +231,11 @@ NXTARG:		;
 			exit (EXIT_FAILURE);
 		}
 
+		if (!(kwbimage_check_header ((struct kwb_header *)ptr))) {
+			kwbimage_print_contents ((struct kwb_header *)ptr);
+			exit (EXIT_SUCCESS);
+		}
+
 		if (fdt_check_header (ptr)) {
 			/* old-style image */
 			image_verify_header ((char *)ptr, sbuf.st_size);
-- 
1.5.3.4



More information about the U-Boot mailing list