[U-Boot-Users] [PATCH] add: fpga loadi <dev> <src> sub command.

eran.liberty at gmail.com eran.liberty at gmail.com
Tue Jul 3 18:51:45 CEST 2007


Adds the capability to load an image packaged with mkimage either in compressed form or not.
(raw gzip & bzip2 images packed with mkimage)

fpga loadi <device number> <address of image>

Signed-off-by: Eran Liberty <eran.liberty at gmail.com>

Index: common/cmd_fpga.c
===================================================================
--- common/cmd_fpga.c	(.../tags/trunk/20070620_2_merge_to_exsw6000)	(revision 69)
+++ common/cmd_fpga.c	(.../branches/exsw6000)	(revision 69)
@@ -32,6 +32,7 @@
 #endif
 #include <fpga.h>
 #include <malloc.h>
+#include <bzlib.h>
 
 #if 0
 #define	FPGA_DEBUG
@@ -45,6 +46,9 @@
 
 #if defined (CONFIG_FPGA) && ( CONFIG_COMMANDS & CFG_CMD_FPGA )
 
+extern int gunzip (void *dst, int dstlen, unsigned char *src,
+		   unsigned long *lenp);
+
 /* Local functions */
 static void fpga_usage (cmd_tbl_t * cmdtp);
 static int fpga_get_op (char *opstr);
@@ -56,7 +60,92 @@
 #define FPGA_LOADB  2
 #define FPGA_DUMP   3
 #define FPGA_LOADMK 4
+#define FPGA_LOADI  5
 
+/* Load an image */
+int fpga_loadi (int devnum, void *buf)
+{
+	ulong addr = (ulong) (buf);
+	ulong data, len, checksum;
+	image_header_t hdr;
+	unsigned int unc_len;
+	unsigned int *punc_len = &unc_len;
+	int i;
+
+	/* Copy header so we can blank CRC field for re-calculation */
+#ifdef CONFIG_HAS_DATAFLASH
+	if (addr_dataflash (addr)) {
+		read_dataflash (addr, sizeof (image_header_t), (char *)&hdr);
+	} else
+#endif
+		memmove (&hdr, (char *)addr, sizeof (image_header_t));
+	if (ntohl (hdr.ih_magic) != IH_MAGIC) {
+		puts ("Bad Magic Number\n");
+		return 1;
+	}
+	data = (ulong) & hdr;
+	len = sizeof (image_header_t);
+
+	checksum = ntohl (hdr.ih_hcrc);
+	hdr.ih_hcrc = 0;
+
+	if (crc32 (0, (uchar *) data, len) != checksum) {
+		puts ("Bad Header Checksum\n");
+		return 1;
+	}
+#ifdef CONFIG_HAS_DATAFLASH
+	if (addr_dataflash (addr)) {
+		len = ntohl (hdr.ih_size) + sizeof (image_header_t);
+		read_dataflash (addr, len, (char *)CFG_LOAD_ADDR);
+		addr = CFG_LOAD_ADDR;
+	}
+#endif
+
+	print_image_hdr ((image_header_t *) addr);
+
+	data = addr + sizeof (image_header_t);
+	len = ntohl (hdr.ih_size);
+
+	puts ("   Verifying Checksum ... ");
+	if (crc32 (0, (uchar *) data, len) != ntohl (hdr.ih_dcrc)) {
+		printf ("Bad Data CRC\n");
+		return 1;
+	}
+	puts ("OK\n");
+
+	switch (hdr.ih_comp) {
+	case IH_COMP_NONE:
+		memmove ((char *)CFG_LOAD_ADDR, (void *)data, len);
+		break;
+	case IH_COMP_GZIP:
+		if (gunzip
+		    ((char *)CFG_LOAD_ADDR, unc_len, (uchar *) data, &len)
+		    != 0) {
+			puts ("GUNZIP ERROR - FPGA not loaded\n");
+			return 1;
+		}
+		len = unc_len;
+		break;
+
+#ifdef CONFIG_BZIP2
+	case IH_COMP_BZIP2:
+		i = BZ2_bzBuffToBuffDecompress ((char *)CFG_LOAD_ADDR, punc_len,
+						(char *)data, len, 1, 0);
+		if (i != BZ_OK) {
+			printf ("BUNZIP2 ERROR %d - FPGA not loaded!\n", i);
+			return 1;
+		}
+		len = unc_len;
+		break;
+#endif				/* CONFIG_BZIP2 */
+	default:
+		printf ("Unimplemented compression type %d\n", hdr.ih_comp);
+		return 1;
+	}
+	
+	return fpga_load(devnum,(char *)CFG_LOAD_ADDR,len);
+}
+
 /* Convert bitstream data and load into the fpga */
 int fpga_loadbitstream(unsigned long dev, char* fpgadata, size_t size)
 {
@@ -248,6 +337,10 @@
 		rc = fpga_load (dev, fpga_data, data_size);
 		break;
 
+	case FPGA_LOADI:
+		rc = fpga_loadi (dev, fpga_data);
+		break;
+
 	case FPGA_LOADB:
 		rc = fpga_loadbitstream(dev, fpga_data, data_size);
 		break;
@@ -298,6 +391,8 @@
 		op = FPGA_INFO;
 	} else if (!strcmp ("loadb", opstr)) {
 		op = FPGA_LOADB;
+	} else if (!strcmp ("loadi", opstr)) {
+		op = FPGA_LOADI;
 	} else if (!strcmp ("load", opstr)) {
 		op = FPGA_LOAD;
 	} else if (!strcmp ("loadmk", opstr)) {
@@ -317,6 +412,7 @@
 	    "fpga [operation type] [device number] [image address] [image size]\n"
 	    "fpga operations:\n"
 	    "\tinfo\tlist known device information\n"
+	    "\tloadi\tLoad device from u-boot image\n"
 	    "\tload\tLoad device from memory buffer\n"
 	    "\tloadb\tLoad device from bitstream buffer (Xilinx devices only)\n"
 	    "\tloadmk\tLoad device generated with mkimage\n"





More information about the U-Boot mailing list