in sdk/userspace/fpga_mgmt_tools/src/virtual_jtag_server.c [138:280]
static void read_packet(XvcClient * c) {
unsigned char * cbuf;
unsigned char * cend;
unsigned fill;
reply_buf_size(max_packet_len);
struct timeval stop, start;
read_more:
cbuf = c->buf;
cend = cbuf + c->buf_len;
fill = 0;
reply_len = 0;
for (;;) {
unsigned char * p = cbuf;
unsigned char * e = p + 30 < cend ? p + 30 : cend;
int len;
while (p < e && *p != ':') {
// printf("cycle: %d at %x ", *p, p);
p++;
}
if (p >= e) {
if (p - cbuf >= 30) {
fprintf(stderr, "protocol error: received %.30s\n", cbuf);
goto error;
}
fill = 1;
break;
}
p++;
len = p - cbuf;
if (len == 8 && memcmp(cbuf, "getinfo:", len) == 0) {
snprintf((char *)reply_buf + reply_len, 100, "xvcServer_v%u.%u:%u\n",
XVC_VERSION / 10, XVC_VERSION % 10, c->buf_max);
reply_len += strlen((char *)reply_buf + reply_len);
goto reply;
}
if (len == 6 && memcmp(cbuf, "shift:", len) == 0) {
gettimeofday(&start, NULL);
unsigned bits;
unsigned bytes;
if (cend < p + 4) {
fill = 1;
break;
}
bits = get_uint_le(p, 4);
bytes = (bits + 7) / 8;
if (cend < p + 4 + bytes * 2) {
assert(p + 4 + bytes * 2 - cbuf <= c->buf_max);
fill = 1;
break;
}
p += 4;
if (!c->pending_error[0]) {
// fprintf(stdout, "bits received %d %d %x %x\n", bits, bytes, p[0], p[bytes]);
shift_tms_tdi(c->jtag_pci_bar, bits, p, p + bytes, reply_buf + reply_len);
}
if (c->pending_error[0]) {
printf("Problem\n");
memset(reply_buf + reply_len, 0, bytes);
}
reply_len += bytes;
p += bytes * 2;
gettimeofday(&stop, NULL);
//printf("Shift external %lu u-seconds\n", stop.tv_usec - start.tv_usec);
goto reply_with_optional_status;
}
if (len == 7 && memcmp(cbuf, "settck:", len) == 0) {
unsigned long nsperiod;
unsigned long resnsperiod;
if (cend < p + 4) {
fill = 1;
break;
}
nsperiod = get_uint_le(p, 4);
p += 4;
if (!c->pending_error[0])
set_tck(nsperiod, &resnsperiod);
if (c->pending_error[0])
resnsperiod = nsperiod;
set_uint_le(reply_buf + reply_len, 4, resnsperiod);
reply_len += 4;
goto reply_with_optional_status;
}
// fprintf(stderr, "protocol error: received len %d", (int)len);
fprintf(stderr, "protocol error: received %.*s\n", (int)len, cbuf);
goto error;
reply_with_optional_status:
// printf("Here2\n");
if (!c->enable_status) goto reply;
reply:
cbuf = p;
}
if (c->buf < cbuf) {
if (send_packet(c, reply_buf, reply_len) < 0) goto error;
consume_packet(c, cbuf - c->buf);
gettimeofday(&stop, NULL);
// if (start.tv_usec != 0)
// printf("Shift send packet %lu u-seconds\n", stop.tv_usec - start.tv_usec);
if (c->buf_len && !fill) goto read_more;
}
{
int len = recv(c->fd, c->buf + c->buf_len, c->buf_max - c->buf_len, 0);
if (len > 0) {
c->buf_len += len;
goto read_more;
}
if (len < 0) goto error;
}
return;
error:
fprintf(stderr, "XVC connection terminated: error %d\n", errno);
}