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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [jtag/] [jp1.c] - Blame information for rev 1322

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

Line No. Rev Author Line
1 435 simons
/* jp1-linux.c -- JTAG protocol via parallel port for linux
2
   Copyright (C) 2001 Marko Mlinar, markom@opencores.org
3
   Code for TCP/IP copied from gdb, by Chris Ziomkowski
4
 
5
This file is part of OpenRISC 1000 Architectural Simulator.
6
 
7
This program is free software; you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation; either version 2 of the License, or
10
(at your option) any later version.
11
 
12
This program is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
GNU General Public License for more details.
16
 
17
You should have received a copy of the GNU General Public License
18
along with this program; if not, write to the Free Software
19
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
 
21
/* Establishes jtag proxy server and communicates with parallel
22
 port directly.  Requires root access. */
23
 
24
#include <stdio.h>
25
#include <ctype.h>
26
#include <string.h>
27
#include <stdlib.h>
28
#include <unistd.h>
29
#include <stdarg.h>
30
 
31
/* Dirty way to include inb and outb from, but they say it is
32
   a standard one.  */
33
#include <asm/io.h>
34
#include <asm/system.h>
35 588 simons
#include "mc.h"
36 435 simons
 
37 602 lampret
 
38
#define Boolean int
39
#define false 0
40
#define true 1
41
 
42 435 simons
#define GDB_IN "../sim/rtl_sim/run/gdb_in.dat"
43
#define GDB_OUT "../sim/rtl_sim/run/gdb_out.dat"
44
 
45
/* Libraries for JTAG proxy server.  */
46
#include <sys/stat.h>
47
#include <sys/types.h>
48
#include <sys/socket.h>
49
#include <netinet/in.h>
50
#include <sys/select.h>
51
#include <sys/poll.h>
52
#include <fcntl.h>
53
#include <netdb.h>
54
#include <netinet/tcp.h>
55
#include <inttypes.h>
56
#include <errno.h>
57
 
58
#include "gdb.h" /* partially copied from gdb/config/or1k */
59
 
60
#ifdef DEBUG
61
#define debug printf
62 602 lampret
#else
63
#define debug
64
#endif
65
 
66
#ifdef DEBUG2
67 435 simons
#define debug2 printf
68 602 lampret
#else
69
#define debug2
70
#endif
71
 
72
#if (DEBUG) || (DEBUG2)
73 435 simons
#define flush_debug() fflush(stdout)
74
#else
75
#define flush_debug()
76
#endif
77
 
78
#define LPT_BASE (base)
79
#define LPT_READ (LPT_BASE+1)
80
#define LPT_WRITE LPT_BASE
81
#if RTL_SIM
82
#define TCLK_BIT (0x01) /* D0, pin #2 */
83
#define TRST_BIT (0x02) /* D1, pin #3 */
84
#define TDI_BIT  (0x04) /* D2, pin #4 */
85
#define TMS_BIT  (0x08) /* D0, pin #5 */
86
#define TDO_BIT  (0x20) /* PE, pin #12 */
87
#define TMS      (0x02)
88
#define TDI      (0x01)
89
#else
90 602 lampret
#ifdef XILINX_PARALLEL_CABLE_III
91 588 simons
#define TCLK_BIT (0x02) /* D1 pin 3 */
92
#define TRST_BIT (0x10) /* Not used */
93
#define TDI_BIT  (0x01) /* D0 pin 2 */
94
#define TMS_BIT  (0x04) /* D2 pin 4 */
95
#define TDO_BIT  (0x10) /* S6 pin 13*/
96
#define TMS      (0x02)
97
#define TDI      (0x01)
98
#else
99 602 lampret
#ifdef XESS_PARALLEL_CABLE
100 435 simons
#define TCLK_BIT (0x04) /* D2 pin 4 */
101
#define TRST_BIT (0x08) /* D3 pin 5 */
102
#define TDI_BIT  (0x10) /* D4 pin 6 */
103
#define TMS_BIT  (0x20) /* D5 pin 7 */
104
#define TDO_BIT  (0x20) /* S5 pin 12*/
105
#define TMS      (0x02)
106
#define TDI      (0x01)
107
#endif
108 588 simons
#endif
109 602 lampret
#endif
110
 
111 435 simons
#ifdef RTL_SIM
112
# define JTAG_WAIT() usleep(1000)
113
# define NUM_RETRIES (16)
114
# define JTAG_RETRY_WAIT() usleep (1000)
115
#else
116
# define JTAG_WAIT() {      \
117
  int i;        \
118
  volatile int j;   \
119
  for(i = 0; i < 1000; i++) \
120
    j = i;      \
121
  }
122
# define NUM_RETRIES (16)
123
# define JTAG_RETRY_WAIT() usleep (1000)
124
#endif
125
 
126
/* Selects crc trailer size in bits. Currently supported: 8 */
127
#define CRC_SIZE (8)
128
 
129
/* Scan chain size in bits.  */
130
#define SC_SIZE (4)
131
 
132
#ifndef ULONGEST
133
#define ULONGEST unsigned long
134
#endif
135
 
136
static int base = 0x378; /* FIXME: We should detect the address. */
137
int err = 0;
138
int set_pc = 0;
139
int set_step = 0;
140 602 lampret
int waiting = 0;
141 435 simons
 
142
unsigned int serverIP = 0;
143
unsigned int serverPort = 0;
144
unsigned int server_fd = 0;
145
unsigned int gdb_fd = 0;
146 602 lampret
void HandleServerSocket(Boolean block);
147 435 simons
void JTAGRequest(void);
148
void GDBRequest(void);
149
void ProtocolClean(int,int32_t);
150
static int gdb_read(void*,int);
151
static int gdb_write(void*,int);
152
static void jtag_set_chain (int);
153
 
154
/* Scan chain info. */
155
/* *INDENT-OFF* */
156
static int chain_addr_size[] = { 0,  32, 0,  0,  5,  32, 32};
157
static int chain_data_size[] = { 0,  32, 0,  32, 32, 32, 32};
158
static int chain_is_valid[]  = { 0,  1,  0,  1,  1,  1,   1};
159
static int chain_has_crc[]   = { 0,  1,  0,  1,  1,  1,   1};
160
static int chain_has_rw[]    = { 0,  1,  0,  0,  1,  1,   1};
161
/* *INDENT-OFF* */
162
 
163
/* Currently selected scan chain - just to prevent unnecessary
164
   transfers. */
165
static int current_chain;
166
 
167
/* Designates whether we are in SELECT_DR state, otherwise in
168
   RUN TEST/IDLE */
169
static int select_dr = 0;
170
 
171
/* Crc of current read or written data.  */
172
static int crc_r, crc_w = 0;
173
 
174
/* Address of previous read */
175
static unsigned long prev_regno = 0;
176
 
177
/* Generates new crc, sending in new bit input_bit */
178
 
179
static int
180
crc_calc (int crc, int input_bit)
181
{
182
  int c;
183
  int new_crc;
184
  int d;
185
 
186
#if (CRC_SIZE == 8)
187
  d = input_bit&1;
188
  c = crc;
189
 
190
  /* Move queue left.  */
191
  new_crc = crc << 1;
192
 
193
  /* Mask upper five bits.  */
194
  new_crc &= 0xF8;
195
 
196
  /* Set lower three bits */
197
  new_crc |= (d ^ ((c >> 7)&1));
198
  new_crc |= (d ^ ((c >> 0)&1) ^ ((c >> 7)&1)) << 1;
199
  new_crc |= (d ^ ((c >> 1)&1) ^ ((c >> 7)&1)) << 2;
200
  return new_crc;
201
#else
202
  return 0;
203
#endif
204
}
205
 
206
/* Send a byte to parallel port. */
207
 
208
inline static void
209
jp1_out (unsigned int value) {
210
 
211
#ifdef RTL_SIM
212
  time_t time;
213
  struct stat s;
214
  char buf[1000];
215
  FILE *fout;
216
  unsigned num_read;
217
  int r;
218
  fout = fopen (GDB_IN, "wt+");
219
  fprintf (fout, "F\n");
220
  fclose (fout);
221
  fout = fopen (GDB_OUT, "wt+");
222
  fprintf (fout, "%02X\n", value);
223
  fclose (fout);
224
error:
225
  fout = fopen (GDB_OUT, "rt");
226
  r = fscanf(fout,"%x", &num_read);
227
  fclose (fout);
228
  if (r == 0 || num_read != (0x10 | value))
229
    goto error;
230
#else
231
  outb(value, LPT_WRITE);
232
#endif /* RTL_SIM */
233
  if  (!(value & 1))
234
    debug("[%x%c]", (value & TDI_BIT) != 0, (value & TMS_BIT)?'^':'_');
235
  flush_debug();
236
}
237
 
238
/* Receive a byte from parallel port.  */
239
 
240
inline static unsigned char
241
jp1_in () {
242
  int data;
243
#ifndef RTL_SIM
244
  data = inb (LPT_READ);
245 588 simons
#ifdef TDO_INV
246
  data = (data & TDO_BIT) != TDO_BIT;
247
#else
248 435 simons
  data = (data & TDO_BIT) == TDO_BIT;
249 588 simons
#endif
250 435 simons
#else
251
  FILE *fin = 0;
252
  char ch;
253
  time_t time;
254
  struct stat s;
255
  while (1) {
256
    fin = fopen (GDB_IN, "rt");
257
    if (fin == 0)
258
      continue;
259
    ch = fgetc (fin);
260
    if (ch != '0' && ch != '1') {
261
      fclose (fin);
262
      continue;
263
    } else break;
264
  }
265
  fclose (fin);
266
  data = ch == '1';
267
#endif /* !RTL_SIM */
268
  debug(" R%01X ", data);
269
  flush_debug();
270
  return data;
271
}
272
 
273
/* Writes TCLK=0, TRST=1, TMS=bit1, TDI=bit0
274
   and    TCLK=1, TRST=1, TMS=bit1, TDI=bit0 */
275
 
276
static inline void
277
jp1_write_JTAG (packet)
278
  unsigned char packet;
279
{
280
  unsigned char data = TRST_BIT;
281
  if (packet & 1)
282
    data |= TDI_BIT;
283
  if (packet & 2)
284
    data |= TMS_BIT;
285
 
286
  jp1_out (data);
287
  JTAG_WAIT();
288
  crc_w = crc_calc (crc_w, packet&1);
289
 
290
  /* rise clock */
291
  jp1_out (data | TCLK_BIT);
292
  JTAG_WAIT();
293
}
294
 
295
/* Reads TDI.  */
296
 
297
static inline int
298
jp1_read_JTAG ()
299
{
300
  int data;
301
  data = jp1_in ();
302
  crc_r = crc_calc (crc_r, data);
303
  return data;
304
}
305
 
306
/* Writes bitstream.  LS bit first.  */
307
 
308
static inline void
309
jp1_write_stream (stream, len, set_last_bit)
310
  ULONGEST stream;
311
  int len;
312
  int set_last_bit;
313
{
314
  int i;
315
  if (len <= 0) return;
316
  debug("\nwrite(");
317
  for (i = 0; i < len - 1; i++)
318
    jp1_write_JTAG ((stream >> i) & 1);
319
 
320
  if (set_last_bit)
321
    jp1_write_JTAG ((stream >> (len - 1))& 1 | TMS);
322
  else
323
    jp1_write_JTAG ((stream >> (len - 1))& 1);
324
  debug(")\n");
325
}
326
 
327
/* Gets bitstream.  LS bit first.  */
328
 
329
inline static ULONGEST
330
jp1_read_stream (stream, len, set_last_bit)
331
  unsigned long stream;
332
  int len;
333
  int set_last_bit;
334
{
335
  int i;
336
  ULONGEST data;
337
  debug("\nread(");
338
  if (len <= 0) return;
339
  data = 0;
340
  for (i = 0; i < len - 1; i++)
341
    {
342
      jp1_write_JTAG (stream & 1);   /* LSB first */
343
      stream >>= 1;
344
      data |= jp1_read_JTAG () << i; /* LSB first */
345
    }
346
 
347
  if (set_last_bit)
348
    jp1_write_JTAG (stream & 1 | TMS);
349
  else
350
    jp1_write_JTAG (stream & 1);
351
  data |= jp1_read_JTAG () << (len - 1);
352
  debug(")\n");
353
  return data;
354
}
355
 
356
/* Goes into SELECT_IR state. Should be called before every control write.  */
357
 
358
inline static void
359
jp1_prepare_control ()
360
{
361
  if (!select_dr)
362
    jp1_write_JTAG (TMS); /* SELECT_DR SCAN */
363
  jp1_write_JTAG (TMS);   /* SELECT_IR SCAN */
364
  select_dr = 0;
365
}
366
 
367
/* Resets JTAG.
368
   Writes TRST=0
369
   and    TRST=1 */
370
 
371
static void
372
jp1_reset_JTAG ()
373
{
374
  int i;
375
  debug2 ("\nreset(");
376
  jp1_out (0);
377
  JTAG_RETRY_WAIT();
378 588 simons
  /* In case we don't have TRST reset it manually */
379
  for (i = 0; i < 8; i++)
380
    jp1_write_JTAG (TMS);
381 435 simons
  jp1_out (TRST_BIT);
382
  JTAG_RETRY_WAIT();
383
  jp1_write_JTAG (0);
384
  debug2(")\n");
385
  select_dr = 0;
386
}
387
 
388
/* Sets register/memory regno to data.  */
389
 
390
/* CZ 08/06/01: I am not sure how error checking is intended to
391
   be implemented here. It appears that no indication is returned
392
   to the caller as you have in standard unix system calls. Therefore,
393
   I guess the only way to use these functions when you want to know
394
   the exact position of the error is to manually clear err, call the
395
   function, and then manually check err. I have also made some changes
396
   where necessary because no value was returned at all int jtag_read_reg.
397
*/
398
 
399
static void
400
jtag_write_reg_support (regno, data)
401
  int regno;
402
  ULONGEST data;
403
{
404
  int crc_read, crc_write, crc_ok, retry;
405
  int result;
406
  int tmp;
407
 
408
  debug("\n");
409
  debug2("write_reg %i(%08x) <- %08x \n", regno, regno, data);
410
  if (!select_dr)
411
    jp1_write_JTAG (TMS); /* SELECT_DR SCAN */
412
  select_dr = 1;
413
 
414
      /* If we don't have rw bit, we assume chain
415
   is read only. */
416
  if (!chain_has_rw[current_chain])
417
    error ("Internal: Chain not writable.");
418
 
419
  for (retry = 0; retry < NUM_RETRIES; retry++) {
420
    jp1_write_JTAG (0); /* CAPTURE_DR */
421
    jp1_write_JTAG (0); /* SHIFT_DR */
422
    crc_w = 0;
423
 
424
    /* write addr */
425
    jp1_write_stream (regno, chain_addr_size[current_chain], 0);
426
 
427
    /* write (R/W=1) - we tested that previously. */
428
    jp1_write_JTAG (TDI);
429
 
430
    if (chain_has_crc[current_chain])
431
      {
432
        /* write data */
433
        jp1_write_stream (data, chain_data_size[current_chain], 0);
434
        crc_write = crc_w;
435
 
436
        /* write CRC, EXIT1_DR */
437
        crc_read = jp1_read_stream (crc_write, CRC_SIZE + 1, 1) >> 1;
438
      }
439
    else
440
      {
441
        /* write data */
442
        jp1_write_stream (data, chain_data_size[current_chain], 1);
443
      }
444
    jp1_write_JTAG (TMS); /* UPDATE_DR */
445
    jp1_write_JTAG (TMS); /* SELECT_DR */
446
 
447
    /* Did JTAG receive packet correctly? */
448
    if (chain_has_crc[current_chain])
449
      crc_ok = crc_read == crc_write;
450
 
451
    if (chain_has_crc[current_chain])
452
      {
453
        if (crc_ok)
454
          return;
455
 
456
        debug2(", crc failed. read %08x, generated %08x\n", crc_read, crc_write);
457
        jp1_reset_JTAG();
458
        jp1_write_JTAG (TMS); /* SELECT_DR SCAN */
459
        select_dr = 1;
460
        tmp = current_chain;
461
        current_chain = -1;
462
        jtag_set_chain(tmp);
463
      }
464
    else
465
      return;
466
  }
467
  printf ("Invalid CRC\n");
468
  err = ERR_CRC;
469
}
470
 
471
/* Reads register/memory from regno.
472
   Reading is a bit strange. Data is not available
473
   at the time we pass an address, but in successive
474
   read instead. Call jtag_read_reg twice to get correct
475
   data. */
476
 
477
static ULONGEST
478
jtag_read_reg (regno)
479
  unsigned int regno;
480
{
481
  ULONGEST data;
482
  int crc_read, crc_write, crc_actual_read,  retry, crc_ok;
483
  int result;
484
  int tmp;
485
 
486
  debug("\n");
487
  debug2("read_reg %i(%08x)", regno, regno);
488
  debug (" \n ");
489
  if (!select_dr)
490
    jp1_write_JTAG (TMS); /* SELECT_DR SCAN */
491
  select_dr = 1;
492
 
493
  for (retry = 0; retry < NUM_RETRIES; retry++) {
494
    jp1_write_JTAG (0); /* CAPTURE_DR */
495
    jp1_write_JTAG (0); /* SHIFT_DR */
496
    crc_w = 0;
497
 
498
    /* write addr */
499
    jp1_write_stream (regno, chain_addr_size[current_chain], 0);
500
 
501
    /* read (R/W=0) */
502
    if (chain_has_rw[current_chain])
503
      jp1_write_JTAG (0);
504
    if (chain_has_crc[current_chain])
505
      {
506
        crc_r = 0;
507
 
508
        /* data = 0 */
509
        data = jp1_read_stream (0, chain_data_size[current_chain], 0);
510
        crc_write = crc_w;
511
        crc_actual_read = crc_r;
512
 
513
        /* Send my crc, EXIT1_DR */
514 614 simons
        crc_read = jp1_read_stream (crc_write, CRC_SIZE + 1, 1) >> 1;
515 435 simons
      } else {
516
        /* data = 0 */
517
        data = jp1_read_stream (0, chain_data_size[current_chain], 1);
518
      }
519
    jp1_write_JTAG (TMS); /* UPDATE_DR */
520
    jp1_write_JTAG (TMS); /* SELECT_DR */
521
 
522
    /* Did JTAG receive packet correctly? */
523
    if (chain_has_crc[current_chain])
524
      crc_ok = jp1_read_JTAG ();
525
 
526
    if (chain_has_crc[current_chain])
527
      {
528
        if ((crc_read == crc_actual_read) && (crc_ok)) {
529
          debug2(" , read_reg %i(%08x) = %08x\n", regno, regno, data);
530
          prev_regno = regno;
531
          return data;
532
        }
533
        debug2(", crc failed. read %08x, generated %08x\n", crc_read, crc_actual_read);
534
        jp1_reset_JTAG();
535
        jp1_write_JTAG (TMS); /* SELECT_DR SCAN */
536
        select_dr = 1;
537
        tmp = current_chain;
538
        current_chain = -1;
539
        jtag_set_chain(tmp);
540
        jtag_read_reg (prev_regno);
541
        if (err) return -1;
542
      }
543
    else {
544
      debug2(" , read_reg %i(%08x) = %08x\n", regno, regno, data);
545
      prev_regno = regno;
546
      return data;
547
    }
548
  }
549
  printf ("Invalid CRC\n");
550
  err = ERR_CRC;
551
  return -1;
552
}
553
 
554
/* Sets scan chain.  */
555
 
556
static void
557
jtag_set_chain (chain)
558
  int chain;
559
{
560
  int crc_read, crc_write, crc_ok, retry;
561
  int result;
562
 
563
  debug("\n");
564
  debug2("set_chain %i\n", chain);
565
  if (current_chain != chain) {
566
    if (!chain_is_valid[chain])
567
      error ("Chain not valid.");
568
 
569
    current_chain = chain;
570
    jp1_prepare_control ();
571
 
572
    while (1) {
573
      jp1_write_JTAG (0); /* CAPTURE_IR */
574
      jp1_write_JTAG (0); /* SHIFT_IR */
575
 
576
      /* write data, EXIT1_IR */
577
      jp1_write_stream (JI_CHAIN_SELECT, JI_SIZE, 1);
578
 
579
      jp1_write_JTAG (TMS); /* UPDATE_IR */
580
      jp1_write_JTAG (TMS); /* SELECT_DR */
581
 
582
      jp1_write_JTAG (0); /* CAPTURE_DR */
583
      jp1_write_JTAG (0); /* SHIFT_DR */
584
 
585
      if (chain_has_crc[current_chain])
586
        {
587
          crc_w = 0;
588
          /* write data */
589
          jp1_write_stream (chain, SC_SIZE, 0);
590
 
591
          crc_write = crc_w;
592
          /* write CRC, EXIT1_DR */
593
          crc_read = jp1_read_stream (crc_write, CRC_SIZE + 1, 1) >> 1;
594
        } else {
595
          /* write data, EXIT1_DR */
596
          jp1_write_stream (chain, SC_SIZE, 1);
597
        }
598
      jp1_write_JTAG (TMS); /* UPDATE_DR */
599
      jp1_write_JTAG (TMS); /* SELECT_DR */
600
 
601
      /* Did JTAG receive packet correctly? */
602
      if (chain_has_crc[current_chain])
603
        crc_ok = crc_read == crc_write;
604
 
605
      if (chain_has_crc[current_chain])
606
        {
607
          if (!crc_ok)
608
            {
609
              debug2(", crc failed.\n");
610
              jp1_reset_JTAG();
611
              jp1_prepare_control ();
612
              continue;
613
            }
614
        }
615
 
616
      jp1_write_JTAG (TMS); /* SELECT_IR */
617
      jp1_write_JTAG (0); /* CAPTURE_IR */
618
      jp1_write_JTAG (0); /* SHIFT_IR */
619
      crc_w = 0;
620
 
621
      /* write data, EXIT1_IR */
622
      jp1_write_stream (JI_DEBUG, JI_SIZE, 1);
623
 
624
      jp1_write_JTAG (TMS); /* UPDATE_IR */
625
      jp1_write_JTAG (TMS); /* SELECT_DR */
626
      select_dr = 1;
627
 
628
      return;
629
    }
630
    printf ("Invalid CRC\n");
631
    err = ERR_CRC;
632
  } else
633
    debug2 ("Already set.\n");
634
}
635
 
636
/* Sets register/memory regno to data.  */
637
 
638
static void
639
jtag_write_reg (regno, data)
640
  int regno;
641
  ULONGEST data;
642
{
643
  /* Set PC */
644 588 simons
//  if (current_chain == SC_RISC_DEBUG && regno == 0x10)
645
//    data = data - 4;
646 435 simons
 
647
  jtag_write_reg_support (regno, data);
648
}
649
 
650
/* Stalls the CPU.  */
651
 
652
static void
653
or1k_stall ()
654
{
655
  int val;
656
  jtag_set_chain (SC_REGISTER);
657
  val = jtag_read_reg (JTAG_RISCOP);
658
  jtag_write_reg (JTAG_RISCOP, val | 1);
659
}
660
 
661
/* Unstalls the CPU.  */
662
 
663
static void
664
or1k_unstall ()
665
{
666
  unsigned int val;
667
 
668
  jtag_set_chain (SC_REGISTER);
669
  val = jtag_read_reg (JTAG_RISCOP);
670
  jtag_write_reg (JTAG_RISCOP, val & ~1);
671
}
672
 
673
/* Initialize a new connection to the or1k board, and make sure we are
674
   really connected.  */
675
 
676
static int
677
jtag_init () {
678
  int tmp, i;
679
  unsigned int npc, ppc, r1, insn, result;
680
  current_chain = -1;
681
  jp1_reset_JTAG ();
682 588 simons
#if 0
683
#define MC_BASE_ADD     0x60000000
684 614 simons
#define MC_CSR_VAL      0x0f300300
685
#define MC_MASK_VAL     0x000000e0
686 588 simons
#define FLASH_BASE_ADD  0x04000000
687
#define FLASH_TMS_VAL   0x0010a10a
688
#define SDRAM_BASE_ADD  0x00000000
689
#define SDRAM_TMS_VAL   0x07248230
690 435 simons
 
691 588 simons
  jtag_set_chain (SC_REGISTER);
692
  jtag_write_reg (4, 0x00000001);
693
 
694
  jtag_set_chain (SC_WISHBONE);
695
  jtag_write_reg (MC_BASE_ADD + MC_CSC(0), (((FLASH_BASE_ADD & 0xffff0000) >> 5) | 0x25));
696
  jtag_write_reg (MC_BASE_ADD + MC_TMS(0), FLASH_TMS_VAL);
697
 
698
  jtag_write_reg (MC_BASE_ADD + MC_BA_MASK, MC_MASK_VAL);
699
  jtag_write_reg (MC_BASE_ADD + MC_CSR, MC_CSR_VAL);
700
 
701
  jtag_write_reg (MC_BASE_ADD + MC_TMS(1), SDRAM_TMS_VAL);
702
  jtag_write_reg (MC_BASE_ADD + MC_CSC(1), (((SDRAM_BASE_ADD & 0xffff0000) >> 5) | 0x0411));
703
 
704
  sleep(1);
705
#endif
706
 
707 435 simons
#if 1
708
 
709 588 simons
#define RAM_BASE 0x00000000
710 435 simons
  /* Stall risc */
711
  jtag_set_chain (SC_REGISTER);
712
  jtag_write_reg (4, 0x00000001);
713
 
714
  jtag_set_chain (SC_WISHBONE);
715
  jtag_write_reg (RAM_BASE + 0x00, 0x9c200000);                                /* l.addi  r1,r0,0x0       */
716
  jtag_write_reg (RAM_BASE + 0x04, 0x18400000 + (RAM_BASE >> 16));             /* l.movhi r2,0x4000       */
717
  jtag_write_reg (RAM_BASE + 0x08, 0xa8420000 + ((RAM_BASE + 0x30) & 0xffff)); /* l.ori   r2,r2,0x0000    */
718
  jtag_write_reg (RAM_BASE + 0x0c, 0x9c210001);                                /* l.addi  r1,r1,1         */
719
  jtag_write_reg (RAM_BASE + 0x10, 0x9c210001);                                /* l.addi  r1,r1,1         */
720
  jtag_write_reg (RAM_BASE + 0x14, 0xd4020800);                                /* l.sw    0(r2),r1        */
721
  jtag_write_reg (RAM_BASE + 0x18, 0x9c210001);                                /* l.addi  r1,r1,1         */
722
  jtag_write_reg (RAM_BASE + 0x1c, 0x84620000);                                /* l.lwz   r3,0(r2)        */
723
  jtag_write_reg (RAM_BASE + 0x20, 0x03fffffb);                                /* l.j     loop2           */
724
  jtag_write_reg (RAM_BASE + 0x24, 0xe0211800);                                /* l.add   r1,r1,r3        */
725
  jtag_write_reg (RAM_BASE + 0x24, 0xe0211800);                                /* l.add   r1,r1,r3        */
726
 
727
  /* Enable exceptions */
728
  jtag_set_chain (SC_RISC_DEBUG);
729 614 simons
  jtag_write_reg ((0 << 11) + 17, 0x01);
730 435 simons
 
731
  /* Trap causes stall */
732
  jtag_set_chain (SC_RISC_DEBUG);
733
  jtag_write_reg ((6 << 11) + 20, 0x2000);
734
 
735
  /* Set PC */
736
  jtag_set_chain (SC_RISC_DEBUG);
737
  jtag_write_reg ((0 << 11) + 16, RAM_BASE);
738
 
739
  /* Set step bit */
740
  jtag_set_chain (SC_RISC_DEBUG);
741
  jtag_write_reg ((6 << 11) + 16, 1 << 22);
742
 
743
 
744
  for (i = 0; i < 10; i++)
745
    {
746
      /* Unstall */
747
      jtag_set_chain (SC_REGISTER);
748
      jtag_write_reg (4, 0x00000000);
749
      jtag_set_chain (SC_RISC_DEBUG);
750
    }
751
 
752
  /* Read NPC */
753
  jtag_set_chain (SC_RISC_DEBUG);
754
  npc = jtag_read_reg ((0 << 11) + 16);
755
  npc = jtag_read_reg ((0 << 11) + 16);
756
 
757
  /* Read PPC */
758
  jtag_set_chain (SC_RISC_DEBUG);
759
  ppc = jtag_read_reg ((0 << 11) + 18);
760
  ppc = jtag_read_reg ((0 << 11) + 18);
761
 
762
  /* Read R1 */
763
  jtag_set_chain (SC_RISC_DEBUG);
764
  r1 = jtag_read_reg (0x401);
765
  r1 = jtag_read_reg (0x401);
766
 
767 588 simons
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
768
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000000c, 0x40000024, 5);
769 435 simons
  result = npc + ppc + r1;
770
 
771
 
772
  /* Reset step bit */
773
  jtag_set_chain (SC_RISC_DEBUG);
774
  jtag_write_reg ((6 << 11) + 16, 0);
775
 
776
 
777
 
778
  /* Set trap insn in delay slot */
779
  jtag_set_chain (SC_WISHBONE);
780
  insn = jtag_read_reg (RAM_BASE + 0x24);
781
  insn = jtag_read_reg (RAM_BASE + 0x24);
782
  jtag_write_reg (RAM_BASE + 0x24, 0x21000001);
783
 
784
  /* Unstall */
785
  jtag_set_chain (SC_REGISTER);
786
  jtag_write_reg (4, 0x00000000);
787
  jtag_set_chain (SC_RISC_DEBUG);
788
 
789
  /* Read NPC */
790
  jtag_set_chain (SC_RISC_DEBUG);
791
  npc = jtag_read_reg ((0 << 11) + 16);
792
  npc = jtag_read_reg ((0 << 11) + 16);
793
 
794
  /* Read PPC */
795
  jtag_set_chain (SC_RISC_DEBUG);
796
  ppc = jtag_read_reg ((0 << 11) + 18);
797
  ppc = jtag_read_reg ((0 << 11) + 18);
798
 
799
  /* Read R1 */
800
  jtag_set_chain (SC_RISC_DEBUG);
801
  r1 = jtag_read_reg (0x401);
802
  r1 = jtag_read_reg (0x401);
803
 
804
  /* Set back original insn */
805
  jtag_set_chain (SC_WISHBONE);
806
  jtag_write_reg (RAM_BASE + 0x24, insn);
807
 
808 588 simons
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
809
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000000c, 0x40000024, 8);
810 435 simons
  result = npc + ppc + r1 + result;
811
 
812
 
813
  /* Set trap insn in place of branch insn */
814
  jtag_set_chain (SC_WISHBONE);
815
  insn = jtag_read_reg (RAM_BASE + 0x20);
816
  insn = jtag_read_reg (RAM_BASE + 0x20);
817
  jtag_write_reg (RAM_BASE + 0x20, 0x21000001);
818
 
819
  /* Set PC */
820
  jtag_set_chain (SC_RISC_DEBUG);
821
  jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x0c);
822
 
823
  /* Unstall */
824
  jtag_set_chain (SC_REGISTER);
825
  jtag_write_reg (4, 0x00000000);
826
  jtag_set_chain (SC_RISC_DEBUG);
827
 
828
  /* Read NPC */
829
  jtag_set_chain (SC_RISC_DEBUG);
830
  npc = jtag_read_reg ((0 << 11) + 16);
831
  npc = jtag_read_reg ((0 << 11) + 16);
832
 
833
  /* Read PPC */
834
  jtag_set_chain (SC_RISC_DEBUG);
835
  ppc = jtag_read_reg ((0 << 11) + 18);
836
  ppc = jtag_read_reg ((0 << 11) + 18);
837
 
838
  /* Read R1 */
839
  jtag_set_chain (SC_RISC_DEBUG);
840
  r1 = jtag_read_reg (0x401);
841
  r1 = jtag_read_reg (0x401);
842
 
843
  /* Set back original insn */
844
  jtag_set_chain (SC_WISHBONE);
845
  jtag_write_reg (RAM_BASE + 0x20, insn);
846
 
847 588 simons
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
848
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000024, 0x40000020, 11);
849 435 simons
  result = npc + ppc + r1 + result;
850
 
851
 
852
  /* Set trap insn before branch insn */
853
  jtag_set_chain (SC_WISHBONE);
854
  insn = jtag_read_reg (RAM_BASE + 0x1c);
855
  insn = jtag_read_reg (RAM_BASE + 0x1c);
856
  jtag_write_reg (RAM_BASE + 0x1c, 0x21000001);
857
 
858
  /* Set PC */
859
  jtag_set_chain (SC_RISC_DEBUG);
860
  jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x20);
861
 
862
  /* Unstall */
863
  jtag_set_chain (SC_REGISTER);
864
  jtag_write_reg (4, 0x00000000);
865
  jtag_set_chain (SC_RISC_DEBUG);
866
 
867
  /* Read NPC */
868
  jtag_set_chain (SC_RISC_DEBUG);
869
  npc = jtag_read_reg ((0 << 11) + 16);
870
  npc = jtag_read_reg ((0 << 11) + 16);
871
 
872
  /* Read PPC */
873
  jtag_set_chain (SC_RISC_DEBUG);
874
  ppc = jtag_read_reg ((0 << 11) + 18);
875
  ppc = jtag_read_reg ((0 << 11) + 18);
876
 
877
  /* Read R1 */
878
  jtag_set_chain (SC_RISC_DEBUG);
879
  r1 = jtag_read_reg (0x401);
880
  r1 = jtag_read_reg (0x401);
881
 
882
  /* Set back original insn */
883
  jtag_set_chain (SC_WISHBONE);
884
  jtag_write_reg (RAM_BASE + 0x1c, insn);
885
 
886 588 simons
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
887
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000020, 0x4000001c, 24);
888 435 simons
  result = npc + ppc + r1 + result;
889
 
890
 
891
  /* Set trap insn behind lsu insn */
892
  jtag_set_chain (SC_WISHBONE);
893
  insn = jtag_read_reg (RAM_BASE + 0x18);
894
  insn = jtag_read_reg (RAM_BASE + 0x18);
895
  jtag_write_reg (RAM_BASE + 0x18, 0x21000001);
896
 
897
  /* Set PC */
898
  jtag_set_chain (SC_RISC_DEBUG);
899
  jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x1c);
900
 
901
  /* Unstall */
902
  jtag_set_chain (SC_REGISTER);
903
  jtag_write_reg (4, 0x00000000);
904
  jtag_set_chain (SC_RISC_DEBUG);
905
 
906
  /* Read NPC */
907
  jtag_set_chain (SC_RISC_DEBUG);
908
  npc = jtag_read_reg ((0 << 11) + 16);
909
  npc = jtag_read_reg ((0 << 11) + 16);
910
 
911
  /* Read PPC */
912
  jtag_set_chain (SC_RISC_DEBUG);
913
  ppc = jtag_read_reg ((0 << 11) + 18);
914
  ppc = jtag_read_reg ((0 << 11) + 18);
915
 
916
  /* Read R1 */
917
  jtag_set_chain (SC_RISC_DEBUG);
918
  r1 = jtag_read_reg (0x401);
919
  r1 = jtag_read_reg (0x401);
920
 
921
  /* Set back original insn */
922
  jtag_set_chain (SC_WISHBONE);
923
  jtag_write_reg (RAM_BASE + 0x18, insn);
924
 
925 588 simons
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
926
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000001c, 0x40000018, 49);
927 435 simons
  result = npc + ppc + r1 + result;
928
 
929
  /* Set trap insn very near previous one */
930
  jtag_set_chain (SC_WISHBONE);
931
  insn = jtag_read_reg (RAM_BASE + 0x1c);
932
  insn = jtag_read_reg (RAM_BASE + 0x1c);
933
  jtag_write_reg (RAM_BASE + 0x1c, 0x21000001);
934
 
935
  /* Set PC */
936
  jtag_set_chain (SC_RISC_DEBUG);
937
  jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x18);
938
 
939
  /* Unstall */
940
  jtag_set_chain (SC_REGISTER);
941
  jtag_write_reg (4, 0x00000000);
942
  jtag_set_chain (SC_RISC_DEBUG);
943
 
944
  /* Read NPC */
945
  jtag_set_chain (SC_RISC_DEBUG);
946
  npc = jtag_read_reg ((0 << 11) + 16);
947
  npc = jtag_read_reg ((0 << 11) + 16);
948
 
949
  /* Read PPC */
950
  jtag_set_chain (SC_RISC_DEBUG);
951
  ppc = jtag_read_reg ((0 << 11) + 18);
952
  ppc = jtag_read_reg ((0 << 11) + 18);
953
 
954
  /* Read R1 */
955
  jtag_set_chain (SC_RISC_DEBUG);
956
  r1 = jtag_read_reg (0x401);
957
  r1 = jtag_read_reg (0x401);
958
 
959
  /* Set back original insn */
960
  jtag_set_chain (SC_WISHBONE);
961
  jtag_write_reg (RAM_BASE + 0x1c, insn);
962
 
963 588 simons
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
964
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000020, 0x4000001c, 50);
965 435 simons
  result = npc + ppc + r1 + result;
966
 
967
 
968
  /* Set trap insn to the start */
969
  jtag_set_chain (SC_WISHBONE);
970
  insn = jtag_read_reg (RAM_BASE + 0x0c);
971
  insn = jtag_read_reg (RAM_BASE + 0x0c);
972
  jtag_write_reg (RAM_BASE + 0x0c, 0x21000001);
973
 
974
  /* Set PC */
975
  jtag_set_chain (SC_RISC_DEBUG);
976
  jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x1c);
977
 
978
  /* Unstall */
979
  jtag_set_chain (SC_REGISTER);
980
  jtag_write_reg (4, 0x00000000);
981
  jtag_set_chain (SC_RISC_DEBUG);
982
 
983
  /* Read NPC */
984
  jtag_set_chain (SC_RISC_DEBUG);
985
  npc = jtag_read_reg ((0 << 11) + 16);
986
  npc = jtag_read_reg ((0 << 11) + 16);
987
 
988
  /* Read PPC */
989
  jtag_set_chain (SC_RISC_DEBUG);
990
  ppc = jtag_read_reg ((0 << 11) + 18);
991
  ppc = jtag_read_reg ((0 << 11) + 18);
992
 
993
  /* Read R1 */
994
  jtag_set_chain (SC_RISC_DEBUG);
995
  r1 = jtag_read_reg (0x401);
996
  r1 = jtag_read_reg (0x401);
997
 
998
  /* Set back original insn */
999
  jtag_set_chain (SC_WISHBONE);
1000
  jtag_write_reg (RAM_BASE + 0x0c, insn);
1001
 
1002 588 simons
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
1003
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000010, 0x4000000c, 99);
1004 435 simons
  result = npc + ppc + r1 + result;
1005
 
1006
 
1007 588 simons
  /* Set step bit */
1008
  jtag_set_chain (SC_RISC_DEBUG);
1009
  jtag_write_reg ((6 << 11) + 16, 1 << 22);
1010
 
1011
  for (i = 0; i < 5; i++)
1012
    {
1013
      /* Unstall */
1014
      jtag_set_chain (SC_REGISTER);
1015
      jtag_write_reg (4, 0x00000000);
1016
      jtag_set_chain (SC_RISC_DEBUG);
1017
    }
1018
 
1019
  /* Read NPC */
1020
  jtag_set_chain (SC_RISC_DEBUG);
1021
  npc = jtag_read_reg ((0 << 11) + 16);
1022
  npc = jtag_read_reg ((0 << 11) + 16);
1023
 
1024
  /* Read PPC */
1025
  jtag_set_chain (SC_RISC_DEBUG);
1026
  ppc = jtag_read_reg ((0 << 11) + 18);
1027
  ppc = jtag_read_reg ((0 << 11) + 18);
1028
 
1029
  /* Read R1 */
1030
  jtag_set_chain (SC_RISC_DEBUG);
1031
  r1 = jtag_read_reg (0x401);
1032
  r1 = jtag_read_reg (0x401);
1033
 
1034
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
1035
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000024, 0x40000020, 101);
1036
  result = npc + ppc + r1 + result;
1037
 
1038
  /* Set PC */
1039
  jtag_set_chain (SC_RISC_DEBUG);
1040
  jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x20);
1041
 
1042
  for (i = 0; i < 2; i++)
1043
    {
1044
      /* Unstall */
1045
      jtag_set_chain (SC_REGISTER);
1046
      jtag_write_reg (4, 0x00000000);
1047
      jtag_set_chain (SC_RISC_DEBUG);
1048
    }
1049
 
1050
  /* Read NPC */
1051
  jtag_set_chain (SC_RISC_DEBUG);
1052
  npc = jtag_read_reg ((0 << 11) + 16);
1053
  npc = jtag_read_reg ((0 << 11) + 16);
1054
 
1055
  /* Read PPC */
1056
  jtag_set_chain (SC_RISC_DEBUG);
1057
  ppc = jtag_read_reg ((0 << 11) + 18);
1058
  ppc = jtag_read_reg ((0 << 11) + 18);
1059
 
1060
  /* Read R1 */
1061
  jtag_set_chain (SC_RISC_DEBUG);
1062
  r1 = jtag_read_reg (0x401);
1063
  r1 = jtag_read_reg (0x401);
1064
 
1065
  printf("Read      npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
1066
  printf("Expected  npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000000c, 0x40000024, 201);
1067
  result = npc + ppc + r1 + result;
1068
 
1069
  printf("result = %.8lx\n", result + 0x5eaddaa9);
1070
 
1071 435 simons
#endif
1072
 
1073
  return err;
1074
}
1075
 
1076
main(argc, argv)
1077
  int argc;
1078
  char *argv[];
1079
{
1080
  char *redirstr;
1081
  int trace_fd = 0;
1082
  char *s;
1083
 
1084
  srand(getpid());
1085
  if (argc != 2) {
1086
    printf("JTAG protocol via parallel port for linux.\n");
1087
    printf("Copyright (C) 2001 Marko Mlinar, markom@opencores.org\n\n");
1088
    printf("Usage: %s JTAG port_number\n", argv[0]);
1089
    return -1;
1090
  }
1091
 
1092
#ifndef RTL_SIM
1093
  if (ioperm(LPT_BASE, 3, 1)) {
1094
    fprintf(stderr, "Couldn't get the port at %x\n", LPT_BASE);
1095
    perror("Root privileges are required.\n");
1096
    return -1;
1097
  }
1098
  printf("Connected to parallel port at %x\n", LPT_BASE);
1099
#else
1100
  {
1101
    FILE *fin = fopen (GDB_IN, "wt+");
1102
    if(fin == 0) {
1103
      fprintf(stderr, "Can not open %s\n", GDB_IN);
1104
      exit(1);
1105
    }
1106
    fclose(fin);
1107
 
1108
  }
1109
#endif
1110
#ifndef RTL_SIM
1111
  /* Get rid of root privileges.  */
1112
  setreuid(getuid(), getuid());
1113
#endif
1114
 
1115
  /* Test the connection.  */
1116
  if (jtag_init()) {
1117
    fprintf(stderr,"Connection with jtag via parallel port failed.\n");
1118
    exit(-1);
1119
  }
1120
 
1121
  /* We have a connection.  Establish server.  */
1122
  argv++; argc--;
1123
  printf ("Dropping root privileges.\n");
1124
  serverPort = strtol(*(argv),&s,10);
1125
  if(*s)
1126
    return -1;
1127
  argv++; argc--;
1128
 
1129
  if(server_fd = GetServerSocket("or1ksim","tcp", serverPort)) {
1130
    printf("JTAG Proxy server started on port %d\n", serverPort);
1131
    printf("Press CTRL+c to exit.\n");
1132
  } else {
1133
    fprintf(stderr,"Cannot start JTAG Proxy server on port %d\n", serverPort);
1134
    exit(-1);
1135
  }
1136
 
1137 602 lampret
  /* Do endless loop of checking and handle GDB requests.  Ctrl-c exits.  */
1138
  HandleServerSocket(true);
1139 435 simons
}
1140
 
1141
/************************
1142
   JTAG Server Routines
1143
 ************************/
1144
 
1145
static int tcp_level = 0;
1146
 
1147
/* Added by CZ 24/05/01 */
1148
int GetServerSocket(const char* name,const char* proto,int port)
1149
{
1150
  struct servent *service;
1151
  struct protoent *protocol;
1152
  struct sockaddr_in sa;
1153
  struct hostent *hp;
1154
  int sockfd;
1155
  char myname[256];
1156
  int flags;
1157
  char sTemp[256];
1158
 
1159
  /* First, get the protocol number of TCP */
1160
  if(!(protocol = getprotobyname(proto)))
1161
    {
1162
      sprintf(sTemp,"Unable to load protocol \"%s\"",proto);
1163
      perror(sTemp);
1164
      return 0;
1165
    }
1166
  tcp_level = protocol->p_proto; /* Save for later */
1167
 
1168
  /* If we weren't passed a non standard port, get the port
1169
     from the services directory. */
1170
  if(!port)
1171
    {
1172
      if(service = getservbyname(name,protocol->p_name))
1173
  port = ntohs(service->s_port);
1174
    }
1175
 
1176
  /* Create the socket using the TCP protocol */
1177
  if((sockfd = socket(PF_INET,SOCK_STREAM,protocol->p_proto)) < 0)
1178
    {
1179
      perror("Unable to create socket");
1180
      return 0;
1181
    }
1182
 
1183
  flags = 1;
1184
  if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(const char*)&flags,sizeof(int))
1185
 < 0)
1186
    {
1187
      sprintf(sTemp,"Can not set SO_REUSEADDR option on socket %d",sockfd);
1188
      perror(sTemp);
1189
      close(sockfd);
1190
      return 0;
1191
    }
1192
 
1193
  /* The server should also be non blocking. Get the current flags. */
1194 1322 phoenix
  if((flags = fcntl(sockfd,F_GETFL,0)) < 0)
1195 435 simons
    {
1196
      sprintf(sTemp,"Unable to get flags for socket %d",sockfd);
1197
      perror(sTemp);
1198
      close(sockfd);
1199
      return 0;
1200
    }
1201
 
1202
  /* Set the nonblocking flag */
1203
  if(fcntl(sockfd,F_SETFL, flags | O_NONBLOCK) < 0)
1204
    {
1205
      sprintf(sTemp,"Unable to set flags for socket %d to value 0x%08x",
1206
        sockfd,flags | O_NONBLOCK);
1207
      perror(sTemp);
1208
      close(sockfd);
1209
      return 0;
1210
    }
1211
 
1212
  /* Find out what our address is */
1213
  memset(&sa,0,sizeof(struct sockaddr_in));
1214
  gethostname(myname,sizeof(myname));
1215
  if(!(hp = gethostbyname(myname)))
1216
    {
1217
      perror("Unable to read hostname");
1218
      close(sockfd);
1219
      return 0;
1220
    }
1221
 
1222
  /* Bind our socket to the appropriate address */
1223
  sa.sin_family = hp->h_addrtype;
1224
  sa.sin_port = htons(port);
1225
  if(bind(sockfd,(struct sockaddr*)&sa,sizeof(struct sockaddr_in)) < 0)
1226
    {
1227
      sprintf(sTemp,"Unable to bind socket %d to port %d",sockfd,port);
1228
      perror(sTemp);
1229
      close(sockfd);
1230
      return 0;
1231
    }
1232
  serverIP = sa.sin_addr.s_addr;
1233
  flags = sizeof(struct sockaddr_in);
1234
  if(getsockname(sockfd,(struct sockaddr*)&sa,&flags) < 0)
1235
    {
1236
      sprintf(sTemp,"Unable to get socket information for socket %d",sockfd);
1237
      perror(sTemp);
1238
      close(sockfd);
1239
      return 0;
1240
    }
1241
  serverPort = ntohs(sa.sin_port);
1242
 
1243
  /* Set the backlog to 1 connections */
1244
  if(listen(sockfd,1) < 0)
1245
    {
1246
      sprintf(sTemp,"Unable to set backlog on socket %d to %d",sockfd,1);
1247
      perror(sTemp);
1248
      close(sockfd);
1249
      return 0;
1250
    }
1251
 
1252
  return sockfd;
1253
}
1254
 
1255
void HandleServerSocket(Boolean block)
1256
{
1257 602 lampret
  struct pollfd fds[2];
1258
  int n;
1259 435 simons
 
1260 602 lampret
rebuild:
1261
  n = 0;
1262
  if(!server_fd && !gdb_fd)
1263 435 simons
    return;
1264
 
1265 602 lampret
  if(server_fd)
1266 435 simons
    {
1267 602 lampret
      fds[n].fd = server_fd;
1268 435 simons
      fds[n].events = POLLIN;
1269
      fds[n++].revents = 0;
1270
    }
1271
  if(gdb_fd)
1272
    {
1273
      fds[n].fd = gdb_fd;
1274
      fds[n].events = POLLIN;
1275
      fds[n++].revents = 0;
1276
    }
1277
 
1278 602 lampret
  while(1)
1279 435 simons
    {
1280 602 lampret
      switch(poll(fds, n, -1))
1281 435 simons
        {
1282 602 lampret
          case 0:
1283 435 simons
          case -1:
1284
            if(errno == EINTR)
1285
              continue;
1286
            perror("poll");
1287
            server_fd = 0;
1288 602 lampret
            return;
1289 435 simons
          default:
1290
            /* Make sure to handle the gdb port first! */
1291 602 lampret
            if (gdb_fd && (fds[0].revents && !server_fd ||
1292
                           fds[1].revents && server_fd))
1293 435 simons
              {
1294 602 lampret
                int revents = server_fd ? fds[1].revents : fds[0].revents;
1295 435 simons
 
1296 602 lampret
                if (revents & POLLIN)
1297 435 simons
                   GDBRequest();
1298
                else /* Error Occurred */
1299
                  {
1300
                    fprintf(stderr,"Received flags 0x%08x on gdb socket. Shutting down.\n",revents);
1301
                    close(gdb_fd);
1302
                    gdb_fd = 0;
1303
                  }
1304
               }
1305 602 lampret
            if(fds[0].revents && server_fd)
1306 435 simons
              {
1307 602 lampret
                if(fds[0].revents & POLLIN) {
1308 435 simons
                  JTAGRequest();
1309 602 lampret
                  goto rebuild;
1310
                } else /* Error Occurred */
1311 435 simons
                  {
1312
                    fprintf(stderr,"Received flags 0x%08x on server. Shutting down.\n",fds[0].revents);
1313 602 lampret
                    close(server_fd);
1314 435 simons
                    server_fd = 0;
1315
                    serverPort = 0;
1316
                    serverIP = 0;
1317 602 lampret
                    return;
1318 435 simons
                  }
1319
              }
1320 1322 phoenix
           if (fds[1].revents && !gdb_fd) {
1321
                   /* gdb_fd was cleared because connection was closed,
1322
                    * but fd still in poll set */
1323
                   fds[1].fd = -1;
1324
                   n = 1;
1325
           }
1326 435 simons
            break;
1327
        } /* End of switch statement */
1328
    } /* End of while statement */
1329
}
1330
 
1331
void JTAGRequest()
1332
{
1333
  struct sockaddr_in sa;
1334
  struct sockaddr* addr = (struct sockaddr*)&sa;
1335
  int n = sizeof(struct sockaddr_in);
1336
  int fd = accept(server_fd,addr,&n);
1337
  int on_off = 0; /* Turn off Nagel's algorithm on the socket */
1338
  int flags;
1339
  char sTemp[256];
1340
 
1341
  if(fd < 0)
1342
    {
1343
      /* This is valid, because a connection could have started,
1344
         and then terminated due to a protocol error or user
1345
         initiation before the accept could take place. */
1346
      if(errno != EWOULDBLOCK && errno != EAGAIN)
1347
        {
1348
          perror("accept");
1349
          close(server_fd);
1350
          server_fd = 0;
1351
          serverPort = 0;
1352
          serverIP = 0;
1353
        }
1354
      return;
1355
    }
1356
 
1357
  if(gdb_fd)
1358
    {
1359
      close(fd);
1360
      return;
1361
    }
1362
 
1363 1322 phoenix
  if((flags = fcntl(fd,F_GETFL,0)) < 0)
1364 435 simons
    {
1365
      sprintf(sTemp,"Unable to get flags for gdb socket %d",fd);
1366
      perror(sTemp);
1367
      close(fd);
1368
      return;
1369
    }
1370
 
1371
  if(fcntl(fd,F_SETFL, flags | O_NONBLOCK) < 0)
1372
    {
1373
      sprintf(sTemp,"Unable to set flags for gdb socket %d to value 0x%08x",
1374
        fd,flags | O_NONBLOCK);
1375
      perror(sTemp);
1376
      close(fd);
1377
      return;
1378
    }
1379
 
1380
  if(setsockopt(fd,tcp_level,TCP_NODELAY,&on_off,sizeof(int)) < 0)
1381
    {
1382
      sprintf(sTemp,"Unable to disable Nagel's algorithm for socket %d.\nsetsockopt",fd);
1383
      perror(sTemp);
1384
      close(fd);
1385
      return;
1386
    }
1387
 
1388
  gdb_fd = fd;
1389
}
1390
 
1391
void GDBRequest()
1392
{
1393
  JTAGProxyWriteMessage msg_write;
1394
  JTAGProxyReadMessage msg_read;
1395
  JTAGProxyChainMessage msg_chain;
1396
  JTAGProxyWriteResponse resp_write;
1397
  JTAGProxyReadResponse resp_read;
1398
  JTAGProxyChainResponse resp_chain;
1399
  JTAGProxyBlockWriteMessage *msg_bwrite;
1400
  JTAGProxyBlockReadMessage msg_bread;
1401
  JTAGProxyBlockWriteResponse resp_bwrite;
1402
  JTAGProxyBlockReadResponse *resp_bread;
1403
  char *buf;
1404
  unsigned long long data;
1405
  uint32_t command,length;
1406
  int len,i;
1407
  err = 0;
1408
 
1409
  /* First, we must read the incomming command */
1410
  if(gdb_read(&command,sizeof(uint32_t)) < 0)
1411
    {
1412
      if(gdb_fd)
1413
        {
1414
          perror("gdb socket - 1");
1415
          close(gdb_fd);
1416
          gdb_fd = 0;
1417
        }
1418
      return;
1419
    }
1420
  if(gdb_read(&length,sizeof(uint32_t)) < 0)
1421
    {
1422
      if(gdb_fd)
1423
        {
1424
          perror("gdb socket - 2");
1425
          close(gdb_fd);
1426
          gdb_fd = 0;
1427
        }
1428
      return;
1429
    }
1430
  length = ntohl(length);
1431
 
1432
  /* Now, verify the protocol and implement the command */
1433
  switch(ntohl(command))
1434
    {
1435
    case JTAG_COMMAND_WRITE:
1436
      if(length != sizeof(msg_write) - 8)
1437
        {
1438
          ProtocolClean(length,JTAG_PROXY_PROTOCOL_ERROR);
1439
          return;
1440
        }
1441
      buf = (char*)&msg_write;
1442
      if(gdb_read(&buf[8],length) < 0)
1443
        {
1444
          if(gdb_fd)
1445
            {
1446
              perror("gdb socket - 3");
1447
              close(gdb_fd);
1448
              gdb_fd = 0;
1449
            }
1450
          return;
1451
        }
1452
      msg_write.address = ntohl(msg_write.address);
1453
      msg_write.data_H = ntohl(msg_write.data_H);
1454
      msg_write.data_L = ntohl(msg_write.data_L);
1455
      jtag_write_reg(msg_write.address,msg_write.data_L);
1456
      resp_write.status = htonl(err);
1457
      if(gdb_write(&resp_write,sizeof(resp_write)) < 0)
1458
        {
1459
          if(gdb_fd)
1460
            {
1461
              perror("gdb socket - 4");
1462
              close(gdb_fd);
1463
              gdb_fd = 0;
1464
            }
1465
          return;
1466
        }
1467
      break;
1468
    case JTAG_COMMAND_READ:
1469
      if(length != sizeof(msg_read) - 8)
1470
        {
1471
          ProtocolClean(length,JTAG_PROXY_PROTOCOL_ERROR);
1472
          return;
1473
        }
1474
      buf = (char*)&msg_read;
1475
      if(gdb_read(&buf[8],length) < 0)
1476
        {
1477
          if(gdb_fd)
1478
            {
1479
              perror("gdb socket - 5");
1480
              close(gdb_fd);
1481
              gdb_fd = 0;
1482
            }
1483
          return;
1484
        }
1485
      msg_read.address = ntohl(msg_read.address);
1486
      jtag_read_reg(msg_read.address); /* Data not ready at this time, repeat. */
1487
      resp_read.data_L = jtag_read_reg(msg_read.address);
1488
      resp_read.status = htonl(err);
1489
      resp_read.data_H = 0;
1490
      resp_read.data_L = htonl(resp_read.data_L);
1491
      if(gdb_write(&resp_read,sizeof(resp_read)) < 0)
1492
        {
1493
          if(gdb_fd)
1494
            {
1495
              perror("gdb socket - 6");
1496
              close(gdb_fd);
1497
              gdb_fd = 0;
1498
            }
1499
          return;
1500
        }
1501
      break;
1502
    case JTAG_COMMAND_BLOCK_WRITE:
1503
      if(length < sizeof(JTAGProxyBlockWriteMessage)-8)
1504
        {
1505
          ProtocolClean(length,JTAG_PROXY_PROTOCOL_ERROR);
1506
          return;
1507
        }
1508
      if(!(buf = (char*)malloc(8+length)))
1509
        {
1510
          ProtocolClean(length,JTAG_PROXY_OUT_OF_MEMORY);
1511
          return;
1512
        }
1513
      msg_bwrite = (JTAGProxyBlockWriteMessage*)buf;
1514
      if(gdb_read(&buf[8],length) < 0)
1515
        {
1516
          if(gdb_fd)
1517
            {
1518
              perror("gdb socket - 5");
1519
              close(gdb_fd);
1520
              gdb_fd = 0;
1521
            }
1522
          free(buf);
1523
          return;
1524
        }
1525
      msg_bwrite->address = ntohl(msg_bwrite->address);
1526
      msg_bwrite->nRegisters = ntohl(msg_bwrite->nRegisters);
1527
      for(i=0;i<msg_bwrite->nRegisters;i++)
1528
        {
1529
          msg_bwrite->data[i] = ntohl(msg_bwrite->data[i]);
1530
          jtag_write_reg(msg_bwrite->address + i * 4,msg_bwrite->data[i]);
1531
        }
1532
      resp_bwrite.status = htonl(err);
1533
      free(buf);
1534 602 lampret
      msg_bwrite = (JTAGProxyBlockWriteMessage *)NULL;
1535
      buf = (char *)msg_bwrite;
1536 435 simons
      if(gdb_write(&resp_bwrite,sizeof(resp_bwrite)) < 0)
1537
        {
1538
          if(gdb_fd)
1539
            {
1540
              perror("gdb socket - 4");
1541
              close(gdb_fd);
1542
              gdb_fd = 0;
1543
            }
1544
          return;
1545
        }
1546
      break;
1547
    case JTAG_COMMAND_BLOCK_READ:
1548
      if(length != sizeof(msg_bread) - 8)
1549
        {
1550
          ProtocolClean(length,JTAG_PROXY_PROTOCOL_ERROR);
1551
          return;
1552
        }
1553
      buf = (char*)&msg_bread;
1554
      if(gdb_read(&buf[8],length) < 0)
1555
        {
1556
          if(gdb_fd)
1557
            {
1558
              perror("gdb socket - 5");
1559
              close(gdb_fd);
1560
              gdb_fd = 0;
1561
            }
1562
          return;
1563
        }
1564
      msg_bread.address = ntohl(msg_bread.address);
1565
      msg_bread.nRegisters = ntohl(msg_bread.nRegisters);
1566
      len = sizeof(JTAGProxyBlockReadResponse) + 4*(msg_bread.nRegisters-1);
1567
      if(!(buf = (char*)malloc(len)))
1568
        {
1569
          ProtocolClean(0,JTAG_PROXY_OUT_OF_MEMORY);
1570
          return;
1571
        }
1572
      resp_bread = (JTAGProxyBlockReadResponse*)buf;
1573
      jtag_read_reg(msg_bread.address); /* Prepare for reading. */
1574
      for(i=0;i<msg_bread.nRegisters;i++)
1575
        {
1576
          /* Read previous, address next one. */
1577
          resp_bread->data[i] = jtag_read_reg(msg_bread.address + (i + 1) * 4);
1578
          resp_bread->data[i] = htonl(resp_bread->data[i]);
1579
        }
1580
      resp_bread->status = htonl(err);
1581
      resp_bread->nRegisters = htonl(msg_bread.nRegisters);
1582
      if(gdb_write(resp_bread,len) < 0)
1583
        {
1584
          if(gdb_fd)
1585
            {
1586
              perror("gdb socket - 6");
1587
              close(gdb_fd);
1588
              gdb_fd = 0;
1589
            }
1590
          free(buf);
1591
          return;
1592
        }
1593
      free(buf);
1594 602 lampret
      resp_bread = (JTAGProxyBlockReadResponse *)NULL;
1595
      buf = (char *)resp_bread;
1596 435 simons
      break;
1597
    case JTAG_COMMAND_CHAIN:
1598
      if(length != sizeof(msg_chain) - 8)
1599
        {
1600
          ProtocolClean(length,JTAG_PROXY_PROTOCOL_ERROR);
1601
          return;
1602
        }
1603
      buf = (char*)&msg_chain;
1604
      if(gdb_read(&buf[8],sizeof(msg_chain)-8) < 0)
1605
        {
1606
          if(gdb_fd)
1607
            {
1608
              perror("gdb socket - 7");
1609
              close(gdb_fd);
1610
              gdb_fd = 0;
1611
            }
1612
          return;
1613
        }
1614
      msg_chain.chain = htonl(msg_chain.chain);
1615
      jtag_set_chain(msg_chain.chain);
1616
      resp_chain.status = htonl(err);
1617
      if(gdb_write(&resp_chain,sizeof(resp_chain)) < 0)
1618
        {
1619
          if(gdb_fd)
1620
            {
1621
              perror("gdb socket - 8");
1622
              close(gdb_fd);
1623
              gdb_fd = 0;
1624
            }
1625
          return;
1626
        }
1627
      break;
1628
    default:
1629
      perror("Unknown JTAG command.");
1630
      ProtocolClean(length,JTAG_PROXY_COMMAND_NOT_IMPLEMENTED);
1631
      break;
1632
    }
1633
}
1634
 
1635
void ProtocolClean(int length,int32_t err)
1636
{
1637
  char buf[4096];
1638
 
1639
  err = htonl(err);
1640
  if((gdb_read(buf,length) < 0) ||
1641
      (gdb_write(&err,sizeof(err)) < 0) && gdb_fd)
1642
    {
1643
      perror("gdb socket - 9");
1644
      close(gdb_fd);
1645
      gdb_fd = 0;
1646
    }
1647
}
1648
 
1649
static int gdb_write(void* buf,int len)
1650
{
1651
  int n;
1652
  char* w_buf = (char*)buf;
1653
  struct pollfd block;
1654
 
1655
  while(len)
1656
    {
1657
      if((n = write(gdb_fd,w_buf,len)) < 0)
1658
        {
1659
          switch(errno)
1660
            {
1661
            case EWOULDBLOCK: /* or EAGAIN */
1662
              /* We've been called on a descriptor marked
1663
           for nonblocking I/O. We better simulate
1664
           blocking behavior. */
1665
              block.fd = gdb_fd;
1666
              block.events = POLLOUT;
1667
              block.revents = 0;
1668
              poll(&block,1,-1);
1669
              continue;
1670
            case EINTR:
1671
              continue;
1672
            case EPIPE:
1673
              close(gdb_fd);
1674
              gdb_fd = 0;
1675
              return -1;
1676
            default:
1677
              return -1;
1678
            }
1679
        }
1680
      else
1681
        {
1682
          len -= n;
1683
          w_buf += n;
1684
        }
1685
    }
1686
  return 0;
1687
}
1688
 
1689
static int gdb_read(void* buf,int len)
1690
{
1691
  int n;
1692
  char* r_buf = (char*)buf;
1693
  struct pollfd block;
1694
 
1695
  while(len)
1696
    {
1697
      if((n = read(gdb_fd,r_buf,len)) < 0)
1698
        {
1699
          switch(errno)
1700
            {
1701
            case EWOULDBLOCK: /* or EAGAIN */
1702
              /* We've been called on a descriptor marked
1703
           for nonblocking I/O. We better simulate
1704
           blocking behavior. */
1705
              block.fd = gdb_fd;
1706
              block.events = POLLIN;
1707
              block.revents = 0;
1708
              poll(&block,1,-1);
1709
              continue;
1710
            case EINTR:
1711
              continue;
1712
            default:
1713
              return -1;
1714
            }
1715
        }
1716
      else if(n == 0)
1717
        {
1718
          close(gdb_fd);
1719
          gdb_fd = 0;
1720
          return -1;
1721
        }
1722
      else
1723
        {
1724
          len -= n;
1725
          r_buf += n;
1726
        }
1727
    }
1728
  return 0;
1729
}

powered by: WebSVN 2.1.0

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