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

Subversion Repositories or1k

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

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
  int result = jtag_proxy_read(fd,&status,4);
337
  char* buf = (char*)buffer;
338
 
339
  status = ntohl(status);
340
  *((int32_t*)buffer) = status;
341
 
342
  if(result)    return result;
343
  if(status)   return status;
344
 
345
  result = jtag_proxy_read(fd,&buf[4],len-4);
346
  return result;
347
}
348
 
349
/* Added by CZ 24/05/01 */
350
#ifndef ANSI_PROTOTYPES
351
static int jtag_send_proxy(va_alist)
352
va_dcl
353
#else
354
static int jtag_send_proxy(int command,...)
355
#endif
356
{
357
  va_list ap;
358
  int result = 0;
359
  int fd = connection.device.fd;
360
  JTAGProxyWriteMessage xmit_write;
361
  JTAGProxyReadMessage xmit_read;
362
  JTAGProxyChainMessage xmit_chain;
363 140 chris
  JTAGProxyBlockWriteMessage *xmit_bwrite;
364
  JTAGProxyBlockReadMessage xmit_bread;
365 124 chris
  JTAGProxyWriteResponse recv_write;
366
  JTAGProxyReadResponse recv_read;
367
  JTAGProxyChainResponse recv_chain;
368 140 chris
  JTAGProxyBlockWriteResponse recv_bwrite;
369
  JTAGProxyBlockReadResponse recv_bread;
370 124 chris
  unsigned long long data,* ret_val;
371
  uint32_t word1; /* Use word1 and word2 to ease portability to platforms */
372
  uint32_t word2; /* without long long and for alignment reasons */
373 140 chris
  unsigned long  address;
374
  unsigned long* b_data;
375
  int nRegisters;
376
  int len,i;
377 124 chris
 
378
#ifndef ANSI_PROTOTYPES
379
  int command;
380
 
381
  va_start(ap);
382
  command = va_arg(ap,int);
383
#else
384
  va_start(ap, command);
385
#endif
386
 
387
 
388
 
389
  if(connection.location == JTAG_REMOTE)
390
    {
391
      switch(command)
392
        {
393
        case JTAG_COMMAND_READ:
394
          xmit_read.command = htonl(command);
395
          xmit_read.length = htonl(sizeof(xmit_read)-8);
396
          xmit_read.address = htonl(va_arg(ap,int));
397
          ret_val = va_arg(ap,unsigned long long *);
398
          /* intentional single equals */
399
          if(result = jtag_proxy_write(fd,&xmit_read,sizeof(xmit_read)))
400
            break;
401
          if(result = ReadResponse(fd,&recv_read,sizeof(recv_read)))
402
            break;
403
          result = ntohl(recv_read.status);
404
          word1 = ntohl(recv_read.data_H);
405
          word2 = ntohl(recv_read.data_L);
406
          *ret_val = (((unsigned long long)word1) << 32) | word2;
407
          break;
408
        case JTAG_COMMAND_WRITE:
409
          xmit_write.command = htonl(command);
410
          xmit_write.length = htonl(sizeof(xmit_write)-8);
411
          xmit_write.address = htonl(va_arg(ap,int));
412
          data = va_arg(ap,unsigned long long);
413
          word1 = htonl(data >> 32);
414
          word2 = htonl(data & 0xFFFFFFFF);
415
          xmit_write.data_H = word1;
416
          xmit_write.data_L = word2;
417
          if(result = jtag_proxy_write(fd,&xmit_write,sizeof(xmit_write)))
418
            break;
419
          if(result = ReadResponse(fd,&recv_write,sizeof(recv_write)))
420
            break;
421
          result = recv_write.status;
422
          break;
423 140 chris
        case JTAG_COMMAND_BLOCK_WRITE:
424
          address = va_arg(ap,unsigned long);
425
          b_data = va_arg(ap,unsigned long*);
426
          nRegisters = va_arg(ap,int);
427
          len = sizeof(JTAGProxyBlockWriteMessage) + (nRegisters-1)*4;
428
          xmit_bwrite = (JTAGProxyBlockWriteMessage*)malloc(len);
429
          xmit_bwrite->command = htonl(command);
430
          xmit_bwrite->length = htonl(len-8);
431
          xmit_bwrite->address = htonl(address);
432
          xmit_bwrite->nRegisters = htonl(nRegisters);
433
          for(i=0;i<nRegisters;i++)
434
            xmit_bwrite->data[i] = htonl(b_data[i]);
435
          if(!(result = jtag_proxy_write(fd,xmit_bwrite,len)) &&
436
             !(result = ReadResponse(fd,&recv_bwrite,sizeof(recv_bwrite))))
437
            result = recv_bwrite.status;
438
          free(xmit_bwrite);
439
          xmit_bwrite = NULL;
440
          break;
441
        case JTAG_COMMAND_BLOCK_READ:
442
          address = va_arg(ap,unsigned long);
443
          b_data = va_arg(ap,unsigned long*);
444
          nRegisters = va_arg(ap,int);
445
          xmit_bread.command = htonl(command);
446
          xmit_bread.length = htonl(sizeof(xmit_bread)-8);
447
          xmit_bread.address = htonl(address);
448
          xmit_bread.nRegisters = htonl(nRegisters);
449
          if(result = jtag_proxy_write(fd,&xmit_bread,sizeof(xmit_bread)))
450
            break;
451
          if(result = ReadResponse(fd,&recv_bread,sizeof(recv_bread)))
452
            break;
453
          b_data[0] = ntohl(recv_bread.data[0]);
454
          if(result = jtag_proxy_read(fd,&b_data[1],4*(recv_bread.nRegisters-1)))
455
            break;
456
          if(recv_bread.nRegisters != nRegisters)
457
            result = JTAG_PROXY_PROTOCOL_ERROR;
458
          else
459
            {
460
              for(i=1;i<nRegisters;i++)
461
                b_data[i] = ntohl(b_data[i]);
462
            }
463
          break;
464 124 chris
        case JTAG_COMMAND_CHAIN:
465
          xmit_chain.command = htonl(command);
466
          xmit_chain.length = htonl(sizeof(xmit_chain)-8);
467
          xmit_chain.chain = htonl(va_arg(ap,unsigned int));
468
          if(result = jtag_proxy_write(fd,&xmit_chain,sizeof(xmit_chain)))
469
            break;
470
          if(result = ReadResponse(fd,&recv_chain,sizeof(recv_chain)))
471
            break;
472
          result = recv_chain.status;
473
          break;
474
        default:
475
          result = JTAG_PROXY_INVALID_COMMAND;
476
          break;
477
        }
478
      va_end(ap);
479
    }
480
  else
481
    {
482
      va_end(ap);
483
      error("jtag_send_proxy called without a remote proxy connection!");
484
      result = JTAG_PROXY_NO_CONNECTION;
485
    }
486
 
487
  if(result == JTAG_PROXY_SERVER_TERMINATED)
488
    {
489
      close(connection.device.fd);
490
      connection.device.fd = 0;
491
      connection.location = JTAG_NOT_CONNECTED;
492
    }
493
 
494
  return result;
495
}
496
 
497
/* Added by CZ 24/05/01 */
498
#ifndef ANSI_PROTOTYPES
499
static void jtag_proxy_error(va_alist)
500
va_dcl
501
#else
502
static void jtag_proxy_error(int result,int command,...)
503
#endif
504
{
505
  va_list ap;
506
  char sTemp[256];
507
 
508
#ifndef ANSI_PROTOTYPES
509
  int result;
510
  int command;
511
 
512
  va_start(ap);
513
  result = va_arg(ap,int);
514
  command = va_arg(ap,int);
515
#else
516
  va_start(ap, command);
517
#endif
518
 
519
  switch(command)
520
    {
521
    case JTAG_COMMAND_READ:
522
      sprintf(sTemp,"An error was reported by the proxy server. The command was:\n"
523
              "\"JTAG_COMMAND_READ\",%u,0x%08x\nThe command returned %d.\n",
524
              va_arg(ap,unsigned int),va_arg(ap,unsigned long long*),result);
525
      error(sTemp);
526
      break;
527
    case JTAG_COMMAND_WRITE:
528
      sprintf(sTemp,"An error was reported by the proxy server. The command was:\n"
529
              "\"JTAG_COMMAND_WRITE\",%u,0x%016llx\nThe command returned %d.\n",
530
              va_arg(ap,unsigned int),va_arg(ap,unsigned long long),result);
531
      error(sTemp);
532
      break;
533
    case JTAG_COMMAND_CHAIN:
534
      sprintf(sTemp,"An error was reported by the proxy server. The command was:\n"
535
              "\"JTAG_COMMAND_CHAIN\",%u. The command returned %d.\n",
536
              va_arg(ap,unsigned int));
537
      error(sTemp);
538
      break;
539 140 chris
    case JTAG_COMMAND_BLOCK_READ:
540
      sprintf(sTemp,"An error was reported by the proxy server. The command was:\n"
541
              "\"JTAG_COMMAND_BLOCK_READ\",0x%08x,0x%08x,%d\nThe command returned %d.\n",
542
              va_arg(ap,unsigned long),va_arg(ap,unsigned long),va_arg(ap,int),result);
543
      error(sTemp);
544
      break;
545
    case JTAG_COMMAND_BLOCK_WRITE:
546 124 chris
    default:
547 140 chris
      sprintf(sTemp,"An error was reported by the proxy server. The command was:\n"
548
              "\"JTAG_COMMAND_BLOCK_WRITE\",0x%08x,0x%08x,%d\nThe command returned %d.\n",
549
              va_arg(ap,unsigned long),va_arg(ap,unsigned long),va_arg(ap,int),result);
550 124 chris
      error(sTemp);
551
      break;
552
    }
553
  va_end(ap);
554
}
555
 
556 104 markom
/* Sets register/memory regno to data.  */
557
 
558 124 chris
/* CZ 08/06/01: I am not sure how error checking is intended to
559
   be implemented here. It appears that no indication is returned
560
   to the caller as you have in standard unix system calls. Therefore,
561
   I guess the only way to use these functions when you want to know
562
   the exact position of the error is to manually clear err, call the
563
   function, and then manually check err. I have also made some changes
564
   where necessary because no value was returned at all int jtag_read_reg.
565
*/
566
 
567 104 markom
void
568
jtag_write_reg (regno, data)
569
     int regno;
570 122 markom
     ULONGEST data;
571 104 markom
{
572
  int crc_read, crc_write, crc_ok, retry;
573 124 chris
  int result;
574 104 markom
 
575 124 chris
  switch(connection.location) /* CZ */
576
    {
577
    case JTAG_LOCAL:
578
      if (!select_dr)
579
        jp1_write_JTAG (1); /* SELECT_DR SCAN */
580
      select_dr = 1;
581 104 markom
 
582 124 chris
      /* If we don't have rw bit, we assume chain
583
         is read only. */
584
      if (!chain_has_rw[current_chain])
585
        error ("Internal: Chain not writable.");
586 113 markom
 
587 124 chris
      for (retry = 0; retry < NUM_RETRIES; retry++)
588
        {
589
          jp1_write_JTAG (0); /* CAPTURE_DR */
590
          jp1_write_JTAG (0); /* SHIFT_DR */
591
          crc_w = 0;
592 118 markom
 
593 124 chris
          /* write addr */
594
          jp1_write_stream (regno, chain_addr_size[current_chain], 0);
595 118 markom
 
596 124 chris
          /* write (R/W=1) - we tested that previously. */
597
          jp1_write_JTAG (2);
598 118 markom
 
599 124 chris
          /* write data */
600
          jp1_write_stream (data, chain_data_size[current_chain], 0);
601
          if (chain_has_crc[current_chain])
602
            {
603
              crc_write = crc_w;
604 118 markom
 
605 124 chris
              /* write CRC, EXIT1_DR */
606
              crc_read = jp1_read_stream (crc_write, CRC_SIZE, 1);
607
            }
608
          jp1_write_JTAG (1); /* UPDATE_DR */
609
 
610
          /* Did JTAG receive packet correctly? */
611
          if (chain_has_crc[current_chain])
612
            crc_ok = jp1_read_JTAG ();
613
          jp1_write_JTAG (1); /* SELECT_DR */
614
          if (chain_has_crc[current_chain])
615
            {
616
              if ((crc_read == crc_write) && (crc_ok))
617
                return;
618
              JTAG_RETRY_WAIT();
619
            }
620
          else return;
621 113 markom
        }
622 124 chris
      err = ERR_CRC;
623
      break;
624
    case JTAG_REMOTE:
625
      if(result = jtag_send_proxy(JTAG_COMMAND_WRITE,regno,data))
626 113 markom
        {
627 124 chris
          jtag_proxy_error(result,JTAG_COMMAND_WRITE,regno,data);
628
          err = result;
629 113 markom
        }
630 124 chris
      break;
631
    default:
632
      error("jtag_write_reg called with no connection!");
633
      break;
634 104 markom
    }
635
}
636
 
637
/* Reads register/memory from regno.  */
638
 
639 122 markom
ULONGEST
640 104 markom
jtag_read_reg (regno)
641
     unsigned int regno;
642
{
643 122 markom
  ULONGEST data;
644 104 markom
  int crc_read, crc_write, crc_actual_read,  retry, crc_ok;
645 124 chris
  int result;
646 104 markom
 
647 124 chris
  switch(connection.location)
648
    {
649
    case JTAG_LOCAL:
650
      if (!select_dr)
651
        jp1_write_JTAG (1); /* SELECT_DR SCAN */
652
      select_dr = 1;
653 104 markom
 
654 124 chris
      for (retry = 0; retry < NUM_RETRIES; retry++)
655
        {
656
          jp1_write_JTAG (0); /* CAPTURE_DR */
657
          jp1_write_JTAG (0); /* SHIFT_DR */
658
          crc_w = 0;
659 118 markom
 
660 124 chris
          /* write addr */
661
          jp1_write_stream (regno, chain_addr_size[current_chain], 0);
662 118 markom
 
663 124 chris
          /* read (R/W=0) */
664
          if (chain_has_rw[current_chain])
665
            jp1_write_JTAG (0);
666
          if (chain_has_crc[current_chain])
667
            {
668
              crc_r = 0;
669 118 markom
 
670 124 chris
              /* data = 0 */
671
              data = jp1_read_stream (0, chain_data_size[current_chain], 0);
672
              crc_write = crc_w;
673
              crc_actual_read = crc_read;
674 118 markom
 
675 124 chris
              /* Send my crc, EXIT1_DR */
676
              crc_read = jp1_read_stream (crc_write, CRC_SIZE, 1);
677
            }
678
          jp1_write_JTAG (1); /* UPDATE_DR */
679
 
680
          /* Did JTAG receive packet correctly? */
681
          if (chain_has_crc[current_chain])
682
            crc_ok = jp1_read_JTAG ();
683
          jp1_write_JTAG (1); /* SELECT_DR */
684
          if (chain_has_crc[current_chain])
685
            {
686
              if ((crc_read == crc_actual_read) && (crc_ok))
687
                return -1;  /* CZ */
688
              JTAG_RETRY_WAIT();
689
            }
690
          else
691
            return -1;  /* CZ */
692 113 markom
        }
693 124 chris
      err = ERR_CRC;
694
      break;
695
    case JTAG_REMOTE:
696
      if(result = jtag_send_proxy(JTAG_COMMAND_READ,regno,&data))
697 113 markom
        {
698 124 chris
          jtag_proxy_error(result,JTAG_COMMAND_READ,regno,&data);
699
          err = result;
700 113 markom
        }
701 124 chris
      break;
702
    default:
703
      error("jtag_write_reg called with no connection!");
704
      break;
705 104 markom
    }
706 124 chris
 
707
  return data;  /* CZ */
708 104 markom
}
709
 
710 140 chris
int jtag_write_block(unsigned int regno,void* data,int nRegisters)
711
{
712
  unsigned long* buffer = (unsigned long*)data;
713
  int i,result;
714
 
715
  err = 0;
716
  switch(connection.location)
717
    {
718
    case JTAG_LOCAL:         /* We can't do any better than this locally */
719
      for(i=0;i<nRegisters;i++)
720
        jtag_write_reg(regno+i,(ULONGEST)buffer[i]);
721
      break;
722
    case JTAG_REMOTE:
723
      if(result = jtag_send_proxy(JTAG_COMMAND_BLOCK_WRITE,regno,data,nRegisters))
724
        {
725
          jtag_proxy_error(result,JTAG_COMMAND_BLOCK_WRITE,regno,data,nRegisters);
726
          err = result;
727
        }
728
      break;
729
    default:
730
      error("jtag_write_reg called with no connection!");
731
      break;
732
    }
733
 
734
  return err;
735
}
736
 
737
int jtag_read_block(unsigned int regno,void* data,int nRegisters)
738
{
739
  unsigned long* buffer = (unsigned long*)data;
740
  int i,result;
741
 
742
  err = 0;
743
  switch(connection.location)
744
    {
745
    case JTAG_LOCAL:         /* We can't do any better than this locally */
746
      for(i=0;i<nRegisters;i++)
747
        buffer[i] = (unsigned long)jtag_read_reg(regno+i);
748
      break;
749
    case JTAG_REMOTE:
750
      if(result = jtag_send_proxy(JTAG_COMMAND_BLOCK_READ,regno,data,nRegisters))
751
        {
752
          jtag_proxy_error(result,JTAG_COMMAND_BLOCK_READ,regno,data,nRegisters);
753
          err = result;
754
        }
755
      break;
756
    default:
757
      error("jtag_write_reg called with no connection!");
758
      break;
759
    }
760
 
761
  return err;
762
}
763
 
764 113 markom
/* Sets scan chain.  */
765
 
766
void
767
jtag_set_chain (chain)
768
     int chain;
769
{
770 124 chris
  int result;
771
 
772
  switch(connection.location)
773 113 markom
    {
774 124 chris
    case JTAG_LOCAL:
775
      if (current_chain != chain)
776
        {
777
          if (!chain_is_valid[chain])
778
            error ("Chain not valid.");
779 113 markom
 
780 124 chris
          current_chain = chain;
781
          jp1_prepare_control ();
782 118 markom
 
783 124 chris
          jp1_write_JTAG (0); /* CAPTURE_IR */
784
          jp1_write_JTAG (0); /* SHIFT_IR */
785 118 markom
 
786 124 chris
          /* write data, EXIT1_IR */
787
          jp1_write_stream (JI_CHAIN_SELECT, JI_SIZE, 4);
788 118 markom
 
789 124 chris
          jp1_write_JTAG (1); /* UPDATE_IR */
790
          jp1_write_JTAG (1); /* SELECT_DR */
791 118 markom
 
792 124 chris
          jp1_write_JTAG (0); /* CAPTURE_DR */
793
          jp1_write_JTAG (0); /* SHIFT_DR */
794 118 markom
 
795 124 chris
          /* write data, EXIT1_DR */
796
          jp1_write_stream (chain, SC_SIZE, 1);
797 118 markom
 
798 124 chris
          jp1_write_JTAG (1); /* UPDATE_DR */
799
          jp1_write_JTAG (1); /* SELECT_DR */
800 118 markom
 
801 124 chris
          /* Now we have to go out of SELECT_CHAIN mode.  */
802
          jp1_write_JTAG (1); /* SELECT_IR */
803
          jp1_write_JTAG (0); /* CAPTURE_IR */
804
          jp1_write_JTAG (0); /* SHIFT_IR */
805 118 markom
 
806 124 chris
          /* write data, EXIT1_IR */
807
          jp1_write_stream (JI_DEBUG, JI_SIZE,1 );
808 118 markom
 
809 124 chris
          jp1_write_JTAG (1); /* UPDATE_IR */
810
          jp1_write_JTAG (1); /* SELECT_DR */
811
          select_dr = 1;
812
        }
813
      break;
814
    case JTAG_REMOTE:
815
      if(current_chain != chain)
816
        {
817
          if(result = jtag_send_proxy(JTAG_COMMAND_CHAIN,chain))
818
            {
819
              jtag_proxy_error(result,JTAG_COMMAND_CHAIN,chain);
820
              err = result;
821
            }
822
        }
823
      break;
824
    default:
825
      error("jtag_set_chain called with no connection!");
826
      break;
827 113 markom
    }
828
}
829
 
830 124 chris
/* Added by CZ 24/05/01 */
831
static int jtag_connect_to_server(char* hostname,char* name)
832
{
833
  struct hostent *host;
834
  struct sockaddr_in sin;
835
  struct servent *service;
836
  struct protoent *protocol;
837
  int sock,flags;
838
  int fd;
839
  char sTemp[256],sTemp2[256];
840
  char* proto_name = "tcp";
841
  int port = 0;
842
  int on_off = 0; /* Turn off Nagel's algorithm on the socket */
843
  char *s;
844
 
845
  if(!(protocol = getprotobyname(proto_name)))
846
    {
847
      sprintf(sTemp,"jtag_connect_to_server: Protocol \"%s\" not available.\n",
848
              proto_name);
849
      error(sTemp);
850
      return 0;
851
    }
852
 
853
  /* Convert name to an integer only if it is well formatted.
854
     Otherwise, assume that it is a service name. */
855
 
856
  port = strtol(name,&s,10);
857
  if(*s)
858
    port = 0;
859
 
860
  if(!port)
861
    {
862
      if(!(service = getservbyname(name,protocol->p_name)))
863
        {
864
          sprintf(sTemp,"jtag_connect_to_server: Unknown service \"%s\".\n",name);
865
          error(sTemp);
866
          return 0;
867
        }
868
 
869
      port = ntohs(service->s_port);
870
    }
871
 
872
  if(!(host = gethostbyname(hostname)))
873
    {
874
      sprintf(sTemp,"jtag_connect_to_server: Unknown host \"%s\"\n",hostname);
875
      error(sTemp);
876
      return 0;
877
    }
878
 
879
  if((sock = socket(PF_INET,SOCK_STREAM,0)) < 0)
880
    {
881
      sprintf(sTemp,"jtag_connect_to_server: can't create socket errno = %d\n",
882
              errno);
883
      sprintf(sTemp2,"%s\n",strerror(errno));
884
      strcat(sTemp,sTemp2);
885
      error(sTemp);
886
      return 0;
887
    }
888
 
889
  if(fcntl(sock,F_GETFL,&flags) < 0)
890
    {
891
      sprintf(sTemp,"Unable to get flags for JTAG proxy socket %d",sock);
892
      error(sTemp);
893
      close(sock);
894
      return 0;
895
    }
896
 
897
  if(fcntl(sock,F_SETFL, flags & ~O_NONBLOCK) < 0)
898
    {
899
      sprintf(sTemp,"Unable to set flags for JTAG proxy socket %d to value 0x%08x",
900
              sock,flags | O_NONBLOCK);
901
      error(sTemp);
902
      close(sock);
903
      return 0;
904
    }
905
 
906
  memset(&sin,0,sizeof(sin));
907
  sin.sin_family = host->h_addrtype;
908
  memcpy(&sin.sin_addr,host->h_addr_list[0],host->h_length);
909
  sin.sin_port = htons(port);
910
 
911
  if((connect(sock,(struct sockaddr*)&sin, sizeof(sin)) < 0)
912
     && errno != EINPROGRESS)
913
    {
914
 
915
      sprintf(sTemp,"jtag_connect_to_server: connect failed  errno = %d\n",errno);
916
      sprintf(sTemp2,"%s\n",strerror(errno));
917
      close(sock);
918
      strcat(sTemp,sTemp2);
919
      error(sTemp);
920
      return 0;
921
    }
922
 
923
  if(fcntl(sock,F_SETFL, flags | O_NONBLOCK) < 0)
924
    {
925
      sprintf(sTemp,"Unable to set flags for JTAG proxy socket %d to value 0x%08x",
926
              sock,flags | O_NONBLOCK);
927
      error(sTemp);
928
      close(sock);
929
      return 0;
930
    }
931
 
932
  if(setsockopt(sock,protocol->p_proto,TCP_NODELAY,&on_off,sizeof(int)) < 0)
933
    {
934
      sprintf(sTemp,"Unable to disable Nagel's algorithm for socket %d.\nsetsockopt",sock);
935
      error(sTemp);
936
      close(sock);
937
      return 0;
938
    }
939
 
940
  return sock;
941
}
942
 
943 104 markom
/* Initialize a new connection to the or1k board, and make sure we are
944
   really connected.  */
945
 
946
void
947
jtag_init (args)
948
     char * args;
949
{
950
  char *ptype;
951
  char *port_name;
952
  char **argv;
953
 
954 124 chris
  if (args == 0) /* CZ */
955
    error ( "To open a or1k remote debugging connection, you need to specify a "
956
            "parallel port\nconnected to the target board, or else a remote "
957
            "server which will proxy these\nservices for you.\nExample: "
958
            "/dev/lp0 or jtag://debughost.mydomain.com:8100.\n");
959 104 markom
 
960 124 chris
  /* If we currently have an open connection, shut it
961
     down.  This is due to a temporary bug in gdb. */
962
  switch(connection.location)
963
    {
964
    case JTAG_REMOTE:
965
      if(connection.device.fd > 0)
966
        {
967
          close(connection.device.fd);
968
        }
969
      break;
970
    case JTAG_LOCAL:
971
      if(connection.device.lp > 0)
972
        {
973
          close(connection.device.lp);
974
        }
975
      break;
976
    default:
977
      break;
978
    }
979
 
980 118 markom
  /* Parse the port name.  */
981 104 markom
  if ((argv = buildargv (args)) == NULL)
982
    nomem (0);
983
  port_name = strsave (argv[0]);
984
  make_cleanup_freeargv (argv);
985
 
986 124 chris
  /* CZ 24/05/01 - Check to see if we have specified a remote
987
     jtag interface or a local one. It is remote if it follows
988
     the URL naming convention jtag://<hostname>:<port> */
989
  if(!strncmp(port_name,"jtag://",7))
990
    {
991
      char *port = strchr(&port_name[7],':');
992
      char hostname[256];
993 104 markom
 
994 124 chris
      if(port)
995
        {
996
          int len = port - port_name - 7;
997
          strncpy(hostname,&port_name[7],len);
998
          hostname[len] = '\0';
999
          port++;
1000
        }
1001
      else
1002
        strcpy(hostname,&port_name[7]);
1003 104 markom
 
1004 124 chris
      /* Interface is remote */
1005
      if(!(connection.device.fd = jtag_connect_to_server(hostname,port)))
1006
        {
1007
          char sTemp[256];
1008
          sprintf(sTemp,"Can not access JTAG Proxy Server at \"%s\"",
1009
                  &port_name[5]);
1010
          error(sTemp);
1011
        }
1012
      connection.location = JTAG_REMOTE;
1013
      printf_unfiltered ("Remote or1k debugging using %s\n",port_name);
1014
    }
1015
  else
1016
    {
1017
      /* Interface is local */
1018
      /* Open and initialize the parallel port.  */
1019
      connection.device.lp = open (port_name, O_WRONLY);
1020
      if (connection.device.lp < 0)
1021
        error ("Cannot open device.");
1022
      connection.location = JTAG_LOCAL; /* CZ */
1023
      printf_unfiltered ("Local or1k debugging using %s\n", port_name);
1024
 
1025
    }
1026
 
1027 113 markom
  current_chain = -1;
1028 124 chris
  if(connection.location == JTAG_LOCAL)
1029
    jp1_reset_JTAG ();
1030 113 markom
  jtag_set_chain (SC_RISC_DEBUG);
1031 124 chris
 
1032 104 markom
  free (port_name);
1033
}
1034
 
1035
void
1036 124 chris
jtag_done ()  /* CZ */
1037 104 markom
{
1038 124 chris
  switch(connection.location)
1039
    {
1040
    case JTAG_LOCAL:
1041
      sync_close (connection.device.lp);
1042
      connection.device.lp = 0;
1043
      break;
1044
    case JTAG_REMOTE:
1045
      sync_close(connection.device.fd);
1046
      connection.device.fd = 0;
1047
      break;
1048
    default:
1049
      error("No jtag connection specified!");
1050
      break;
1051
    }
1052
  connection.location = JTAG_NOT_CONNECTED;
1053 104 markom
}
1054 124 chris
 
1055
int sync_close(int fd)
1056
{
1057
  int flags = 0;
1058
  struct linger linger;
1059
  char sTemp[256];
1060
 
1061
  linger.l_onoff = 0;
1062
  linger.l_linger = 0;
1063
 
1064
  /* First, make sure we're non blocking */
1065
  if(fcntl(fd,F_GETFL,&flags) < 0)
1066
    {
1067
      sprintf(sTemp,"Unable to get flags for JTAG proxy socket %d",fd);
1068
      error(sTemp);
1069
    }
1070
  if(fcntl(fd,F_SETFL, flags & ~O_NONBLOCK) < 0)
1071
    {
1072
      sprintf(sTemp,"Unable to set flags for JTAG proxy socket %d to value 0x%08x",
1073
              fd,flags | O_NONBLOCK);
1074
      error(sTemp);
1075
    }
1076
 
1077
  /* Now, make sure we don't linger around */
1078
  if(setsockopt(fd,SOL_SOCKET,SO_LINGER,&linger,sizeof(linger)) < 0)
1079
    {
1080
      sprintf(sTemp,"Unable to disable SO_LINGER for JTAG proxy socket %d.",fd);
1081
      error(sTemp);
1082
    }
1083
 
1084
  return close(fd);
1085
}

powered by: WebSVN 2.1.0

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