OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [jtag.c] - Blame information for rev 593

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* Remote debugging interface for JTAG debugging protocol.
2 118 markom
   JTAG connects to or1k target ops. See or1k-tdep.c
3
 
4 104 markom
   Copyright 1993-1995, 2000 Free Software Foundation, Inc.
5
   Contributed by Cygnus Support.  Written by Marko Mlinar
6
   <markom@opencores.org>
7 124 chris
   Areas noted by (CZ) were modified by Chris Ziomkowski
8
   <chris@asics.ws>
9 104 markom
 
10
   This file is part of GDB.
11
 
12
   This program is free software; you can redistribute it and/or modify
13
   it under the terms of the GNU General Public License as published by
14
   the Free Software Foundation; either version 2 of the License, or
15
   (at your option) any later version.
16
 
17
   This program is distributed in the hope that it will be useful,
18
   but WITHOUT ANY WARRANTY; without even the implied warranty of
19
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20
   GNU General Public License for more details.
21
 
22
   You should have received a copy of the GNU General Public License
23
   along with this program; if not, write to the Free Software
24
   Foundation, Inc., 59 Temple Place - Suite 330,
25
   Boston, MA 02111-1307, USA.  */
26
 
27
#include "defs.h"
28
#include "inferior.h"
29
#include "bfd.h"
30
#include "symfile.h"
31
#include "gdb_wait.h"
32
#include "gdbcmd.h"
33
#include "gdbcore.h"
34
#include "serial.h"
35
#include "target.h"
36
#include "remote-utils.h"
37
#include "gdb_string.h"
38
#include "tm.h"
39 124 chris
/* Added by CZ 24/05/01 */
40
#include <sys/poll.h>
41
#include <sys/socket.h>
42
#include <netdb.h>
43
#include <netinet/in.h>
44
#include <netinet/tcp.h>
45
#include <sys/select.h>
46
#include <sys/time.h>
47
#include <unistd.h>
48 104 markom
 
49
#include <signal.h>
50
#include <sys/types.h>
51
#include <sys/stat.h>
52
#include <sys/ioctl.h>
53
#include <fcntl.h>
54
 
55 113 markom
#define TCLK (0x01)
56
#define TRST (0x02)
57 104 markom
#define JTAG_WAIT()
58 113 markom
#define NUM_RETRIES (16)
59
#define JTAG_RETRY_WAIT() usleep (100)
60 104 markom
 
61 113 markom
/* Selects crc trailer size in bits. Currently supported: 8 */
62
#define CRC_SIZE (8)
63 104 markom
 
64 113 markom
/* Scan chain size in bits.  */
65
#define SC_SIZE (4)
66
 
67
/* Scan chain info. */
68
/* *INDENT-OFF* */
69
static int chain_addr_size[] = { 0,  32, 0,  0,  5  };
70
static int chain_data_size[] = { 0,  32, 0,  32, 32 };
71
static int chain_is_valid[]  = { 0,  1,  0,  1,  1  };
72
static int chain_has_crc[]   = { 0,  1,  0,  1,  1  };
73
static int chain_has_rw[]    = { 0,  1,  0,  0,  1  };
74
/* *INDENT-OFF* */
75
 
76
/* Currently selected scan chain - just to prevent unnecessary
77
   transfers. */
78
static int current_chain;
79
 
80 104 markom
/* Designates whether we are in SELECT_DR state, otherwise in
81
   RUN TEST/IDLE */
82
static int select_dr = 0;
83
 
84 124 chris
/* CZ - 24/05/01 - Changed to structure for remote/local */
85
typedef enum {
86
  JTAG_NOT_CONNECTED = 0,
87
  JTAG_LOCAL = 1,
88
  JTAG_REMOTE = 2,
89
} jtag_location;
90 104 markom
 
91 124 chris
typedef struct {
92
  union {
93
    int lp; /* Printer compatible device we have open.  */
94
    int fd; /* Socket for remote or1k jtag interface */
95
  } device;
96
  jtag_location location;
97
} jtag_connection;
98
 
99
/* Our current connect information */
100
static jtag_connection connection;
101
 
102 104 markom
/* Crc of current read or written data.  */
103
static int crc_r, crc_w = 0;
104
 
105
/* Generates new crc, sending in new bit input_bit */
106 118 markom
 
107 104 markom
static int
108
crc_calc (int crc, int input_bit)
109
{
110
  int c;
111
  int new_crc;
112
  int d;
113
 
114 113 markom
#if (CRC_SIZE == 8)
115 104 markom
  d = input_bit&1;
116
  c = crc;
117
 
118
  /* Move queue left.  */
119
  new_crc = crc << 1;
120 118 markom
 
121 104 markom
  /* Mask upper five bits.  */
122
  new_crc &= 0xF8;
123
 
124
  /* Set lower three bits */
125
  new_crc |= (d ^ ((c >> 7)&1));
126
  new_crc |= (d ^ ((c >> 0)&1) ^ ((c >> 7)&1)) << 1;
127
  new_crc |= (d ^ ((c >> 1)&1) ^ ((c >> 7)&1)) << 2;
128
  return new_crc;
129 113 markom
#else
130
  return 0;
131
#endif
132 104 markom
}
133
 
134
/* Resets JTAG.
135
   Writes TRST=0
136
   and    TRST=1 */
137
 
138
static void
139
jp1_reset_JTAG ()
140
{
141
  unsigned char data;
142 124 chris
  int lp = connection.device.lp;         /* CZ */
143
 
144
  if(connection.location != JTAG_LOCAL)
145
    error("jp1_reset_JTAG called without a local connection!");
146
 
147 104 markom
  data = 0;
148
  write (lp, &data, sizeof (data));
149
  JTAG_WAIT();
150
  data = TRST;
151
  write (lp, &data, sizeof (data));
152
  JTAG_WAIT();
153
}
154
 
155
/* Writes TCLK=0, TRST=1, TMS=bit0, TDI=bit1
156
   and    TCLK=1, TRST=1, TMS=bit0, TDI=bit1 */
157
 
158
static void
159
jp1_write_JTAG (packet)
160
     unsigned char packet;
161
{
162
  unsigned char data;
163 124 chris
  int lp = connection.device.lp;    /* CZ */
164
 
165
  if(connection.location != JTAG_LOCAL)
166
    error("jp1_write_JTAG called without a local connection!");
167
 
168 104 markom
  data = ((packet & 3) << 2) | TRST;
169
  write (lp, &data, sizeof (data));
170
  JTAG_WAIT();
171
  crc_w = crc_calc (crc_w, (packet >> 1)&1);
172
 
173
  /* rise clock */
174
  data |= TCLK;
175
  write (lp, &data, sizeof (data));
176
  JTAG_WAIT();
177
}
178
 
179
/* Reads TDO, using IOCTL.  */
180
 
181
static int
182
jp1_read_JTAG ()
183
{
184
  int data;
185 124 chris
 
186
  if(connection.location != JTAG_LOCAL)    /* CZ */
187
    error("jp1_read_JTAG called without a local connection!");
188
 
189 113 markom
  ioctl (data, 0x60b, &data);
190 104 markom
  data = ((data & 0x80) != 0);
191
  crc_r = crc_calc (crc_r, data);
192
  return data;
193
}
194
 
195
/* Writes bitstream.  MS bit first.  */
196
 
197
static void
198
jp1_write_stream (stream, len, set_last_bit)
199 122 markom
     ULONGEST stream;
200 104 markom
     int len;
201
     int set_last_bit;
202
{
203
  int i;
204
  if (len <= 0) return;
205
  for (i = len - 1; i > 0; i--)
206
    jp1_write_JTAG (((stream >> i) & 1) << 1);
207
 
208
  if (set_last_bit)
209
    jp1_write_JTAG (((stream & 1) << 1) | 1);
210
  else
211
    jp1_write_JTAG ((stream & 1) << 1);
212
}
213
 
214
/* Gets bitstream.  MS bit first.  */
215
 
216 122 markom
static ULONGEST
217 104 markom
jp1_read_stream (len, stream, set_last_bit)
218
     int len;
219
     unsigned long stream;
220
     int set_last_bit;
221
{
222
  int i;
223 122 markom
  ULONGEST data;
224 104 markom
 
225
  if (len <= 0) return;
226
  data = 0;
227
  for (i = 0; i < len-1; i++)
228
    {
229
      jp1_write_JTAG (0 + ((stream & 1) << 1));
230
      stream >>= 1;
231
      data <<= 1;
232
      data |= jp1_read_JTAG ();
233
    }
234
 
235
  if (set_last_bit)
236
    jp1_write_JTAG (1 + (stream & 1) << 1);
237
  else
238
    jp1_write_JTAG (0 + (stream & 1) << 1);
239
  data <<= 1;
240
  data |= jp1_read_JTAG ();
241
  return data;
242
}
243
 
244
/* Goes into SELECT_IR state. Should be called before every control write.  */
245
 
246
static void
247
jp1_prepare_control ()
248
{
249
  if (!select_dr)
250
    jp1_write_JTAG (1); /* SELECT_DR SCAN */
251 118 markom
  jp1_write_JTAG (1);   /* SELECT_IR SCAN */
252 104 markom
  select_dr = 0;
253
}
254
 
255 124 chris
/* Added by CZ 24/05/01 */
256
static int jtag_proxy_write(int fd,void* buf,int len)
257
{
258
  int n;
259
  char* w_buf = (char*)buf;
260
  struct pollfd block;
261
 
262
  while(len)
263
    {
264
      if((n = write(fd,w_buf,len)) < 0)
265
        {
266
          switch(errno)
267
            {
268
            case EWOULDBLOCK: /* or EAGAIN */
269
              /* We've been called on a descriptor marked
270
                 for nonblocking I/O. We better simulate
271
                 blocking behavior. */
272
              block.fd = fd;
273
              block.events = POLLOUT;
274
              block.revents = 0;
275
              poll(&block,1,-1);
276
              continue;
277
            case EINTR:
278
              continue;
279
            case EPIPE:
280
              return JTAG_PROXY_SERVER_TERMINATED;
281
            default:
282
              return errno;
283
            }
284
        }
285
      else
286
        {
287
          len -= n;
288
          w_buf += n;
289
        }
290
    }
291
  return 0;
292
}
293
 
294
/* Added by CZ 24/05/01 */
295
static int jtag_proxy_read(int fd,void* buf,int len)
296
{
297
  int n;
298
  char* r_buf = (char*)buf;
299
  struct pollfd block;
300
 
301
  while(len)
302
    {
303
      if((n = read(fd,r_buf,len)) < 0)
304
        {
305
          switch(errno)
306
            {
307
            case EWOULDBLOCK: /* or EAGAIN */
308
              /* We've been called on a descriptor marked
309
                 for nonblocking I/O. We better simulate
310
                 blocking behavior. */
311
              block.fd = fd;
312
              block.events = POLLIN;
313
              block.revents = 0;
314
              poll(&block,1,-1);
315
              continue;
316
            case EINTR:
317
              continue;
318
            default:
319
              return errno;
320
            }
321
        }
322
      else if(n == 0)
323
        return JTAG_PROXY_SERVER_TERMINATED;
324
      else
325
        {
326
          len -= n;
327
          r_buf += n;
328
        }
329
    }
330
  return 0;
331
}
332
 
333
static int ReadResponse(int fd,void* buffer,int len)
334
{
335
  int32_t status = 0;
336 362 markom
  int result;
337 124 chris
  char* buf = (char*)buffer;
338
 
339 362 markom
        result = jtag_proxy_read(fd,&status,4);
340
 
341 124 chris
  status = ntohl(status);
342
  *((int32_t*)buffer) = status;
343
 
344 362 markom
  if(result)    {printf("result %i %x\n", result, result); return result;}
345
  if(status)    {printf("status %i %x\n", status, status); return status;}
346 124 chris
 
347
  result = jtag_proxy_read(fd,&buf[4],len-4);
348
  return result;
349
}
350
 
351
/* Added by CZ 24/05/01 */
352
#ifndef ANSI_PROTOTYPES
353
static int jtag_send_proxy(va_alist)
354
va_dcl
355
#else
356
static int jtag_send_proxy(int command,...)
357
#endif
358
{
359
  va_list ap;
360
  int result = 0;
361
  int fd = connection.device.fd;
362
  JTAGProxyWriteMessage xmit_write;
363
  JTAGProxyReadMessage xmit_read;
364
  JTAGProxyChainMessage xmit_chain;
365 140 chris
  JTAGProxyBlockWriteMessage *xmit_bwrite;
366
  JTAGProxyBlockReadMessage xmit_bread;
367 124 chris
  JTAGProxyWriteResponse recv_write;
368
  JTAGProxyReadResponse recv_read;
369
  JTAGProxyChainResponse recv_chain;
370 140 chris
  JTAGProxyBlockWriteResponse recv_bwrite;
371
  JTAGProxyBlockReadResponse recv_bread;
372 124 chris
  unsigned long long data,* ret_val;
373
  uint32_t word1; /* Use word1 and word2 to ease portability to platforms */
374
  uint32_t word2; /* without long long and for alignment reasons */
375 140 chris
  unsigned long  address;
376
  unsigned long* b_data;
377
  int nRegisters;
378
  int len,i;
379 124 chris
 
380
#ifndef ANSI_PROTOTYPES
381
  int command;
382
 
383
  va_start(ap);
384
  command = va_arg(ap,int);
385
#else
386
  va_start(ap, command);
387
#endif
388
 
389
 
390
 
391
  if(connection.location == JTAG_REMOTE)
392
    {
393
      switch(command)
394
        {
395
        case JTAG_COMMAND_READ:
396
          xmit_read.command = htonl(command);
397
          xmit_read.length = htonl(sizeof(xmit_read)-8);
398
          xmit_read.address = htonl(va_arg(ap,int));
399
          ret_val = va_arg(ap,unsigned long long *);
400
          /* intentional single equals */
401
          if(result = jtag_proxy_write(fd,&xmit_read,sizeof(xmit_read)))
402
            break;
403
          if(result = ReadResponse(fd,&recv_read,sizeof(recv_read)))
404
            break;
405
          result = ntohl(recv_read.status);
406
          word1 = ntohl(recv_read.data_H);
407
          word2 = ntohl(recv_read.data_L);
408
          *ret_val = (((unsigned long long)word1) << 32) | word2;
409
          break;
410
        case JTAG_COMMAND_WRITE:
411
          xmit_write.command = htonl(command);
412
          xmit_write.length = htonl(sizeof(xmit_write)-8);
413
          xmit_write.address = htonl(va_arg(ap,int));
414
          data = va_arg(ap,unsigned long long);
415
          word1 = htonl(data >> 32);
416
          word2 = htonl(data & 0xFFFFFFFF);
417
          xmit_write.data_H = word1;
418
          xmit_write.data_L = word2;
419
          if(result = jtag_proxy_write(fd,&xmit_write,sizeof(xmit_write)))
420
            break;
421
          if(result = ReadResponse(fd,&recv_write,sizeof(recv_write)))
422
            break;
423
          result = recv_write.status;
424
          break;
425 140 chris
        case JTAG_COMMAND_BLOCK_WRITE:
426
          address = va_arg(ap,unsigned long);
427
          b_data = va_arg(ap,unsigned long*);
428
          nRegisters = va_arg(ap,int);
429
          len = sizeof(JTAGProxyBlockWriteMessage) + (nRegisters-1)*4;
430
          xmit_bwrite = (JTAGProxyBlockWriteMessage*)malloc(len);
431
          xmit_bwrite->command = htonl(command);
432
          xmit_bwrite->length = htonl(len-8);
433
          xmit_bwrite->address = htonl(address);
434
          xmit_bwrite->nRegisters = htonl(nRegisters);
435
          for(i=0;i<nRegisters;i++)
436
            xmit_bwrite->data[i] = htonl(b_data[i]);
437
          if(!(result = jtag_proxy_write(fd,xmit_bwrite,len)) &&
438
             !(result = ReadResponse(fd,&recv_bwrite,sizeof(recv_bwrite))))
439
            result = recv_bwrite.status;
440
          free(xmit_bwrite);
441
          xmit_bwrite = NULL;
442
          break;
443
        case JTAG_COMMAND_BLOCK_READ:
444
          address = va_arg(ap,unsigned long);
445
          b_data = va_arg(ap,unsigned long*);
446
          nRegisters = va_arg(ap,int);
447
          xmit_bread.command = htonl(command);
448
          xmit_bread.length = htonl(sizeof(xmit_bread)-8);
449
          xmit_bread.address = htonl(address);
450
          xmit_bread.nRegisters = htonl(nRegisters);
451
          if(result = jtag_proxy_write(fd,&xmit_bread,sizeof(xmit_bread)))
452
            break;
453
          if(result = ReadResponse(fd,&recv_bread,sizeof(recv_bread)))
454
            break;
455
          b_data[0] = ntohl(recv_bread.data[0]);
456 194 chris
          recv_bread.nRegisters = ntohl(recv_bread.nRegisters);
457 140 chris
          if(result = jtag_proxy_read(fd,&b_data[1],4*(recv_bread.nRegisters-1)))
458
            break;
459
          if(recv_bread.nRegisters != nRegisters)
460
            result = JTAG_PROXY_PROTOCOL_ERROR;
461
          else
462
            {
463
              for(i=1;i<nRegisters;i++)
464
                b_data[i] = ntohl(b_data[i]);
465
            }
466
          break;
467 124 chris
        case JTAG_COMMAND_CHAIN:
468
          xmit_chain.command = htonl(command);
469
          xmit_chain.length = htonl(sizeof(xmit_chain)-8);
470
          xmit_chain.chain = htonl(va_arg(ap,unsigned int));
471
          if(result = jtag_proxy_write(fd,&xmit_chain,sizeof(xmit_chain)))
472
            break;
473
          if(result = ReadResponse(fd,&recv_chain,sizeof(recv_chain)))
474
            break;
475
          result = recv_chain.status;
476
          break;
477
        default:
478
          result = JTAG_PROXY_INVALID_COMMAND;
479
          break;
480
        }
481
      va_end(ap);
482
    }
483
  else
484
    {
485
      va_end(ap);
486
      error("jtag_send_proxy called without a remote proxy connection!");
487
      result = JTAG_PROXY_NO_CONNECTION;
488
    }
489
 
490
  if(result == JTAG_PROXY_SERVER_TERMINATED)
491
    {
492
      close(connection.device.fd);
493
      connection.device.fd = 0;
494
      connection.location = JTAG_NOT_CONNECTED;
495
    }
496
 
497
  return result;
498
}
499
 
500
/* Added by CZ 24/05/01 */
501
#ifndef ANSI_PROTOTYPES
502
static void jtag_proxy_error(va_alist)
503
va_dcl
504
#else
505
static void jtag_proxy_error(int result,int command,...)
506
#endif
507
{
508
  va_list ap;
509
  char sTemp[256];
510
 
511
#ifndef ANSI_PROTOTYPES
512
  int result;
513
  int command;
514
 
515
  va_start(ap);
516
  result = va_arg(ap,int);
517
  command = va_arg(ap,int);
518
#else
519
  va_start(ap, command);
520
#endif
521
 
522
  switch(command)
523
    {
524
    case JTAG_COMMAND_READ:
525
      sprintf(sTemp,"An error was reported by the proxy server. The command was:\n"
526
              "\"JTAG_COMMAND_READ\",%u,0x%08x\nThe command returned %d.\n",
527
              va_arg(ap,unsigned int),va_arg(ap,unsigned long long*),result);
528
      error(sTemp);
529
      break;
530
    case JTAG_COMMAND_WRITE:
531
      sprintf(sTemp,"An error was reported by the proxy server. The command was:\n"
532
              "\"JTAG_COMMAND_WRITE\",%u,0x%016llx\nThe command returned %d.\n",
533
              va_arg(ap,unsigned int),va_arg(ap,unsigned long long),result);
534
      error(sTemp);
535
      break;
536
    case JTAG_COMMAND_CHAIN:
537
      sprintf(sTemp,"An error was reported by the proxy server. The command was:\n"
538
              "\"JTAG_COMMAND_CHAIN\",%u. The command returned %d.\n",
539
              va_arg(ap,unsigned int));
540
      error(sTemp);
541
      break;
542 140 chris
    case JTAG_COMMAND_BLOCK_READ:
543
      sprintf(sTemp,"An error was reported by the proxy server. The command was:\n"
544
              "\"JTAG_COMMAND_BLOCK_READ\",0x%08x,0x%08x,%d\nThe command returned %d.\n",
545
              va_arg(ap,unsigned long),va_arg(ap,unsigned long),va_arg(ap,int),result);
546
      error(sTemp);
547
      break;
548
    case JTAG_COMMAND_BLOCK_WRITE:
549 124 chris
    default:
550 140 chris
      sprintf(sTemp,"An error was reported by the proxy server. The command was:\n"
551
              "\"JTAG_COMMAND_BLOCK_WRITE\",0x%08x,0x%08x,%d\nThe command returned %d.\n",
552
              va_arg(ap,unsigned long),va_arg(ap,unsigned long),va_arg(ap,int),result);
553 124 chris
      error(sTemp);
554
      break;
555
    }
556
  va_end(ap);
557
}
558
 
559 104 markom
/* Sets register/memory regno to data.  */
560
 
561 124 chris
/* CZ 08/06/01: I am not sure how error checking is intended to
562
   be implemented here. It appears that no indication is returned
563
   to the caller as you have in standard unix system calls. Therefore,
564
   I guess the only way to use these functions when you want to know
565
   the exact position of the error is to manually clear err, call the
566
   function, and then manually check err. I have also made some changes
567
   where necessary because no value was returned at all int jtag_read_reg.
568
*/
569
 
570 104 markom
void
571
jtag_write_reg (regno, data)
572
     int regno;
573 122 markom
     ULONGEST data;
574 104 markom
{
575
  int crc_read, crc_write, crc_ok, retry;
576 124 chris
  int result;
577 104 markom
 
578 362 markom
#ifdef DEBUG_JTAG
579
  printf_unfiltered ("write reg %x <- %x\n", regno, data);
580
  fflush (stdout);
581
#endif
582 124 chris
  switch(connection.location) /* CZ */
583
    {
584
    case JTAG_LOCAL:
585
      if (!select_dr)
586
        jp1_write_JTAG (1); /* SELECT_DR SCAN */
587
      select_dr = 1;
588 104 markom
 
589 124 chris
      /* If we don't have rw bit, we assume chain
590
         is read only. */
591
      if (!chain_has_rw[current_chain])
592
        error ("Internal: Chain not writable.");
593 113 markom
 
594 124 chris
      for (retry = 0; retry < NUM_RETRIES; retry++)
595
        {
596
          jp1_write_JTAG (0); /* CAPTURE_DR */
597
          jp1_write_JTAG (0); /* SHIFT_DR */
598
          crc_w = 0;
599 118 markom
 
600 124 chris
          /* write addr */
601
          jp1_write_stream (regno, chain_addr_size[current_chain], 0);
602 118 markom
 
603 124 chris
          /* write (R/W=1) - we tested that previously. */
604
          jp1_write_JTAG (2);
605 118 markom
 
606 124 chris
          /* write data */
607
          jp1_write_stream (data, chain_data_size[current_chain], 0);
608
          if (chain_has_crc[current_chain])
609
            {
610
              crc_write = crc_w;
611 118 markom
 
612 124 chris
              /* write CRC, EXIT1_DR */
613
              crc_read = jp1_read_stream (crc_write, CRC_SIZE, 1);
614
            }
615
          jp1_write_JTAG (1); /* UPDATE_DR */
616
 
617
          /* Did JTAG receive packet correctly? */
618
          if (chain_has_crc[current_chain])
619
            crc_ok = jp1_read_JTAG ();
620
          jp1_write_JTAG (1); /* SELECT_DR */
621
          if (chain_has_crc[current_chain])
622
            {
623
              if ((crc_read == crc_write) && (crc_ok))
624
                return;
625
              JTAG_RETRY_WAIT();
626
            }
627
          else return;
628 113 markom
        }
629 124 chris
      err = ERR_CRC;
630
      break;
631
    case JTAG_REMOTE:
632
      if(result = jtag_send_proxy(JTAG_COMMAND_WRITE,regno,data))
633 113 markom
        {
634 124 chris
          jtag_proxy_error(result,JTAG_COMMAND_WRITE,regno,data);
635
          err = result;
636 113 markom
        }
637 124 chris
      break;
638
    default:
639
      error("jtag_write_reg called with no connection!");
640
      break;
641 104 markom
    }
642 362 markom
#ifdef DEBUG_JTAG
643
  printf_unfiltered ("!write reg\n");
644
  fflush (stdout);
645
#endif
646 104 markom
}
647
 
648
/* Reads register/memory from regno.  */
649
 
650 122 markom
ULONGEST
651 104 markom
jtag_read_reg (regno)
652
     unsigned int regno;
653
{
654 122 markom
  ULONGEST data;
655 104 markom
  int crc_read, crc_write, crc_actual_read,  retry, crc_ok;
656 124 chris
  int result;
657 104 markom
 
658 362 markom
#ifdef DEBUG_JTAG
659
  printf_unfiltered ("read reg %x\n", regno);
660
  fflush (stdout);
661
#endif
662 124 chris
  switch(connection.location)
663
    {
664
    case JTAG_LOCAL:
665
      if (!select_dr)
666
        jp1_write_JTAG (1); /* SELECT_DR SCAN */
667
      select_dr = 1;
668 104 markom
 
669 124 chris
      for (retry = 0; retry < NUM_RETRIES; retry++)
670
        {
671
          jp1_write_JTAG (0); /* CAPTURE_DR */
672
          jp1_write_JTAG (0); /* SHIFT_DR */
673
          crc_w = 0;
674 118 markom
 
675 124 chris
          /* write addr */
676
          jp1_write_stream (regno, chain_addr_size[current_chain], 0);
677 118 markom
 
678 124 chris
          /* read (R/W=0) */
679
          if (chain_has_rw[current_chain])
680
            jp1_write_JTAG (0);
681
          if (chain_has_crc[current_chain])
682
            {
683
              crc_r = 0;
684 118 markom
 
685 124 chris
              /* data = 0 */
686
              data = jp1_read_stream (0, chain_data_size[current_chain], 0);
687
              crc_write = crc_w;
688
              crc_actual_read = crc_read;
689 118 markom
 
690 124 chris
              /* Send my crc, EXIT1_DR */
691
              crc_read = jp1_read_stream (crc_write, CRC_SIZE, 1);
692
            }
693
          jp1_write_JTAG (1); /* UPDATE_DR */
694
 
695
          /* Did JTAG receive packet correctly? */
696
          if (chain_has_crc[current_chain])
697
            crc_ok = jp1_read_JTAG ();
698
          jp1_write_JTAG (1); /* SELECT_DR */
699
          if (chain_has_crc[current_chain])
700
            {
701
              if ((crc_read == crc_actual_read) && (crc_ok))
702
                return -1;  /* CZ */
703
              JTAG_RETRY_WAIT();
704
            }
705
          else
706
            return -1;  /* CZ */
707 113 markom
        }
708 124 chris
      err = ERR_CRC;
709
      break;
710
    case JTAG_REMOTE:
711
      if(result = jtag_send_proxy(JTAG_COMMAND_READ,regno,&data))
712 113 markom
        {
713 124 chris
          jtag_proxy_error(result,JTAG_COMMAND_READ,regno,&data);
714
          err = result;
715 113 markom
        }
716 124 chris
      break;
717
    default:
718
      error("jtag_write_reg called with no connection!");
719
      break;
720 104 markom
    }
721 124 chris
 
722 362 markom
#ifdef DEBUG_JTAG
723
  printf_unfiltered ("read reg %x\n", data);
724
  fflush (stdout);
725
#endif
726 124 chris
  return data;  /* CZ */
727 104 markom
}
728
 
729 140 chris
int jtag_write_block(unsigned int regno,void* data,int nRegisters)
730
{
731
  unsigned long* buffer = (unsigned long*)data;
732
  int i,result;
733
 
734 362 markom
  if(nRegisters == 1) {
735
    jtag_write_reg(regno, *buffer);
736
    return err;
737
  }
738
 
739
#ifdef DEBUG_JTAG
740
  printf_unfiltered ("write block %x,%i\n", regno, nRegisters);
741
  fflush (stdout);
742
#endif
743
 
744 140 chris
  err = 0;
745
  switch(connection.location)
746
    {
747
    case JTAG_LOCAL:         /* We can't do any better than this locally */
748
      for(i=0;i<nRegisters;i++)
749
        jtag_write_reg(regno+i,(ULONGEST)buffer[i]);
750
      break;
751
    case JTAG_REMOTE:
752
      if(result = jtag_send_proxy(JTAG_COMMAND_BLOCK_WRITE,regno,data,nRegisters))
753
        {
754
          jtag_proxy_error(result,JTAG_COMMAND_BLOCK_WRITE,regno,data,nRegisters);
755
          err = result;
756
        }
757
      break;
758
    default:
759
      error("jtag_write_reg called with no connection!");
760
      break;
761
    }
762 362 markom
 
763
#ifdef DEBUG_JTAG
764
  printf_unfiltered ("!write block\n");
765
  fflush (stdout);
766
#endif
767 140 chris
  return err;
768
}
769
 
770
int jtag_read_block(unsigned int regno,void* data,int nRegisters)
771
{
772
  unsigned long* buffer = (unsigned long*)data;
773
  int i,result;
774
 
775 362 markom
#ifdef DEBUG_JTAG
776
  printf_unfiltered ("read block %x,%i\n", regno, nRegisters);
777
  fflush (stdout);
778
#endif
779
 
780
  /*  if(nRegisters == 1) {
781
    *buffer = jtag_read_reg(regno);
782
    return err;
783
    }*/
784 140 chris
  err = 0;
785
  switch(connection.location)
786
    {
787
    case JTAG_LOCAL:         /* We can't do any better than this locally */
788
      for(i=0;i<nRegisters;i++)
789
        buffer[i] = (unsigned long)jtag_read_reg(regno+i);
790
      break;
791
    case JTAG_REMOTE:
792
      if(result = jtag_send_proxy(JTAG_COMMAND_BLOCK_READ,regno,data,nRegisters))
793
        {
794
          jtag_proxy_error(result,JTAG_COMMAND_BLOCK_READ,regno,data,nRegisters);
795
          err = result;
796
        }
797
      break;
798
    default:
799
      error("jtag_write_reg called with no connection!");
800
      break;
801
    }
802
 
803 362 markom
#ifdef DEBUG_JTAG
804
  printf_unfiltered ("read block\n");
805
  fflush (stdout);
806
#endif  
807 140 chris
  return err;
808
}
809
 
810 113 markom
/* Sets scan chain.  */
811
 
812
void
813
jtag_set_chain (chain)
814
     int chain;
815
{
816 124 chris
  int result;
817
 
818 362 markom
#ifdef DEBUG_JTAG
819
  printf_unfiltered ("set chain %x\n", chain);
820
  fflush (stdout);
821
#endif
822 124 chris
  switch(connection.location)
823 113 markom
    {
824 124 chris
    case JTAG_LOCAL:
825
      if (current_chain != chain)
826
        {
827
          if (!chain_is_valid[chain])
828
            error ("Chain not valid.");
829 113 markom
 
830 124 chris
          current_chain = chain;
831
          jp1_prepare_control ();
832 362 markom
 
833 124 chris
          jp1_write_JTAG (0); /* CAPTURE_IR */
834
          jp1_write_JTAG (0); /* SHIFT_IR */
835 118 markom
 
836 124 chris
          /* write data, EXIT1_IR */
837
          jp1_write_stream (JI_CHAIN_SELECT, JI_SIZE, 4);
838 118 markom
 
839 124 chris
          jp1_write_JTAG (1); /* UPDATE_IR */
840
          jp1_write_JTAG (1); /* SELECT_DR */
841 118 markom
 
842 124 chris
          jp1_write_JTAG (0); /* CAPTURE_DR */
843
          jp1_write_JTAG (0); /* SHIFT_DR */
844 118 markom
 
845 124 chris
          /* write data, EXIT1_DR */
846
          jp1_write_stream (chain, SC_SIZE, 1);
847 118 markom
 
848 124 chris
          jp1_write_JTAG (1); /* UPDATE_DR */
849
          jp1_write_JTAG (1); /* SELECT_DR */
850 118 markom
 
851 124 chris
          /* Now we have to go out of SELECT_CHAIN mode.  */
852
          jp1_write_JTAG (1); /* SELECT_IR */
853
          jp1_write_JTAG (0); /* CAPTURE_IR */
854
          jp1_write_JTAG (0); /* SHIFT_IR */
855 118 markom
 
856 124 chris
          /* write data, EXIT1_IR */
857
          jp1_write_stream (JI_DEBUG, JI_SIZE,1 );
858 118 markom
 
859 124 chris
          jp1_write_JTAG (1); /* UPDATE_IR */
860
          jp1_write_JTAG (1); /* SELECT_DR */
861
          select_dr = 1;
862
        }
863
      break;
864
    case JTAG_REMOTE:
865
      if(current_chain != chain)
866
        {
867
          if(result = jtag_send_proxy(JTAG_COMMAND_CHAIN,chain))
868
            {
869
              jtag_proxy_error(result,JTAG_COMMAND_CHAIN,chain);
870
              err = result;
871
            }
872
        }
873
      break;
874
    default:
875
      error("jtag_set_chain called with no connection!");
876
      break;
877 113 markom
    }
878 362 markom
#ifdef DEBUG_JTAG
879
  printf_unfiltered ("!set chain\n");
880
  fflush (stdout);
881
#endif
882 113 markom
}
883
 
884 124 chris
/* Added by CZ 24/05/01 */
885
static int jtag_connect_to_server(char* hostname,char* name)
886
{
887
  struct hostent *host;
888
  struct sockaddr_in sin;
889
  struct servent *service;
890
  struct protoent *protocol;
891
  int sock,flags;
892
  int fd;
893
  char sTemp[256],sTemp2[256];
894
  char* proto_name = "tcp";
895
  int port = 0;
896
  int on_off = 0; /* Turn off Nagel's algorithm on the socket */
897
  char *s;
898
 
899
  if(!(protocol = getprotobyname(proto_name)))
900
    {
901
      sprintf(sTemp,"jtag_connect_to_server: Protocol \"%s\" not available.\n",
902
              proto_name);
903
      error(sTemp);
904
      return 0;
905
    }
906
 
907
  /* Convert name to an integer only if it is well formatted.
908
     Otherwise, assume that it is a service name. */
909
 
910
  port = strtol(name,&s,10);
911
  if(*s)
912
    port = 0;
913
 
914
  if(!port)
915
    {
916
      if(!(service = getservbyname(name,protocol->p_name)))
917
        {
918
          sprintf(sTemp,"jtag_connect_to_server: Unknown service \"%s\".\n",name);
919
          error(sTemp);
920
          return 0;
921
        }
922
 
923
      port = ntohs(service->s_port);
924
    }
925
 
926
  if(!(host = gethostbyname(hostname)))
927
    {
928
      sprintf(sTemp,"jtag_connect_to_server: Unknown host \"%s\"\n",hostname);
929
      error(sTemp);
930
      return 0;
931
    }
932
 
933
  if((sock = socket(PF_INET,SOCK_STREAM,0)) < 0)
934
    {
935
      sprintf(sTemp,"jtag_connect_to_server: can't create socket errno = %d\n",
936
              errno);
937
      sprintf(sTemp2,"%s\n",strerror(errno));
938
      strcat(sTemp,sTemp2);
939
      error(sTemp);
940
      return 0;
941
    }
942
 
943
  if(fcntl(sock,F_GETFL,&flags) < 0)
944
    {
945
      sprintf(sTemp,"Unable to get flags for JTAG proxy socket %d",sock);
946
      error(sTemp);
947
      close(sock);
948
      return 0;
949
    }
950
 
951
  if(fcntl(sock,F_SETFL, flags & ~O_NONBLOCK) < 0)
952
    {
953
      sprintf(sTemp,"Unable to set flags for JTAG proxy socket %d to value 0x%08x",
954
              sock,flags | O_NONBLOCK);
955
      error(sTemp);
956
      close(sock);
957
      return 0;
958
    }
959
 
960
  memset(&sin,0,sizeof(sin));
961
  sin.sin_family = host->h_addrtype;
962
  memcpy(&sin.sin_addr,host->h_addr_list[0],host->h_length);
963
  sin.sin_port = htons(port);
964
 
965
  if((connect(sock,(struct sockaddr*)&sin, sizeof(sin)) < 0)
966
     && errno != EINPROGRESS)
967
    {
968
 
969
      sprintf(sTemp,"jtag_connect_to_server: connect failed  errno = %d\n",errno);
970
      sprintf(sTemp2,"%s\n",strerror(errno));
971
      close(sock);
972
      strcat(sTemp,sTemp2);
973
      error(sTemp);
974
      return 0;
975
    }
976
 
977
  if(fcntl(sock,F_SETFL, flags | O_NONBLOCK) < 0)
978
    {
979
      sprintf(sTemp,"Unable to set flags for JTAG proxy socket %d to value 0x%08x",
980
              sock,flags | O_NONBLOCK);
981
      error(sTemp);
982
      close(sock);
983
      return 0;
984
    }
985
 
986
  if(setsockopt(sock,protocol->p_proto,TCP_NODELAY,&on_off,sizeof(int)) < 0)
987
    {
988
      sprintf(sTemp,"Unable to disable Nagel's algorithm for socket %d.\nsetsockopt",sock);
989
      error(sTemp);
990
      close(sock);
991
      return 0;
992
    }
993
 
994
  return sock;
995
}
996
 
997 104 markom
/* Initialize a new connection to the or1k board, and make sure we are
998
   really connected.  */
999
 
1000
void
1001
jtag_init (args)
1002
     char * args;
1003
{
1004
  char *ptype;
1005
  char *port_name;
1006
  char **argv;
1007
 
1008 593 markom
  int tmp, i;
1009
  unsigned int npc, ppc, r1, insn, result;
1010
 
1011 362 markom
#ifdef DEBUG_JTAG
1012
  printf_unfiltered ("INIT\n");
1013
  fflush(stdout);
1014
#endif
1015 124 chris
  if (args == 0) /* CZ */
1016
    error ( "To open a or1k remote debugging connection, you need to specify a "
1017
            "parallel port\nconnected to the target board, or else a remote "
1018
            "server which will proxy these\nservices for you.\nExample: "
1019
            "/dev/lp0 or jtag://debughost.mydomain.com:8100.\n");
1020 104 markom
 
1021 124 chris
  /* If we currently have an open connection, shut it
1022
     down.  This is due to a temporary bug in gdb. */
1023
  switch(connection.location)
1024
    {
1025
    case JTAG_REMOTE:
1026
      if(connection.device.fd > 0)
1027
        {
1028
          close(connection.device.fd);
1029
        }
1030
      break;
1031
    case JTAG_LOCAL:
1032
      if(connection.device.lp > 0)
1033
        {
1034
          close(connection.device.lp);
1035
        }
1036
      break;
1037
    default:
1038
      break;
1039
    }
1040
 
1041 118 markom
  /* Parse the port name.  */
1042 104 markom
  if ((argv = buildargv (args)) == NULL)
1043
    nomem (0);
1044 580 markom
  port_name = xstrdup (argv[0]);
1045 104 markom
  make_cleanup_freeargv (argv);
1046
 
1047 124 chris
  /* CZ 24/05/01 - Check to see if we have specified a remote
1048
     jtag interface or a local one. It is remote if it follows
1049
     the URL naming convention jtag://<hostname>:<port> */
1050
  if(!strncmp(port_name,"jtag://",7))
1051
    {
1052
      char *port = strchr(&port_name[7],':');
1053
      char hostname[256];
1054 104 markom
 
1055 124 chris
      if(port)
1056
        {
1057
          int len = port - port_name - 7;
1058
          strncpy(hostname,&port_name[7],len);
1059
          hostname[len] = '\0';
1060
          port++;
1061
        }
1062
      else
1063
        strcpy(hostname,&port_name[7]);
1064 104 markom
 
1065 124 chris
      /* Interface is remote */
1066
      if(!(connection.device.fd = jtag_connect_to_server(hostname,port)))
1067
        {
1068
          char sTemp[256];
1069
          sprintf(sTemp,"Can not access JTAG Proxy Server at \"%s\"",
1070
                  &port_name[5]);
1071
          error(sTemp);
1072
        }
1073
      connection.location = JTAG_REMOTE;
1074
      printf_unfiltered ("Remote or1k debugging using %s\n",port_name);
1075
    }
1076
  else
1077
    {
1078
      /* Interface is local */
1079
      /* Open and initialize the parallel port.  */
1080
      connection.device.lp = open (port_name, O_WRONLY);
1081
      if (connection.device.lp < 0)
1082
        error ("Cannot open device.");
1083
      connection.location = JTAG_LOCAL; /* CZ */
1084
      printf_unfiltered ("Local or1k debugging using %s\n", port_name);
1085
 
1086
    }
1087
 
1088 113 markom
  current_chain = -1;
1089 124 chris
  if(connection.location == JTAG_LOCAL)
1090
    jp1_reset_JTAG ();
1091 113 markom
  jtag_set_chain (SC_RISC_DEBUG);
1092 124 chris
 
1093 104 markom
  free (port_name);
1094 593 markom
 
1095
#if 1
1096
 
1097
#define RAM_BASE 0x40000000
1098
  /* Stall risc */
1099
  jtag_set_chain (SC_REGISTER);
1100
  jtag_write_reg (4, 0x00000001);
1101
 
1102
  jtag_set_chain (SC_WISHBONE);
1103
  jtag_write_reg (RAM_BASE + 0x00, 0x9c200000);                                /* l.addi  r1,r0,0x0       */
1104
  jtag_write_reg (RAM_BASE + 0x04, 0x18400000 + (RAM_BASE >> 16));             /* l.movhi r2,0x4000       */
1105
  jtag_write_reg (RAM_BASE + 0x08, 0xa8420000 + ((RAM_BASE + 0x30) & 0xffff)); /* l.ori   r2,r2,0x0000    */
1106
  jtag_write_reg (RAM_BASE + 0x0c, 0x9c210001);                                /* l.addi  r1,r1,1         */
1107
  jtag_write_reg (RAM_BASE + 0x10, 0x9c210001);                                /* l.addi  r1,r1,1         */
1108
  jtag_write_reg (RAM_BASE + 0x14, 0xd4020800);                                /* l.sw    0(r2),r1        */
1109
  jtag_write_reg (RAM_BASE + 0x18, 0x9c210001);                                /* l.addi  r1,r1,1         */
1110
  jtag_write_reg (RAM_BASE + 0x1c, 0x84620000);                                /* l.lwz   r3,0(r2)        */
1111
  jtag_write_reg (RAM_BASE + 0x20, 0x03fffffb);                                /* l.j     loop2           */
1112
  jtag_write_reg (RAM_BASE + 0x24, 0xe0211800);                                /* l.add   r1,r1,r3        */
1113
  jtag_write_reg (RAM_BASE + 0x24, 0xe0211800);                                /* l.add   r1,r1,r3        */
1114
 
1115
  /* Enable exceptions */
1116
  jtag_set_chain (SC_RISC_DEBUG);
1117
  jtag_write_reg ((0 << 11) + 17, 0x03);
1118
 
1119
  /* Trap causes stall */
1120
  jtag_set_chain (SC_RISC_DEBUG);
1121
  jtag_write_reg ((6 << 11) + 20, 0x2000);
1122
 
1123
  /* Set PC */
1124
  jtag_set_chain (SC_RISC_DEBUG);
1125
  jtag_write_reg ((0 << 11) + 16, RAM_BASE);
1126
 
1127
  /* Set step bit */
1128
  jtag_set_chain (SC_RISC_DEBUG);
1129
  jtag_write_reg ((6 << 11) + 16, 1 << 22);
1130
 
1131
 
1132
  for (i = 0; i < 10; i++)
1133
    {
1134
      /* Unstall */
1135
      jtag_set_chain (SC_REGISTER);
1136
      jtag_write_reg (4, 0x00000000);
1137
      jtag_set_chain (SC_RISC_DEBUG);
1138
    }
1139
 
1140
  /* Read NPC */
1141
  jtag_set_chain (SC_RISC_DEBUG);
1142
  npc = jtag_read_reg ((0 << 11) + 16);
1143
  npc = jtag_read_reg ((0 << 11) + 16);
1144
 
1145
  /* Read PPC */
1146
  jtag_set_chain (SC_RISC_DEBUG);
1147
  ppc = jtag_read_reg ((0 << 11) + 18);
1148
  ppc = jtag_read_reg ((0 << 11) + 18);
1149
 
1150
  /* Read R1 */
1151
  jtag_set_chain (SC_RISC_DEBUG);
1152
  r1 = jtag_read_reg (0x401);
1153
  r1 = jtag_read_reg (0x401);
1154
 
1155
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
1156
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000000c, 0x40000024, 5);
1157
  result = npc + ppc + r1;
1158
 
1159
 
1160
  /* Reset step bit */
1161
  jtag_set_chain (SC_RISC_DEBUG);
1162
  jtag_write_reg ((6 << 11) + 16, 0);
1163
 
1164
 
1165
 
1166
  /* Set trap insn in delay slot */
1167
  jtag_set_chain (SC_WISHBONE);
1168
  insn = jtag_read_reg (RAM_BASE + 0x24);
1169
  insn = jtag_read_reg (RAM_BASE + 0x24);
1170
  jtag_write_reg (RAM_BASE + 0x24, 0x21000001);
1171
 
1172
  /* Unstall */
1173
  jtag_set_chain (SC_REGISTER);
1174
  jtag_write_reg (4, 0x00000000);
1175
  jtag_set_chain (SC_RISC_DEBUG);
1176
 
1177
  /* Read NPC */
1178
  jtag_set_chain (SC_RISC_DEBUG);
1179
  npc = jtag_read_reg ((0 << 11) + 16);
1180
  npc = jtag_read_reg ((0 << 11) + 16);
1181
 
1182
  /* Read PPC */
1183
  jtag_set_chain (SC_RISC_DEBUG);
1184
  ppc = jtag_read_reg ((0 << 11) + 18);
1185
  ppc = jtag_read_reg ((0 << 11) + 18);
1186
 
1187
  /* Read R1 */
1188
  jtag_set_chain (SC_RISC_DEBUG);
1189
  r1 = jtag_read_reg (0x401);
1190
  r1 = jtag_read_reg (0x401);
1191
 
1192
  /* Set back original insn */
1193
  jtag_set_chain (SC_WISHBONE);
1194
  jtag_write_reg (RAM_BASE + 0x24, insn);
1195
 
1196
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
1197
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000000c, 0x40000024, 8);
1198
  result = npc + ppc + r1 + result;
1199
 
1200
 
1201
  /* Set trap insn in place of branch insn */
1202
  jtag_set_chain (SC_WISHBONE);
1203
  insn = jtag_read_reg (RAM_BASE + 0x20);
1204
  insn = jtag_read_reg (RAM_BASE + 0x20);
1205
  jtag_write_reg (RAM_BASE + 0x20, 0x21000001);
1206
 
1207
  /* Set PC */
1208
  jtag_set_chain (SC_RISC_DEBUG);
1209
  jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x0c);
1210
 
1211
  /* Unstall */
1212
  jtag_set_chain (SC_REGISTER);
1213
  jtag_write_reg (4, 0x00000000);
1214
  jtag_set_chain (SC_RISC_DEBUG);
1215
 
1216
  /* Read NPC */
1217
  jtag_set_chain (SC_RISC_DEBUG);
1218
  npc = jtag_read_reg ((0 << 11) + 16);
1219
  npc = jtag_read_reg ((0 << 11) + 16);
1220
 
1221
  /* Read PPC */
1222
  jtag_set_chain (SC_RISC_DEBUG);
1223
  ppc = jtag_read_reg ((0 << 11) + 18);
1224
  ppc = jtag_read_reg ((0 << 11) + 18);
1225
 
1226
  /* Read R1 */
1227
  jtag_set_chain (SC_RISC_DEBUG);
1228
  r1 = jtag_read_reg (0x401);
1229
  r1 = jtag_read_reg (0x401);
1230
 
1231
  /* Set back original insn */
1232
  jtag_set_chain (SC_WISHBONE);
1233
  jtag_write_reg (RAM_BASE + 0x20, insn);
1234
 
1235
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
1236
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000024, 0x40000020, 11);
1237
  result = npc + ppc + r1 + result;
1238
 
1239
 
1240
  /* Set trap insn before branch insn */
1241
  jtag_set_chain (SC_WISHBONE);
1242
  insn = jtag_read_reg (RAM_BASE + 0x1c);
1243
  insn = jtag_read_reg (RAM_BASE + 0x1c);
1244
  jtag_write_reg (RAM_BASE + 0x1c, 0x21000001);
1245
 
1246
  /* Set PC */
1247
  jtag_set_chain (SC_RISC_DEBUG);
1248
  jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x20);
1249
 
1250
  /* Unstall */
1251
  jtag_set_chain (SC_REGISTER);
1252
  jtag_write_reg (4, 0x00000000);
1253
  jtag_set_chain (SC_RISC_DEBUG);
1254
 
1255
  /* Read NPC */
1256
  jtag_set_chain (SC_RISC_DEBUG);
1257
  npc = jtag_read_reg ((0 << 11) + 16);
1258
  npc = jtag_read_reg ((0 << 11) + 16);
1259
 
1260
  /* Read PPC */
1261
  jtag_set_chain (SC_RISC_DEBUG);
1262
  ppc = jtag_read_reg ((0 << 11) + 18);
1263
  ppc = jtag_read_reg ((0 << 11) + 18);
1264
 
1265
  /* Read R1 */
1266
  jtag_set_chain (SC_RISC_DEBUG);
1267
  r1 = jtag_read_reg (0x401);
1268
  r1 = jtag_read_reg (0x401);
1269
 
1270
  /* Set back original insn */
1271
  jtag_set_chain (SC_WISHBONE);
1272
  jtag_write_reg (RAM_BASE + 0x1c, insn);
1273
 
1274
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
1275
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000020, 0x4000001c, 24);
1276
  result = npc + ppc + r1 + result;
1277
 
1278
 
1279
  /* Set trap insn behind lsu insn */
1280
  jtag_set_chain (SC_WISHBONE);
1281
  insn = jtag_read_reg (RAM_BASE + 0x18);
1282
  insn = jtag_read_reg (RAM_BASE + 0x18);
1283
  jtag_write_reg (RAM_BASE + 0x18, 0x21000001);
1284
 
1285
  /* Set PC */
1286
  jtag_set_chain (SC_RISC_DEBUG);
1287
  jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x1c);
1288
 
1289
  /* Unstall */
1290
  jtag_set_chain (SC_REGISTER);
1291
  jtag_write_reg (4, 0x00000000);
1292
  jtag_set_chain (SC_RISC_DEBUG);
1293
 
1294
  /* Read NPC */
1295
  jtag_set_chain (SC_RISC_DEBUG);
1296
  npc = jtag_read_reg ((0 << 11) + 16);
1297
  npc = jtag_read_reg ((0 << 11) + 16);
1298
 
1299
  /* Read PPC */
1300
  jtag_set_chain (SC_RISC_DEBUG);
1301
  ppc = jtag_read_reg ((0 << 11) + 18);
1302
  ppc = jtag_read_reg ((0 << 11) + 18);
1303
 
1304
  /* Read R1 */
1305
  jtag_set_chain (SC_RISC_DEBUG);
1306
  r1 = jtag_read_reg (0x401);
1307
  r1 = jtag_read_reg (0x401);
1308
 
1309
  /* Set back original insn */
1310
  jtag_set_chain (SC_WISHBONE);
1311
  jtag_write_reg (RAM_BASE + 0x18, insn);
1312
 
1313
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
1314
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000001c, 0x40000018, 49);
1315
  result = npc + ppc + r1 + result;
1316
 
1317
  /* Set trap insn very near previous one */
1318
  jtag_set_chain (SC_WISHBONE);
1319
  insn = jtag_read_reg (RAM_BASE + 0x1c);
1320
  insn = jtag_read_reg (RAM_BASE + 0x1c);
1321
  jtag_write_reg (RAM_BASE + 0x1c, 0x21000001);
1322
 
1323
  /* Set PC */
1324
  jtag_set_chain (SC_RISC_DEBUG);
1325
  jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x18);
1326
 
1327
  /* Unstall */
1328
  jtag_set_chain (SC_REGISTER);
1329
  jtag_write_reg (4, 0x00000000);
1330
  jtag_set_chain (SC_RISC_DEBUG);
1331
 
1332
  /* Read NPC */
1333
  jtag_set_chain (SC_RISC_DEBUG);
1334
  npc = jtag_read_reg ((0 << 11) + 16);
1335
  npc = jtag_read_reg ((0 << 11) + 16);
1336
 
1337
  /* Read PPC */
1338
  jtag_set_chain (SC_RISC_DEBUG);
1339
  ppc = jtag_read_reg ((0 << 11) + 18);
1340
  ppc = jtag_read_reg ((0 << 11) + 18);
1341
 
1342
  /* Read R1 */
1343
  jtag_set_chain (SC_RISC_DEBUG);
1344
  r1 = jtag_read_reg (0x401);
1345
  r1 = jtag_read_reg (0x401);
1346
 
1347
  /* Set back original insn */
1348
  jtag_set_chain (SC_WISHBONE);
1349
  jtag_write_reg (RAM_BASE + 0x1c, insn);
1350
 
1351
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
1352
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000020, 0x4000001c, 50);
1353
  result = npc + ppc + r1 + result;
1354
 
1355
 
1356
  /* Set trap insn to the start */
1357
  jtag_set_chain (SC_WISHBONE);
1358
  insn = jtag_read_reg (RAM_BASE + 0x0c);
1359
  insn = jtag_read_reg (RAM_BASE + 0x0c);
1360
  jtag_write_reg (RAM_BASE + 0x0c, 0x21000001);
1361
 
1362
  /* Set PC */
1363
  jtag_set_chain (SC_RISC_DEBUG);
1364
  jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x1c);
1365
 
1366
  /* Unstall */
1367
  jtag_set_chain (SC_REGISTER);
1368
  jtag_write_reg (4, 0x00000000);
1369
  jtag_set_chain (SC_RISC_DEBUG);
1370
 
1371
  /* Read NPC */
1372
  jtag_set_chain (SC_RISC_DEBUG);
1373
  npc = jtag_read_reg ((0 << 11) + 16);
1374
  npc = jtag_read_reg ((0 << 11) + 16);
1375
 
1376
  /* Read PPC */
1377
  jtag_set_chain (SC_RISC_DEBUG);
1378
  ppc = jtag_read_reg ((0 << 11) + 18);
1379
  ppc = jtag_read_reg ((0 << 11) + 18);
1380
 
1381
  /* Read R1 */
1382
  jtag_set_chain (SC_RISC_DEBUG);
1383
  r1 = jtag_read_reg (0x401);
1384
  r1 = jtag_read_reg (0x401);
1385
 
1386
  /* Set back original insn */
1387
  jtag_set_chain (SC_WISHBONE);
1388
  jtag_write_reg (RAM_BASE + 0x0c, insn);
1389
 
1390
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
1391
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000010, 0x4000000c, 99);
1392
  result = npc + ppc + r1 + result;
1393
 
1394
 
1395
  /* Set step bit */
1396
  jtag_set_chain (SC_RISC_DEBUG);
1397
  jtag_write_reg ((6 << 11) + 16, 1 << 22);
1398
 
1399
  for (i = 0; i < 5; i++)
1400
    {
1401
      /* Unstall */
1402
      jtag_set_chain (SC_REGISTER);
1403
      jtag_write_reg (4, 0x00000000);
1404
      jtag_set_chain (SC_RISC_DEBUG);
1405
    }
1406
 
1407
  /* Read NPC */
1408
  jtag_set_chain (SC_RISC_DEBUG);
1409
  npc = jtag_read_reg ((0 << 11) + 16);
1410
  npc = jtag_read_reg ((0 << 11) + 16);
1411
 
1412
  /* Read PPC */
1413
  jtag_set_chain (SC_RISC_DEBUG);
1414
  ppc = jtag_read_reg ((0 << 11) + 18);
1415
  ppc = jtag_read_reg ((0 << 11) + 18);
1416
 
1417
  /* Read R1 */
1418
  jtag_set_chain (SC_RISC_DEBUG);
1419
  r1 = jtag_read_reg (0x401);
1420
  r1 = jtag_read_reg (0x401);
1421
 
1422
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
1423
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000024, 0x40000020, 101);
1424
  result = npc + ppc + r1 + result;
1425
 
1426
  /* Set PC */
1427
  jtag_set_chain (SC_RISC_DEBUG);
1428
  jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x20);
1429
 
1430
  for (i = 0; i < 2; i++)
1431
    {
1432
      /* Unstall */
1433
      jtag_set_chain (SC_REGISTER);
1434
      jtag_write_reg (4, 0x00000000);
1435
      jtag_set_chain (SC_RISC_DEBUG);
1436
    }
1437
 
1438
  /* Read NPC */
1439
  jtag_set_chain (SC_RISC_DEBUG);
1440
  npc = jtag_read_reg ((0 << 11) + 16);
1441
  npc = jtag_read_reg ((0 << 11) + 16);
1442
 
1443
  /* Read PPC */
1444
  jtag_set_chain (SC_RISC_DEBUG);
1445
  ppc = jtag_read_reg ((0 << 11) + 18);
1446
  ppc = jtag_read_reg ((0 << 11) + 18);
1447
 
1448
  /* Read R1 */
1449
  jtag_set_chain (SC_RISC_DEBUG);
1450
  r1 = jtag_read_reg (0x401);
1451
  r1 = jtag_read_reg (0x401);
1452
 
1453
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
1454
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000000c, 0x40000024, 201);
1455
  result = npc + ppc + r1 + result;
1456
 
1457
  printf("result = %.8lx\n", result + 0x5eaddaa9);
1458
 
1459
#endif
1460 104 markom
}
1461
 
1462
void
1463 124 chris
jtag_done ()  /* CZ */
1464 104 markom
{
1465 124 chris
  switch(connection.location)
1466
    {
1467
    case JTAG_LOCAL:
1468
      sync_close (connection.device.lp);
1469
      connection.device.lp = 0;
1470
      break;
1471
    case JTAG_REMOTE:
1472
      sync_close(connection.device.fd);
1473
      connection.device.fd = 0;
1474
      break;
1475
    default:
1476
      break;
1477
    }
1478
  connection.location = JTAG_NOT_CONNECTED;
1479 104 markom
}
1480 124 chris
 
1481
int sync_close(int fd)
1482
{
1483
  int flags = 0;
1484
  struct linger linger;
1485
  char sTemp[256];
1486
 
1487
  linger.l_onoff = 0;
1488
  linger.l_linger = 0;
1489
 
1490
  /* First, make sure we're non blocking */
1491
  if(fcntl(fd,F_GETFL,&flags) < 0)
1492
    {
1493
      sprintf(sTemp,"Unable to get flags for JTAG proxy socket %d",fd);
1494
      error(sTemp);
1495
    }
1496
  if(fcntl(fd,F_SETFL, flags & ~O_NONBLOCK) < 0)
1497
    {
1498
      sprintf(sTemp,"Unable to set flags for JTAG proxy socket %d to value 0x%08x",
1499
              fd,flags | O_NONBLOCK);
1500
      error(sTemp);
1501
    }
1502
 
1503
  /* Now, make sure we don't linger around */
1504
  if(setsockopt(fd,SOL_SOCKET,SO_LINGER,&linger,sizeof(linger)) < 0)
1505
    {
1506
      sprintf(sTemp,"Unable to disable SO_LINGER for JTAG proxy socket %d.",fd);
1507
      error(sTemp);
1508
    }
1509
 
1510
  return close(fd);
1511
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.