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

Subversion Repositories or1k

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

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

powered by: WebSVN 2.1.0

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