public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: eran.liberty at gmail.com <eran.liberty@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot-Users] [PATCH] add: fpga loadi <dev> <src> sub command.
Date: Tue, 03 Jul 2007 16:51:45 -0000	[thread overview]
Message-ID: <E1I5lbL-0004T6-WE@mail.sourceforge.net> (raw)

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@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"

             reply	other threads:[~2007-07-03 16:51 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-07-03 16:51 eran.liberty at gmail.com [this message]
2007-07-03 17:50 ` [U-Boot-Users] [PATCH] add: fpga loadi <dev> <src> sub command Grant Likely
2007-07-04  7:13   ` eran liberty
2007-07-04 16:23     ` Grant Likely

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=E1I5lbL-0004T6-WE@mail.sourceforge.net \
    --to=eran.liberty@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox