+#define FPGA_LOADMK 4
+
+/* Convert bitstream data and load into the fpga */
+int fpga_loadbitstream(unsigned long dev, char* fpgadata, size_t size)
+{
+ unsigned int length;
+ unsigned char* swapdata;
+ unsigned int swapsize;
+ char buffer[80];
+ unsigned char *ptr;
+ unsigned char *dataptr;
+ unsigned char data;
+ unsigned int i;
+ int rc;
+
+ dataptr = (unsigned char *)fpgadata;
+
+#if CFG_FPGA_XILINX
+ /* skip the first bytes of the bitsteam, their meaning is unknown */
+ length = (*dataptr << 8) + *(dataptr+1);
+ dataptr+=2;
+ dataptr+=length;
+
+ /* get design name (identifier, length, string) */
+ length = (*dataptr << 8) + *(dataptr+1);
+ dataptr+=2;
+ if (*dataptr++ != 0x61) {
+ PRINTF ("%s: Design name identifier not recognized in bitstream\n",
+ __FUNCTION__ );
+ return FPGA_FAIL;
+ }
+
+ length = (*dataptr << 8) + *(dataptr+1);
+ dataptr+=2;
+ for(i=0;i<length;i++)
+ buffer[i]=*dataptr++;
+
+ printf(" design filename = \"%s\"\n", buffer);
+
+ /* get part number (identifier, length, string) */
+ if (*dataptr++ != 0x62) {
+ printf("%s: Part number identifier not recognized in bitstream\n",
+ __FUNCTION__ );
+ return FPGA_FAIL;
+ }
+
+ length = (*dataptr << 8) + *(dataptr+1);
+ dataptr+=2;
+ for(i=0;i<length;i++)
+ buffer[i]=*dataptr++;
+ printf(" part number = \"%s\"\n", buffer);
+
+ /* get date (identifier, length, string) */
+ if (*dataptr++ != 0x63) {
+ printf("%s: Date identifier not recognized in bitstream\n",
+ __FUNCTION__);
+ return FPGA_FAIL;
+ }
+
+ length = (*dataptr << 8) + *(dataptr+1);
+ dataptr+=2;
+ for(i=0;i<length;i++)
+ buffer[i]=*dataptr++;
+ printf(" date = \"%s\"\n", buffer);
+
+ /* get time (identifier, length, string) */
+ if (*dataptr++ != 0x64) {
+ printf("%s: Time identifier not recognized in bitstream\n",__FUNCTION__);
+ return FPGA_FAIL;
+ }
+
+ length = (*dataptr << 8) + *(dataptr+1);
+ dataptr+=2;
+ for(i=0;i<length;i++)
+ buffer[i]=*dataptr++;
+ printf(" time = \"%s\"\n", buffer);
+
+ /* get fpga data length (identifier, length) */
+ if (*dataptr++ != 0x65) {
+ printf("%s: Data length identifier not recognized in bitstream\n",
+ __FUNCTION__);
+ return FPGA_FAIL;
+ }
+ swapsize = ((unsigned int) *dataptr <<24) +
+ ((unsigned int) *(dataptr+1) <<16) +
+ ((unsigned int) *(dataptr+2) <<8 ) +
+ ((unsigned int) *(dataptr+3) ) ;
+ dataptr+=4;
+ printf(" bytes in bitstream = %d\n", swapsize);
+
+ /* check consistency of length obtained */
+ if (swapsize >= size) {
+ printf("%s: Could not find right length of data in bitstream\n",
+ __FUNCTION__);
+ return FPGA_FAIL;
+ }
+
+ /* allocate memory */
+ swapdata = (unsigned char *)malloc(swapsize);
+ if (swapdata == NULL) {
+ printf("%s: Could not allocate %d bytes memory !\n",
+ __FUNCTION__, swapsize);
+ return FPGA_FAIL;
+ }
+
+ /* read data into memory and swap bits */
+ ptr = swapdata;
+ for (i = 0; i < swapsize; i++) {
+ data = 0x00;
+ data |= (*dataptr & 0x01) << 7;
+ data |= (*dataptr & 0x02) << 5;
+ data |= (*dataptr & 0x04) << 3;
+ data |= (*dataptr & 0x08) << 1;
+ data |= (*dataptr & 0x10) >> 1;
+ data |= (*dataptr & 0x20) >> 3;
+ data |= (*dataptr & 0x40) >> 5;
+ data |= (*dataptr & 0x80) >> 7;
+ *ptr++ = data;
+ dataptr++;
+ }
+
+ rc = fpga_load(dev, swapdata, swapsize);
+ free(swapdata);
+ return rc;
+#else
+ printf("Bitstream support only for Xilinx devices\n");
+ return FPGA_FAIL;
+#endif
+}