HS bitstream configuration
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
diff --git a/libztex.c b/libztex.c
index 3440d22..a73130f 100644
--- a/libztex.c
+++ b/libztex.c
@@ -125,6 +125,107 @@ static int libztex_getFpgaState(struct libztex_device *ztex, struct libztex_fpga
return 0;
}
+static int libztex_configureFpgaHS(struct libztex_device *ztex, const char* firmware, bool force, char bs)
+{
+ struct libztex_fpgastate state;
+ const int transactionBytes = 65536;
+ unsigned char buf[transactionBytes], settings[2];
+ int tries, cnt, buf_p, i;
+ ssize_t pos = 0;
+ FILE *fp;
+
+ if (!libztex_checkCapability(ztex, CAPABILITY_HS_FPGA))
+ return -1;
+ libztex_getFpgaState(ztex, &state);
+ if (!force && state.fpgaConfigured) {
+ applog(LOG_INFO, "Bitstream already configured");
+ return 1;
+ }
+ cnt = libusb_control_transfer(ztex->hndl, 0xc0, 0x33, 0, 0, settings, 2, 1000);
+ if (unlikely(cnt < 0)) {
+ applog(LOG_ERR, "%s: Failed getHSFpgaSettings with err %d", ztex->repr, cnt);
+ return cnt;
+ }
+
+ libusb_claim_interface(ztex->hndl, settings[1]);
+
+ for (tries = 3; tries > 0; tries--) {
+ fp = fopen(firmware, "rb");
+ if (!fp) {
+ applog(LOG_ERR, "%s: failed to read firmware '%s'", ztex->repr, firmware);
+ return -2;
+ }
+
+ while (pos < transactionBytes && !feof(fp)) {
+ buf[pos++] = getc(fp);
+ }
+
+ if (feof(fp))
+ pos--;
+
+ if (bs != 0 && bs != 1)
+ bs = libztex_detectBitstreamBitOrder(buf, transactionBytes < pos? transactionBytes: pos);
+
+
+ if (bs == 1)
+ libztex_swapBits(buf, pos);
+
+ libusb_control_transfer(ztex->hndl, 0x40, 0x34, 0, 0, NULL, 0, 1000);
+ // 0x34 - initHSFPGAConfiguration
+
+ buf_p = pos;
+ while (1) {
+ i = 0;
+ while (i < buf_p) {
+ if (libusb_bulk_transfer(ztex->hndl,
+ settings[0],
+ &buf[i],
+ buf_p - i,
+ &cnt, 1000) != 0) {
+ applog(LOG_ERR, "%s: Failed send hs fpga data", ztex->repr);
+ break;
+ }
+ usleep(500);
+ i += cnt;
+ }
+ if (i < buf_p || buf_p < transactionBytes)
+ break;
+ buf_p = 0;
+ while (buf_p < transactionBytes && !feof(fp)) {
+ buf[buf_p++] = getc(fp);
+ }
+ if (feof(fp))
+ buf_p--;
+ pos += buf_p;
+ if (buf_p == 0)
+ break;
+ if (bs == 1)
+ libztex_swapBits(buf, buf_p);
+ }
+
+ libusb_control_transfer(ztex->hndl, 0x40, 0x35, 0, 0, NULL, 0, 1000);
+ // 0x35 - finishHSFPGAConfiguration
+ if (cnt >= 0)
+ tries = 0;
+
+ fclose(fp);
+
+ libztex_getFpgaState(ztex, &state);
+ if (!state.fpgaConfigured) {
+ applog(LOG_ERR, "%s: HS FPGA configuration failed: DONE pin does not go high", ztex->repr);
+ return -3;
+ }
+
+ }
+
+ libusb_release_interface(ztex->hndl, settings[1]);
+
+ usleep(200000);
+ applog(LOG_INFO, "%s: HS FPGA configuration done", ztex->repr);
+ return 0;
+
+}
+
static int libztex_configureFpgaLS(struct libztex_device *ztex, const char* firmware, bool force, char bs)
{
struct libztex_fpgastate state;
@@ -216,12 +317,15 @@ static int libztex_configureFpgaLS(struct libztex_device *ztex, const char* firm
int libztex_configureFpga(struct libztex_device *ztex)
{
char buf[256] = "bitstreams/";
+ int rv;
memset(&buf[11], 0, 245);
strcpy(&buf[11], ztex->bitFileName);
strcpy(&buf[strlen(buf)], ".bit");
-
- return libztex_configureFpgaLS(ztex, buf, true, 2);
+ rv = libztex_configureFpgaHS(ztex, buf, true, 2);
+ if (rv != 0)
+ rv = libztex_configureFpgaLS(ztex, buf, true, 2);
+ return rv;
}
int libztex_numberOfFpgas(struct libztex_device *ztex) {