[U-Boot-Users] [PATCH] adds loadi sub command to fpag

eran liberty eran.liberty at gmail.com
Thu Jun 21 08:25:12 CEST 2007


fpga loadi <dev> <image addr>
Signed-off-by: Eran Liberty

diff -x .svn -Nuar
u-boot.git-5ffa76a032279bc6d3230b703eda32d13305ba13/common/cmd_fpga.c
u-boot.exsw6000/common/cmd_fpga.c
--- u-boot.git-5ffa76a032279bc6d3230b703eda32d13305ba13/common/cmd_fpga.c	2007-06-18
22:38:46.000000000 +0300
+++ u-boot.exsw6000/common/cmd_fpga.c	2007-06-20 19:25:51.000000000 +0300
@@ -32,6 +32,7 @@
 #endif
 #include <fpga.h>
 #include <malloc.h>
+#include <bzlib.h>

 #if 0
 #define	FPGA_DEBUG
@@ -45,6 +46,8 @@

 #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,6 +59,89 @@
 #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 +334,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 +388,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 +409,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