transition more directly to the end state + reuse more of the state move code/paths
[openocd.git] / src / jtag / zy1000.c
1 /***************************************************************************
2 * Copyright (C) 2007-2008 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 #ifdef HAVE_CONFIG_H
20 #include "config.h"
21 #endif
22
23
24 #include "log.h"
25 #include "jtag.h"
26 #include "bitbang.h"
27 #include "../target/embeddedice.h"
28
29
30 #include <cyg/hal/hal_io.h> // low level i/o
31 #include <cyg/hal/hal_diag.h>
32
33 #include <stdlib.h>
34
35 #define ZYLIN_VERSION "1.51"
36 #define ZYLIN_DATE __DATE__
37 #define ZYLIN_TIME __TIME__
38 #define ZYLIN_OPENOCD "$Revision$"
39 #define ZYLIN_OPENOCD_VERSION "Zylin JTAG ZY1000 " ZYLIN_VERSION " " ZYLIN_DATE " " ZYLIN_TIME
40 const char *zylin_config_dir="/config/settings";
41
42 extern int jtag_error;
43
44 /* low level command set
45 */
46 int zy1000_read(void);
47 static void zy1000_write(int tck, int tms, int tdi);
48 void zy1000_reset(int trst, int srst);
49
50
51 int zy1000_speed(int speed);
52 int zy1000_register_commands(struct command_context_s *cmd_ctx);
53 int zy1000_init(void);
54 int zy1000_quit(void);
55
56 /* interface commands */
57 int zy1000_handle_zy1000_port_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
58
59 static int zy1000_khz(int khz, int *jtag_speed)
60 {
61 if (khz==0)
62 {
63 *jtag_speed=0;
64 }
65 else
66 {
67 *jtag_speed=64000/khz;
68 }
69 return ERROR_OK;
70 }
71
72 static int zy1000_speed_div(int speed, int *khz)
73 {
74 if (speed==0)
75 {
76 *khz = 0;
77 }
78 else
79 {
80 *khz=64000/speed;
81 }
82
83 return ERROR_OK;
84 }
85
86 static bool readPowerDropout(void)
87 {
88 cyg_uint32 state;
89 // sample and clear power dropout
90 HAL_WRITE_UINT32(ZY1000_JTAG_BASE+0x10, 0x80);
91 HAL_READ_UINT32(ZY1000_JTAG_BASE+0x10, state);
92 bool powerDropout;
93 powerDropout = (state & 0x80) != 0;
94 return powerDropout;
95 }
96
97
98 static bool readSRST(void)
99 {
100 cyg_uint32 state;
101 // sample and clear SRST sensing
102 HAL_WRITE_UINT32(ZY1000_JTAG_BASE+0x10, 0x00000040);
103 HAL_READ_UINT32(ZY1000_JTAG_BASE+0x10, state);
104 bool srstAsserted;
105 srstAsserted = (state & 0x40) != 0;
106 return srstAsserted;
107 }
108
109 static int zy1000_srst_asserted(int *srst_asserted)
110 {
111 *srst_asserted=readSRST();
112 return ERROR_OK;
113 }
114
115 static int zy1000_power_dropout(int *dropout)
116 {
117 *dropout=readPowerDropout();
118 return ERROR_OK;
119 }
120
121
122 jtag_interface_t zy1000_interface =
123 {
124 .name = "ZY1000",
125 .execute_queue = bitbang_execute_queue,
126 .speed = zy1000_speed,
127 .register_commands = zy1000_register_commands,
128 .init = zy1000_init,
129 .quit = zy1000_quit,
130 .khz = zy1000_khz,
131 .speed_div = zy1000_speed_div,
132 .power_dropout = zy1000_power_dropout,
133 .srst_asserted = zy1000_srst_asserted,
134 };
135
136 bitbang_interface_t zy1000_bitbang =
137 {
138 .read = zy1000_read,
139 .write = zy1000_write,
140 .reset = zy1000_reset
141 };
142
143
144
145 static void zy1000_write(int tck, int tms, int tdi)
146 {
147
148 }
149
150 int zy1000_read(void)
151 {
152 return -1;
153 }
154
155 extern bool readSRST(void);
156
157 void zy1000_reset(int trst, int srst)
158 {
159 LOG_DEBUG("zy1000 trst=%d, srst=%d", trst, srst);
160 if(!srst)
161 {
162 ZY1000_POKE(ZY1000_JTAG_BASE+0x14, 0x00000001);
163 }
164 else
165 {
166 /* Danger!!! if clk!=0 when in
167 * idle in TAP_IDLE, reset halt on str912 will fail.
168 */
169 ZY1000_POKE(ZY1000_JTAG_BASE+0x10, 0x00000001);
170 }
171
172 if(!trst)
173 {
174 ZY1000_POKE(ZY1000_JTAG_BASE+0x14, 0x00000002);
175 }
176 else
177 {
178 /* assert reset */
179 ZY1000_POKE(ZY1000_JTAG_BASE+0x10, 0x00000002);
180 }
181
182 if (trst||(srst&&(jtag_reset_config & RESET_SRST_PULLS_TRST)))
183 {
184 waitIdle();
185 /* we're now in the RESET state until trst is deasserted */
186 ZY1000_POKE(ZY1000_JTAG_BASE+0x20, TAP_RESET);
187 } else
188 {
189 /* We'll get RCLK failure when we assert TRST, so clear any false positives here */
190 ZY1000_POKE(ZY1000_JTAG_BASE+0x14, 0x400);
191 }
192
193 /* wait for srst to float back up */
194 if (!srst)
195 {
196 int i;
197 for (i=0; i<1000; i++)
198 {
199 // We don't want to sense our own reset, so we clear here.
200 // There is of course a timing hole where we could loose
201 // a "real" reset.
202 if (!readSRST())
203 break;
204
205 /* wait 1ms */
206 alive_sleep(1);
207 }
208
209 if (i==1000)
210 {
211 LOG_USER("SRST didn't deassert after %dms", i);
212 } else if (i>1)
213 {
214 LOG_USER("SRST took %dms to deassert", i);
215 }
216 }
217 }
218
219 int zy1000_speed(int speed)
220 {
221 if(speed == 0)
222 {
223 /*0 means RCLK*/
224 speed = 0;
225 ZY1000_POKE(ZY1000_JTAG_BASE+0x10, 0x100);
226 LOG_DEBUG("jtag_speed using RCLK");
227 }
228 else
229 {
230 if(speed > 8190 || speed < 2)
231 {
232 LOG_USER("valid ZY1000 jtag_speed=[8190,2]. Divisor is 64MHz / even values between 8190-2, i.e. min 7814Hz, max 32MHz");
233 return ERROR_INVALID_ARGUMENTS;
234 }
235
236 LOG_USER("jtag_speed %d => JTAG clk=%f", speed, 64.0/(float)speed);
237 ZY1000_POKE(ZY1000_JTAG_BASE+0x14, 0x100);
238 ZY1000_POKE(ZY1000_JTAG_BASE+0x1c, speed&~1);
239 }
240 return ERROR_OK;
241 }
242
243 static bool savePower;
244
245
246 static void setPower(bool power)
247 {
248 savePower = power;
249 if (power)
250 {
251 HAL_WRITE_UINT32(ZY1000_JTAG_BASE+0x14, 0x8);
252 } else
253 {
254 HAL_WRITE_UINT32(ZY1000_JTAG_BASE+0x10, 0x8);
255 }
256 }
257
258 int handle_power_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
259 {
260 if (argc > 1)
261 {
262 return ERROR_INVALID_ARGUMENTS;
263 }
264
265 if (argc == 1)
266 {
267 if (strcmp(args[0], "on") == 0)
268 {
269 setPower(1);
270 }
271 else if (strcmp(args[0], "off") == 0)
272 {
273 setPower(0);
274 } else
275 {
276 command_print(cmd_ctx, "arg is \"on\" or \"off\"");
277 return ERROR_INVALID_ARGUMENTS;
278 }
279 }
280
281 command_print(cmd_ctx, "Target power %s", savePower ? "on" : "off");
282
283 return ERROR_OK;
284 }
285
286
287 /* Give TELNET a way to find out what version this is */
288 static int jim_zy1000_version(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
289 {
290 if ((argc < 1) || (argc > 2))
291 return JIM_ERR;
292 char buff[128];
293 const char *version_str=NULL;
294
295 if (argc == 1)
296 {
297 version_str=ZYLIN_OPENOCD_VERSION;
298 } else
299 {
300 const char *str = Jim_GetString(argv[1], NULL);
301 if (strcmp("openocd", str) == 0)
302 {
303 int revision;
304 revision = atol(ZYLIN_OPENOCD+strlen("XRevision: "));
305 sprintf(buff, "%d", revision);
306 version_str=buff;
307 }
308 else if (strcmp("zy1000", str) == 0)
309 {
310 version_str=ZYLIN_VERSION;
311 }
312 else if (strcmp("date", str) == 0)
313 {
314 version_str=ZYLIN_DATE;
315 }
316 else
317 {
318 return JIM_ERR;
319 }
320 }
321
322 Jim_SetResult(interp, Jim_NewStringObj(interp, version_str, -1));
323
324 return JIM_OK;
325 }
326
327
328 static int
329 zylinjtag_Jim_Command_powerstatus(Jim_Interp *interp,
330 int argc,
331 Jim_Obj * const *argv)
332 {
333 if (argc != 1)
334 {
335 Jim_WrongNumArgs(interp, 1, argv, "powerstatus");
336 return JIM_ERR;
337 }
338
339 cyg_uint32 status;
340 ZY1000_PEEK(ZY1000_JTAG_BASE+0x10, status);
341
342 Jim_SetResult(interp, Jim_NewIntObj(interp, (status&0x80)!=0));
343
344 return JIM_OK;
345 }
346
347 int zy1000_register_commands(struct command_context_s *cmd_ctx)
348 {
349 register_command(cmd_ctx, NULL, "power", handle_power_command, COMMAND_ANY,
350 "power <on/off> - turn power switch to target on/off. No arguments - print status.");
351
352 Jim_CreateCommand(interp, "zy1000_version", jim_zy1000_version, NULL, NULL);
353
354
355 Jim_CreateCommand(interp, "powerstatus", zylinjtag_Jim_Command_powerstatus, NULL, NULL);
356
357 return ERROR_OK;
358 }
359
360
361
362
363 int zy1000_init(void)
364 {
365 LOG_USER("%s", ZYLIN_OPENOCD_VERSION);
366
367 ZY1000_POKE(ZY1000_JTAG_BASE+0x10, 0x30); // Turn on LED1 & LED2
368
369 setPower(true); // on by default
370
371
372 /* deassert resets. Important to avoid infinite loop waiting for SRST to deassert */
373 zy1000_reset(0, 0);
374 zy1000_speed(jtag_speed);
375
376 bitbang_interface = &zy1000_bitbang;
377
378 return ERROR_OK;
379 }
380
381 int zy1000_quit(void)
382 {
383
384 return ERROR_OK;
385 }
386
387
388
389
390 int interface_jtag_execute_queue(void)
391 {
392 cyg_uint32 empty;
393
394 waitIdle();
395 ZY1000_PEEK(ZY1000_JTAG_BASE+0x10, empty);
396 /* clear JTAG error register */
397 ZY1000_POKE(ZY1000_JTAG_BASE+0x14, 0x400);
398
399 if ((empty&0x400)!=0)
400 {
401 LOG_WARNING("RCLK timeout");
402 /* the error is informative only as we don't want to break the firmware if there
403 * is a false positive.
404 */
405 // return ERROR_FAIL;
406 }
407 return ERROR_OK;
408 }
409
410
411
412
413
414 static cyg_uint32 getShiftValue(void)
415 {
416 cyg_uint32 value;
417 waitIdle();
418 ZY1000_PEEK(ZY1000_JTAG_BASE+0xc, value);
419 VERBOSE(LOG_INFO("getShiftValue %08x", value));
420 return value;
421 }
422 #if 0
423 static cyg_uint32 getShiftValueFlip(void)
424 {
425 cyg_uint32 value;
426 waitIdle();
427 ZY1000_PEEK(ZY1000_JTAG_BASE+0x18, value);
428 VERBOSE(LOG_INFO("getShiftValue %08x (flipped)", value));
429 return value;
430 }
431 #endif
432
433 #if 0
434 static void shiftValueInnerFlip(const tap_state_t state, const tap_state_t endState, int repeat, cyg_uint32 value)
435 {
436 VERBOSE(LOG_INFO("shiftValueInner %s %s %d %08x (flipped)", tap_state_name(state), tap_state_name(endState), repeat, value));
437 cyg_uint32 a,b;
438 a=state;
439 b=endState;
440 ZY1000_POKE(ZY1000_JTAG_BASE+0xc, value);
441 ZY1000_POKE(ZY1000_JTAG_BASE+0x8, (1<<15)|(repeat<<8)|(a<<4)|b);
442 VERBOSE(getShiftValueFlip());
443 }
444 #endif
445
446 extern int jtag_check_value(u8 *captured, void *priv);
447
448 static void gotoEndState(void)
449 {
450 setCurrentState(cmd_queue_end_state);
451 }
452
453 static __inline void scanFields(int num_fields, scan_field_t *fields, tap_state_t shiftState, int pause)
454 {
455 int i;
456 int j;
457 int k;
458
459 for (i = 0; i < num_fields; i++)
460 {
461 cyg_uint32 value;
462
463 static u8 *in_buff=NULL; /* pointer to buffer for scanned data */
464 static int in_buff_size=0;
465 u8 *inBuffer=NULL;
466
467
468 // figure out where to store the input data
469 int num_bits=fields[i].num_bits;
470 if (fields[i].in_value!=NULL)
471 {
472 inBuffer=fields[i].in_value;
473 } else if (fields[i].in_handler!=NULL)
474 {
475 if (in_buff_size*8<num_bits)
476 {
477 // we need more space
478 if (in_buff!=NULL)
479 free(in_buff);
480 in_buff=NULL;
481 in_buff_size=(num_bits+7)/8;
482 in_buff=malloc(in_buff_size);
483 if (in_buff==NULL)
484 {
485 LOG_ERROR("Out of memory");
486 jtag_error=ERROR_JTAG_QUEUE_FAILED;
487 return;
488 }
489 }
490 inBuffer=in_buff;
491 }
492
493 // here we shuffle N bits out/in
494 j=0;
495 while (j<num_bits)
496 {
497 tap_state_t pause_state;
498 int l;
499 k=num_bits-j;
500 pause_state=(shiftState==TAP_DRSHIFT)?TAP_DRSHIFT:TAP_IRSHIFT;
501 if (k>32)
502 {
503 k=32;
504 /* we have more to shift out */
505 } else if (pause&&(i == num_fields-1))
506 {
507 /* this was the last to shift out this time */
508 pause_state=(shiftState==TAP_DRSHIFT)?TAP_DRPAUSE:TAP_IRPAUSE;
509 }
510
511 // we have (num_bits+7)/8 bytes of bits to toggle out.
512 // bits are pushed out LSB to MSB
513 value=0;
514 if (fields[i].out_value!=NULL)
515 {
516 for (l=0; l<k; l+=8)
517 {
518 value|=fields[i].out_value[(j+l)/8]<<l;
519 }
520 }
521 /* mask away unused bits for easier debugging */
522 value&=~(((u32)0xffffffff)<<k);
523
524 shiftValueInner(shiftState, pause_state, k, value);
525
526 if (inBuffer!=NULL)
527 {
528 // data in, LSB to MSB
529 value=getShiftValue();
530 // we're shifting in data to MSB, shift data to be aligned for returning the value
531 value >>= 32-k;
532
533 for (l=0; l<k; l+=8)
534 {
535 inBuffer[(j+l)/8]=(value>>l)&0xff;
536 }
537 }
538 j+=k;
539 }
540
541 if (fields[i].in_handler!=NULL)
542 {
543 // invoke callback
544 int r=fields[i].in_handler(inBuffer, fields[i].in_handler_priv, fields+i);
545 if (r!=ERROR_OK)
546 {
547 /* this will cause jtag_execute_queue() to return an error */
548 jtag_error=r;
549 }
550 }
551 }
552 }
553
554 int interface_jtag_add_end_state(tap_state_t state)
555 {
556 return ERROR_OK;
557 }
558
559
560 int interface_jtag_add_ir_scan(int num_fields, scan_field_t *fields, tap_state_t state)
561 {
562
563 int j;
564 int scan_size = 0;
565 jtag_tap_t *tap, *nextTap;
566 for(tap = jtag_NextEnabledTap(NULL); tap!= NULL; tap=nextTap)
567 {
568 nextTap=jtag_NextEnabledTap(tap);
569 int pause=(nextTap==NULL);
570
571 int found = 0;
572
573 scan_size = tap->ir_length;
574
575 /* search the list */
576 for (j=0; j < num_fields; j++)
577 {
578 if (tap == fields[j].tap)
579 {
580 found = 1;
581
582 if ((jtag_verify_capture_ir)&&(fields[j].in_handler==NULL))
583 {
584 jtag_set_check_value(fields+j, tap->expected, tap->expected_mask, NULL);
585 } else if (jtag_verify_capture_ir)
586 {
587 fields[j].in_check_value = tap->expected;
588 fields[j].in_check_mask = tap->expected_mask;
589 }
590
591 scanFields(1, fields+j, TAP_IRSHIFT, pause);
592 /* update device information */
593 buf_cpy(fields[j].out_value, tap->cur_instr, scan_size);
594
595 tap->bypass = 0;
596 break;
597 }
598 }
599
600 if (!found)
601 {
602 /* if a device isn't listed, set it to BYPASS */
603 u8 ones[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
604
605 scan_field_t tmp;
606 memset(&tmp, 0, sizeof(tmp));
607 tmp.out_value = ones;
608 tmp.num_bits = scan_size;
609 scanFields(1, &tmp, TAP_IRSHIFT, pause);
610 /* update device information */
611 buf_cpy(tmp.out_value, tap->cur_instr, scan_size);
612 tap->bypass = 1;
613 }
614 }
615 gotoEndState();
616
617 return ERROR_OK;
618 }
619
620
621
622
623
624 int interface_jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, tap_state_t state)
625 {
626 scanFields(num_fields, fields, TAP_IRSHIFT, 1);
627 gotoEndState();
628
629 return ERROR_OK;
630 }
631
632 /*extern jtag_command_t **jtag_get_last_command_p(void);*/
633
634 int interface_jtag_add_dr_scan(int num_fields, scan_field_t *fields, tap_state_t state)
635 {
636
637 int j;
638 jtag_tap_t *tap, *nextTap;
639 for(tap = jtag_NextEnabledTap(NULL); tap!= NULL; tap=nextTap)
640 {
641 nextTap=jtag_NextEnabledTap(tap);
642 int found=0;
643 int pause=(nextTap==NULL);
644
645 for (j=0; j < num_fields; j++)
646 {
647 if (tap == fields[j].tap)
648 {
649 found = 1;
650
651 scanFields(1, fields+j, TAP_DRSHIFT, pause);
652 }
653 }
654 if (!found)
655 {
656 scan_field_t tmp;
657 /* program the scan field to 1 bit length, and ignore it's value */
658 tmp.num_bits = 1;
659 tmp.out_value = NULL;
660 tmp.in_value = NULL;
661 tmp.in_check_value = NULL;
662 tmp.in_check_mask = NULL;
663 tmp.in_handler = NULL;
664 tmp.in_handler_priv = NULL;
665
666 scanFields(1, &tmp, TAP_DRSHIFT, pause);
667 }
668 else
669 {
670 }
671 }
672 gotoEndState();
673 return ERROR_OK;
674 }
675
676 int interface_jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, tap_state_t state)
677 {
678 scanFields(num_fields, fields, TAP_DRSHIFT, 1);
679 gotoEndState();
680 return ERROR_OK;
681 }
682
683
684 int interface_jtag_add_tlr()
685 {
686 setCurrentState(TAP_RESET);
687 return ERROR_OK;
688 }
689
690
691
692
693 extern int jtag_nsrst_delay;
694 extern int jtag_ntrst_delay;
695
696 int interface_jtag_add_reset(int req_trst, int req_srst)
697 {
698 zy1000_reset(req_trst, req_srst);
699 return ERROR_OK;
700 }
701
702 static int zy1000_jtag_add_clocks(int num_cycles, tap_state_t state, tap_state_t clockstate)
703 {
704 /* num_cycles can be 0 */
705 setCurrentState(clockstate);
706
707 /* execute num_cycles, 32 at the time. */
708 int i;
709 for (i=0; i<num_cycles; i+=32)
710 {
711 int num;
712 num=32;
713 if (num_cycles-i<num)
714 {
715 num=num_cycles-i;
716 }
717 shiftValueInner(clockstate, clockstate, num, 0);
718 }
719
720 #if !TEST_MANUAL()
721 /* finish in end_state */
722 setCurrentState(state);
723 #else
724 tap_state_t t=TAP_IDLE;
725 /* test manual drive code on any target */
726 int tms;
727 u8 tms_scan = tap_get_tms_path(t, state);
728
729 for (i = 0; i < 7; i++)
730 {
731 tms = (tms_scan >> i) & 1;
732 waitIdle();
733 ZY1000_POKE(ZY1000_JTAG_BASE+0x28, tms);
734 }
735 waitIdle();
736 ZY1000_POKE(ZY1000_JTAG_BASE+0x20, state);
737 #endif
738
739
740 return ERROR_OK;
741 }
742
743 int interface_jtag_add_runtest(int num_cycles, tap_state_t state)
744 {
745 return zy1000_jtag_add_clocks(num_cycles, state, TAP_IDLE);
746 }
747
748 int interface_jtag_add_clocks(int num_cycles)
749 {
750 return zy1000_jtag_add_clocks(num_cycles, cmd_queue_cur_state, cmd_queue_end_state);
751 }
752
753 int interface_jtag_add_sleep(u32 us)
754 {
755 jtag_sleep(us);
756 return ERROR_OK;
757 }
758
759 int interface_jtag_add_pathmove(int num_states, tap_state_t *path)
760 {
761 int state_count;
762 int tms = 0;
763
764 /*wait for the fifo to be empty*/
765 waitIdle();
766
767 state_count = 0;
768
769 tap_state_t cur_state=cmd_queue_cur_state;
770
771 while (num_states)
772 {
773 if (tap_state_transition(cur_state, false) == path[state_count])
774 {
775 tms = 0;
776 }
777 else if (tap_state_transition(cur_state, true) == path[state_count])
778 {
779 tms = 1;
780 }
781 else
782 {
783 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state), tap_state_name(path[state_count]));
784 exit(-1);
785 }
786
787 waitIdle();
788 ZY1000_POKE(ZY1000_JTAG_BASE+0x28, tms);
789
790 cur_state = path[state_count];
791 state_count++;
792 num_states--;
793 }
794
795 waitIdle();
796 ZY1000_POKE(ZY1000_JTAG_BASE+0x20, cur_state);
797 return ERROR_OK;
798 }
799
800
801
802 void embeddedice_write_dcc(jtag_tap_t *tap, int reg_addr, u8 *buffer, int little, int count)
803 {
804 // static int const reg_addr=0x5;
805 tap_state_t end_state=cmd_queue_end_state;
806 if (jtag_NextEnabledTap(jtag_NextEnabledTap(NULL))==NULL)
807 {
808 /* better performance via code duplication */
809 if (little)
810 {
811 int i;
812 for (i = 0; i < count; i++)
813 {
814 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, 1));
815 shiftValueInner(TAP_DRSHIFT, end_state, 6, reg_addr|(1<<5));
816 buffer+=4;
817 }
818 } else
819 {
820 int i;
821 for (i = 0; i < count; i++)
822 {
823 shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, 0));
824 shiftValueInner(TAP_DRSHIFT, end_state, 6, reg_addr|(1<<5));
825 buffer+=4;
826 }
827 }
828 }
829 else
830 {
831 int i;
832 for (i = 0; i < count; i++)
833 {
834 embeddedice_write_reg_inner(tap, reg_addr, fast_target_buffer_get_u32(buffer, little));
835 buffer += 4;
836 }
837 }
838 }
839
840 int loadFile(const char *fileName, void **data, int *len);
841
842 /* boolean parameter stored on config */
843 int boolParam(char *var)
844 {
845 bool result = false;
846 char *name = alloc_printf("%s/%s", zylin_config_dir, var);
847 if (name == NULL)
848 return result;
849
850 void *data;
851 int len;
852 if (loadFile(name, &data, &len) == ERROR_OK)
853 {
854 if (len > 1)
855 len = 1;
856 result = strncmp((char *) data, "1", len) == 0;
857 free(data);
858 }
859 free(name);
860 return result;
861 }
862
863

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)