Browse Source

libztex: Read bitstream file in 2kb blocks with simpler and faster code

optimized libztex_configureFpgaLS() like it was done some commits
ago to libztex_configureFpgaHS()
nfactor-troky
Denis Ahrens 12 years ago
parent
commit
b48b2cc8c4
  1. 59
      libztex.c

59
libztex.c

@ -421,9 +421,8 @@ static int libztex_configureFpgaLS(struct libztex_device *ztex, const char* firm
{ {
struct libztex_fpgastate state; struct libztex_fpgastate state;
const int transactionBytes = 2048; const int transactionBytes = 2048;
unsigned char buf[transactionBytes], cs; unsigned char buf[transactionBytes];
int tries, cnt, buf_p, i; int tries, cnt, i;
ssize_t pos = 0;
FILE *fp; FILE *fp;
if (!libztex_checkCapability(ztex, CAPABILITY_FPGA)) if (!libztex_checkCapability(ztex, CAPABILITY_FPGA))
@ -442,18 +441,6 @@ static int libztex_configureFpgaLS(struct libztex_device *ztex, const char* firm
return -2; return -2;
} }
cs = 0;
while (pos < transactionBytes && !feof(fp)) {
buf[pos] = getc(fp);
cs += buf[pos++];
}
if (feof(fp))
pos--;
if (bs != 0 && bs != 1)
bs = libztex_detectBitstreamBitOrder(buf, transactionBytes < pos? transactionBytes: pos);
//* Reset fpga //* Reset fpga
cnt = libztex_resetFpga(ztex); cnt = libztex_resetFpga(ztex);
if (unlikely(cnt < 0)) { if (unlikely(cnt < 0)) {
@ -461,36 +448,24 @@ static int libztex_configureFpgaLS(struct libztex_device *ztex, const char* firm
continue; continue;
} }
if (bs == 1) do
libztex_swapBits(buf, pos); {
int length = fread(buf, 1, transactionBytes, fp);
buf_p = pos;
while (1) { if (bs != 0 && bs != 1)
i = 0; bs = libztex_detectBitstreamBitOrder(buf, length);
while (i < buf_p) { if (bs == 1)
cnt = libusb_control_transfer(ztex->hndl, 0x40, 0x32, 0, 0, &buf[i], buf_p - i, 5000); libztex_swapBits(buf, length);
if (unlikely(cnt < 0)) { cnt = libusb_control_transfer(ztex->hndl, 0x40, 0x32, 0, 0, buf, length, 5000);
applog(LOG_ERR, "%s: Failed send fpga data with err %d", ztex->repr, cnt); if (cnt != length)
break; {
} applog(LOG_ERR, "%s: Failed send hs fpga data", ztex->repr);
i += cnt;
}
if (i < buf_p || buf_p < transactionBytes)
break; break;
buf_p = 0;
while (buf_p < transactionBytes && !feof(fp)) {
buf[buf_p] = getc(fp);
cs += buf[buf_p++];
} }
if (feof(fp))
buf_p--;
pos += buf_p;
if (buf_p == 0)
break;
if (bs == 1)
libztex_swapBits(buf, buf_p);
} }
if (cnt >= 0) while (!feof(fp));
if (cnt > 0)
tries = 0; tries = 0;
fclose(fp); fclose(fp);

Loading…
Cancel
Save