zy1000: fix arm11 optimisation
[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 = 0;
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 bool dropout = readPowerDropout();
438
439 Jim_SetResult(interp, Jim_NewIntObj(interp, dropout));
440
441 return JIM_OK;
442 }
443
444
445
446 int zy1000_quit(void)
447 {
448
449 return ERROR_OK;
450 }
451
452
453
454 int interface_jtag_execute_queue(void)
455 {
456 uint32_t empty;
457
458 waitIdle();
459 ZY1000_PEEK(ZY1000_JTAG_BASE + 0x10, empty);
460 /* clear JTAG error register */
461 ZY1000_POKE(ZY1000_JTAG_BASE + 0x14, 0x400);
462
463 if ((empty&0x400) != 0)
464 {
465 LOG_WARNING("RCLK timeout");
466 /* the error is informative only as we don't want to break the firmware if there
467 * is a false positive.
468 */
469 // return ERROR_FAIL;
470 }
471 return ERROR_OK;
472 }
473
474
475
476
477
478 static uint32_t getShiftValue(void)
479 {
480 uint32_t value;
481 waitIdle();
482 ZY1000_PEEK(ZY1000_JTAG_BASE + 0xc, value);
483 VERBOSE(LOG_INFO("getShiftValue %08x", value));
484 return value;
485 }
486 #if 0
487 static uint32_t getShiftValueFlip(void)
488 {
489 uint32_t value;
490 waitIdle();
491 ZY1000_PEEK(ZY1000_JTAG_BASE + 0x18, value);
492 VERBOSE(LOG_INFO("getShiftValue %08x (flipped)", value));
493 return value;
494 }
495 #endif
496
497 #if 0
498 static void shiftValueInnerFlip(const tap_state_t state, const tap_state_t endState, int repeat, uint32_t value)
499 {
500 VERBOSE(LOG_INFO("shiftValueInner %s %s %d %08x (flipped)", tap_state_name(state), tap_state_name(endState), repeat, value));
501 uint32_t a,b;
502 a = state;
503 b = endState;
504 ZY1000_POKE(ZY1000_JTAG_BASE + 0xc, value);
505 ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (1 << 15) | (repeat << 8) | (a << 4) | b);
506 VERBOSE(getShiftValueFlip());
507 }
508 #endif
509
510 // here we shuffle N bits out/in
511 static __inline void scanBits(const uint8_t *out_value, uint8_t *in_value, int num_bits, bool pause_now, tap_state_t shiftState, tap_state_t end_state)
512 {
513 tap_state_t pause_state = shiftState;
514 for (int j = 0; j < num_bits; j += 32)
515 {
516 int k = num_bits - j;
517 if (k > 32)
518 {
519 k = 32;
520 /* we have more to shift out */
521 } else if (pause_now)
522 {
523 /* this was the last to shift out this time */
524 pause_state = end_state;
525 }
526
527 // we have (num_bits + 7)/8 bytes of bits to toggle out.
528 // bits are pushed out LSB to MSB
529 uint32_t value;
530 value = 0;
531 if (out_value != NULL)
532 {
533 for (int l = 0; l < k; l += 8)
534 {
535 value|=out_value[(j + l)/8]<<l;
536 }
537 }
538 /* mask away unused bits for easier debugging */
539 if (k < 32)
540 {
541 value&=~(((uint32_t)0xffffffff) << k);
542 } else
543 {
544 /* Shifting by >= 32 is not defined by the C standard
545 * and will in fact shift by &0x1f bits on nios */
546 }
547
548 shiftValueInner(shiftState, pause_state, k, value);
549
550 if (in_value != NULL)
551 {
552 // data in, LSB to MSB
553 value = getShiftValue();
554 // we're shifting in data to MSB, shift data to be aligned for returning the value
555 value >>= 32-k;
556
557 for (int l = 0; l < k; l += 8)
558 {
559 in_value[(j + l)/8]=(value >> l)&0xff;
560 }
561 }
562 }
563 }
564
565 static __inline void scanFields(int num_fields, const struct scan_field *fields, tap_state_t shiftState, tap_state_t end_state)
566 {
567 for (int i = 0; i < num_fields; i++)
568 {
569 scanBits(fields[i].out_value,
570 fields[i].in_value,
571 fields[i].num_bits,
572 (i == num_fields-1),
573 shiftState,
574 end_state);
575 }
576 }
577
578 int interface_jtag_add_ir_scan(struct jtag_tap *active, const struct scan_field *fields, tap_state_t state)
579 {
580 int scan_size = 0;
581 struct jtag_tap *tap, *nextTap;
582 tap_state_t pause_state = TAP_IRSHIFT;
583
584 for (tap = jtag_tap_next_enabled(NULL); tap!= NULL; tap = nextTap)
585 {
586 nextTap = jtag_tap_next_enabled(tap);
587 if (nextTap==NULL)
588 {
589 pause_state = state;
590 }
591 scan_size = tap->ir_length;
592
593 /* search the list */
594 if (tap == active)
595 {
596 scanFields(1, fields, TAP_IRSHIFT, pause_state);
597 /* update device information */
598 buf_cpy(fields[0].out_value, tap->cur_instr, scan_size);
599
600 tap->bypass = 0;
601 } else
602 {
603 /* if a device isn't listed, set it to BYPASS */
604 assert(scan_size <= 32);
605 shiftValueInner(TAP_IRSHIFT, pause_state, scan_size, 0xffffffff);
606
607 tap->bypass = 1;
608 }
609 }
610
611 return ERROR_OK;
612 }
613
614
615
616
617
618 int interface_jtag_add_plain_ir_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits, tap_state_t state)
619 {
620 scanBits(out_bits, in_bits, num_bits, true, TAP_IRSHIFT, state);
621 return ERROR_OK;
622 }
623
624 int interface_jtag_add_dr_scan(struct jtag_tap *active, int num_fields, const struct scan_field *fields, tap_state_t state)
625 {
626 struct jtag_tap *tap, *nextTap;
627 tap_state_t pause_state = TAP_DRSHIFT;
628 for (tap = jtag_tap_next_enabled(NULL); tap!= NULL; tap = nextTap)
629 {
630 nextTap = jtag_tap_next_enabled(tap);
631 if (nextTap==NULL)
632 {
633 pause_state = state;
634 }
635
636 /* Find a range of fields to write to this tap */
637 if (tap == active)
638 {
639 assert(!tap->bypass);
640
641 scanFields(num_fields, fields, TAP_DRSHIFT, pause_state);
642 } else
643 {
644 /* Shift out a 0 for disabled tap's */
645 assert(tap->bypass);
646 shiftValueInner(TAP_DRSHIFT, pause_state, 1, 0);
647 }
648 }
649 return ERROR_OK;
650 }
651
652 int interface_jtag_add_plain_dr_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits, tap_state_t state)
653 {
654 scanBits(out_bits, in_bits, num_bits, true, TAP_DRSHIFT, state);
655 return ERROR_OK;
656 }
657
658 int interface_jtag_add_tlr()
659 {
660 setCurrentState(TAP_RESET);
661 return ERROR_OK;
662 }
663
664
665 int interface_jtag_add_reset(int req_trst, int req_srst)
666 {
667 zy1000_reset(req_trst, req_srst);
668 return ERROR_OK;
669 }
670
671 static int zy1000_jtag_add_clocks(int num_cycles, tap_state_t state, tap_state_t clockstate)
672 {
673 /* num_cycles can be 0 */
674 setCurrentState(clockstate);
675
676 /* execute num_cycles, 32 at the time. */
677 int i;
678 for (i = 0; i < num_cycles; i += 32)
679 {
680 int num;
681 num = 32;
682 if (num_cycles-i < num)
683 {
684 num = num_cycles-i;
685 }
686 shiftValueInner(clockstate, clockstate, num, 0);
687 }
688
689 #if !TEST_MANUAL()
690 /* finish in end_state */
691 setCurrentState(state);
692 #else
693 tap_state_t t = TAP_IDLE;
694 /* test manual drive code on any target */
695 int tms;
696 uint8_t tms_scan = tap_get_tms_path(t, state);
697 int tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
698
699 for (i = 0; i < tms_count; i++)
700 {
701 tms = (tms_scan >> i) & 1;
702 waitIdle();
703 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, tms);
704 }
705 waitIdle();
706 ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, state);
707 #endif
708
709 return ERROR_OK;
710 }
711
712 int interface_jtag_add_runtest(int num_cycles, tap_state_t state)
713 {
714 return zy1000_jtag_add_clocks(num_cycles, state, TAP_IDLE);
715 }
716
717 int interface_jtag_add_clocks(int num_cycles)
718 {
719 return zy1000_jtag_add_clocks(num_cycles, cmd_queue_cur_state, cmd_queue_cur_state);
720 }
721
722 int interface_add_tms_seq(unsigned num_bits, const uint8_t *seq, enum tap_state state)
723 {
724 /*wait for the fifo to be empty*/
725 waitIdle();
726
727 for (unsigned i = 0; i < num_bits; i++)
728 {
729 int tms;
730
731 if (((seq[i/8] >> (i % 8)) & 1) == 0)
732 {
733 tms = 0;
734 }
735 else
736 {
737 tms = 1;
738 }
739
740 waitIdle();
741 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, tms);
742 }
743
744 waitIdle();
745 if (state != TAP_INVALID)
746 {
747 ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, state);
748 } else
749 {
750 /* this would be normal if we are switching to SWD mode */
751 }
752 return ERROR_OK;
753 }
754
755 int interface_jtag_add_pathmove(int num_states, const tap_state_t *path)
756 {
757 int state_count;
758 int tms = 0;
759
760 state_count = 0;
761
762 tap_state_t cur_state = cmd_queue_cur_state;
763
764 uint8_t seq[16];
765 memset(seq, 0, sizeof(seq));
766 assert(num_states < (int)((sizeof(seq) * 8)));
767
768 while (num_states)
769 {
770 if (tap_state_transition(cur_state, false) == path[state_count])
771 {
772 tms = 0;
773 }
774 else if (tap_state_transition(cur_state, true) == path[state_count])
775 {
776 tms = 1;
777 }
778 else
779 {
780 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state), tap_state_name(path[state_count]));
781 exit(-1);
782 }
783
784 seq[state_count/8] = seq[state_count/8] | (tms << (state_count % 8));
785
786 cur_state = path[state_count];
787 state_count++;
788 num_states--;
789 }
790
791 return interface_add_tms_seq(state_count, seq, cur_state);
792 }
793
794 static void jtag_pre_post_bits(struct jtag_tap *tap, int *pre, int *post)
795 {
796 /* bypass bits before and after */
797 int pre_bits = 0;
798 int post_bits = 0;
799
800 bool found = false;
801 struct jtag_tap *cur_tap, *nextTap;
802 for (cur_tap = jtag_tap_next_enabled(NULL); cur_tap!= NULL; cur_tap = nextTap)
803 {
804 nextTap = jtag_tap_next_enabled(cur_tap);
805 if (cur_tap == tap)
806 {
807 found = true;
808 } else
809 {
810 if (found)
811 {
812 post_bits++;
813 } else
814 {
815 pre_bits++;
816 }
817 }
818 }
819 *pre = pre_bits;
820 *post = post_bits;
821 }
822
823 /*
824 static const int embeddedice_num_bits[] = {32, 6};
825 uint32_t values[2];
826
827 values[0] = value;
828 values[1] = (1 << 5) | reg_addr;
829
830 jtag_add_dr_out(tap,
831 2,
832 embeddedice_num_bits,
833 values,
834 TAP_IDLE);
835 */
836
837 void embeddedice_write_dcc(struct jtag_tap *tap, int reg_addr, uint8_t *buffer, int little, int count)
838 {
839 #if 0
840 int i;
841 for (i = 0; i < count; i++)
842 {
843 embeddedice_write_reg_inner(tap, reg_addr, fast_target_buffer_get_u32(buffer, little));
844 buffer += 4;
845 }
846 #else
847 int pre_bits;
848 int post_bits;
849 jtag_pre_post_bits(tap, &pre_bits, &post_bits);
850
851 if ((pre_bits > 32) || (post_bits + 6 > 32))
852 {
853 int i;
854 for (i = 0; i < count; i++)
855 {
856 embeddedice_write_reg_inner(tap, reg_addr, fast_target_buffer_get_u32(buffer, little));
857 buffer += 4;
858 }
859 } else
860 {
861 int i;
862 for (i = 0; i < count; i++)
863 {
864 /* Fewer pokes means we get to use the FIFO more efficiently */
865 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, pre_bits, 0);
866 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, little));
867 /* Danger! here we need to exit into the TAP_IDLE state to make
868 * DCC pick up this value.
869 */
870 shiftValueInner(TAP_DRSHIFT, TAP_IDLE, 6 + post_bits, (reg_addr | (1 << 5)));
871 buffer += 4;
872 }
873 }
874 #endif
875 }
876
877
878
879 int arm11_run_instr_data_to_core_noack_inner(struct jtag_tap * tap, uint32_t opcode, uint32_t * data, size_t count)
880 {
881 /* bypass bits before and after */
882 int pre_bits;
883 int post_bits;
884 jtag_pre_post_bits(tap, &pre_bits, &post_bits);
885 post_bits+=2;
886
887 if ((pre_bits > 32) || (post_bits > 32))
888 {
889 int arm11_run_instr_data_to_core_noack_inner_default(struct jtag_tap * tap, uint32_t opcode, uint32_t * data, size_t count);
890 return arm11_run_instr_data_to_core_noack_inner_default(tap, opcode, data, count);
891 } else
892 {
893 static const int bits[] = {32, 2};
894 uint32_t values[] = {0, 0};
895
896 /* FIX!!!!!! the target_write_memory() API started this nasty problem
897 * with unaligned uint32_t * pointers... */
898 const uint8_t *t = (const uint8_t *)data;
899
900 while (--count > 0)
901 {
902 #if 1
903 /* Danger! This code doesn't update cmd_queue_cur_state, so
904 * invoking jtag_add_pathmove() before jtag_add_dr_out() after
905 * this loop would fail!
906 */
907 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, pre_bits, 0);
908
909 uint32_t value;
910 value = *t++;
911 value |= (*t++<<8);
912 value |= (*t++<<16);
913 value |= (*t++<<24);
914
915 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, value);
916 /* minimum 2 bits */
917 shiftValueInner(TAP_DRSHIFT, TAP_DRPAUSE, post_bits, 0);
918
919 /* copy & paste from arm11_dbgtap.c */
920 //TAP_DREXIT2, TAP_DRUPDATE, TAP_IDLE, TAP_IDLE, TAP_IDLE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DRSHIFT
921 /* KLUDGE! we have to flush the fifo or the Nios CPU locks up.
922 * This is probably a bug in the Avalon bus(cross clocking bridge?)
923 * or in the jtag registers module.
924 */
925 waitIdle();
926 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 1);
927 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 1);
928 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
929 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
930 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
931 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 1);
932 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
933 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
934 /* we don't have to wait for the queue to empty here */
935 ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, TAP_DRSHIFT);
936 waitIdle();
937 #else
938 static const tap_state_t arm11_MOVE_DRPAUSE_IDLE_DRPAUSE_with_delay[] =
939 {
940 TAP_DREXIT2, TAP_DRUPDATE, TAP_IDLE, TAP_IDLE, TAP_IDLE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DRSHIFT
941 };
942
943 values[0] = *t++;
944 values[0] |= (*t++<<8);
945 values[0] |= (*t++<<16);
946 values[0] |= (*t++<<24);
947
948 jtag_add_dr_out(tap,
949 2,
950 bits,
951 values,
952 TAP_IDLE);
953
954 jtag_add_pathmove(ARRAY_SIZE(arm11_MOVE_DRPAUSE_IDLE_DRPAUSE_with_delay),
955 arm11_MOVE_DRPAUSE_IDLE_DRPAUSE_with_delay);
956 #endif
957 }
958
959 values[0] = *t++;
960 values[0] |= (*t++<<8);
961 values[0] |= (*t++<<16);
962 values[0] |= (*t++<<24);
963
964 /* This will happen on the last iteration updating cmd_queue_cur_state
965 * so we don't have to track it during the common code path
966 */
967 jtag_add_dr_out(tap,
968 2,
969 bits,
970 values,
971 TAP_IDLE);
972
973 return jtag_execute_queue();
974 }
975 }
976
977
978 static const struct command_registration zy1000_commands[] = {
979 {
980 .name = "power",
981 .handler = handle_power_command,
982 .mode = COMMAND_ANY,
983 .help = "Turn power switch to target on/off. "
984 "With no arguments, prints status.",
985 .usage = "('on'|'off)",
986 },
987 #if BUILD_ECOSBOARD
988 {
989 .name = "zy1000_version",
990 .mode = COMMAND_ANY,
991 .jim_handler = jim_zy1000_version,
992 .help = "Print version info for zy1000.",
993 .usage = "['openocd'|'zy1000'|'date'|'time'|'pcb'|'fpga']",
994 },
995 #else
996 {
997 .name = "zy1000_server",
998 .mode = COMMAND_ANY,
999 .jim_handler = jim_zy1000_server,
1000 .help = "Tcpip address for ZY1000 server.",
1001 .usage = "address",
1002 },
1003 #endif
1004 {
1005 .name = "powerstatus",
1006 .mode = COMMAND_ANY,
1007 .jim_handler = zylinjtag_Jim_Command_powerstatus,
1008 .help = "Returns power status of target",
1009 },
1010 #ifdef CYGPKG_HAL_NIOS2
1011 {
1012 .name = "updatezy1000firmware",
1013 .mode = COMMAND_ANY,
1014 .jim_handler = jim_zy1000_writefirmware,
1015 .help = "writes firmware to flash",
1016 /* .usage = "some_string", */
1017 },
1018 #endif
1019 COMMAND_REGISTRATION_DONE
1020 };
1021
1022
1023 static int tcp_ip = -1;
1024
1025 /* Write large packets if we can */
1026 static size_t out_pos;
1027 static uint8_t out_buffer[16384];
1028 static size_t in_pos;
1029 static size_t in_write;
1030 static uint8_t in_buffer[16384];
1031
1032 static bool flush_writes(void)
1033 {
1034 bool ok = (write(tcp_ip, out_buffer, out_pos) == (int)out_pos);
1035 out_pos = 0;
1036 return ok;
1037 }
1038
1039 static bool writeLong(uint32_t l)
1040 {
1041 int i;
1042 for (i = 0; i < 4; i++)
1043 {
1044 uint8_t c = (l >> (i*8))&0xff;
1045 out_buffer[out_pos++] = c;
1046 if (out_pos >= sizeof(out_buffer))
1047 {
1048 if (!flush_writes())
1049 {
1050 return false;
1051 }
1052 }
1053 }
1054 return true;
1055 }
1056
1057 static bool readLong(uint32_t *out_data)
1058 {
1059 if (out_pos > 0)
1060 {
1061 if (!flush_writes())
1062 {
1063 return false;
1064 }
1065 }
1066
1067 uint32_t data = 0;
1068 int i;
1069 for (i = 0; i < 4; i++)
1070 {
1071 uint8_t c;
1072 if (in_pos == in_write)
1073 {
1074 /* read more */
1075 int t;
1076 t = read(tcp_ip, in_buffer, sizeof(in_buffer));
1077 if (t < 1)
1078 {
1079 return false;
1080 }
1081 in_write = (size_t) t;
1082 in_pos = 0;
1083 }
1084 c = in_buffer[in_pos++];
1085
1086 data |= (c << (i*8));
1087 }
1088 *out_data = data;
1089 return true;
1090 }
1091
1092 enum ZY1000_CMD
1093 {
1094 ZY1000_CMD_POKE = 0x0,
1095 ZY1000_CMD_PEEK = 0x8,
1096 ZY1000_CMD_SLEEP = 0x1,
1097 };
1098
1099
1100 #if !BUILD_ECOSBOARD
1101
1102 #include <sys/socket.h> /* for socket(), connect(), send(), and recv() */
1103 #include <arpa/inet.h> /* for sockaddr_in and inet_addr() */
1104
1105 /* We initialize this late since we need to know the server address
1106 * first.
1107 */
1108 static void tcpip_open(void)
1109 {
1110 if (tcp_ip >= 0)
1111 return;
1112
1113 struct sockaddr_in echoServAddr; /* Echo server address */
1114
1115 /* Create a reliable, stream socket using TCP */
1116 if ((tcp_ip = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
1117 {
1118 fprintf(stderr, "Failed to connect to zy1000 server\n");
1119 exit(-1);
1120 }
1121
1122 /* Construct the server address structure */
1123 memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */
1124 echoServAddr.sin_family = AF_INET; /* Internet address family */
1125 echoServAddr.sin_addr.s_addr = inet_addr(tcp_server); /* Server IP address */
1126 echoServAddr.sin_port = htons(7777); /* Server port */
1127
1128 /* Establish the connection to the echo server */
1129 if (connect(tcp_ip, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)
1130 {
1131 fprintf(stderr, "Failed to connect to zy1000 server\n");
1132 exit(-1);
1133 }
1134
1135 int flag = 1;
1136 setsockopt(tcp_ip, /* socket affected */
1137 IPPROTO_TCP, /* set option at TCP level */
1138 TCP_NODELAY, /* name of option */
1139 (char *)&flag, /* the cast is historical cruft */
1140 sizeof(int)); /* length of option value */
1141
1142 }
1143
1144
1145 /* send a poke */
1146 void zy1000_tcpout(uint32_t address, uint32_t data)
1147 {
1148 tcpip_open();
1149 if (!writeLong((ZY1000_CMD_POKE << 24) | address)||
1150 !writeLong(data))
1151 {
1152 fprintf(stderr, "Could not write to zy1000 server\n");
1153 exit(-1);
1154 }
1155 }
1156
1157 uint32_t zy1000_tcpin(uint32_t address)
1158 {
1159 tcpip_open();
1160 uint32_t data;
1161 if (!writeLong((ZY1000_CMD_PEEK << 24) | address)||
1162 !readLong(&data))
1163 {
1164 fprintf(stderr, "Could not read from zy1000 server\n");
1165 exit(-1);
1166 }
1167 return data;
1168 }
1169
1170 int interface_jtag_add_sleep(uint32_t us)
1171 {
1172 tcpip_open();
1173 if (!writeLong((ZY1000_CMD_SLEEP << 24))||
1174 !writeLong(us))
1175 {
1176 fprintf(stderr, "Could not read from zy1000 server\n");
1177 exit(-1);
1178 }
1179 return ERROR_OK;
1180 }
1181
1182
1183 #endif
1184
1185 #if BUILD_ECOSBOARD
1186 static char tcpip_stack[2048];
1187 static cyg_thread tcpip_thread_object;
1188 static cyg_handle_t tcpip_thread_handle;
1189
1190 static char watchdog_stack[2048];
1191 static cyg_thread watchdog_thread_object;
1192 static cyg_handle_t watchdog_thread_handle;
1193
1194 /* Infinite loop peeking & poking */
1195 static void tcpipserver(void)
1196 {
1197 for (;;)
1198 {
1199 uint32_t address;
1200 if (!readLong(&address))
1201 return;
1202 enum ZY1000_CMD c = (address >> 24) & 0xff;
1203 address &= 0xffffff;
1204 switch (c)
1205 {
1206 case ZY1000_CMD_POKE:
1207 {
1208 uint32_t data;
1209 if (!readLong(&data))
1210 return;
1211 address &= ~0x80000000;
1212 ZY1000_POKE(address + ZY1000_JTAG_BASE, data);
1213 break;
1214 }
1215 case ZY1000_CMD_PEEK:
1216 {
1217 uint32_t data;
1218 ZY1000_PEEK(address + ZY1000_JTAG_BASE, data);
1219 if (!writeLong(data))
1220 return;
1221 break;
1222 }
1223 case ZY1000_CMD_SLEEP:
1224 {
1225 uint32_t data;
1226 if (!readLong(&data))
1227 return;
1228 jtag_sleep(data);
1229 break;
1230 }
1231 default:
1232 return;
1233 }
1234 }
1235 }
1236
1237
1238 static void tcpip_server(cyg_addrword_t data)
1239 {
1240 int so_reuseaddr_option = 1;
1241
1242 int fd;
1243 if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
1244 {
1245 LOG_ERROR("error creating socket: %s", strerror(errno));
1246 exit(-1);
1247 }
1248
1249 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*) &so_reuseaddr_option,
1250 sizeof(int));
1251
1252 struct sockaddr_in sin;
1253 unsigned int address_size;
1254 address_size = sizeof(sin);
1255 memset(&sin, 0, sizeof(sin));
1256 sin.sin_family = AF_INET;
1257 sin.sin_addr.s_addr = INADDR_ANY;
1258 sin.sin_port = htons(7777);
1259
1260 if (bind(fd, (struct sockaddr *) &sin, sizeof(sin)) == -1)
1261 {
1262 LOG_ERROR("couldn't bind to socket: %s", strerror(errno));
1263 exit(-1);
1264 }
1265
1266 if (listen(fd, 1) == -1)
1267 {
1268 LOG_ERROR("couldn't listen on socket: %s", strerror(errno));
1269 exit(-1);
1270 }
1271
1272
1273 for (;;)
1274 {
1275 tcp_ip = accept(fd, (struct sockaddr *) &sin, &address_size);
1276 if (tcp_ip < 0)
1277 {
1278 continue;
1279 }
1280
1281 int flag = 1;
1282 setsockopt(tcp_ip, /* socket affected */
1283 IPPROTO_TCP, /* set option at TCP level */
1284 TCP_NODELAY, /* name of option */
1285 (char *)&flag, /* the cast is historical cruft */
1286 sizeof(int)); /* length of option value */
1287
1288 bool save_poll = jtag_poll_get_enabled();
1289
1290 /* polling will screw up the "connection" */
1291 jtag_poll_set_enabled(false);
1292
1293 tcpipserver();
1294
1295 jtag_poll_set_enabled(save_poll);
1296
1297 close(tcp_ip);
1298
1299 }
1300 close(fd);
1301
1302 }
1303
1304 #ifdef WATCHDOG_BASE
1305 /* If we connect to port 8888 we must send a char every 10s or the board resets itself */
1306 static void watchdog_server(cyg_addrword_t data)
1307 {
1308 int so_reuseaddr_option = 1;
1309
1310 int fd;
1311 if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
1312 {
1313 LOG_ERROR("error creating socket: %s", strerror(errno));
1314 exit(-1);
1315 }
1316
1317 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*) &so_reuseaddr_option,
1318 sizeof(int));
1319
1320 struct sockaddr_in sin;
1321 unsigned int address_size;
1322 address_size = sizeof(sin);
1323 memset(&sin, 0, sizeof(sin));
1324 sin.sin_family = AF_INET;
1325 sin.sin_addr.s_addr = INADDR_ANY;
1326 sin.sin_port = htons(8888);
1327
1328 if (bind(fd, (struct sockaddr *) &sin, sizeof(sin)) == -1)
1329 {
1330 LOG_ERROR("couldn't bind to socket: %s", strerror(errno));
1331 exit(-1);
1332 }
1333
1334 if (listen(fd, 1) == -1)
1335 {
1336 LOG_ERROR("couldn't listen on socket: %s", strerror(errno));
1337 exit(-1);
1338 }
1339
1340
1341 for (;;)
1342 {
1343 int watchdog_ip = accept(fd, (struct sockaddr *) &sin, &address_size);
1344
1345 /* Start watchdog, must be reset every 10 seconds. */
1346 HAL_WRITE_UINT32(WATCHDOG_BASE + 4, 4);
1347
1348 if (watchdog_ip < 0)
1349 {
1350 LOG_ERROR("couldn't open watchdog socket: %s", strerror(errno));
1351 exit(-1);
1352 }
1353
1354 int flag = 1;
1355 setsockopt(watchdog_ip, /* socket affected */
1356 IPPROTO_TCP, /* set option at TCP level */
1357 TCP_NODELAY, /* name of option */
1358 (char *)&flag, /* the cast is historical cruft */
1359 sizeof(int)); /* length of option value */
1360
1361
1362 char buf;
1363 for (;;)
1364 {
1365 if (read(watchdog_ip, &buf, 1) == 1)
1366 {
1367 /* Reset timer */
1368 HAL_WRITE_UINT32(WATCHDOG_BASE + 8, 0x1234);
1369 /* Echo so we can telnet in and see that resetting works */
1370 write(watchdog_ip, &buf, 1);
1371 } else
1372 {
1373 /* Stop tickling the watchdog, the CPU will reset in < 10 seconds
1374 * now.
1375 */
1376 return;
1377 }
1378
1379 }
1380
1381 /* Never reached */
1382 }
1383 }
1384 #endif
1385
1386 int interface_jtag_add_sleep(uint32_t us)
1387 {
1388 jtag_sleep(us);
1389 return ERROR_OK;
1390 }
1391
1392 #endif
1393
1394
1395 int zy1000_init(void)
1396 {
1397 #if BUILD_ECOSBOARD
1398 LOG_USER("%s", ZYLIN_OPENOCD_VERSION);
1399 #endif
1400
1401 ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x30); // Turn on LED1 & LED2
1402
1403 setPower(true); // on by default
1404
1405
1406 /* deassert resets. Important to avoid infinite loop waiting for SRST to deassert */
1407 zy1000_reset(0, 0);
1408 zy1000_speed(jtag_get_speed());
1409
1410
1411 #if BUILD_ECOSBOARD
1412 cyg_thread_create(1, tcpip_server, (cyg_addrword_t) 0, "tcip/ip server",
1413 (void *) tcpip_stack, sizeof(tcpip_stack),
1414 &tcpip_thread_handle, &tcpip_thread_object);
1415 cyg_thread_resume(tcpip_thread_handle);
1416 #ifdef WATCHDOG_BASE
1417 cyg_thread_create(1, watchdog_server, (cyg_addrword_t) 0, "watchdog tcip/ip server",
1418 (void *) watchdog_stack, sizeof(watchdog_stack),
1419 &watchdog_thread_handle, &watchdog_thread_object);
1420 cyg_thread_resume(watchdog_thread_handle);
1421 #endif
1422 #endif
1423
1424 return ERROR_OK;
1425 }
1426
1427
1428
1429 struct jtag_interface zy1000_interface =
1430 {
1431 .name = "ZY1000",
1432 .supported = DEBUG_CAP_TMS_SEQ,
1433 .execute_queue = NULL,
1434 .speed = zy1000_speed,
1435 .commands = zy1000_commands,
1436 .init = zy1000_init,
1437 .quit = zy1000_quit,
1438 .khz = zy1000_khz,
1439 .speed_div = zy1000_speed_div,
1440 .power_dropout = zy1000_power_dropout,
1441 .srst_asserted = zy1000_srst_asserted,
1442 };
1443

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)