
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"