zy1000: fix false positive warning about unitialized local variable
[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, 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)
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 void embeddedice_write_dcc(struct jtag_tap *tap, int reg_addr, uint8_t *buffer, int little, int count)
824 {
825
826 int pre_bits;
827 int post_bits;
828 jtag_pre_post_bits(tap, &pre_bits, &post_bits);
829
830 if (pre_bits + post_bits + 6 > 32)
831 {
832 int i;
833 for (i = 0; i < count; i++)
834 {
835 embeddedice_write_reg_inner(tap, reg_addr, fast_target_buffer_get_u32(buffer, little));
836 buffer += 4;
837 }
838 } else
839 {
840 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, pre_bits, 0);
841 int i;
842 for (i = 0; i < count - 1; i++)
843 {
844 /* Fewer pokes means we get to use the FIFO more efficiently */
845 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, little));
846 shiftValueInner(TAP_DRSHIFT, TAP_IDLE, 6 + post_bits + pre_bits, (reg_addr | (1 << 5)));
847 buffer += 4;
848 }
849 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, little));
850 shiftValueInner(TAP_DRSHIFT, TAP_IDLE, 6 + post_bits, (reg_addr | (1 << 5)));
851 }
852 }
853
854
855
856 int arm11_run_instr_data_to_core_noack_inner(struct jtag_tap * tap, uint32_t opcode, uint32_t * data, size_t count)
857 {
858 #if 0
859 int arm11_run_instr_data_to_core_noack_inner_default(struct jtag_tap * tap, uint32_t opcode, uint32_t * data, size_t count);
860 return arm11_run_instr_data_to_core_noack_inner_default(tap, opcode, data, count);
861 #else
862 static const int bits[] = {32, 2};
863 uint32_t values[] = {0, 0};
864
865 /* FIX!!!!!! the target_write_memory() API started this nasty problem
866 * with unaligned uint32_t * pointers... */
867 const uint8_t *t = (const uint8_t *)data;
868
869
870 /* bypass bits before and after */
871 int pre_bits;
872 int post_bits;
873 jtag_pre_post_bits(tap, &pre_bits, &post_bits);
874
875 bool found = false;
876 struct jtag_tap *cur_tap, *nextTap;
877 for (cur_tap = jtag_tap_next_enabled(NULL); cur_tap!= NULL; cur_tap = nextTap)
878 {
879 nextTap = jtag_tap_next_enabled(cur_tap);
880 if (cur_tap == tap)
881 {
882 found = true;
883 } else
884 {
885 if (found)
886 {
887 post_bits++;
888 } else
889 {
890 pre_bits++;
891 }
892 }
893 }
894
895 post_bits+=2;
896
897
898 while (--count > 0)
899 {
900 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, pre_bits, 0);
901
902 uint32_t value;
903 value = *t++;
904 value |= (*t++<<8);
905 value |= (*t++<<16);
906 value |= (*t++<<24);
907
908 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, value);
909 /* minimum 2 bits */
910 shiftValueInner(TAP_DRSHIFT, TAP_DRPAUSE, post_bits, 0);
911
912 #if 1
913 /* copy & paste from arm11_dbgtap.c */
914 //TAP_DREXIT2, TAP_DRUPDATE, TAP_IDLE, TAP_IDLE, TAP_IDLE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DRSHIFT
915
916 waitIdle();
917 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 1);
918 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 1);
919 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
920 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
921 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
922 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 1);
923 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
924 ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
925 /* we don't have to wait for the queue to empty here. waitIdle(); */
926 ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, TAP_DRSHIFT);
927 #else
928 static const tap_state_t arm11_MOVE_DRPAUSE_IDLE_DRPAUSE_with_delay[] =
929 {
930 TAP_DREXIT2, TAP_DRUPDATE, TAP_IDLE, TAP_IDLE, TAP_IDLE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DRSHIFT
931 };
932
933 jtag_add_pathmove(ARRAY_SIZE(arm11_MOVE_DRPAUSE_IDLE_DRPAUSE_with_delay),
934 arm11_MOVE_DRPAUSE_IDLE_DRPAUSE_with_delay);
935 #endif
936 }
937
938 values[0] = *t++;
939 values[0] |= (*t++<<8);
940 values[0] |= (*t++<<16);
941 values[0] |= (*t++<<24);
942
943 /* This will happen on the last iteration updating the current tap state
944 * so we don't have to track it during the common code path */
945 jtag_add_dr_out(tap,
946 2,
947 bits,
948 values,
949 TAP_IDLE);
950
951 return jtag_execute_queue();
952 #endif
953 }
954
955
956 static const struct command_registration zy1000_commands[] = {
957 {
958 .name = "power",
959 .handler = handle_power_command,
960 .mode = COMMAND_ANY,
961 .help = "Turn power switch to target on/off. "
962 "With no arguments, prints status.",
963 .usage = "('on'|'off)",
964 },
965 #if BUILD_ECOSBOARD
966 {
967 .name = "zy1000_version",
968 .mode = COMMAND_ANY,
969 .jim_handler = jim_zy1000_version,
970 .help = "Print version info for zy1000.",
971 .usage = "['openocd'|'zy1000'|'date'|'time'|'pcb'|'fpga']",
972 },
973 #else
974 {
975 .name = "zy1000_server",
976 .mode = COMMAND_ANY,
977 .jim_handler = jim_zy1000_server,
978 .help = "Tcpip address for ZY1000 server.",
979 .usage = "address",
980 },
981 #endif
982 {
983 .name = "powerstatus",
984 .mode = COMMAND_ANY,
985 .jim_handler = zylinjtag_Jim_Command_powerstatus,
986 .help = "Returns power status of target",
987 },
988 #ifdef CYGPKG_HAL_NIOS2
989 {
990 .name = "updatezy1000firmware",
991 .mode = COMMAND_ANY,
992 .jim_handler = jim_zy1000_writefirmware,
993 .help = "writes firmware to flash",
994 /* .usage = "some_string", */
995 },
996 #endif
997 COMMAND_REGISTRATION_DONE
998 };
999
1000
1001 static int tcp_ip = -1;
1002
1003 /* Write large packets if we can */
1004 static size_t out_pos;
1005 static uint8_t out_buffer[16384];
1006 static size_t in_pos;
1007 static size_t in_write;
1008 static uint8_t in_buffer[16384];
1009
1010 static bool flush_writes(void)
1011 {
1012 bool ok = (write(tcp_ip, out_buffer, out_pos) == (int)out_pos);
1013 out_pos = 0;
1014 return ok;
1015 }
1016
1017 static bool writeLong(uint32_t l)
1018 {
1019 int i;
1020 for (i = 0; i < 4; i++)
1021 {
1022 uint8_t c = (l >> (i*8))&0xff;
1023 out_buffer[out_pos++] = c;
1024 if (out_pos >= sizeof(out_buffer))
1025 {
1026 if (!flush_writes())
1027 {
1028 return false;
1029 }
1030 }
1031 }
1032 return true;
1033 }
1034
1035 static bool readLong(uint32_t *out_data)
1036 {
1037 if (out_pos > 0)
1038 {
1039 if (!flush_writes())
1040 {
1041 return false;
1042 }
1043 }
1044
1045 uint32_t data = 0;
1046 int i;
1047 for (i = 0; i < 4; i++)
1048 {
1049 uint8_t c;
1050 if (in_pos == in_write)
1051 {
1052 /* read more */
1053 int t;
1054 t = read(tcp_ip, in_buffer, sizeof(in_buffer));
1055 if (t < 1)
1056 {
1057 return false;
1058 }
1059 in_write = (size_t) t;
1060 in_pos = 0;
1061 }
1062 c = in_buffer[in_pos++];
1063
1064 data |= (c << (i*8));
1065 }
1066 *out_data = data;
1067 return true;
1068 }
1069
1070 enum ZY1000_CMD
1071 {
1072 ZY1000_CMD_POKE = 0x0,
1073 ZY1000_CMD_PEEK = 0x8,
1074 ZY1000_CMD_SLEEP = 0x1,
1075 };
1076
1077
1078 #if !BUILD_ECOSBOARD
1079
1080 #include <sys/socket.h> /* for socket(), connect(), send(), and recv() */
1081 #include <arpa/inet.h> /* for sockaddr_in and inet_addr() */
1082
1083 /* We initialize this late since we need to know the server address
1084 * first.
1085 */
1086 static void tcpip_open(void)
1087 {
1088 if (tcp_ip >= 0)
1089 return;
1090
1091 struct sockaddr_in echoServAddr; /* Echo server address */
1092
1093 /* Create a reliable, stream socket using TCP */
1094 if ((tcp_ip = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
1095 {
1096 fprintf(stderr, "Failed to connect to zy1000 server\n");
1097 exit(-1);
1098 }
1099
1100 /* Construct the server address structure */
1101 memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */
1102 echoServAddr.sin_family = AF_INET; /* Internet address family */
1103 echoServAddr.sin_addr.s_addr = inet_addr(tcp_server); /* Server IP address */
1104 echoServAddr.sin_port = htons(7777); /* Server port */
1105
1106 /* Establish the connection to the echo server */
1107 if (connect(tcp_ip, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)
1108 {
1109 fprintf(stderr, "Failed to connect to zy1000 server\n");
1110 exit(-1);
1111 }
1112
1113 int flag = 1;
1114 setsockopt(tcp_ip, /* socket affected */
1115 IPPROTO_TCP, /* set option at TCP level */
1116 TCP_NODELAY, /* name of option */
1117 (char *)&flag, /* the cast is historical cruft */
1118 sizeof(int)); /* length of option value */
1119
1120 }
1121
1122
1123 /* send a poke */
1124 void zy1000_tcpout(uint32_t address, uint32_t data)
1125 {
1126 tcpip_open();
1127 if (!writeLong((ZY1000_CMD_POKE << 24) | address)||
1128 !writeLong(data))
1129 {
1130 fprintf(stderr, "Could not write to zy1000 server\n");
1131 exit(-1);
1132 }
1133 }
1134
1135 uint32_t zy1000_tcpin(uint32_t address)
1136 {
1137 tcpip_open();
1138 uint32_t data;
1139 if (!writeLong((ZY1000_CMD_PEEK << 24) | address)||
1140 !readLong(&data))
1141 {
1142 fprintf(stderr, "Could not read from zy1000 server\n");
1143 exit(-1);
1144 }
1145 return data;
1146 }
1147
1148 int interface_jtag_add_sleep(uint32_t us)
1149 {
1150 tcpip_open();
1151 if (!writeLong((ZY1000_CMD_SLEEP << 24))||
1152 !writeLong(us))
1153 {
1154 fprintf(stderr, "Could not read from zy1000 server\n");
1155 exit(-1);
1156 }
1157 return ERROR_OK;
1158 }
1159
1160
1161 #endif
1162
1163 #if BUILD_ECOSBOARD
1164 static char tcpip_stack[2048];
1165
1166 static cyg_thread tcpip_thread_object;
1167 static cyg_handle_t tcpip_thread_handle;
1168
1169 /* Infinite loop peeking & poking */
1170 static void tcpipserver(void)
1171 {
1172 for (;;)
1173 {
1174 uint32_t address;
1175 if (!readLong(&address))
1176 return;
1177 enum ZY1000_CMD c = (address >> 24) & 0xff;
1178 address &= 0xffffff;
1179 switch (c)
1180 {
1181 case ZY1000_CMD_POKE:
1182 {
1183 uint32_t data;
1184 if (!readLong(&data))
1185 return;
1186 address &= ~0x80000000;
1187 ZY1000_POKE(address + ZY1000_JTAG_BASE, data);
1188 break;
1189 }
1190 case ZY1000_CMD_PEEK:
1191 {
1192 uint32_t data;
1193 ZY1000_PEEK(address + ZY1000_JTAG_BASE, data);
1194 if (!writeLong(data))
1195 return;
1196 break;
1197 }
1198 case ZY1000_CMD_SLEEP:
1199 {
1200 uint32_t data;
1201 if (!readLong(&data))
1202 return;
1203 jtag_sleep(data);
1204 break;
1205 }
1206 default:
1207 return;
1208 }
1209 }
1210 }
1211
1212
1213 static void tcpip_server(cyg_addrword_t data)
1214 {
1215 int so_reuseaddr_option = 1;
1216
1217 int fd;
1218 if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
1219 {
1220 LOG_ERROR("error creating socket: %s", strerror(errno));
1221 exit(-1);
1222 }
1223
1224 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*) &so_reuseaddr_option,
1225 sizeof(int));
1226
1227 struct sockaddr_in sin;
1228 unsigned int address_size;
1229 address_size = sizeof(sin);
1230 memset(&sin, 0, sizeof(sin));
1231 sin.sin_family = AF_INET;
1232 sin.sin_addr.s_addr = INADDR_ANY;
1233 sin.sin_port = htons(7777);
1234
1235 if (bind(fd, (struct sockaddr *) &sin, sizeof(sin)) == -1)
1236 {
1237 LOG_ERROR("couldn't bind to socket: %s", strerror(errno));
1238 exit(-1);
1239 }
1240
1241 if (listen(fd, 1) == -1)
1242 {
1243 LOG_ERROR("couldn't listen on socket: %s", strerror(errno));
1244 exit(-1);
1245 }
1246
1247
1248 for (;;)
1249 {
1250 tcp_ip = accept(fd, (struct sockaddr *) &sin, &address_size);
1251 if (tcp_ip < 0)
1252 {
1253 continue;
1254 }
1255
1256 int flag = 1;
1257 setsockopt(tcp_ip, /* socket affected */
1258 IPPROTO_TCP, /* set option at TCP level */
1259 TCP_NODELAY, /* name of option */
1260 (char *)&flag, /* the cast is historical cruft */
1261 sizeof(int)); /* length of option value */
1262
1263 bool save_poll = jtag_poll_get_enabled();
1264
1265 /* polling will screw up the "connection" */
1266 jtag_poll_set_enabled(false);
1267
1268 tcpipserver();
1269
1270 jtag_poll_set_enabled(save_poll);
1271
1272 close(tcp_ip);
1273
1274 }
1275 close(fd);
1276
1277 }
1278
1279 int interface_jtag_add_sleep(uint32_t us)
1280 {
1281 jtag_sleep(us);
1282 return ERROR_OK;
1283 }
1284
1285 #endif
1286
1287
1288 int zy1000_init(void)
1289 {
1290 #if BUILD_ECOSBOARD
1291 LOG_USER("%s", ZYLIN_OPENOCD_VERSION);
1292 #endif
1293
1294 ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x30); // Turn on LED1 & LED2
1295
1296 setPower(true); // on by default
1297
1298
1299 /* deassert resets. Important to avoid infinite loop waiting for SRST to deassert */
1300 zy1000_reset(0, 0);
1301 zy1000_speed(jtag_get_speed());
1302
1303
1304 #if BUILD_ECOSBOARD
1305 cyg_thread_create(1, tcpip_server, (cyg_addrword_t) 0, "tcip/ip server",
1306 (void *) tcpip_stack, sizeof(tcpip_stack),
1307 &tcpip_thread_handle, &tcpip_thread_object);
1308 cyg_thread_resume(tcpip_thread_handle);
1309 #endif
1310
1311 return ERROR_OK;
1312 }
1313
1314
1315
1316 struct jtag_interface zy1000_interface =
1317 {
1318 .name = "ZY1000",
1319 .supported = DEBUG_CAP_TMS_SEQ,
1320 .execute_queue = NULL,
1321 .speed = zy1000_speed,
1322 .commands = zy1000_commands,
1323 .init = zy1000_init,
1324 .quit = zy1000_quit,
1325 .khz = zy1000_khz,
1326 .speed_div = zy1000_speed_div,
1327 .power_dropout = zy1000_power_dropout,
1328 .srst_asserted = zy1000_srst_asserted,
1329 };
1330

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)