
adds the the sub command loadi to fpga. this will load an fpga image that was u-boot packed with mkimage. the image may be plain, gzip or bzip2 as with the kernel and fs images. =============== sof ======================= diff -x .svn -Nuar u-boot.git/common/cmd_fpga.c u-boot-exsw6000/common/cmd_fpga.c --- u-boot.git/common/cmd_fpga.c 2007-05-28 02:11:11.000000000 +0300 +++ u-boot-exsw6000/common/cmd_fpga.c 2007-06-03 22:13:42.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)) { @@ -313,12 +405,13 @@ }
U_BOOT_CMD (fpga, 6, 1, do_fpga, - "fpga - loadable FPGA image support\n", - "fpga [operation type] [device number] [image address] [image size]\n" - "fpga operations:\n" - "\tinfo\tlist known device information\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" - "\tdump\tLoad device to memory buffer\n"); + "fpga - loadable FPGA image support\n", + "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" + "\tdump\tLoad device to memory buffer\n"); #endif /* CONFIG_FPGA && CONFIG_COMMANDS & CFG_CMD_FPGA */ =============== eof =======================