OpenOCD
vdebug.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
2 
3 /* Copyright 2020-2022 Cadence Design Systems, Inc. */
4 
15 #ifdef HAVE_CONFIG_H
16 #include "config.h"
17 #endif
18 
19 #ifdef _WIN32
20 #define WIN32_LEAN_AND_MEAN
21 #include <windows.h>
22 #else
23 #ifdef HAVE_UNISTD_H
24 #include <unistd.h> /* close */
25 #endif
26 #ifdef HAVE_SYS_SOCKET_H
27 #include <sys/socket.h>
28 #endif
29 #ifdef HAVE_ARPA_INET_H
30 #include <arpa/inet.h>
31 #endif
32 #ifdef HAVE_NETDB_H
33 #include <netdb.h>
34 #endif
35 #endif
36 #include <stdio.h>
37 #ifdef HAVE_STDINT_H
38 #include <stdint.h>
39 #endif
40 #ifdef HAVE_STDLIB_H
41 #include <stdlib.h>
42 #endif
43 #include <stdarg.h>
44 #include <string.h>
45 #include <errno.h>
46 
47 #include "jtag/interface.h"
48 #include "jtag/commands.h"
49 #include "transport/transport.h"
50 #include "target/arm_adi_v5.h"
51 #include "helper/time_support.h"
52 #include "helper/replacements.h"
53 #include "helper/log.h"
54 #include "helper/list.h"
55 
56 #define VD_VERSION 48
57 #define VD_BUFFER_LEN 4024
58 #define VD_CHEADER_LEN 24
59 #define VD_SHEADER_LEN 16
60 
61 #define VD_MAX_MEMORIES 20
62 #define VD_POLL_INTERVAL 500
63 #define VD_SCALE_PSTOMS 1000000000
64 
68 enum {
69  VD_BFM_TPIU = 0x0000, /* transactor trace TPIU */
70  VD_BFM_DAP6 = 0x0001, /* transactor DAP ADI V6 */
71  VD_BFM_SWDP = 0x0002, /* transactor DAP SWD DP */
72  VD_BFM_AHB = 0x0003, /* transactor AMBA AHB */
73  VD_BFM_APB = 0x0004, /* transactor AMBA APB */
74  VD_BFM_AXI = 0x0005, /* transactor AMBA AXI */
75  VD_BFM_JTAG = 0x0006, /* transactor serial JTAG */
76  VD_BFM_SWD = 0x0007, /* transactor serial SWD */
77 };
78 
82 enum {
83  VD_SIG_TCK = 0x0001, /* JTAG clock; tclk */
84  VD_SIG_TDI = 0x0002, /* JTAG TDI; tdi */
85  VD_SIG_TMS = 0x0004, /* JTAG TMS; tms */
86  VD_SIG_RESET = 0x0008, /* DUT reset; rst */
87  VD_SIG_TRST = 0x0010, /* JTAG Reset; trstn */
88  VD_SIG_TDO = 0x0020, /* JTAG TDO; tdo */
89  VD_SIG_POWER = 0x0100, /* BFM power; bfm_up */
90  VD_SIG_TCKDIV = 0x0200, /* JTAG clock divider; tclkdiv */
91  VD_SIG_BUF = 0x1000, /* memory buffer; mem */
92 };
93 
97 enum {
98  VD_ERR_NONE = 0x0000, /* no error */
99  VD_ERR_NOT_IMPL = 0x0100, /* feature not implemented */
100  VD_ERR_USAGE = 0x0101, /* incorrect usage */
101  VD_ERR_PARAM = 0x0102, /* incorrect parameter */
102  VD_ERR_CONFIG = 0x0107, /* incorrect configuration */
103  VD_ERR_NO_MEMORY = 0x0104, /* out of memory */
104  VD_ERR_SHM_OPEN = 0x010a, /* cannot open shared memory */
105  VD_ERR_SHM_MAP = 0x010b, /* cannot map shared memory */
106  VD_ERR_SOC_OPEN = 0x011a, /* cannot open socket */
107  VD_ERR_SOC_OPT = 0x011b, /* cannot set socket option */
108  VD_ERR_SOC_ADDR = 0x011c, /* cannot resolve host address */
109  VD_ERR_SOC_CONN = 0x011d, /* cannot connect to host */
110  VD_ERR_SOC_SEND = 0x011e, /* error sending data on socket */
111  VD_ERR_SOC_RECV = 0x011f, /* error receiving data from socket */
112  VD_ERR_LOCKED = 0x0202, /* device locked */
113  VD_ERR_NOT_RUN = 0x0204, /* transactor not running */
114  VD_ERR_NOT_OPEN = 0x0205, /* transactor not open/connected */
115  VD_ERR_LICENSE = 0x0206, /* cannot check out the license */
116  VD_ERR_VERSION = 0x0207, /* transactor version mismatch */
117  VD_ERR_TIME_OUT = 0x0301, /* time out, waiting */
118  VD_ERR_NO_POWER = 0x0302, /* power out error */
119  VD_ERR_BUS_ERROR = 0x0304, /* bus protocol error, like pslverr */
120  VD_ERR_NO_ACCESS = 0x0306, /* no access to an object */
121  VD_ERR_INV_HANDLE = 0x0307, /* invalid object handle */
122  VD_ERR_INV_SCOPE = 0x0308, /* invalid scope */
123 };
124 
125 enum {
126  VD_CMD_OPEN = 0x01,
127  VD_CMD_CLOSE = 0x02,
130  VD_CMD_WAIT = 0x09,
140 };
141 
142 enum {
143  VD_ASPACE_AP = 0x01,
144  VD_ASPACE_DP = 0x02,
145  VD_ASPACE_ID = 0x03,
146  VD_ASPACE_AB = 0x04,
147 };
148 
149 enum {
153 };
154 
155 struct vd_shm {
156  struct { /* VD_CHEADER_LEN written by client */
157  uint8_t cmd; /* 000; command */
158  uint8_t type; /* 001; interface type */
159  uint8_t waddr[2]; /* 002; write pointer */
160  uint8_t wbytes[2]; /* 004; data bytes */
161  uint8_t rbytes[2]; /* 006; data bytes to read */
162  uint8_t wwords[2]; /* 008; data words */
163  uint8_t rwords[2]; /* 00a; data words to read */
164  uint8_t rwdata[4]; /* 00c; read/write data */
165  uint8_t offset[4]; /* 010; address offset */
166  uint8_t offseth[2]; /* 014; address offset 47:32 */
167  uint8_t wid[2]; /* 016; request id*/
168  };
169  uint8_t wd8[VD_BUFFER_LEN]; /* 018; */
170  struct { /* VD_SHEADER_LEN written by server */
171  uint8_t rid[2]; /* fd0: request id read */
172  uint8_t awords[2]; /* fd2: actual data words read back */
173  uint8_t status[4]; /* fd4; */
174  uint8_t duttime[8]; /* fd8; */
175  };
176  uint8_t rd8[VD_BUFFER_LEN]; /* fe0: */
177  uint8_t state[4]; /* 1f98; connection state */
178  uint8_t count[4]; /* 1f9c; */
179  uint8_t dummy[96]; /* 1fa0; 48+40B+8B; */
180 } __attribute__((packed));
181 
182 struct vd_rdata {
183  struct list_head lh;
184  uint8_t *rdata;
185 };
186 
187 struct vd_client {
188  uint8_t trans_batch;
191  uint8_t mem_ndx;
192  uint8_t buf_width;
193  uint8_t addr_bits;
194  uint8_t bfm_type;
195  uint16_t sig_read;
196  uint16_t sig_write;
197  uint32_t bfm_period;
202  uint16_t server_port;
203  uint32_t poll_cycles;
204  uint32_t poll_min;
205  uint32_t poll_max;
206  uint32_t targ_time;
207  int hsocket;
208  char server_name[32];
209  char bfm_path[128];
211  struct vd_rdata rdataq;
212 };
213 
214 struct vd_jtag_hdr {
215  uint64_t tlen:24;
216  uint64_t post:3;
217  uint64_t pre:3;
218  uint64_t cmd:2;
219  uint64_t wlen:16;
220  uint64_t rlen:16;
221 };
222 
223 struct vd_reg_hdr {
224  uint64_t prot:3;
225  uint64_t nonincr:1;
226  uint64_t haddr:12;
227  uint64_t tlen:11;
228  uint64_t asize:3;
229  uint64_t cmd:2;
230  uint64_t addr:32;
231 };
232 
233 static struct vd_shm *pbuf;
234 static struct vd_client vdc;
235 
236 static int vdebug_socket_error(void)
237 {
238 #ifdef _WIN32
239  return WSAGetLastError();
240 #else
241  return errno;
242 #endif
243 }
244 
245 static int vdebug_socket_open(char *server_addr, uint32_t port)
246 {
247  int hsock;
248  int rc = 0;
249  uint32_t buflen = sizeof(struct vd_shm); /* size of the send and rcv buffer */
250  struct addrinfo *ainfo = NULL;
251  struct addrinfo ahint = { 0, AF_INET, SOCK_STREAM, 0, 0, NULL, NULL, NULL };
252 
253 #ifdef _WIN32
254  hsock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
255  if (hsock == INVALID_SOCKET)
256  rc = vdebug_socket_error();
257 #elif defined __CYGWIN__
258  /* SO_RCVLOWAT unsupported on CYGWIN */
259  hsock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
260  if (hsock < 0)
261  rc = errno;
262 #else
263  uint32_t rcvwat = VD_SHEADER_LEN; /* size of the rcv header, as rcv min watermark */
264  hsock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
265  if (hsock < 0)
266  rc = errno;
267  else if (setsockopt(hsock, SOL_SOCKET, SO_RCVLOWAT, &rcvwat, sizeof(rcvwat)) < 0)
268  rc = errno;
269 #endif
270  else if (setsockopt(hsock, SOL_SOCKET, SO_SNDBUF, (const char *)&buflen, sizeof(buflen)) < 0)
271  rc = vdebug_socket_error();
272  else if (setsockopt(hsock, SOL_SOCKET, SO_RCVBUF, (const char *)&buflen, sizeof(buflen)) < 0)
273  rc = vdebug_socket_error();
274 
275  if (rc) {
276  LOG_ERROR("socket_open: cannot set socket option, error %d", rc);
277  } else if (getaddrinfo(server_addr, NULL, &ahint, &ainfo) != 0) {
278  LOG_ERROR("socket_open: cannot resolve address %s, error %d", server_addr, vdebug_socket_error());
279  rc = VD_ERR_SOC_ADDR;
280  } else {
281  h_u16_to_be((uint8_t *)ainfo->ai_addr->sa_data, port);
282  if (connect(hsock, ainfo->ai_addr, sizeof(struct sockaddr)) < 0) {
283  LOG_ERROR("socket_open: cannot connect to %s:%d, error %d", server_addr, port, vdebug_socket_error());
284  rc = VD_ERR_SOC_CONN;
285  }
286  }
287 
288  if (rc) {
289  close_socket(hsock);
290  hsock = 0;
291  }
292 
293  if (ainfo)
294  freeaddrinfo(ainfo);
295 
296  return hsock;
297 }
298 
299 static int vdebug_socket_receive(int hsock, struct vd_shm *pmem)
300 {
301  int rc;
302  int dreceived = 0;
303  int offset = &pmem->rid[0] - &pmem->cmd;
304  int to_receive = VD_SHEADER_LEN + le_to_h_u16(pmem->rbytes);
305  char *pb = (char *)pmem;
306 
307  do {
308  rc = recv(hsock, pb + offset, to_receive, 0);
309  if (rc <= 0) {
310  LOG_WARNING("socket_receive: recv failed, error %d", rc < 0 ? vdebug_socket_error() : 0);
311  return rc;
312  }
313  to_receive -= rc;
314  offset += rc;
315  LOG_DEBUG_IO("socket_receive: received %d, to receive %d", rc, to_receive);
316  dreceived += rc;
317  } while (to_receive);
318 
319  return dreceived;
320 }
321 
322 static int vdebug_socket_send(int hsock, struct vd_shm *pmem)
323 {
324  int rc = send(hsock, (const char *)&pmem->cmd, VD_CHEADER_LEN + le_to_h_u16(pmem->wbytes), 0);
325  if (rc <= 0)
326  LOG_WARNING("socket_send: send failed, error %d", vdebug_socket_error());
327  else
328  LOG_DEBUG_IO("socket_send: sent %d, to send 0", rc);
329 
330  return rc;
331 }
332 
333 static uint32_t vdebug_wait_server(int hsock, struct vd_shm *pmem)
334 {
335  if (!hsock)
336  return VD_ERR_SOC_OPEN;
337 
338  int st = vdebug_socket_send(hsock, pmem);
339  if (st <= 0)
340  return VD_ERR_SOC_SEND;
341 
342  int rd = vdebug_socket_receive(hsock, pmem);
343  if (rd <= 0)
344  return VD_ERR_SOC_RECV;
345 
346  int rc = le_to_h_u32(pmem->status);
347  LOG_DEBUG_IO("wait_server: cmd %02" PRIx8 " done, sent %d, rcvd %d, status %d",
348  pmem->cmd, st, rd, rc);
349 
350  return rc;
351 }
352 
353 static int vdebug_run_jtag_queue(int hsock, struct vd_shm *pm, unsigned int count)
354 {
355  uint8_t num_pre, num_post, tdi, tms;
356  unsigned int num, anum, bytes, hwords, words;
357  unsigned int req, waddr, rwords;
358  int64_t ts, te;
359  uint8_t *tdo;
360  int rc;
361  uint64_t jhdr;
362  struct vd_rdata *rd;
363 
364  req = 0; /* beginning of request */
365  waddr = 0;
366  rwords = 0;
369  ts = timeval_ms();
370  rc = vdebug_wait_server(hsock, pm);
371  while (!rc && (req < count)) { /* loop over requests to read data and print out */
372  jhdr = le_to_h_u64(&pm->wd8[waddr * 4]);
373  words = jhdr >> 48;
374  hwords = (jhdr >> 32) & 0xffff;
375  anum = jhdr & 0xffffff;
376  num_pre = (jhdr >> 27) & 0x7;
377  num_post = (jhdr >> 24) & 0x7;
378  if (num_post)
379  num = anum - num_pre - num_post + 1;
380  else
381  num = anum - num_pre;
382  bytes = (num + 7) / 8;
383  vdc.trans_last = (req + 1) < count ? 0 : 1;
384  vdc.trans_first = waddr ? 0 : 1;
385  if (((jhdr >> 30) & 0x3) == 3) { /* cmd is read */
386  if (!rwords) {
387  rd = &vdc.rdataq;
388  tdo = rd->rdata;
389  } else {
390  rd = list_first_entry(&vdc.rdataq.lh, struct vd_rdata, lh);
391  tdo = rd->rdata;
392  list_del(&rd->lh);
393  free(rd);
394  }
395  for (unsigned int j = 0; j < bytes; j++) {
396  tdo[j] = (pm->rd8[rwords * 8 + j] >> num_pre) | (pm->rd8[rwords * 8 + j + 1] << (8 - num_pre));
397  LOG_DEBUG_IO("%04x D0[%02x]:%02x", le_to_h_u16(pm->wid) - count + req, j, tdo[j]);
398  }
399  rwords += words; /* read data offset */
400  } else {
401  tdo = NULL;
402  }
403  waddr += sizeof(uint64_t) / 4; /* waddr past header */
404  tdi = (pm->wd8[waddr * 4] >> num_pre) | (pm->wd8[waddr * 4 + 1] << (8 - num_pre));
405  tms = (pm->wd8[waddr * 4 + 4] >> num_pre) | (pm->wd8[waddr * 4 + 4 + 1] << (8 - num_pre));
406  LOG_DEBUG_IO("%04x L:%02d O:%05x @%03x DI:%02x MS:%02x DO:%02x",
407  le_to_h_u16(pm->wid) - count + req, num, (vdc.trans_first << 14) | (vdc.trans_last << 15),
408  waddr - 2, tdi, tms, (tdo ? tdo[0] : 0xdd));
409  waddr += hwords * 2; /* start of next request */
410  req += 1;
411  }
412 
413  if (rc) {
414  LOG_ERROR("0x%x executing transaction", rc);
415  rc = ERROR_FAIL;
416  }
417 
418  te = timeval_ms();
419  vdc.targ_time += (uint32_t)(te - ts);
420  h_u16_to_le(pm->offseth, 0); /* reset buffer write address */
421  h_u32_to_le(pm->offset, 0);
422  h_u16_to_le(pm->rwords, 0);
423  h_u16_to_le(pm->waddr, 0);
424  assert(list_empty(&vdc.rdataq.lh));/* list should be empty after run queue */
425 
426  return rc;
427 }
428 
429 static int vdebug_run_reg_queue(int hsock, struct vd_shm *pm, unsigned int count)
430 {
431  unsigned int num, awidth, wwidth;
432  unsigned int req, waddr, rwords;
433  uint8_t aspace;
434  uint32_t addr;
435  int64_t ts, te;
436  uint8_t *data;
437  int rc;
438  uint64_t rhdr;
439  struct vd_rdata *rd;
440 
441  req = 0; /* beginning of request */
442  waddr = 0;
443  rwords = 0;
446  ts = timeval_ms();
447  rc = vdebug_wait_server(hsock, pm);
448  while (!rc && (req < count)) { /* loop over requests to read data and print out */
449  rhdr = le_to_h_u64(&pm->wd8[waddr * 4]);
450  addr = rhdr >> 32; /* reconstruct data for a single request */
451  num = (rhdr >> 16) & 0x7ff;
452  aspace = rhdr & 0x3;
453  awidth = (1 << ((rhdr >> 27) & 0x7));
454  wwidth = (awidth + vdc.buf_width - 1) / vdc.buf_width;
455  vdc.trans_last = (req + 1) < count ? 0 : 1;
456  vdc.trans_first = waddr ? 0 : 1;
457  if (((rhdr >> 30) & 0x3) == 2) { /* cmd is read */
458  if (num) {
459  if (!rwords) {
460  rd = &vdc.rdataq;
461  data = rd->rdata;
462  } else {
463  rd = list_first_entry(&vdc.rdataq.lh, struct vd_rdata, lh);
464  data = rd->rdata;
465  list_del(&rd->lh);
466  free(rd);
467  }
468  for (unsigned int j = 0; j < num; j++)
469  memcpy(&data[j * awidth], &pm->rd8[(rwords + j) * awidth], awidth);
470  }
471  LOG_DEBUG("read %04x AS:%1x RG:%1x O:%05x @%03x D:%08x", le_to_h_u16(pm->wid) - count + req,
472  aspace, addr << 2, (vdc.trans_first << 14) | (vdc.trans_last << 15), waddr,
473  (num ? le_to_h_u32(&pm->rd8[rwords * 4]) : 0xdead));
474  rwords += num * wwidth;
475  waddr += sizeof(uint64_t) / 4; /* waddr past header */
476  } else {
477  LOG_DEBUG("write %04x AS:%1x RG:%1x O:%05x @%03x D:%08x", le_to_h_u16(pm->wid) - count + req,
478  aspace, addr << 2, (vdc.trans_first << 14) | (vdc.trans_last << 15), waddr,
479  le_to_h_u32(&pm->wd8[(waddr + num + 1) * 4]));
480  waddr += sizeof(uint64_t) / 4 + (num * wwidth * awidth + 3) / 4;
481  }
482  req += 1;
483  }
484 
485  if (rc) {
486  LOG_ERROR("0x%x executing transaction", rc);
487  rc = ERROR_FAIL;
488  }
489 
490  te = timeval_ms();
491  vdc.targ_time += (uint32_t)(te - ts);
492  h_u16_to_le(pm->offseth, 0); /* reset buffer write address */
493  h_u32_to_le(pm->offset, 0);
494  h_u16_to_le(pm->rwords, 0);
495  h_u16_to_le(pm->waddr, 0);
496  assert(list_empty(&vdc.rdataq.lh));/* list should be empty after run queue */
497 
498  return rc;
499 }
500 
501 static int vdebug_open(int hsock, struct vd_shm *pm, const char *path,
502  uint8_t type, uint32_t period_ps, uint32_t sig_mask)
503 {
504  int rc = VD_ERR_NOT_OPEN;
505 
506  pm->cmd = VD_CMD_OPEN;
507  h_u16_to_le(pm->wid, VD_VERSION); /* client version */
508  h_u16_to_le(pm->wbytes, 0);
509  h_u16_to_le(pm->rbytes, 0);
510  h_u16_to_le(pm->wwords, 0);
511  h_u16_to_le(pm->rwords, 0);
512  rc = vdebug_wait_server(hsock, pm);
513  if (rc != 0) { /* communication problem */
514  LOG_ERROR("0x%x connecting to server", rc);
515  } else if (le_to_h_u16(pm->rid) < le_to_h_u16(pm->wid)) {
516  LOG_ERROR("server version %d too old for the client %d", le_to_h_u16(pm->rid), le_to_h_u16(pm->wid));
517  pm->cmd = VD_CMD_CLOSE; /* let server close the connection */
518  vdebug_wait_server(hsock, pm);
519  rc = VD_ERR_VERSION;
520  } else {
521  pm->cmd = VD_CMD_CONNECT;
522  pm->type = type; /* BFM type to connect to */
523  h_u32_to_le(pm->rwdata, sig_mask | VD_SIG_BUF | (VD_SIG_BUF << 16));
524  h_u16_to_le(pm->wbytes, strlen(path) + 1);
525  h_u16_to_le(pm->rbytes, 12);
526  h_u16_to_le(pm->wid, 0); /* reset wid for transaction ID */
527  h_u16_to_le(pm->wwords, 0);
528  h_u16_to_le(pm->rwords, 0);
529  memcpy(pm->wd8, path, le_to_h_u16(pm->wbytes));
530  rc = vdebug_wait_server(hsock, pm);
531  vdc.sig_read = le_to_h_u32(pm->rwdata) >> 16; /* signal read mask */
532  vdc.sig_write = le_to_h_u32(pm->rwdata); /* signal write mask */
533  vdc.bfm_period = period_ps;
534  vdc.buf_width = le_to_h_u32(&pm->rd8[0]) / 8;/* access width in bytes */
535  vdc.addr_bits = le_to_h_u32(&pm->rd8[2 * 4]); /* supported address bits */
536  }
537 
538  if (rc) {
539  LOG_ERROR("0x%x connecting to BFM %s", rc, path);
540  return ERROR_FAIL;
541  }
542 
544  LOG_DEBUG("%s type %0x, period %dps, buffer %dx%dB signals r%04xw%04x",
547 
548  return ERROR_OK;
549 }
550 
551 static int vdebug_close(int hsock, struct vd_shm *pm, uint8_t type)
552 {
553  pm->cmd = VD_CMD_DISCONNECT;
554  pm->type = type; /* BFM type, here JTAG */
555  h_u16_to_le(pm->wbytes, 0);
556  h_u16_to_le(pm->rbytes, 0);
557  h_u16_to_le(pm->wwords, 0);
558  h_u16_to_le(pm->rwords, 0);
559  vdebug_wait_server(hsock, pm);
560  pm->cmd = VD_CMD_CLOSE;
561  h_u16_to_le(pm->wid, VD_VERSION); /* client version */
562  h_u16_to_le(pm->wbytes, 0);
563  h_u16_to_le(pm->rbytes, 0);
564  h_u16_to_le(pm->wwords, 0);
565  h_u16_to_le(pm->rwords, 0);
566  vdebug_wait_server(hsock, pm);
567  LOG_DEBUG("type %0x", type);
568 
569  return ERROR_OK;
570 }
571 
572 static int vdebug_wait(int hsock, struct vd_shm *pm, uint32_t cycles)
573 {
574  if (cycles) {
575  pm->cmd = VD_CMD_WAIT;
576  h_u16_to_le(pm->wbytes, 0);
577  h_u16_to_le(pm->rbytes, 0);
578  h_u32_to_le(pm->rwdata, cycles); /* clock sycles to wait */
579  int rc = vdebug_wait_server(hsock, pm);
580  if (rc) {
581  LOG_ERROR("0x%x waiting %" PRIx32 " cycles", rc, cycles);
582  return ERROR_FAIL;
583  }
584  LOG_DEBUG("%d cycles", cycles);
585  }
586 
587  return ERROR_OK;
588 }
589 
590 static int vdebug_sig_set(int hsock, struct vd_shm *pm, uint32_t write_mask, uint32_t value)
591 {
592  pm->cmd = VD_CMD_SIGSET;
593  h_u16_to_le(pm->wbytes, 0);
594  h_u16_to_le(pm->rbytes, 0);
595  h_u32_to_le(pm->rwdata, (write_mask << 16) | (value & 0xffff)); /* mask and value of signals to set */
596  int rc = vdebug_wait_server(hsock, pm);
597  if (rc) {
598  LOG_ERROR("0x%x setting signals %04" PRIx32, rc, write_mask);
599  return ERROR_FAIL;
600  }
601 
602  LOG_DEBUG("setting signals %04" PRIx32 " to %04" PRIx32, write_mask, value);
603 
604  return ERROR_OK;
605 }
606 
607 static int vdebug_jtag_clock(int hsock, struct vd_shm *pm, uint32_t value)
608 {
609  pm->cmd = VD_CMD_JTAGCLOCK;
610  h_u16_to_le(pm->wbytes, 0);
611  h_u16_to_le(pm->rbytes, 0);
612  h_u32_to_le(pm->rwdata, value); /* divider value */
613  int rc = vdebug_wait_server(hsock, pm);
614  if (rc) {
615  LOG_ERROR("0x%x setting jtag_clock", rc);
616  return ERROR_FAIL;
617  }
618 
619  LOG_DEBUG("setting jtag clock divider to %" PRIx32, value);
620 
621  return ERROR_OK;
622 }
623 
624 static int vdebug_jtag_shift_tap(int hsock, struct vd_shm *pm, uint8_t num_pre,
625  const uint8_t tms_pre, uint32_t num, const uint8_t *tdi,
626  uint8_t num_post, const uint8_t tms_post, uint8_t *tdo,
627  uint8_t f_last)
628 {
629  const uint32_t tobits = 8;
630  uint16_t bytes, hwords, anum, words, waddr;
631  int rc = 0;
632 
633  pm->cmd = VD_CMD_JTAGSHTAP;
634  vdc.trans_last = f_last || (vdc.trans_batch == VD_BATCH_NO);
635  if (vdc.trans_first)
636  waddr = 0; /* reset buffer offset */
637  else
638  waddr = le_to_h_u32(pm->offseth); /* continue from the previous transaction */
639  if (num_post) /* actual number of bits to shift */
640  anum = num + num_pre + num_post - 1;
641  else
642  anum = num + num_pre;
643  hwords = (anum + 4 * vdc.buf_width - 1) / (4 * vdc.buf_width); /* in 4B TDI/TMS words */
644  words = (hwords + 1) / 2; /* in 8B TDO words to read */
645  bytes = (num + 7) / 8; /* data only portion in bytes */
646  /* buffer overflow check and flush */
647  if (4 * waddr + sizeof(uint64_t) + 8 * hwords + 64 > VD_BUFFER_LEN) {
648  vdc.trans_last = 1; /* force flush within 64B of buffer end */
649  } else if (4 * waddr + sizeof(uint64_t) + 8 * hwords > VD_BUFFER_LEN) {
650  /* this req does not fit, discard it */
651  LOG_ERROR("%04x L:%02d O:%05x @%04x too many bits to shift",
652  le_to_h_u16(pm->wid), anum, (vdc.trans_first << 14) | (vdc.trans_last << 15), waddr);
653  rc = ERROR_FAIL;
654  }
655 
656  if (!rc && anum) {
657  uint16_t i, j; /* portability requires to use bit operations for 8B JTAG header */
658  uint64_t jhdr = (tdo ? ((uint64_t)(words) << 48) : 0) + ((uint64_t)(hwords) << 32) +
659  ((tdo ? 3UL : 1UL) << 30) + (num_pre << 27) + (num_post << 24) + anum;
660  h_u64_to_le(&pm->wd8[4 * waddr], jhdr);
661 
662  h_u16_to_le(pm->wid, le_to_h_u16(pm->wid) + 1); /* transaction ID */
663  waddr += 2; /* waddr past header */
664  /* TDI/TMS data follows as 32 bit word pairs {TMS,TDI} */
665  pm->wd8[4 * waddr] = (tdi ? (tdi[0] << num_pre) : 0);
666  pm->wd8[4 * waddr + 4] = tms_pre; /* init with tms_pre */
667  if (num + num_pre <= 8) /* and tms_post for num <=4 */
668  pm->wd8[4 * waddr + 4] |= (tms_post << (num + num_pre - 1));
669  for (i = 1, j = 4 * waddr; i < bytes; i++) {
670  if (i == bytes - 1 && num + num_pre <= bytes * tobits)
671  pm->wd8[j + i + 4] = tms_post << ((num + num_pre - 1) % 8);
672  else
673  pm->wd8[j + i + 4] = 0x0;/* placing 4 bytes of TMS bits into high word */
674  if (!tdi) /* placing 4 bytes of TDI bits into low word */
675  pm->wd8[j + i] = 0x0;
676  else
677  pm->wd8[j + i] = (tdi[i] << num_pre) | (tdi[i - 1] >> (8 - num_pre));
678  if (i % 4 == 3)
679  j += 4;
680  }
681 
682  if (tdi)
683  if (num + num_pre > bytes * tobits) /* in case 1 additional byte needed for TDI */
684  pm->wd8[j + i] = (tdi[i - 1] >> (8 - num_pre)); /* put last TDI bits there */
685 
686  if (num + num_pre <= bytes * tobits) { /* in case no or 1 additional byte needed */
687  pm->wd8[j + i + 4] = tms_post >> (8 - (num + num_pre - 1) % 8); /* may need to add higher part */
688  /* in case exactly 1 additional byte needed */
689  } else if (num + num_pre > bytes * tobits && anum <= (bytes + 1) * tobits) {
690  pm->wd8[j + i + 4] = tms_post << ((num + num_pre - 1) % 8); /* add whole tms_post */
691  } else { /* in case 2 additional bytes, tms_post split */
692  pm->wd8[j + i + 4] = tms_post << ((num + num_pre - 1) % 8);/* add lower part of tms_post */
693  if (i % 4 == 3) /* next byte is in the next 32b word */
694  pm->wd8[j + i + 4 + 5] = tms_post >> (8 - (num + num_pre - 1) % 8); /* and higher part */
695  else /* next byte is in the same 32b word */
696  pm->wd8[j + i + 4 + 1] = tms_post >> (8 - (num + num_pre - 1) % 8); /* and higher part */
697  }
698 
699  if (tdo) {
700  struct vd_rdata *rd;
701  if (le_to_h_u16(pm->rwords) == 0) {
702  rd = &vdc.rdataq;
703  } else {
704  rd = calloc(1, sizeof(struct vd_rdata));
705  if (!rd) /* check allocation for 24B */
706  return ERROR_FAIL;
707  list_add_tail(&rd->lh, &vdc.rdataq.lh);
708  }
709  rd->rdata = tdo;
710  h_u16_to_le(pm->rwords, le_to_h_u16(pm->rwords) + words);/* keep track of the words to read */
711  }
712  h_u16_to_le(pm->wwords, waddr / 2 + hwords); /* payload size *2 to include both TDI and TMS data */
713  h_u16_to_le(pm->waddr, le_to_h_u16(pm->waddr) + 1);
714  }
715 
716  if (!waddr) /* flush issued, but buffer empty */
717  ;
718  else if (!vdc.trans_last) /* buffered request */
719  h_u16_to_le(pm->offseth, waddr + hwords * 2); /* offset for next transaction, must be even */
720  else /* execute batch of requests */
721  rc = vdebug_run_jtag_queue(hsock, pm, le_to_h_u16(pm->waddr));
722  vdc.trans_first = vdc.trans_last; /* flush forces trans_first flag */
723 
724  return rc;
725 }
726 
727 static int vdebug_reg_write(int hsock, struct vd_shm *pm, const uint32_t reg,
728  const uint32_t data, uint8_t aspace, uint8_t f_last)
729 {
730  uint32_t waddr;
731  int rc = ERROR_OK;
732 
733  pm->cmd = VD_CMD_REGWRITE;
734  vdc.trans_last = f_last || (vdc.trans_batch == VD_BATCH_NO);
735  if (vdc.trans_first)
736  waddr = 0; /* reset buffer offset */
737  else
738  waddr = le_to_h_u16(pm->offseth); /* continue from the previous transaction */
739 
740  if (4 * waddr + 2 * sizeof(uint64_t) + 4 > VD_BUFFER_LEN)
741  vdc.trans_last = 1; /* force flush, no room for next request */
742 
743  uint64_t rhdr = ((uint64_t)reg << 32) + (1UL << 30) + (2UL << 27) + (1UL << 16) + aspace;
744  h_u64_to_le(&pm->wd8[4 * waddr], rhdr);
745  h_u32_to_le(&pm->wd8[4 * (waddr + 2)], data);
746  h_u16_to_le(pm->wid, le_to_h_u16(pm->wid) + 1);
747  h_u16_to_le(pm->wwords, waddr + 3);
748  h_u16_to_le(pm->waddr, le_to_h_u16(pm->waddr) + 1);
749  if (!vdc.trans_last) /* buffered request */
750  h_u16_to_le(pm->offseth, waddr + 3);
751  else
752  rc = vdebug_run_reg_queue(hsock, pm, le_to_h_u16(pm->waddr));
753  vdc.trans_first = vdc.trans_last; /* flush forces trans_first flag */
754 
755  return rc;
756 }
757 
758 static int vdebug_reg_read(int hsock, struct vd_shm *pm, const uint32_t reg,
759  uint32_t *data, uint8_t aspace, uint8_t f_last)
760 {
761  uint32_t waddr;
762  int rc = ERROR_OK;
763 
764  pm->cmd = VD_CMD_REGREAD;
765  vdc.trans_last = f_last || (vdc.trans_batch == VD_BATCH_NO);
766  if (vdc.trans_first)
767  waddr = 0; /* reset buffer offset */
768  else
769  waddr = le_to_h_u16(pm->offseth); /* continue from the previous transaction */
770 
771  if (4 * waddr + 2 * sizeof(uint64_t) + 4 > VD_BUFFER_LEN)
772  vdc.trans_last = 1; /* force flush, no room for next request */
773 
774  uint64_t rhdr = ((uint64_t)reg << 32) + (2UL << 30) + (2UL << 27) + ((data ? 1UL : 0UL) << 16) + aspace;
775  h_u64_to_le(&pm->wd8[4 * waddr], rhdr);
776  h_u16_to_le(pm->wid, le_to_h_u16(pm->wid) + 1);
777  if (data) {
778  struct vd_rdata *rd;
779  if (le_to_h_u16(pm->rwords) == 0) {
780  rd = &vdc.rdataq;
781  } else {
782  rd = calloc(1, sizeof(struct vd_rdata));
783  if (!rd) /* check allocation for 24B */
784  return ERROR_FAIL;
785  list_add_tail(&rd->lh, &vdc.rdataq.lh);
786  }
787  rd->rdata = (uint8_t *)data;
788  h_u16_to_le(pm->rwords, le_to_h_u16(pm->rwords) + 1);
789  }
790  h_u16_to_le(pm->wwords, waddr + 2);
791  h_u16_to_le(pm->waddr, le_to_h_u16(pm->waddr) + 1);
792  if (!vdc.trans_last) /* buffered request */
793  h_u16_to_le(pm->offseth, waddr + 2);
794  else
795  rc = vdebug_run_reg_queue(hsock, pm, le_to_h_u16(pm->waddr));
796  vdc.trans_first = vdc.trans_last; /* flush forces trans_first flag */
797 
798  return rc;
799 }
800 
801 static int vdebug_mem_open(int hsock, struct vd_shm *pm, const char *path, uint8_t ndx)
802 {
803  int rc;
804 
805  if (!path)
806  return ERROR_OK;
807 
808  pm->cmd = VD_CMD_MEMOPEN;
809  h_u16_to_le(pm->wbytes, strlen(path) + 1); /* includes terminating 0 */
810  h_u16_to_le(pm->rbytes, 8);
811  h_u16_to_le(pm->wwords, 0);
812  h_u16_to_le(pm->rwords, 0);
813  memcpy(pm->wd8, path, le_to_h_u16(pm->wbytes));
814  rc = vdebug_wait_server(hsock, pm);
815  if (rc) {
816  LOG_ERROR("0x%x opening memory %s", rc, path);
817  } else if (ndx != pm->rd8[2]) {
818  LOG_WARNING("Invalid memory index %" PRIu16 " returned. Direct memory access disabled", pm->rd8[2]);
819  } else {
820  vdc.mem_width[ndx] = le_to_h_u16(&pm->rd8[0]) / 8; /* memory width in bytes */
821  vdc.mem_depth[ndx] = le_to_h_u32(&pm->rd8[4]); /* memory depth in words */
822  LOG_DEBUG("%" PRIx8 ": %s memory %" PRIu32 "x%" PRIu32 "B, buffer %" PRIu32 "x%" PRIu32 "B", ndx, path,
823  vdc.mem_depth[ndx], vdc.mem_width[ndx], VD_BUFFER_LEN / vdc.mem_width[ndx], vdc.mem_width[ndx]);
824  }
825 
826  return ERROR_OK;
827 }
828 
829 static void vdebug_mem_close(int hsock, struct vd_shm *pm, uint8_t ndx)
830 {
831  pm->cmd = VD_CMD_MEMCLOSE;
832  h_u32_to_le(pm->rwdata, ndx); /* which memory */
833  h_u16_to_le(pm->wbytes, 0);
834  h_u16_to_le(pm->rbytes, 0);
835  h_u16_to_le(pm->wwords, 0);
836  h_u16_to_le(pm->rwords, 0);
837  vdebug_wait_server(hsock, pm);
838  LOG_DEBUG("%" PRIx8 ": %s", ndx, vdc.mem_path[ndx]);
839 }
840 
841 
842 static int vdebug_init(void)
843 {
845  pbuf = calloc(1, sizeof(struct vd_shm));
846  if (!pbuf) {
848  vdc.hsocket = 0;
849  LOG_ERROR("cannot allocate %zu bytes", sizeof(struct vd_shm));
850  return ERROR_FAIL;
851  }
852  if (vdc.hsocket <= 0) {
853  free(pbuf);
854  pbuf = NULL;
855  LOG_ERROR("cannot connect to vdebug server %s:%" PRIu16,
857  return ERROR_FAIL;
858  }
859  vdc.trans_first = 1;
861  uint32_t sig_mask = VD_SIG_RESET;
862  if (transport_is_jtag())
863  sig_mask |= VD_SIG_TRST | VD_SIG_TCKDIV;
864 
865  int rc = vdebug_open(vdc.hsocket, pbuf, vdc.bfm_path, vdc.bfm_type, vdc.bfm_period, sig_mask);
866  if (rc != 0) {
867  LOG_ERROR("0x%x cannot connect to %s", rc, vdc.bfm_path);
869  vdc.hsocket = 0;
870  free(pbuf);
871  pbuf = NULL;
872  } else {
873  for (uint8_t i = 0; i < vdc.mem_ndx; i++) {
874  rc = vdebug_mem_open(vdc.hsocket, pbuf, vdc.mem_path[i], i);
875  if (rc != 0)
876  LOG_ERROR("0x%x cannot connect to %s", rc, vdc.mem_path[i]);
877  }
878 
879  LOG_INFO("vdebug %d connected to %s through %s:%" PRIu16,
881  }
882 
883  return rc;
884 }
885 
886 static int vdebug_quit(void)
887 {
888  for (uint8_t i = 0; i < vdc.mem_ndx; i++)
889  if (vdc.mem_width[i])
891  int rc = vdebug_close(vdc.hsocket, pbuf, vdc.bfm_type);
892  LOG_INFO("vdebug %d disconnected from %s through %s:%" PRIu16 " rc:%d", VD_VERSION,
894  if (vdc.hsocket)
896  free(pbuf);
897  pbuf = NULL;
898 
899  return ERROR_OK;
900 }
901 
902 static int vdebug_reset(int trst, int srst)
903 {
904  uint16_t sig_val = 0xffff;
905  uint16_t sig_mask = 0;
906 
907  sig_mask |= VD_SIG_RESET;
908  if (srst)
909  sig_val &= ~VD_SIG_RESET;/* active low */
910  if (transport_is_jtag()) {
911  sig_mask |= VD_SIG_TRST;
912  if (trst)
913  sig_val &= ~VD_SIG_TRST; /* active low */
914  }
915 
916  LOG_INFO("rst trst:%d srst:%d mask:%" PRIx16 " val:%" PRIx16, trst, srst, sig_mask, sig_val);
917  int rc = vdebug_sig_set(vdc.hsocket, pbuf, sig_mask, sig_val);
918  if (rc == 0)
919  rc = vdebug_wait(vdc.hsocket, pbuf, 20); /* 20 clock cycles pulse */
920 
921  return rc;
922 }
923 
924 static int vdebug_jtag_tms_seq(const uint8_t *tms, int num, uint8_t f_flush)
925 {
926  LOG_DEBUG_IO("tms len:%d tms:%x", num, *tms);
927 
928  return vdebug_jtag_shift_tap(vdc.hsocket, pbuf, num, *tms, 0, NULL, 0, 0, NULL, f_flush);
929 }
930 
931 static int vdebug_jtag_path_move(struct pathmove_command *cmd, uint8_t f_flush)
932 {
933  uint8_t tms[DIV_ROUND_UP(cmd->num_states, 8)];
934  LOG_DEBUG_IO("path num states %d", cmd->num_states);
935 
936  memset(tms, 0, DIV_ROUND_UP(cmd->num_states, 8));
937 
938  for (uint8_t i = 0; i < cmd->num_states; i++) {
939  if (tap_state_transition(tap_get_state(), true) == cmd->path[i])
940  buf_set_u32(tms, i, 1, 1);
941  tap_set_state(cmd->path[i]);
942  }
943 
944  return vdebug_jtag_tms_seq(tms, cmd->num_states, f_flush);
945 }
946 
947 static int vdebug_jtag_tlr(tap_state_t state, uint8_t f_flush)
948 {
949  int rc = ERROR_OK;
950 
951  tap_state_t cur = tap_get_state();
952  uint8_t tms_pre = tap_get_tms_path(cur, state);
953  uint8_t num_pre = tap_get_tms_path_len(cur, state);
954  LOG_DEBUG_IO("tlr from %x to %x", cur, state);
955  if (cur != state) {
956  rc = vdebug_jtag_shift_tap(vdc.hsocket, pbuf, num_pre, tms_pre, 0, NULL, 0, 0, NULL, f_flush);
958  }
959 
960  return rc;
961 }
962 
963 static int vdebug_jtag_scan(struct scan_command *cmd, uint8_t f_flush)
964 {
965  int rc = ERROR_OK;
966 
967  tap_state_t cur = tap_get_state();
968  uint8_t state = cmd->ir_scan ? TAP_IRSHIFT : TAP_DRSHIFT;
969  uint8_t tms_pre = tap_get_tms_path(cur, state);
970  uint8_t num_pre = tap_get_tms_path_len(cur, state);
971  uint8_t tms_post = tap_get_tms_path(state, cmd->end_state);
972  uint8_t num_post = tap_get_tms_path_len(state, cmd->end_state);
973  int num_bits = jtag_scan_size(cmd);
974  LOG_DEBUG_IO("scan len:%d fields:%d ir/!dr:%d state cur:%x end:%x",
975  num_bits, cmd->num_fields, cmd->ir_scan, cur, cmd->end_state);
976  for (int i = 0; i < cmd->num_fields; i++) {
977  uint8_t cur_num_pre = i == 0 ? num_pre : 0;
978  uint8_t cur_tms_pre = i == 0 ? tms_pre : 0;
979  uint8_t cur_num_post = i == cmd->num_fields - 1 ? num_post : 0;
980  uint8_t cur_tms_post = i == cmd->num_fields - 1 ? tms_post : 0;
981  uint8_t cur_flush = i == cmd->num_fields - 1 ? f_flush : 0;
982  rc = vdebug_jtag_shift_tap(vdc.hsocket, pbuf, cur_num_pre, cur_tms_pre,
983  cmd->fields[i].num_bits, cmd->fields[i].out_value, cur_num_post, cur_tms_post,
984  cmd->fields[i].in_value, cur_flush);
985  if (rc)
986  break;
987  }
988 
989  if (cur != cmd->end_state)
990  tap_set_state(cmd->end_state);
991 
992  return rc;
993 }
994 
995 static int vdebug_jtag_runtest(int cycles, tap_state_t state, uint8_t f_flush)
996 {
997  tap_state_t cur = tap_get_state();
998  uint8_t tms_pre = tap_get_tms_path(cur, state);
999  uint8_t num_pre = tap_get_tms_path_len(cur, state);
1000  LOG_DEBUG_IO("idle len:%d state cur:%x end:%x", cycles, cur, state);
1001  int rc = vdebug_jtag_shift_tap(vdc.hsocket, pbuf, num_pre, tms_pre, cycles, NULL, 0, 0, NULL, f_flush);
1002  if (cur != state)
1004 
1005  return rc;
1006 }
1007 
1008 static int vdebug_jtag_stableclocks(int num, uint8_t f_flush)
1009 {
1010  LOG_DEBUG("stab len:%d state cur:%x", num, tap_get_state());
1011 
1012  return vdebug_jtag_shift_tap(vdc.hsocket, pbuf, 0, 0, num, NULL, 0, 0, NULL, f_flush);
1013 }
1014 
1015 static int vdebug_sleep(int us)
1016 {
1017  LOG_INFO("sleep %d us", us);
1018 
1019  return vdebug_wait(vdc.hsocket, pbuf, us / 1000);
1020 }
1021 
1022 static int vdebug_jtag_speed(int speed)
1023 {
1024  unsigned int clkmax = VD_SCALE_PSTOMS / (vdc.bfm_period * 2); /* kHz */
1025  unsigned int divval = clkmax / speed;
1026  LOG_INFO("jclk speed:%d kHz set, BFM divider %u", speed, divval);
1027 
1028  return vdebug_jtag_clock(vdc.hsocket, pbuf, divval);
1029 }
1030 
1031 static int vdebug_jtag_khz(int khz, int *jtag_speed)
1032 {
1033  unsigned int clkmax = VD_SCALE_PSTOMS / (vdc.bfm_period * 2); /* kHz */
1034  unsigned int divval = khz ? clkmax / khz : 1;
1035  *jtag_speed = clkmax / divval;
1036  LOG_DEBUG("khz speed:%d from khz:%d", *jtag_speed, khz);
1037 
1038  return ERROR_OK;
1039 }
1040 
1041 static int vdebug_jtag_div(int speed, int *khz)
1042 {
1043  *khz = speed;
1044  LOG_DEBUG("div khz:%d from speed:%d", *khz, speed);
1045 
1046  return ERROR_OK;
1047 }
1048 
1049 static int vdebug_jtag_execute_queue(struct jtag_command *cmd_queue)
1050 {
1051  int rc = ERROR_OK;
1052 
1053  for (struct jtag_command *cmd = cmd_queue; rc == ERROR_OK && cmd; cmd = cmd->next) {
1054  switch (cmd->type) {
1055  case JTAG_RUNTEST:
1056  rc = vdebug_jtag_runtest(cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->end_state, !cmd->next);
1057  break;
1058  case JTAG_STABLECLOCKS:
1059  rc = vdebug_jtag_stableclocks(cmd->cmd.stableclocks->num_cycles, !cmd->next);
1060  break;
1061  case JTAG_TLR_RESET:
1062  rc = vdebug_jtag_tlr(cmd->cmd.statemove->end_state, !cmd->next);
1063  break;
1064  case JTAG_PATHMOVE:
1065  rc = vdebug_jtag_path_move(cmd->cmd.pathmove, !cmd->next);
1066  break;
1067  case JTAG_TMS:
1068  rc = vdebug_jtag_tms_seq(cmd->cmd.tms->bits, cmd->cmd.tms->num_bits, !cmd->next);
1069  break;
1070  case JTAG_SLEEP:
1071  rc = vdebug_sleep(cmd->cmd.sleep->us);
1072  break;
1073  case JTAG_SCAN:
1074  rc = vdebug_jtag_scan(cmd->cmd.scan, !cmd->next);
1075  break;
1076  default:
1077  LOG_ERROR("Unknown JTAG command type 0x%x encountered", cmd->type);
1078  rc = ERROR_FAIL;
1079  }
1080  }
1081 
1082  return rc;
1083 }
1084 
1085 static int vdebug_dap_bankselect(struct adiv5_ap *ap, unsigned int reg)
1086 {
1087  int rc = ERROR_OK;
1088  uint64_t sel;
1089 
1090  if (is_adiv6(ap->dap)) {
1091  sel = ap->ap_num | (reg & 0x00000FF0);
1092  if (sel != (ap->dap->select & ~0xfull)) {
1093  sel |= ap->dap->select & DP_SELECT_DPBANK;
1094  if (ap->dap->asize > 32)
1095  sel |= (DP_SELECT1 >> 4) & DP_SELECT_DPBANK;
1096  ap->dap->select = sel;
1097  ap->dap->select_valid = true;
1098  rc = vdebug_reg_write(vdc.hsocket, pbuf, DP_SELECT >> 2, (uint32_t)sel, VD_ASPACE_DP, 0);
1099  if (rc == ERROR_OK) {
1100  ap->dap->select_valid = true;
1101  if (ap->dap->asize > 32)
1103  (uint32_t)(sel >> 32), VD_ASPACE_DP, 0);
1104  if (rc == ERROR_OK)
1105  ap->dap->select1_valid = true;
1106  }
1107  }
1108  } else { /* ADIv5 */
1109  sel = (ap->ap_num << 24) | (reg & ADIV5_DP_SELECT_APBANK);
1110  if (sel != ap->dap->select) {
1111  ap->dap->select = sel;
1112  rc = vdebug_reg_write(vdc.hsocket, pbuf, DP_SELECT >> 2, (uint32_t)sel, VD_ASPACE_DP, 0);
1113  if (rc == ERROR_OK)
1114  ap->dap->select_valid = true;
1115  }
1116  }
1117  return rc;
1118 }
1119 
1120 static int vdebug_dap_connect(struct adiv5_dap *dap)
1121 {
1122  return dap_dp_init(dap);
1123 }
1124 
1125 static int vdebug_dap_send_sequence(struct adiv5_dap *dap, enum swd_special_seq seq)
1126 {
1127  return ERROR_OK;
1128 }
1129 
1130 static int vdebug_dap_queue_dp_read(struct adiv5_dap *dap, unsigned int reg, uint32_t *data)
1131 {
1132  if (reg != DP_SELECT && reg != DP_RDBUFF
1133  && (!dap->select_valid || ((reg >> 4) & DP_SELECT_DPBANK) != (dap->select & DP_SELECT_DPBANK))) {
1134  dap->select = (dap->select & ~DP_SELECT_DPBANK) | ((reg >> 4) & DP_SELECT_DPBANK);
1136  dap->select_valid = true;
1137  }
1138  return vdebug_reg_read(vdc.hsocket, pbuf, (reg & DP_SELECT_DPBANK) >> 2, data, VD_ASPACE_DP, 0);
1139 }
1140 
1141 static int vdebug_dap_queue_dp_write(struct adiv5_dap *dap, unsigned int reg, uint32_t data)
1142 {
1143  if (reg != DP_SELECT && reg != DP_RDBUFF
1144  && (!dap->select_valid || ((reg >> 4) & DP_SELECT_DPBANK) != (dap->select & DP_SELECT_DPBANK))) {
1145  dap->select = (dap->select & ~DP_SELECT_DPBANK) | ((reg >> 4) & DP_SELECT_DPBANK);
1147  dap->select_valid = true;
1148  }
1149  return vdebug_reg_write(vdc.hsocket, pbuf, (reg & DP_SELECT_DPBANK) >> 2, data, VD_ASPACE_DP, 0);
1150 }
1151 
1152 static int vdebug_dap_queue_ap_read(struct adiv5_ap *ap, unsigned int reg, uint32_t *data)
1153 {
1155 
1157 
1158  return vdebug_reg_read(vdc.hsocket, pbuf, DP_RDBUFF >> 2, data, VD_ASPACE_DP, 0);
1159 }
1160 
1161 static int vdebug_dap_queue_ap_write(struct adiv5_ap *ap, unsigned int reg, uint32_t data)
1162 {
1164  return vdebug_reg_write(vdc.hsocket, pbuf, (reg & DP_SELECT_DPBANK) >> 2, data, VD_ASPACE_AP, 0);
1165 }
1166 
1167 static int vdebug_dap_queue_ap_abort(struct adiv5_dap *dap, uint8_t *ack)
1168 {
1169  return vdebug_reg_write(vdc.hsocket, pbuf, 0, 0x1, VD_ASPACE_AB, 0);
1170 }
1171 
1172 static int vdebug_dap_run(struct adiv5_dap *dap)
1173 {
1174  if (le_to_h_u16(pbuf->waddr))
1176 
1177  return ERROR_OK;
1178 }
1179 
1180 COMMAND_HANDLER(vdebug_set_server)
1181 {
1182  if ((CMD_ARGC != 1) || !strchr(CMD_ARGV[0], ':'))
1184 
1185  char *pchar = strchr(CMD_ARGV[0], ':');
1186  *pchar = '\0';
1187  strncpy(vdc.server_name, CMD_ARGV[0], sizeof(vdc.server_name) - 1);
1188  int port = atoi(++pchar);
1189  if (port < 0 || port > UINT16_MAX) {
1190  LOG_ERROR("invalid port number %d specified", port);
1192  }
1193  vdc.server_port = port;
1194  LOG_DEBUG("server: %s port %u", vdc.server_name, vdc.server_port);
1195 
1196  return ERROR_OK;
1197 }
1198 
1199 COMMAND_HANDLER(vdebug_set_bfm)
1200 {
1201  char prefix;
1202 
1203  if ((CMD_ARGC != 2) || (sscanf(CMD_ARGV[1], "%u%c", &vdc.bfm_period, &prefix) != 2))
1205 
1206  strncpy(vdc.bfm_path, CMD_ARGV[0], sizeof(vdc.bfm_path) - 1);
1207  switch (prefix) {
1208  case 'u':
1209  vdc.bfm_period *= 1000000;
1210  break;
1211  case 'n':
1212  vdc.bfm_period *= 1000;
1213  break;
1214  case 'p':
1215  default:
1216  break;
1217  }
1219  vdc.bfm_type = strstr(vdc.bfm_path, "dap6") ? VD_BFM_DAP6 : VD_BFM_SWDP;
1220  else
1222  LOG_DEBUG("bfm_path: %s clk_period %ups", vdc.bfm_path, vdc.bfm_period);
1223 
1224  return ERROR_OK;
1225 }
1226 
1227 COMMAND_HANDLER(vdebug_set_mem)
1228 {
1229  if (CMD_ARGC != 3)
1231 
1232  if (vdc.mem_ndx >= VD_MAX_MEMORIES) {
1233  LOG_ERROR("mem_path declared more than %d allowed times", VD_MAX_MEMORIES);
1234  return ERROR_FAIL;
1235  }
1236 
1237  strncpy(vdc.mem_path[vdc.mem_ndx], CMD_ARGV[0], sizeof(vdc.mem_path[vdc.mem_ndx]) - 1);
1240  LOG_DEBUG("mem_path: set %s @ 0x%08x+0x%08x", vdc.mem_path[vdc.mem_ndx],
1242  vdc.mem_ndx++;
1243 
1244  return ERROR_OK;
1245 }
1246 
1247 COMMAND_HANDLER(vdebug_set_batching)
1248 {
1249  if (CMD_ARGC != 1)
1251 
1252  if (isdigit((unsigned char)CMD_ARGV[0][0]))
1253  vdc.trans_batch = (CMD_ARGV[0][0] == '0' ? 0 : (CMD_ARGV[0][0] == '1' ? 1 : 2));
1254  else if (CMD_ARGV[0][0] == 'r')
1256  else if (CMD_ARGV[0][0] == 'w')
1258  else
1260  LOG_DEBUG("batching: set to %u", vdc.trans_batch);
1261 
1262  return ERROR_OK;
1263 }
1264 
1265 COMMAND_HANDLER(vdebug_set_polling)
1266 {
1267  if (CMD_ARGC != 2)
1269 
1270  vdc.poll_min = atoi(CMD_ARGV[0]);
1271  vdc.poll_max = atoi(CMD_ARGV[1]);
1272  LOG_DEBUG("polling: set min %u max %u", vdc.poll_min, vdc.poll_max);
1273 
1274  return ERROR_OK;
1275 }
1276 
1277 static const struct command_registration vdebug_command_handlers[] = {
1278  {
1279  .name = "server",
1280  .handler = &vdebug_set_server,
1281  .mode = COMMAND_CONFIG,
1282  .help = "set the vdebug server name or address",
1283  .usage = "<host:port>",
1284  },
1285  {
1286  .name = "bfm_path",
1287  .handler = &vdebug_set_bfm,
1288  .mode = COMMAND_CONFIG,
1289  .help = "set the vdebug BFM hierarchical path",
1290  .usage = "<path> <clk_period[p|n|u]s>",
1291  },
1292  {
1293  .name = "mem_path",
1294  .handler = &vdebug_set_mem,
1295  .mode = COMMAND_CONFIG,
1296  .help = "set the design memory for the code load",
1297  .usage = "<path> <base_address> <size>",
1298  },
1299  {
1300  .name = "batching",
1301  .handler = &vdebug_set_batching,
1302  .mode = COMMAND_CONFIG,
1303  .help = "set the transaction batching no|wr|rd [0|1|2]",
1304  .usage = "<level>",
1305  },
1306  {
1307  .name = "polling",
1308  .handler = &vdebug_set_polling,
1309  .mode = COMMAND_CONFIG,
1310  .help = "set the polling pause, executing hardware cycles between min and max",
1311  .usage = "<min cycles> <max cycles>",
1312  },
1314 };
1315 
1316 static const struct command_registration vdebug_command[] = {
1317  {
1318  .name = "vdebug",
1319  .chain = vdebug_command_handlers,
1320  .mode = COMMAND_ANY,
1321  .help = "vdebug command group",
1322  .usage = "",
1323  },
1325 };
1326 
1327 static struct jtag_interface vdebug_jtag_ops = {
1329  .execute_queue = vdebug_jtag_execute_queue,
1330 };
1331 
1332 static const struct dap_ops vdebug_dap_ops = {
1334  .send_sequence = vdebug_dap_send_sequence,
1335  .queue_dp_read = vdebug_dap_queue_dp_read,
1336  .queue_dp_write = vdebug_dap_queue_dp_write,
1337  .queue_ap_read = vdebug_dap_queue_ap_read,
1338  .queue_ap_write = vdebug_dap_queue_ap_write,
1339  .queue_ap_abort = vdebug_dap_queue_ap_abort,
1340  .run = vdebug_dap_run,
1341  .sync = NULL, /* optional */
1342  .quit = NULL, /* optional */
1343 };
1344 
1345 static const char *const vdebug_transports[] = { "jtag", "dapdirect_swd", NULL };
1346 
1348  .name = "vdebug",
1349  .transports = vdebug_transports,
1350  .speed = vdebug_jtag_speed,
1351  .khz = vdebug_jtag_khz,
1352  .speed_div = vdebug_jtag_div,
1353  .commands = vdebug_command,
1354  .init = vdebug_init,
1355  .quit = vdebug_quit,
1356  .reset = vdebug_reset,
1357  .jtag_ops = &vdebug_jtag_ops,
1358  .dap_swd_ops = &vdebug_dap_ops,
1359 };
bool transport_is_dapdirect_swd(void)
Returns true if the current debug session is using SWD as its transport.
int dap_dp_init(struct adiv5_dap *dap)
Initialize a DAP.
Definition: arm_adi_v5.c:779
This defines formats and data structures used to talk to ADIv5 entities.
#define DP_SELECT
Definition: arm_adi_v5.h:57
#define DP_SELECT1
Definition: arm_adi_v5.h:55
#define DP_RDBUFF
Definition: arm_adi_v5.h:58
swd_special_seq
Definition: arm_adi_v5.h:236
static bool is_adiv6(const struct adiv5_dap *dap)
Check if DAP is ADIv6.
Definition: arm_adi_v5.h:523
#define ADIV5_DP_SELECT_APBANK
Definition: arm_adi_v5.h:101
#define DP_SELECT_DPBANK
Definition: arm_adi_v5.h:102
static void buf_set_u32(uint8_t *_buffer, unsigned first, unsigned num, uint32_t value)
Sets num bits in _buffer, starting at the first bit, using the bits in value.
Definition: binarybuffer.h:31
#define CMD_ARGV
Use this macro to access the arguments for the command being handled, rather than accessing the varia...
Definition: command.h:156
#define ERROR_COMMAND_SYNTAX_ERROR
Definition: command.h:402
#define CMD_ARGC
Use this macro to access the number of arguments for the command being handled, rather than accessing...
Definition: command.h:151
#define COMMAND_PARSE_NUMBER(type, in, out)
parses the string in into out as a type, or prints a command error and passes the error code to the c...
Definition: command.h:442
#define COMMAND_REGISTRATION_DONE
Use this as the last entry in an array of command_registration records.
Definition: command.h:253
@ COMMAND_CONFIG
Definition: command.h:41
@ COMMAND_ANY
Definition: command.h:42
int jtag_scan_size(const struct scan_command *cmd)
Definition: commands.c:182
@ JTAG_TLR_RESET
Definition: commands.h:137
@ JTAG_SCAN
Definition: commands.h:129
@ JTAG_PATHMOVE
Definition: commands.h:140
@ JTAG_STABLECLOCKS
Definition: commands.h:142
@ JTAG_RUNTEST
Definition: commands.h:138
@ JTAG_SLEEP
Definition: commands.h:141
@ JTAG_TMS
Definition: commands.h:143
tap_state_t tap_state_transition(tap_state_t cur_state, bool tms)
Function tap_state_transition takes a current TAP state and returns the next state according to the t...
Definition: interface.c:223
int tap_get_tms_path(tap_state_t from, tap_state_t to)
This function provides a "bit sequence" indicating what has to be done with TMS during a sequence of ...
Definition: interface.c:190
int tap_get_tms_path_len(tap_state_t from, tap_state_t to)
Function int tap_get_tms_path_len returns the total number of bits that represents a TMS path transit...
Definition: interface.c:195
tap_state_t tap_get_state(void)
This function gets the state of the "state follower" which tracks the state of the TAPs connected to ...
Definition: interface.c:37
#define DEBUG_CAP_TMS_SEQ
Definition: interface.h:187
#define tap_set_state(new_state)
This function sets the state of a "state follower" which tracks the state of the TAPs connected to th...
Definition: interface.h:49
bool transport_is_jtag(void)
Returns true if the current debug session is using JTAG as its transport.
Definition: jtag/core.c:1828
@ TAP_IRSHIFT
Definition: jtag.h:51
@ TAP_DRSHIFT
Definition: jtag.h:43
enum tap_state tap_state_t
Defines JTAG Test Access Port states.
#define list_first_entry(ptr, type, member)
Definition: list.h:127
static void list_add_tail(struct list_head *new, struct list_head *head)
Definition: list.h:199
static int list_empty(const struct list_head *head)
Definition: list.h:60
static void list_del(struct list_head *entry)
Definition: list.h:87
static void INIT_LIST_HEAD(struct list_head *list)
Definition: list.h:53
#define LOG_DEBUG_IO(expr ...)
Definition: log.h:101
#define LOG_WARNING(expr ...)
Definition: log.h:129
#define ERROR_FAIL
Definition: log.h:170
#define LOG_ERROR(expr ...)
Definition: log.h:132
#define LOG_INFO(expr ...)
Definition: log.h:126
#define LOG_DEBUG(expr ...)
Definition: log.h:109
#define ERROR_OK
Definition: log.h:164
static uint32_t lh(unsigned int rd, unsigned int base, uint16_t offset) __attribute__((unused))
Definition: opcodes.h:117
static int close_socket(int sock)
Definition: replacements.h:184
target_addr_t addr
Start address to search for the control block.
Definition: rtt/rtt.c:28
Represents a driver for a debugging interface.
Definition: interface.h:207
const char *const name
The name of the interface driver.
Definition: interface.h:209
This represents an ARM Debug Interface (v5) Access Port (AP).
Definition: arm_adi_v5.h:250
uint64_t ap_num
ADIv5: Number of this AP (0~255) ADIv6: Base address of this AP (4k aligned) TODO: to be more coheren...
Definition: arm_adi_v5.h:261
struct adiv5_dap * dap
DAP this AP belongs to.
Definition: arm_adi_v5.h:254
This represents an ARM Debug Interface (v5) Debug Access Port (DAP).
Definition: arm_adi_v5.h:348
bool select_valid
Validity of DP SELECT cache.
Definition: arm_adi_v5.h:372
bool select1_valid
Definition: arm_adi_v5.h:373
uint64_t select
Cache for DP SELECT and SELECT1 (ADIv6) register.
Definition: arm_adi_v5.h:370
unsigned int asize
Definition: arm_adi_v5.h:436
const char * name
Definition: command.h:235
enum command_mode mode
Definition: command.h:238
Transport-neutral representation of queued DAP transactions, supporting both JTAG and SWD transports.
Definition: arm_adi_v5.h:446
int(* connect)(struct adiv5_dap *dap)
connect operation for SWD
Definition: arm_adi_v5.h:451
Represents a driver for a debugging interface.
Definition: interface.h:182
unsigned supported
Bit vector listing capabilities exposed by this driver.
Definition: interface.h:186
Definition: list.h:40
Definition: register.h:111
The scan_command provide a means of encapsulating a set of scan_field_s structures that should be sca...
Definition: commands.h:35
uint16_t sig_write
Definition: vdebug.c:196
uint8_t mem_ndx
Definition: vdebug.c:191
uint32_t mem_width[VD_MAX_MEMORIES]
Definition: vdebug.c:200
bool trans_first
Definition: vdebug.c:189
uint16_t sig_read
Definition: vdebug.c:195
uint8_t bfm_type
Definition: vdebug.c:194
uint8_t buf_width
Definition: vdebug.c:192
uint8_t trans_batch
Definition: vdebug.c:188
uint32_t mem_base[VD_MAX_MEMORIES]
Definition: vdebug.c:198
uint16_t server_port
Definition: vdebug.c:202
char mem_path[VD_MAX_MEMORIES][128]
Definition: vdebug.c:210
uint8_t addr_bits
Definition: vdebug.c:193
bool trans_last
Definition: vdebug.c:190
uint32_t bfm_period
Definition: vdebug.c:197
struct vd_rdata rdataq
Definition: vdebug.c:211
char server_name[32]
Definition: vdebug.c:208
uint32_t mem_depth[VD_MAX_MEMORIES]
Definition: vdebug.c:201
uint32_t poll_cycles
Definition: vdebug.c:203
uint32_t poll_max
Definition: vdebug.c:205
uint32_t targ_time
Definition: vdebug.c:206
uint32_t mem_size[VD_MAX_MEMORIES]
Definition: vdebug.c:199
uint32_t poll_min
Definition: vdebug.c:204
char bfm_path[128]
Definition: vdebug.c:209
int hsocket
Definition: vdebug.c:207
uint64_t pre
Definition: vdebug.c:217
uint64_t wlen
Definition: vdebug.c:219
uint64_t cmd
Definition: vdebug.c:218
uint64_t post
Definition: vdebug.c:216
uint64_t tlen
Definition: vdebug.c:215
uint64_t rlen
Definition: vdebug.c:220
uint8_t * rdata
Definition: vdebug.c:184
struct list_head lh
Definition: vdebug.c:183
uint64_t haddr
Definition: vdebug.c:226
uint64_t prot
Definition: vdebug.c:224
uint64_t nonincr
Definition: vdebug.c:225
uint64_t tlen
Definition: vdebug.c:227
uint64_t asize
Definition: vdebug.c:228
uint64_t addr
Definition: vdebug.c:230
uint64_t cmd
Definition: vdebug.c:229
Definition: vdebug.c:155
uint8_t offset[4]
Definition: vdebug.c:165
uint8_t dummy[96]
Definition: vdebug.c:179
uint8_t offseth[2]
Definition: vdebug.c:166
uint8_t rwdata[4]
Definition: vdebug.c:164
uint8_t rd8[VD_BUFFER_LEN]
Definition: vdebug.c:176
uint8_t rwords[2]
Definition: vdebug.c:163
uint8_t type
Definition: vdebug.c:158
uint8_t cmd
Definition: vdebug.c:157
uint8_t waddr[2]
Definition: vdebug.c:159
uint8_t wd8[VD_BUFFER_LEN]
Definition: vdebug.c:169
uint8_t awords[2]
Definition: vdebug.c:172
uint8_t wbytes[2]
Definition: vdebug.c:160
uint8_t state[4]
Definition: vdebug.c:177
uint8_t status[4]
Definition: vdebug.c:173
uint8_t wid[2]
Definition: vdebug.c:167
uint8_t count[4]
Definition: vdebug.c:178
uint8_t rbytes[2]
Definition: vdebug.c:161
uint8_t wwords[2]
Definition: vdebug.c:162
uint8_t rid[2]
Definition: vdebug.c:171
uint8_t duttime[8]
Definition: vdebug.c:174
int64_t timeval_ms(void)
static uint64_t le_to_h_u64(const uint8_t *buf)
Definition: types.h:100
static void h_u16_to_be(uint8_t *buf, uint16_t val)
Definition: types.h:214
static uint16_t le_to_h_u16(const uint8_t *buf)
Definition: types.h:122
static void h_u32_to_le(uint8_t *buf, uint32_t val)
Definition: types.h:178
#define DIV_ROUND_UP(m, n)
Rounds m up to the nearest multiple of n using division.
Definition: types.h:79
static void h_u16_to_le(uint8_t *buf, uint16_t val)
Definition: types.h:208
static uint32_t le_to_h_u32(const uint8_t *buf)
Definition: types.h:112
static void h_u64_to_le(uint8_t *buf, uint64_t val)
Definition: types.h:154
#define NULL
Definition: usb.h:16
static uint32_t vdebug_wait_server(int hsock, struct vd_shm *pmem)
Definition: vdebug.c:333
static int vdebug_close(int hsock, struct vd_shm *pm, uint8_t type)
Definition: vdebug.c:551
#define VD_CHEADER_LEN
Definition: vdebug.c:58
uint8_t rwords[2]
Definition: vdebug.c:7
static int vdebug_dap_bankselect(struct adiv5_ap *ap, unsigned int reg)
Definition: vdebug.c:1085
uint8_t waddr[2]
Definition: vdebug.c:3
static int vdebug_dap_send_sequence(struct adiv5_dap *dap, enum swd_special_seq seq)
Definition: vdebug.c:1125
@ VD_BATCH_WO
Definition: vdebug.c:151
@ VD_BATCH_NO
Definition: vdebug.c:150
@ VD_BATCH_WR
Definition: vdebug.c:152
@ VD_BFM_SWDP
Definition: vdebug.c:71
@ VD_BFM_JTAG
Definition: vdebug.c:75
@ VD_BFM_TPIU
Definition: vdebug.c:69
@ VD_BFM_SWD
Definition: vdebug.c:76
@ VD_BFM_AHB
Definition: vdebug.c:72
@ VD_BFM_APB
Definition: vdebug.c:73
@ VD_BFM_DAP6
Definition: vdebug.c:70
@ VD_BFM_AXI
Definition: vdebug.c:74
static int vdebug_dap_queue_dp_write(struct adiv5_dap *dap, unsigned int reg, uint32_t data)
Definition: vdebug.c:1141
uint8_t type
Definition: vdebug.c:2
static int vdebug_jtag_div(int speed, int *khz)
Definition: vdebug.c:1041
static const char *const vdebug_transports[]
Definition: vdebug.c:1345
static int vdebug_dap_queue_ap_abort(struct adiv5_dap *dap, uint8_t *ack)
Definition: vdebug.c:1167
@ VD_SIG_BUF
Definition: vdebug.c:91
@ VD_SIG_RESET
Definition: vdebug.c:86
@ VD_SIG_TCK
Definition: vdebug.c:83
@ VD_SIG_TRST
Definition: vdebug.c:87
@ VD_SIG_POWER
Definition: vdebug.c:89
@ VD_SIG_TDO
Definition: vdebug.c:88
@ VD_SIG_TMS
Definition: vdebug.c:85
@ VD_SIG_TDI
Definition: vdebug.c:84
@ VD_SIG_TCKDIV
Definition: vdebug.c:90
static int vdebug_reg_read(int hsock, struct vd_shm *pm, const uint32_t reg, uint32_t *data, uint8_t aspace, uint8_t f_last)
Definition: vdebug.c:758
static int vdebug_open(int hsock, struct vd_shm *pm, const char *path, uint8_t type, uint32_t period_ps, uint32_t sig_mask)
Definition: vdebug.c:501
#define VD_SHEADER_LEN
Definition: vdebug.c:59
#define VD_VERSION
Definition: vdebug.c:56
static int vdebug_dap_queue_ap_read(struct adiv5_ap *ap, unsigned int reg, uint32_t *data)
Definition: vdebug.c:1152
static int vdebug_jtag_stableclocks(int num, uint8_t f_flush)
Definition: vdebug.c:1008
static int vdebug_jtag_path_move(struct pathmove_command *cmd, uint8_t f_flush)
Definition: vdebug.c:931
@ VD_CMD_SIGGET
Definition: vdebug.c:132
@ VD_CMD_REGREAD
Definition: vdebug.c:135
@ VD_CMD_REGWRITE
Definition: vdebug.c:134
@ VD_CMD_DISCONNECT
Definition: vdebug.c:129
@ VD_CMD_OPEN
Definition: vdebug.c:126
@ VD_CMD_SIGSET
Definition: vdebug.c:131
@ VD_CMD_WAIT
Definition: vdebug.c:130
@ VD_CMD_JTAGCLOCK
Definition: vdebug.c:133
@ VD_CMD_MEMOPEN
Definition: vdebug.c:137
@ VD_CMD_CLOSE
Definition: vdebug.c:127
@ VD_CMD_JTAGSHTAP
Definition: vdebug.c:136
@ VD_CMD_CONNECT
Definition: vdebug.c:128
@ VD_CMD_MEMCLOSE
Definition: vdebug.c:138
@ VD_CMD_MEMWRITE
Definition: vdebug.c:139
static int vdebug_run_jtag_queue(int hsock, struct vd_shm *pm, unsigned int count)
Definition: vdebug.c:353
static int vdebug_run_reg_queue(int hsock, struct vd_shm *pm, unsigned int count)
Definition: vdebug.c:429
COMMAND_HANDLER(vdebug_set_server)
Definition: vdebug.c:1180
static struct jtag_interface vdebug_jtag_ops
Definition: vdebug.c:1327
uint8_t cmd
Definition: vdebug.c:1
#define VD_BUFFER_LEN
Definition: vdebug.c:57
struct adapter_driver vdebug_adapter_driver
Definition: vdebug.c:1347
static int vdebug_jtag_shift_tap(int hsock, struct vd_shm *pm, uint8_t num_pre, const uint8_t tms_pre, uint32_t num, const uint8_t *tdi, uint8_t num_post, const uint8_t tms_post, uint8_t *tdo, uint8_t f_last)
Definition: vdebug.c:624
#define VD_MAX_MEMORIES
Definition: vdebug.c:61
static int vdebug_dap_queue_ap_write(struct adiv5_ap *ap, unsigned int reg, uint32_t data)
Definition: vdebug.c:1161
static int vdebug_jtag_runtest(int cycles, tap_state_t state, uint8_t f_flush)
Definition: vdebug.c:995
static int vdebug_socket_open(char *server_addr, uint32_t port)
Definition: vdebug.c:245
static struct vd_client vdc
Definition: vdebug.c:234
static int vdebug_quit(void)
Definition: vdebug.c:886
static int vdebug_jtag_speed(int speed)
Definition: vdebug.c:1022
#define VD_SCALE_PSTOMS
Definition: vdebug.c:63
static const struct dap_ops vdebug_dap_ops
Definition: vdebug.c:1332
static int vdebug_reset(int trst, int srst)
Definition: vdebug.c:902
static int vdebug_jtag_scan(struct scan_command *cmd, uint8_t f_flush)
Definition: vdebug.c:963
static int vdebug_init(void)
Definition: vdebug.c:842
static int vdebug_jtag_clock(int hsock, struct vd_shm *pm, uint32_t value)
Definition: vdebug.c:607
struct vd_rdata __attribute__
static int vdebug_dap_connect(struct adiv5_dap *dap)
Definition: vdebug.c:1120
static int vdebug_reg_write(int hsock, struct vd_shm *pm, const uint32_t reg, const uint32_t data, uint8_t aspace, uint8_t f_last)
Definition: vdebug.c:727
static int vdebug_dap_queue_dp_read(struct adiv5_dap *dap, unsigned int reg, uint32_t *data)
Definition: vdebug.c:1130
static int vdebug_jtag_tms_seq(const uint8_t *tms, int num, uint8_t f_flush)
Definition: vdebug.c:924
static int vdebug_mem_open(int hsock, struct vd_shm *pm, const char *path, uint8_t ndx)
Definition: vdebug.c:801
static int vdebug_wait(int hsock, struct vd_shm *pm, uint32_t cycles)
Definition: vdebug.c:572
static int vdebug_dap_run(struct adiv5_dap *dap)
Definition: vdebug.c:1172
static int vdebug_jtag_tlr(tap_state_t state, uint8_t f_flush)
Definition: vdebug.c:947
static void vdebug_mem_close(int hsock, struct vd_shm *pm, uint8_t ndx)
Definition: vdebug.c:829
static int vdebug_sig_set(int hsock, struct vd_shm *pm, uint32_t write_mask, uint32_t value)
Definition: vdebug.c:590
@ VD_ASPACE_ID
Definition: vdebug.c:145
@ VD_ASPACE_AB
Definition: vdebug.c:146
@ VD_ASPACE_AP
Definition: vdebug.c:143
@ VD_ASPACE_DP
Definition: vdebug.c:144
static int vdebug_jtag_execute_queue(struct jtag_command *cmd_queue)
Definition: vdebug.c:1049
static int vdebug_jtag_khz(int khz, int *jtag_speed)
Definition: vdebug.c:1031
uint8_t offset[4]
Definition: vdebug.c:9
static int vdebug_socket_error(void)
Definition: vdebug.c:236
static int vdebug_socket_send(int hsock, struct vd_shm *pmem)
Definition: vdebug.c:322
static int vdebug_socket_receive(int hsock, struct vd_shm *pmem)
Definition: vdebug.c:299
static const struct command_registration vdebug_command[]
Definition: vdebug.c:1316
static struct vd_shm * pbuf
Definition: vdebug.c:233
uint8_t state[4]
Definition: vdebug.c:21
static int vdebug_sleep(int us)
Definition: vdebug.c:1015
static const struct command_registration vdebug_command_handlers[]
Definition: vdebug.c:1277
@ VD_ERR_NO_POWER
Definition: vdebug.c:118
@ VD_ERR_LICENSE
Definition: vdebug.c:115
@ VD_ERR_SOC_ADDR
Definition: vdebug.c:108
@ VD_ERR_NO_ACCESS
Definition: vdebug.c:120
@ VD_ERR_NOT_OPEN
Definition: vdebug.c:114
@ VD_ERR_TIME_OUT
Definition: vdebug.c:117
@ VD_ERR_PARAM
Definition: vdebug.c:101
@ VD_ERR_SHM_MAP
Definition: vdebug.c:105
@ VD_ERR_INV_HANDLE
Definition: vdebug.c:121
@ VD_ERR_NO_MEMORY
Definition: vdebug.c:103
@ VD_ERR_SOC_OPEN
Definition: vdebug.c:106
@ VD_ERR_SOC_CONN
Definition: vdebug.c:109
@ VD_ERR_NOT_RUN
Definition: vdebug.c:113
@ VD_ERR_SOC_RECV
Definition: vdebug.c:111
@ VD_ERR_CONFIG
Definition: vdebug.c:102
@ VD_ERR_NONE
Definition: vdebug.c:98
@ VD_ERR_SOC_OPT
Definition: vdebug.c:107
@ VD_ERR_NOT_IMPL
Definition: vdebug.c:99
@ VD_ERR_VERSION
Definition: vdebug.c:116
@ VD_ERR_INV_SCOPE
Definition: vdebug.c:122
@ VD_ERR_SOC_SEND
Definition: vdebug.c:110
@ VD_ERR_BUS_ERROR
Definition: vdebug.c:119
@ VD_ERR_LOCKED
Definition: vdebug.c:112
@ VD_ERR_SHM_OPEN
Definition: vdebug.c:104
@ VD_ERR_USAGE
Definition: vdebug.c:100
uint8_t count[4]
Definition: vdebug.c:22