zy1000: fix keep_alive() bug
[openocd.git] / src / jtag / zy1000 / zy1000.c
1 /***************************************************************************
2 * Copyright (C) 2007-2010 by Øyvind Harboe *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
18 ***************************************************************************/
19
20 /* This file supports the zy1000 debugger: http://www.zylin.com/zy1000.html
21 *
22 * The zy1000 is a standalone debugger that has a web interface and
23 * requires no drivers on the developer host as all communication
24 * is via TCP/IP. The zy1000 gets it performance(~400-700kBytes/s
25 * DCC downloads @ 16MHz target) as it has an FPGA to hardware
26 * accelerate the JTAG commands, while offering *very* low latency
27 * between OpenOCD and the FPGA registers.
28 *
29 * The disadvantage of the zy1000 is that it has a feeble CPU compared to
30 * a PC(ca. 50-500 DMIPS depending on how one counts it), whereas a PC
31 * is on the order of 10000 DMIPS(i.e. at a factor of 20-200).
32 *
33 * The zy1000 revc hardware is using an Altera Nios CPU, whereas the
34 * revb is using ARM7 + Xilinx.
35 *
36 * See Zylin web pages or contact Zylin for more information.
37 *
38 * The reason this code is in OpenOCD rather than OpenOCD linked with the
39 * ZY1000 code is that OpenOCD is the long road towards getting
40 * libopenocd into place. libopenocd will support both low performance,
41 * low latency systems(embedded) and high performance high latency
42 * systems(PCs).
43 */
44 #ifdef HAVE_CONFIG_H
45 #include "config.h"
46 #endif
47
48 #include <target/embeddedice.h>
49 #include <jtag/minidriver.h>
50 #include <jtag/interface.h>
51 #include <time.h>
52 #include <helper/time_support.h>
53
54 #include <netinet/tcp.h>
55
56 #if BUILD_ECOSBOARD
57 #include "zy1000_version.h"
58
59 #include <cyg/hal/hal_io.h> // low level i/o
60 #include <cyg/hal/hal_diag.h>
61
62 #ifdef CYGPKG_HAL_NIOS2
63 #include <cyg/hal/io.h>
64 #include <cyg/firmwareutil/firmwareutil.h>
65 #endif
66
67 #define ZYLIN_VERSION GIT_ZY1000_VERSION
68 #define ZYLIN_DATE __DATE__
69 #define ZYLIN_TIME __TIME__
70 #define ZYLIN_OPENOCD GIT_OPENOCD_VERSION
71 #define ZYLIN_OPENOCD_VERSION "ZY1000 " ZYLIN_VERSION " " ZYLIN_DATE
72
73 #endif
74
75 static int zy1000_khz(int khz, int *jtag_speed)
76 {
77 if (khz == 0)
78 {
79 *jtag_speed = 0;
80 }
81 else
82 {
83 *jtag_speed = 64000/khz;
84 }
85 return ERROR_OK;
86 }
87
88 static int zy1000_speed_div(int speed, int *khz)
89 {
90 if (speed == 0)
91 {
92 *khz = 0;
93 }
94 else
95 {
96 *khz = 64000/speed;
97 }
98
99 return ERROR_OK;
100 }
101
102 static bool readPowerDropout(void)
103 {
104 uint32_t state;
105 // sample and clear power dropout
106 ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x80);
107 ZY1000_PEEK(ZY1000_JTAG_BASE + 0x10, state);
108 bool powerDropout;
109 powerDropout = (state & 0x80) != 0;
110 return powerDropout;
111 }
112
113
114 static bool readSRST(void)
115 {
116 uint32_t state;
117 // sample and clear SRST sensing
118 ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x00000040);
119 ZY1000_PEEK(ZY1000_JTAG_BASE + 0x10, state);
120 bool srstAsserted;
121 srstAsserted = (state & 0x40) != 0;
122 return srstAsserted;
123 }
124
125 static int zy1000_srst_asserted(int *srst_asserted)
126 {
127 *srst_asserted = readSRST();
128 return ERROR_OK;
129 }
130
131 static int zy1000_power_dropout(int *dropout)
132 {
133 *dropout = readPowerDropout();
134 return ERROR_OK;
135 }
136
137 void zy1000_reset(int trst, int srst)
138 {
139 LOG_DEBUG("zy1000 trst=%d, srst=%d", trst, srst);
140
141 /* flush the JTAG FIFO. Not flushing the queue before messing with
142 * reset has such interesting bugs as causing hard to reproduce
143 * RCLK bugs as RCLK will stop responding when TRST is asserted
144 */
145 waitIdle();
146
147 if (!srst)
148 {
149 ZY1000_POKE(ZY1000_JTAG_BASE + 0x14, 0x00000001);
150 }
151 else
152 {
153 /* Danger!!! if clk != 0 when in
154 * idle in TAP_IDLE, reset halt on str912 will fail.
155 */
156 ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x00000001);
157 }
158
159 if (!trst)
160 {
161 ZY1000_POKE(ZY1000_JTAG_BASE + 0x14, 0x00000002);
162 }
163 else
164 {
165 /* assert reset */
166 ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x00000002);
167 }
168
169 if (trst||(srst && (jtag_get_reset_config() & RESET_SRST_PULLS_TRST)))
170 {
171 /* we're now in the RESET state until trst is deasserted */
172 ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, TAP_RESET);
173 } else
174 {
175 /* We'll get RCLK failure when we assert TRST, so clear any false positives here */
176 ZY1000_POKE(ZY1000_JTAG_BASE + 0x14, 0x400);
177 }
178
179 /* wait for srst to float back up */
180 if ((!srst && ((jtag_get_reset_config() & RESET_TRST_PULLS_SRST) == 0))||
181 (!srst && !trst && (jtag_get_reset_config() & RESET_TRST_PULLS_SRST)))
182 {
183 bool first = true;
184 long long start;
185 long total = 0;
186 for (;;)
187 {
188 // We don't want to sense our own reset, so we clear here.
189 // There is of course a timing hole where we could loose
190 // a "real" reset.
191 if (!readSRST())
192 {
193 if (total > 1)
194 {
195 LOG_USER("SRST took %dms to deassert", (int)total);
196 }
197 break;
198 }
199
200 if (first)
201 {
202 first = false;
203 start = timeval_ms();
204 }
205
206 total = timeval_ms() - start;
207
208 keep_alive();
209
210 if (total > 5000)
211 {
212 LOG_ERROR("SRST took too long to deassert: %dms", (int)total);
213 break;
214 }
215 }
216
217 }
218 }
219
220 int zy1000_speed(int speed)
221 {
222 /* flush JTAG master FIFO before setting speed */
223 waitIdle();
224
225 if (speed == 0)
226 {
227 /*0 means RCLK*/
228 speed = 0;
229 ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x100);
230 LOG_DEBUG("jtag_speed using RCLK");
231 }
232 else
233 {
234 if (speed > 8190 || speed < 2)
235 {
236 LOG_USER("valid ZY1000 jtag_speed=[8190,2]. Divisor is 64MHz / even values between 8190-2, i.e. min 7814Hz, max 32MHz");
237 return ERROR_INVALID_ARGUMENTS;
238 }
239
240 LOG_USER("jtag_speed %d => JTAG clk=%f", speed, 64.0/(float)speed);
241 ZY1000_POKE(ZY1000_JTAG_BASE + 0x14, 0x100);
242 ZY1000_POKE(ZY1000_JTAG_BASE + 0x1c, speed&~1);
243 }
244 return ERROR_OK;
245 }
246
247 static bool savePower;
248
249
250 static void setPower(bool power)
251 {
252 savePower = power;
253 if (power)
254 {
255 ZY1000_POKE(ZY1000_JTAG_BASE + 0x14, 0x8);
256 } else
257 {
258 ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x8);
259 }
260 }
261
262 COMMAND_HANDLER(handle_power_command)
263 {
264 switch (CMD_ARGC)
265 {
266 case 1: {
267 bool enable;
268 COMMAND_PARSE_ON_OFF(CMD_ARGV[0], enable);
269 setPower(enable);
270 // fall through
271 }
272 case 0:
273 LOG_INFO("Target power %s", savePower ? "on" : "off");
274 break;
275 default:
276 return ERROR_INVALID_ARGUMENTS;
277 }
278
279 return ERROR_OK;
280 }
281
282 #if !BUILD_ECOSBOARD
283 static char *tcp_server = "notspecified";
284 static int jim_zy1000_server(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
285 {
286 if (argc != 2)
287 return JIM_ERR;
288
289 tcp_server = strdup(Jim_GetString(argv[1], NULL));
290
291 return JIM_OK;
292 }
293 #endif
294
295 #if BUILD_ECOSBOARD
296 /* Give TELNET a way to find out what version this is */
297 static int jim_zy1000_version(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
298 {
299 if ((argc < 1) || (argc > 3))
300 return JIM_ERR;
301 const char *version_str = NULL;
302
303 if (argc == 1)
304 {
305 version_str = ZYLIN_OPENOCD_VERSION;
306 } else
307 {
308 const char *str = Jim_GetString(argv[1], NULL);
309 const char *str2 = NULL;
310 if (argc > 2)
311 str2 = Jim_GetString(argv[2], NULL);
312 if (strcmp("openocd", str) == 0)
313 {
314 version_str = ZYLIN_OPENOCD;
315 }
316 else if (strcmp("zy1000", str) == 0)
317 {
318 version_str = ZYLIN_VERSION;
319 }
320 else if (strcmp("date", str) == 0)
321 {
322 version_str = ZYLIN_DATE;
323 }
324 else if (strcmp("time", str) == 0)
325 {
326 version_str = ZYLIN_TIME;
327 }
328 else if (strcmp("pcb", str) == 0)
329 {
330 #ifdef CYGPKG_HAL_NIOS2
331 version_str="c";
332 #else
333 version_str="b";
334 #endif
335 }
336 #ifdef CYGPKG_HAL_NIOS2
337 else if (strcmp("fpga", str) == 0)
338 {
339
340 /* return a list of 32 bit integers to describe the expected
341 * and actual FPGA
342 */
343 static char *fpga_id = "0x12345678 0x12345678 0x12345678 0x12345678";
344 uint32_t id, timestamp;
345 HAL_READ_UINT32(SYSID_BASE, id);
346 HAL_READ_UINT32(SYSID_BASE+4, timestamp);
347 sprintf(fpga_id, "0x%08x 0x%08x 0x%08x 0x%08x", id, timestamp, SYSID_ID, SYSID_TIMESTAMP);
348 version_str = fpga_id;
349 if ((argc>2) && (strcmp("time", str2) == 0))
350 {
351 time_t last_mod = timestamp;
352 char * t = ctime (&last_mod) ;
353 t[strlen(t)-1] = 0;
354 version_str = t;
355 }
356 }
357 #endif
358
359 else
360 {
361 return JIM_ERR;
362 }
363 }
364
365 Jim_SetResult(interp, Jim_NewStringObj(interp, version_str, -1));
366
367 return JIM_OK;
368 }
369 #endif
370
371 #ifdef CYGPKG_HAL_NIOS2
372
373
374 struct info_forward
375 {
376 void *data;
377 struct cyg_upgrade_info *upgraded_file;
378 };
379
380 static void report_info(void *data, const char * format, va_list args)
381 {
382 char *s = alloc_vprintf(format, args);
383 LOG_USER_N("%s", s);
384 free(s);
385 }
386
387 struct cyg_upgrade_info firmware_info =
388 {
389 (uint8_t *)0x84000000,
390 "/ram/firmware.phi",
391 "Firmware",
392 0x0300000,
393 0x1f00000 -
394 0x0300000,
395 "ZylinNiosFirmware\n",
396 report_info,
397 };
398
399 static int jim_zy1000_writefirmware(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
400 {
401 if (argc != 2)
402 return JIM_ERR;
403
404 int length;
405 const char *str = Jim_GetString(argv[1], &length);
406
407 /* */
408 int tmpFile;
409 if ((tmpFile = open(firmware_info.file, O_RDWR | O_CREAT | O_TRUNC)) <= 0)
410 {
411 return JIM_ERR;
412 }
413 bool success;
414 success = write(tmpFile, str, length) == length;
415 close(tmpFile);
416 if (!success)
417 return JIM_ERR;
418
419 if (!cyg_firmware_upgrade(NULL, firmware_info))
420 return JIM_ERR;
421
422 return JIM_OK;
423 }
424 #endif
425
426 static int
427 zylinjtag_Jim_Command_powerstatus(Jim_Interp *interp,
428 int argc,
429 Jim_Obj * const *argv)
430 {
431 if (argc != 1)
432 {
433 Jim_WrongNumArgs(interp, 1, argv, "powerstatus");
434 return JIM_ERR;
435 }
436
437 uint32_t status;
438 ZY1000_PEEK(ZY1000_JTAG_BASE + 0x10, status);
439
440 Jim_SetResult(interp, Jim_NewIntObj(interp, (status&0x80) != 0));
441
442 return JIM_OK;
443 }
444
445
446
447 int zy1000_quit(void)
448 {
449
450 return ERROR_OK;
451 }
452
453
454
455 int interface_jtag_execute_queue(void)
456 {
457 uint32_t empty;
458
459 waitIdle();
460 ZY1000_PEEK(ZY1000_JTAG_BASE + 0x10, empty);
461 /* clear JTAG error register */
462 ZY1000_POKE(ZY1000_JTAG_BASE + 0x14, 0x400);
463
464 if ((empty&0x400) != 0)
465 {
466 LOG_WARNING("RCLK timeout");
467 /* the error is informative only as we don't want to break the firmware if there
468 * is a false positive.
469 */
470 // return ERROR_FAIL;
471 }
472 return ERROR_OK;
473 }
474
475
476
477
478
479 static uint32_t getShiftValue(void)
480 {
481 uint32_t value;
482 waitIdle();
483 ZY1000_PEEK(ZY1000_JTAG_BASE + 0xc, value);
484 VERBOSE(LOG_INFO("getShiftValue %08x", value));
485 return value;
486 }
487 #if 0
488 static uint32_t getShiftValueFlip(void)
489 {
490 uint32_t value;
491 waitIdle();
492 ZY1000_PEEK(ZY1000_JTAG_BASE + 0x18, value);
493 VERBOSE(LOG_INFO("getShiftValue %08x (flipped)", value));
494 return value;
495 }
496 #endif
497
498 #if 0
499 static void shiftValueInnerFlip(const tap_state_t state, const tap_state_t endState, int repeat, uint32_t value)
500 {
501 VERBOSE(LOG_INFO("shiftValueInner %s %s %d %08x (flipped)", tap_state_name(state), tap_state_name(endState), repeat, value));
502 uint32_t a,b;
503 a = state;
504 b = endState;
505 ZY1000_POKE(ZY1000_JTAG_BASE + 0xc, value);
506 ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (1 << 15) | (repeat << 8) | (a << 4) | b);
507 VERBOSE(getShiftValueFlip());
508 }
509 #endif
510
511 // here we shuffle N bits out/in
512 static __inline void scanBits(const uint8_t *out_value, uint8_t *in_value, int num_bits, bool pause, tap_state_t shiftState, tap_state_t end_state)
513 {
514 tap_state_t pause_state = shiftState;
515 for (int j = 0; j < num_bits; j += 32)
516 {
517 int k = num_bits - j;
518 if (k > 32)
519 {
520 k = 32;
521 /* we have more to shift out */
522 } else if (pause)
523 {
524 /* this was the last to shift out this time */
525 pause_state = end_state;
526 }
527
528 // we have (num_bits + 7)/8 bytes of bits to toggle out.
529 // bits are pushed out LSB to MSB
530 uint32_t value;
531 value = 0;
532 if (out_value != NULL)
533 {
534 for (int l = 0; l < k; l += 8)
535 {
536 value|=out_value[(j + l)/8]<<l;
537 }
538 }
539 /* mask away unused bits for easier debugging */
540 if (k < 32)
541 {
542 value&=~(((uint32_t)0xffffffff) << k);
543 } else
544 {
545 /* Shifting by >= 32 is not defined by the C standard
546 * and will in fact shift by &0x1f bits on nios */
547 }
548
549 shiftValueInner(shiftState, pause_state, k, value);
550
551 if (in_value != NULL)
552 {
553 // data in, LSB to MSB
554 value = getShiftValue();
555 // we're shifting in data to MSB, shift data to be aligned for returning the value
556 value >>= 32-k;
557
558 for (int l = 0; l < k; l += 8)
559 {
560 in_value[(j + l)/8]=(value >> l)&0xff;
561 }
562 }
563 }
564 }
565
566 static __inline void scanFields(int num_fields, const struct scan_field *fields, tap_state_t shiftState, tap_state_t end_state)
567 {
568 for (int i = 0; i < num_fields; i++)
569 {
570 scanBits(fields[i].out_value,
571 fields[i].in_value,
572 fields[i].num_bits,
573 (i == num_fields-1),
574 shiftState,
575 end_state);
576 }
577 }
578
579 int interface_jtag_add_ir_scan(struct jtag_tap *active, const struct scan_field *fields, tap_state_t state)
580 {
581 int scan_size = 0;
582 struct jtag_tap *tap, *nextTap;
583 tap_state_t pause_state = TAP_IRSHIFT;
584
585 for (tap = jtag_tap_next_enabled(NULL); tap!= NULL; tap = nextTap)
586 {
587 nextTap = jtag_tap_next_enabled(tap);
588 if (nextTap==NULL)
589 {
590 pause_state = state;
591 }
592 scan_size = tap->ir_length;
593
594 /* search the list */
595 if (tap == active)
596 {
597 scanFields(1, fields, TAP_IRSHIFT, pause_state);
598 /* update device information */
599 buf_cpy(fields[0].out_value, tap->cur_instr, scan_size);
600
601 tap->bypass = 0;
602 } else
603 {
604 /* if a device isn't listed, set it to BYPASS */
605 assert(scan_size <= 32);
606 shiftValueInner(TAP_IRSHIFT, pause_state, scan_size, 0xffffffff);
607
608 tap->bypass = 1;
609 }
610 }
611
612 return ERROR_OK;
613 }
614
615
616
617
618
619 int interface_jtag_add_plain_ir_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits, tap_state_t state)
620 {
621 scanBits(out_bits, in_bits, num_bits, true, TAP_IRSHIFT, state);
622 return ERROR_OK;
623 }
624
625 int interface_jtag_add_dr_scan(struct jtag_tap *active, int num_fields, const struct scan_field *fields, tap_state_t state)
626 {
627 struct jtag_tap *tap, *nextTap;
628 tap_state_t pause_state = TAP_DRSHIFT;
629 for (tap = jtag_tap_next_enabled(NULL); tap!= NULL; tap = nextTap)
630 {
631 nextTap = jtag_tap_next_enabled(tap);
632 if (nextTap==NULL)
633 {
634 pause_state = state;
635 }
636
637 /* Find a range of fields to write to this tap */
638 if (tap == active)
639 {
640 assert(!tap->bypass);
641
642 scanFields(num_fields, fields, TAP_DRSHIFT, pause_state);
643 } else
644 {
645 /* Shift out a 0 for disabled tap's */
646 assert(tap->bypass);
647 shiftValueInner(TAP_DRSHIFT, pause_state, 1, 0);
648 }
649 }
650 return ERROR_OK;
651 }
652
653 int interface_jtag_add_plain_dr_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits, tap_state_t state)
654 {
655 scanBits(out_bits, in_bits, num_bits, true, TAP_DRSHIFT, state);
656 return ERROR_OK;
657 }
658
659 int interface_jtag_add_tlr()
660 {
661 setCurrentState(TAP_RESET);
662 return ERROR_OK;
663 }
664
665
666 int interface_jtag_add_reset(int req_trst, int req_srst)
667 {
668 zy1000_reset(req_trst, req_srst);
669 return ERROR_OK;
670 }
671
672 static int zy1000_jtag_add_clocks(int num_cycles, tap_state_t state, tap_state_t clockstate)
673 {
674 /* num_cycles can be 0 */
675 setCurrentState(clockstate);
676
677 /* execute num_cycles, 32 at the time. */
678 int i;
679 for (i = 0; i < num_cycles; i += 32)
680 {
681 int num;
682 num = 32;
683 if (num_cycles-i < num)
684 {
685 num = num_cycles-i;
686 }
687 shiftValueInner(clockstate, clockstate, num, 0);
688 }
689
690 #if !TEST_MANUAL()
691 /* finish in end_state */
692 setCurrentState(state);
693 #else
694 tap_state_t t = TAP_IDLE;
695 /* test manual drive code on any target */
696 int tms;
697 uint8_t tms_scan = tap_get_tms_path(t, state);
698 int tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
699
700 for (i = 0; i < tms_count; i++)
701 {
702 tms = (tms_scan >> i) & 1;
703 waitIdle();
704 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, tms);
705 }
706 waitIdle();
707 ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, state);
708 #endif
709
710 return ERROR_OK;
711 }
712
713 int interface_jtag_add_runtest(int num_cycles, tap_state_t state)
714 {
715 return zy1000_jtag_add_clocks(num_cycles, state, TAP_IDLE);
716 }
717
718 int interface_jtag_add_clocks(int num_cycles)
719 {
720 return zy1000_jtag_add_clocks(num_cycles, cmd_queue_cur_state, cmd_queue_cur_state);
721 }
722
723 int interface_add_tms_seq(unsigned num_bits, const uint8_t *seq, enum tap_state state)
724 {
725 /*wait for the fifo to be empty*/
726 waitIdle();
727
728 for (unsigned i = 0; i < num_bits; i++)
729 {
730 int tms;
731
732 if (((seq[i/8] >> (i % 8)) & 1) == 0)
733 {
734 tms = 0;
735 }
736 else
737 {
738 tms = 1;
739 }
740
741 waitIdle();
742 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, tms);
743 }
744
745 waitIdle();
746 if (state != TAP_INVALID)
747 {
748 ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, state);
749 } else
750 {
751 /* this would be normal if we are switching to SWD mode */
752 }
753 return ERROR_OK;
754 }
755
756 int interface_jtag_add_pathmove(int num_states, const tap_state_t *path)
757 {
758 int state_count;
759 int tms = 0;
760
761 state_count = 0;
762
763 tap_state_t cur_state = cmd_queue_cur_state;
764
765 uint8_t seq[16];
766 memset(seq, 0, sizeof(seq));
767 assert(num_states < (int)((sizeof(seq) * 8)));
768
769 while (num_states)
770 {
771 if (tap_state_transition(cur_state, false) == path[state_count])
772 {
773 tms = 0;
774 }
775 else if (tap_state_transition(cur_state, true) == path[state_count])
776 {
777 tms = 1;
778 }
779 else
780 {
781 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state), tap_state_name(path[state_count]));
782 exit(-1);
783 }
784
785 seq[state_count/8] = seq[state_count/8] | (tms << (state_count % 8));
786
787 cur_state = path[state_count];
788 state_count++;
789 num_states--;
790 }
791
792 return interface_add_tms_seq(state_count, seq, cur_state);
793 }
794
795 static void jtag_pre_post_bits(struct jtag_tap *tap, int *pre, int *post)
796 {
797 /* bypass bits before and after */
798 int pre_bits = 0;
799 int post_bits = 0;
800
801 bool found = false;
802 struct jtag_tap *cur_tap, *nextTap;
803 for (cur_tap = jtag_tap_next_enabled(NULL); cur_tap!= NULL; cur_tap = nextTap)
804 {
805 nextTap = jtag_tap_next_enabled(cur_tap);
806 if (cur_tap == tap)
807 {
808 found = true;
809 } else
810 {
811 if (found)
812 {
813 post_bits++;
814 } else
815 {
816 pre_bits++;
817 }
818 }
819 }
820 *pre = pre_bits;
821 *post = post_bits;
822 }
823
824 void embeddedice_write_dcc(struct jtag_tap *tap, int reg_addr, uint8_t *buffer, int little, int count)
825 {
826
827 int pre_bits;
828 int post_bits;
829 jtag_pre_post_bits(tap, &pre_bits, &post_bits);
830
831 if (pre_bits + post_bits + 6 > 32)
832 {
833 int i;
834 for (i = 0; i < count; i++)
835 {
836 embeddedice_write_reg_inner(tap, reg_addr, fast_target_buffer_get_u32(buffer, little));
837 buffer += 4;
838 }
839 } else
840 {
841 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, pre_bits, 0);
842 int i;
843 for (i = 0; i < count - 1; i++)
844 {
845 /* Fewer pokes means we get to use the FIFO more efficiently */
846 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, little));
847 shiftValueInner(TAP_DRSHIFT, TAP_IDLE, 6 + post_bits + pre_bits, (reg_addr | (1 << 5)));
848 buffer += 4;
849 }
850 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, little));
851 shiftValueInner(TAP_DRSHIFT, TAP_IDLE, 6 + post_bits, (reg_addr | (1 << 5)));
852 }
853 }
854
855
856
857 int arm11_run_instr_data_to_core_noack_inner(struct jtag_tap * tap, uint32_t opcode, uint32_t * data, size_t count)
858 {
859 #if 0
860 int arm11_run_instr_data_to_core_noack_inner_default(struct jtag_tap * tap, uint32_t opcode, uint32_t * data, size_t count);
861 return arm11_run_instr_data_to_core_noack_inner_default(tap, opcode, data, count);
862 #else
863 static const int bits[] = {32, 2};
864 uint32_t values[] = {0, 0};
865
866 /* FIX!!!!!! the target_write_memory() API started this nasty problem
867 * with unaligned uint32_t * pointers... */
868 const uint8_t *t = (const uint8_t *)data;
869
870
871 /* bypass bits before and after */
872 int pre_bits;
873 int post_bits;
874 jtag_pre_post_bits(tap, &pre_bits, &post_bits);
875
876 bool found = false;
877 struct jtag_tap *cur_tap, *nextTap;
878 for (cur_tap = jtag_tap_next_enabled(NULL); cur_tap!= NULL; cur_tap = nextTap)
879 {
880 nextTap = jtag_tap_next_enabled(cur_tap);
881 if (cur_tap == tap)
882 {
883 found = true;
884 } else
885 {
886 if (found)
887 {
888 post_bits++;
889 } else
890 {
891 pre_bits++;
892 }
893 }
894 }
895
896 post_bits+=2;
897
898
899 while (--count > 0)
900 {
901 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, pre_bits, 0);
902
903 uint32_t value;
904 value = *t++;
905 value |= (*t++<<8);
906 value |= (*t++<<16);
907 value |= (*t++<<24);
908
909 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, value);
910 /* minimum 2 bits */
911 shiftValueInner(TAP_DRSHIFT, TAP_DRPAUSE, post_bits, 0);
912
913 #if 1
914 /* copy & paste from arm11_dbgtap.c */
915 //TAP_DREXIT2, TAP_DRUPDATE, TAP_IDLE, TAP_IDLE, TAP_IDLE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DRSHIFT
916
917 waitIdle();
918 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 1);
919 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 1);
920 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
921 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
922 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
923 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 1);
924 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
925 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
926 /* we don't have to wait for the queue to empty here. waitIdle(); */
927 ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, TAP_DRSHIFT);
928 #else
929 static const tap_state_t arm11_MOVE_DRPAUSE_IDLE_DRPAUSE_with_delay[] =
930 {
931 TAP_DREXIT2, TAP_DRUPDATE, TAP_IDLE, TAP_IDLE, TAP_IDLE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DRSHIFT
932 };
933
934 jtag_add_pathmove(ARRAY_SIZE(arm11_MOVE_DRPAUSE_IDLE_DRPAUSE_with_delay),
935 arm11_MOVE_DRPAUSE_IDLE_DRPAUSE_with_delay);
936 #endif
937 }
938
939 values[0] = *t++;
940 values[0] |= (*t++<<8);
941 values[0] |= (*t++<<16);
942 values[0] |= (*t++<<24);
943
944 /* This will happen on the last iteration updating the current tap state
945 * so we don't have to track it during the common code path */
946 jtag_add_dr_out(tap,
947 2,
948 bits,
949 values,
950 TAP_IDLE);
951
952 return jtag_execute_queue();
953 #endif
954 }
955
956
957 static const struct command_registration zy1000_commands[] = {
958 {
959 .name = "power",
960 .handler = handle_power_command,
961 .mode = COMMAND_ANY,
962 .help = "Turn power switch to target on/off. "
963 "With no arguments, prints status.",
964 .usage = "('on'|'off)",
965 },
966 #if BUILD_ECOSBOARD
967 {
968 .name = "zy1000_version",
969 .mode = COMMAND_ANY,
970 .jim_handler = jim_zy1000_version,
971 .help = "Print version info for zy1000.",
972 .usage = "['openocd'|'zy1000'|'date'|'time'|'pcb'|'fpga']",
973 },
974 #else
975 {
976 .name = "zy1000_server",
977 .mode = COMMAND_ANY,
978 .jim_handler = jim_zy1000_server,
979 .help = "Tcpip address for ZY1000 server.",
980 .usage = "address",
981 },
982 #endif
983 {
984 .name = "powerstatus",
985 .mode = COMMAND_ANY,
986 .jim_handler = zylinjtag_Jim_Command_powerstatus,
987 .help = "Returns power status of target",
988 },
989 #ifdef CYGPKG_HAL_NIOS2
990 {
991 .name = "updatezy1000firmware",
992 .mode = COMMAND_ANY,
993 .jim_handler = jim_zy1000_writefirmware,
994 .help = "writes firmware to flash",
995 /* .usage = "some_string", */
996 },
997 #endif
998 COMMAND_REGISTRATION_DONE
999 };
1000
1001
1002 static int tcp_ip = -1;
1003
1004 /* Write large packets if we can */
1005 static size_t out_pos;
1006 static uint8_t out_buffer[16384];
1007 static size_t in_pos;
1008 static size_t in_write;
1009 static uint8_t in_buffer[16384];
1010
1011 static bool flush_writes(void)
1012 {
1013 bool ok = (write(tcp_ip, out_buffer, out_pos) == (int)out_pos);
1014 out_pos = 0;
1015 return ok;
1016 }
1017
1018 static bool writeLong(uint32_t l)
1019 {
1020 int i;
1021 for (i = 0; i < 4; i++)
1022 {
1023 uint8_t c = (l >> (i*8))&0xff;
1024 out_buffer[out_pos++] = c;
1025 if (out_pos >= sizeof(out_buffer))
1026 {
1027 if (!flush_writes())
1028 {
1029 return false;
1030 }
1031 }
1032 }
1033 return true;
1034 }
1035
1036 static bool readLong(uint32_t *out_data)
1037 {
1038 if (out_pos > 0)
1039 {
1040 if (!flush_writes())
1041 {
1042 return false;
1043 }
1044 }
1045
1046 uint32_t data = 0;
1047 int i;
1048 for (i = 0; i < 4; i++)
1049 {
1050 uint8_t c;
1051 if (in_pos == in_write)
1052 {
1053 /* read more */
1054 int t;
1055 t = read(tcp_ip, in_buffer, sizeof(in_buffer));
1056 if (t < 1)
1057 {
1058 return false;
1059 }
1060 in_write = (size_t) t;
1061 in_pos = 0;
1062 }
1063 c = in_buffer[in_pos++];
1064
1065 data |= (c << (i*8));
1066 }
1067 *out_data = data;
1068 return true;
1069 }
1070
1071 enum ZY1000_CMD
1072 {
1073 ZY1000_CMD_POKE = 0x0,
1074 ZY1000_CMD_PEEK = 0x8,
1075 ZY1000_CMD_SLEEP = 0x1,
1076 };
1077
1078
1079 #if !BUILD_ECOSBOARD
1080
1081 #include <sys/socket.h> /* for socket(), connect(), send(), and recv() */
1082 #include <arpa/inet.h> /* for sockaddr_in and inet_addr() */
1083
1084 /* We initialize this late since we need to know the server address
1085 * first.
1086 */
1087 static void tcpip_open(void)
1088 {
1089 if (tcp_ip >= 0)
1090 return;
1091
1092 struct sockaddr_in echoServAddr; /* Echo server address */
1093
1094 /* Create a reliable, stream socket using TCP */
1095 if ((tcp_ip = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
1096 {
1097 fprintf(stderr, "Failed to connect to zy1000 server\n");
1098 exit(-1);
1099 }
1100
1101 /* Construct the server address structure */
1102 memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */
1103 echoServAddr.sin_family = AF_INET; /* Internet address family */
1104 echoServAddr.sin_addr.s_addr = inet_addr(tcp_server); /* Server IP address */
1105 echoServAddr.sin_port = htons(7777); /* Server port */
1106
1107 /* Establish the connection to the echo server */
1108 if (connect(tcp_ip, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)
1109 {
1110 fprintf(stderr, "Failed to connect to zy1000 server\n");
1111 exit(-1);
1112 }
1113
1114 int flag = 1;
1115 setsockopt(tcp_ip, /* socket affected */
1116 IPPROTO_TCP, /* set option at TCP level */
1117 TCP_NODELAY, /* name of option */
1118 (char *)&flag, /* the cast is historical cruft */
1119 sizeof(int)); /* length of option value */
1120
1121 }
1122
1123
1124 /* send a poke */
1125 void zy1000_tcpout(uint32_t address, uint32_t data)
1126 {
1127 tcpip_open();
1128 if (!writeLong((ZY1000_CMD_POKE << 24) | address)||
1129 !writeLong(data))
1130 {
1131 fprintf(stderr, "Could not write to zy1000 server\n");
1132 exit(-1);
1133 }
1134 }
1135
1136 uint32_t zy1000_tcpin(uint32_t address)
1137 {
1138 tcpip_open();
1139 uint32_t data;
1140 if (!writeLong((ZY1000_CMD_PEEK << 24) | address)||
1141 !readLong(&data))
1142 {
1143 fprintf(stderr, "Could not read from zy1000 server\n");
1144 exit(-1);
1145 }
1146 return data;
1147 }
1148
1149 int interface_jtag_add_sleep(uint32_t us)
1150 {
1151 tcpip_open();
1152 if (!writeLong((ZY1000_CMD_SLEEP << 24))||
1153 !writeLong(us))
1154 {
1155 fprintf(stderr, "Could not read from zy1000 server\n");
1156 exit(-1);
1157 }
1158 return ERROR_OK;
1159 }
1160
1161
1162 #endif
1163
1164 #if BUILD_ECOSBOARD
1165 static char tcpip_stack[2048];
1166
1167 static cyg_thread tcpip_thread_object;
1168 static cyg_handle_t tcpip_thread_handle;
1169
1170 /* Infinite loop peeking & poking */
1171 static void tcpipserver(void)
1172 {
1173 for (;;)
1174 {
1175 uint32_t address;
1176 if (!readLong(&address))
1177 return;
1178 enum ZY1000_CMD c = (address >> 24) & 0xff;
1179 address &= 0xffffff;
1180 switch (c)
1181 {
1182 case ZY1000_CMD_POKE:
1183 {
1184 uint32_t data;
1185 if (!readLong(&data))
1186 return;
1187 address &= ~0x80000000;
1188 ZY1000_POKE(address + ZY1000_JTAG_BASE, data);
1189 break;
1190 }
1191 case ZY1000_CMD_PEEK:
1192 {
1193 uint32_t data;
1194 ZY1000_PEEK(address + ZY1000_JTAG_BASE, data);
1195 if (!writeLong(data))
1196 return;
1197 break;
1198 }
1199 case ZY1000_CMD_SLEEP:
1200 {
1201 uint32_t data;
1202 if (!readLong(&data))
1203 return;
1204 jtag_sleep(data);
1205 break;
1206 }
1207 default:
1208 return;
1209 }
1210 }
1211 }
1212
1213
1214 static void tcpip_server(cyg_addrword_t data)
1215 {
1216 int so_reuseaddr_option = 1;
1217
1218 int fd;
1219 if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
1220 {
1221 LOG_ERROR("error creating socket: %s", strerror(errno));
1222 exit(-1);
1223 }
1224
1225 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*) &so_reuseaddr_option,
1226 sizeof(int));
1227
1228 struct sockaddr_in sin;
1229 unsigned int address_size;
1230 address_size = sizeof(sin);
1231 memset(&sin, 0, sizeof(sin));
1232 sin.sin_family = AF_INET;
1233 sin.sin_addr.s_addr = INADDR_ANY;
1234 sin.sin_port = htons(7777);
1235
1236 if (bind(fd, (struct sockaddr *) &sin, sizeof(sin)) == -1)
1237 {
1238 LOG_ERROR("couldn't bind to socket: %s", strerror(errno));
1239 exit(-1);
1240 }
1241
1242 if (listen(fd, 1) == -1)
1243 {
1244 LOG_ERROR("couldn't listen on socket: %s", strerror(errno));
1245 exit(-1);
1246 }
1247
1248
1249 for (;;)
1250 {
1251 tcp_ip = accept(fd, (struct sockaddr *) &sin, &address_size);
1252 if (tcp_ip < 0)
1253 {
1254 continue;
1255 }
1256
1257 int flag = 1;
1258 setsockopt(tcp_ip, /* socket affected */
1259 IPPROTO_TCP, /* set option at TCP level */
1260 TCP_NODELAY, /* name of option */
1261 (char *)&flag, /* the cast is historical cruft */
1262 sizeof(int)); /* length of option value */
1263
1264 bool save_poll = jtag_poll_get_enabled();
1265
1266 /* polling will screw up the "connection" */
1267 jtag_poll_set_enabled(false);
1268
1269 tcpipserver();
1270
1271 jtag_poll_set_enabled(save_poll);
1272
1273 close(tcp_ip);
1274
1275 }
1276 close(fd);
1277
1278 }
1279
1280 int interface_jtag_add_sleep(uint32_t us)
1281 {
1282 jtag_sleep(us);
1283 return ERROR_OK;
1284 }
1285
1286 #endif
1287
1288
1289 int zy1000_init(void)
1290 {
1291 #if BUILD_ECOSBOARD
1292 LOG_USER("%s", ZYLIN_OPENOCD_VERSION);
1293 #endif
1294
1295 ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x30); // Turn on LED1 & LED2
1296
1297 setPower(true); // on by default
1298
1299
1300 /* deassert resets. Important to avoid infinite loop waiting for SRST to deassert */
1301 zy1000_reset(0, 0);
1302 zy1000_speed(jtag_get_speed());
1303
1304
1305 #if BUILD_ECOSBOARD
1306 cyg_thread_create(1, tcpip_server, (cyg_addrword_t) 0, "tcip/ip server",
1307 (void *) tcpip_stack, sizeof(tcpip_stack),
1308 &tcpip_thread_handle, &tcpip_thread_object);
1309 cyg_thread_resume(tcpip_thread_handle);
1310 #endif
1311
1312 return ERROR_OK;
1313 }
1314
1315
1316
1317 struct jtag_interface zy1000_interface =
1318 {
1319 .name = "ZY1000",
1320 .supported = DEBUG_CAP_TMS_SEQ,
1321 .execute_queue = NULL,
1322 .speed = zy1000_speed,
1323 .commands = zy1000_commands,
1324 .init = zy1000_init,
1325 .quit = zy1000_quit,
1326 .khz = zy1000_khz,
1327 .speed_div = zy1000_speed_div,
1328 .power_dropout = zy1000_power_dropout,
1329 .srst_asserted = zy1000_srst_asserted,
1330 };
1331

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)