1 /***************************************************************************
2 * Copyright (C) 2007-2008 by Øyvind Harboe *
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. *
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. *
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 ***************************************************************************/
23 #define INCLUDE_JTAG_INTERFACE_H
24 #include "embeddedice.h"
25 #include "minidriver.h"
26 #include "interface.h"
29 #include <cyg/hal/hal_io.h> // low level i/o
30 #include <cyg/hal/hal_diag.h>
33 #define ZYLIN_VERSION "1.52"
34 #define ZYLIN_DATE __DATE__
35 #define ZYLIN_TIME __TIME__
36 #define ZYLIN_OPENOCD "$Revision$"
37 #define ZYLIN_OPENOCD_VERSION "Zylin JTAG ZY1000 " ZYLIN_VERSION " " ZYLIN_DATE " " ZYLIN_TIME
38 const char *zylin_config_dir
="/config/settings";
40 /* low level command set
42 int zy1000_read(void);
43 static void zy1000_write(int tck
, int tms
, int tdi
);
44 void zy1000_reset(int trst
, int srst
);
47 int zy1000_speed(int speed
);
48 int zy1000_register_commands(struct command_context_s
*cmd_ctx
);
49 int zy1000_init(void);
50 int zy1000_quit(void);
52 /* interface commands */
53 int zy1000_handle_zy1000_port_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
55 static int zy1000_khz(int khz
, int *jtag_speed
)
63 *jtag_speed
=64000/khz
;
68 static int zy1000_speed_div(int speed
, int *khz
)
82 static bool readPowerDropout(void)
85 // sample and clear power dropout
86 HAL_WRITE_UINT32(ZY1000_JTAG_BASE
+0x10, 0x80);
87 HAL_READ_UINT32(ZY1000_JTAG_BASE
+0x10, state
);
89 powerDropout
= (state
& 0x80) != 0;
94 static bool readSRST(void)
97 // sample and clear SRST sensing
98 HAL_WRITE_UINT32(ZY1000_JTAG_BASE
+0x10, 0x00000040);
99 HAL_READ_UINT32(ZY1000_JTAG_BASE
+0x10, state
);
101 srstAsserted
= (state
& 0x40) != 0;
105 static int zy1000_srst_asserted(int *srst_asserted
)
107 *srst_asserted
=readSRST();
111 static int zy1000_power_dropout(int *dropout
)
113 *dropout
=readPowerDropout();
118 jtag_interface_t zy1000_interface
=
121 .execute_queue
= bitbang_execute_queue
,
122 .speed
= zy1000_speed
,
123 .register_commands
= zy1000_register_commands
,
127 .speed_div
= zy1000_speed_div
,
128 .power_dropout
= zy1000_power_dropout
,
129 .srst_asserted
= zy1000_srst_asserted
,
132 bitbang_interface_t zy1000_bitbang
=
135 .write
= zy1000_write
,
136 .reset
= zy1000_reset
141 static void zy1000_write(int tck
, int tms
, int tdi
)
146 int zy1000_read(void)
151 extern bool readSRST(void);
153 void zy1000_reset(int trst
, int srst
)
155 LOG_DEBUG("zy1000 trst=%d, srst=%d", trst
, srst
);
158 ZY1000_POKE(ZY1000_JTAG_BASE
+0x14, 0x00000001);
162 /* Danger!!! if clk!=0 when in
163 * idle in TAP_IDLE, reset halt on str912 will fail.
165 ZY1000_POKE(ZY1000_JTAG_BASE
+0x10, 0x00000001);
170 ZY1000_POKE(ZY1000_JTAG_BASE
+0x14, 0x00000002);
175 ZY1000_POKE(ZY1000_JTAG_BASE
+0x10, 0x00000002);
178 if (trst
||(srst
&&(jtag_reset_config
& RESET_SRST_PULLS_TRST
)))
181 /* we're now in the RESET state until trst is deasserted */
182 ZY1000_POKE(ZY1000_JTAG_BASE
+0x20, TAP_RESET
);
185 /* We'll get RCLK failure when we assert TRST, so clear any false positives here */
186 ZY1000_POKE(ZY1000_JTAG_BASE
+0x14, 0x400);
189 /* wait for srst to float back up */
193 for (i
=0; i
<1000; i
++)
195 // We don't want to sense our own reset, so we clear here.
196 // There is of course a timing hole where we could loose
207 LOG_USER("SRST didn't deassert after %dms", i
);
210 LOG_USER("SRST took %dms to deassert", i
);
215 int zy1000_speed(int speed
)
221 ZY1000_POKE(ZY1000_JTAG_BASE
+0x10, 0x100);
222 LOG_DEBUG("jtag_speed using RCLK");
226 if(speed
> 8190 || speed
< 2)
228 LOG_USER("valid ZY1000 jtag_speed=[8190,2]. Divisor is 64MHz / even values between 8190-2, i.e. min 7814Hz, max 32MHz");
229 return ERROR_INVALID_ARGUMENTS
;
232 LOG_USER("jtag_speed %d => JTAG clk=%f", speed
, 64.0/(float)speed
);
233 ZY1000_POKE(ZY1000_JTAG_BASE
+0x14, 0x100);
234 ZY1000_POKE(ZY1000_JTAG_BASE
+0x1c, speed
&~1);
239 static bool savePower
;
242 static void setPower(bool power
)
247 HAL_WRITE_UINT32(ZY1000_JTAG_BASE
+0x14, 0x8);
250 HAL_WRITE_UINT32(ZY1000_JTAG_BASE
+0x10, 0x8);
254 int handle_power_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
258 return ERROR_INVALID_ARGUMENTS
;
263 if (strcmp(args
[0], "on") == 0)
267 else if (strcmp(args
[0], "off") == 0)
272 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
273 return ERROR_INVALID_ARGUMENTS
;
277 command_print(cmd_ctx
, "Target power %s", savePower
? "on" : "off");
283 /* Give TELNET a way to find out what version this is */
284 static int jim_zy1000_version(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
286 if ((argc
< 1) || (argc
> 2))
289 const char *version_str
=NULL
;
293 version_str
=ZYLIN_OPENOCD_VERSION
;
296 const char *str
= Jim_GetString(argv
[1], NULL
);
297 if (strcmp("openocd", str
) == 0)
300 revision
= atol(ZYLIN_OPENOCD
+strlen("XRevision: "));
301 sprintf(buff
, "%d", revision
);
304 else if (strcmp("zy1000", str
) == 0)
306 version_str
=ZYLIN_VERSION
;
308 else if (strcmp("date", str
) == 0)
310 version_str
=ZYLIN_DATE
;
318 Jim_SetResult(interp
, Jim_NewStringObj(interp
, version_str
, -1));
325 zylinjtag_Jim_Command_powerstatus(Jim_Interp
*interp
,
327 Jim_Obj
* const *argv
)
331 Jim_WrongNumArgs(interp
, 1, argv
, "powerstatus");
336 ZY1000_PEEK(ZY1000_JTAG_BASE
+0x10, status
);
338 Jim_SetResult(interp
, Jim_NewIntObj(interp
, (status
&0x80)!=0));
343 int zy1000_register_commands(struct command_context_s
*cmd_ctx
)
345 register_command(cmd_ctx
, NULL
, "power", handle_power_command
, COMMAND_ANY
,
346 "power <on/off> - turn power switch to target on/off. No arguments - print status.");
348 Jim_CreateCommand(interp
, "zy1000_version", jim_zy1000_version
, NULL
, NULL
);
351 Jim_CreateCommand(interp
, "powerstatus", zylinjtag_Jim_Command_powerstatus
, NULL
, NULL
);
359 int zy1000_init(void)
361 LOG_USER("%s", ZYLIN_OPENOCD_VERSION
);
363 ZY1000_POKE(ZY1000_JTAG_BASE
+0x10, 0x30); // Turn on LED1 & LED2
365 setPower(true); // on by default
368 /* deassert resets. Important to avoid infinite loop waiting for SRST to deassert */
370 zy1000_speed(jtag_speed
);
372 bitbang_interface
= &zy1000_bitbang
;
377 int zy1000_quit(void)
385 int interface_jtag_execute_queue(void)
390 ZY1000_PEEK(ZY1000_JTAG_BASE
+0x10, empty
);
391 /* clear JTAG error register */
392 ZY1000_POKE(ZY1000_JTAG_BASE
+0x14, 0x400);
394 if ((empty
&0x400)!=0)
396 LOG_WARNING("RCLK timeout");
397 /* the error is informative only as we don't want to break the firmware if there
398 * is a false positive.
400 // return ERROR_FAIL;
409 static cyg_uint32
getShiftValue(void)
413 ZY1000_PEEK(ZY1000_JTAG_BASE
+0xc, value
);
414 VERBOSE(LOG_INFO("getShiftValue %08x", value
));
418 static cyg_uint32
getShiftValueFlip(void)
422 ZY1000_PEEK(ZY1000_JTAG_BASE
+0x18, value
);
423 VERBOSE(LOG_INFO("getShiftValue %08x (flipped)", value
));
429 static void shiftValueInnerFlip(const tap_state_t state
, const tap_state_t endState
, int repeat
, cyg_uint32 value
)
431 VERBOSE(LOG_INFO("shiftValueInner %s %s %d %08x (flipped)", tap_state_name(state
), tap_state_name(endState
), repeat
, value
));
435 ZY1000_POKE(ZY1000_JTAG_BASE
+0xc, value
);
436 ZY1000_POKE(ZY1000_JTAG_BASE
+0x8, (1<<15)|(repeat
<<8)|(a
<<4)|b
);
437 VERBOSE(getShiftValueFlip());
441 extern int jtag_check_value(u8
*captured
, void *priv
);
443 static void gotoEndState(void)
445 setCurrentState(cmd_queue_end_state
);
448 static __inline
void scanFields(int num_fields
, scan_field_t
*fields
, tap_state_t shiftState
, tap_state_t end_state
)
454 for (i
= 0; i
< num_fields
; i
++)
458 static u8
*in_buff
=NULL
; /* pointer to buffer for scanned data */
459 static int in_buff_size
=0;
463 // figure out where to store the input data
464 int num_bits
=fields
[i
].num_bits
;
465 if (fields
[i
].in_value
!=NULL
)
467 inBuffer
=fields
[i
].in_value
;
470 // here we shuffle N bits out/in
474 tap_state_t pause_state
;
477 pause_state
=(shiftState
==TAP_DRSHIFT
)?TAP_DRSHIFT
:TAP_IRSHIFT
;
481 /* we have more to shift out */
482 } else if (i
== num_fields
-1)
484 /* this was the last to shift out this time */
485 pause_state
=end_state
;
488 // we have (num_bits+7)/8 bytes of bits to toggle out.
489 // bits are pushed out LSB to MSB
491 if (fields
[i
].out_value
!=NULL
)
495 value
|=fields
[i
].out_value
[(j
+l
)/8]<<l
;
498 /* mask away unused bits for easier debugging */
499 value
&=~(((u32
)0xffffffff)<<k
);
501 shiftValueInner(shiftState
, pause_state
, k
, value
);
505 // data in, LSB to MSB
506 value
=getShiftValue();
507 // we're shifting in data to MSB, shift data to be aligned for returning the value
512 inBuffer
[(j
+l
)/8]=(value
>>l
)&0xff;
520 int interface_jtag_add_end_state(tap_state_t state
)
526 int interface_jtag_add_ir_scan(int num_fields
, const scan_field_t
*fields
, tap_state_t state
)
531 jtag_tap_t
*tap
, *nextTap
;
532 for(tap
= jtag_NextEnabledTap(NULL
); tap
!= NULL
; tap
=nextTap
)
534 nextTap
=jtag_NextEnabledTap(tap
);
535 tap_state_t end_state
;
538 end_state
= cmd_queue_end_state
;
541 end_state
= TAP_IRSHIFT
;
546 scan_size
= tap
->ir_length
;
548 /* search the list */
549 for (j
=0; j
< num_fields
; j
++)
551 if (tap
== fields
[j
].tap
)
555 scanFields(1, fields
+j
, TAP_IRSHIFT
, end_state
);
556 /* update device information */
557 buf_cpy(fields
[j
].out_value
, tap
->cur_instr
, scan_size
);
566 /* if a device isn't listed, set it to BYPASS */
567 u8 ones
[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
570 memset(&tmp
, 0, sizeof(tmp
));
571 tmp
.out_value
= ones
;
572 tmp
.num_bits
= scan_size
;
573 scanFields(1, &tmp
, TAP_IRSHIFT
, end_state
);
574 /* update device information */
575 buf_cpy(tmp
.out_value
, tap
->cur_instr
, scan_size
);
587 int interface_jtag_add_plain_ir_scan(int num_fields
, const scan_field_t
*fields
, tap_state_t state
)
589 scanFields(num_fields
, fields
, TAP_IRSHIFT
, cmd_queue_end_state
);
594 /*extern jtag_command_t **jtag_get_last_command_p(void);*/
596 int interface_jtag_add_dr_scan(int num_fields
, const scan_field_t
*fields
, tap_state_t state
)
600 jtag_tap_t
*tap
, *nextTap
;
601 for(tap
= jtag_NextEnabledTap(NULL
); tap
!= NULL
; tap
=nextTap
)
603 nextTap
=jtag_NextEnabledTap(tap
);
605 tap_state_t end_state
;
608 end_state
= cmd_queue_end_state
;
611 end_state
= TAP_DRSHIFT
;
614 for (j
=0; j
< num_fields
; j
++)
616 if (tap
== fields
[j
].tap
)
620 scanFields(1, fields
+j
, TAP_DRSHIFT
, end_state
);
626 /* program the scan field to 1 bit length, and ignore it's value */
628 tmp
.out_value
= NULL
;
631 scanFields(1, &tmp
, TAP_DRSHIFT
, end_state
);
640 int interface_jtag_add_plain_dr_scan(int num_fields
, const scan_field_t
*fields
, tap_state_t state
)
642 scanFields(num_fields
, fields
, TAP_DRSHIFT
, cmd_queue_end_state
);
647 int interface_jtag_add_tlr()
649 setCurrentState(TAP_RESET
);
656 extern int jtag_nsrst_delay
;
657 extern int jtag_ntrst_delay
;
659 int interface_jtag_add_reset(int req_trst
, int req_srst
)
661 zy1000_reset(req_trst
, req_srst
);
665 static int zy1000_jtag_add_clocks(int num_cycles
, tap_state_t state
, tap_state_t clockstate
)
667 /* num_cycles can be 0 */
668 setCurrentState(clockstate
);
670 /* execute num_cycles, 32 at the time. */
672 for (i
=0; i
<num_cycles
; i
+=32)
676 if (num_cycles
-i
<num
)
680 shiftValueInner(clockstate
, clockstate
, num
, 0);
684 /* finish in end_state */
685 setCurrentState(state
);
687 tap_state_t t
=TAP_IDLE
;
688 /* test manual drive code on any target */
690 u8 tms_scan
= tap_get_tms_path(t
, state
);
691 int tms_count
= tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
693 for (i
= 0; i
< tms_count
; i
++)
695 tms
= (tms_scan
>> i
) & 1;
697 ZY1000_POKE(ZY1000_JTAG_BASE
+0x28, tms
);
700 ZY1000_POKE(ZY1000_JTAG_BASE
+0x20, state
);
707 int interface_jtag_add_runtest(int num_cycles
, tap_state_t state
)
709 return zy1000_jtag_add_clocks(num_cycles
, state
, TAP_IDLE
);
712 int interface_jtag_add_clocks(int num_cycles
)
714 return zy1000_jtag_add_clocks(num_cycles
, cmd_queue_cur_state
, cmd_queue_end_state
);
717 int interface_jtag_add_sleep(u32 us
)
723 int interface_jtag_add_pathmove(int num_states
, const tap_state_t
*path
)
728 /*wait for the fifo to be empty*/
733 tap_state_t cur_state
=cmd_queue_cur_state
;
737 if (tap_state_transition(cur_state
, false) == path
[state_count
])
741 else if (tap_state_transition(cur_state
, true) == path
[state_count
])
747 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state
), tap_state_name(path
[state_count
]));
752 ZY1000_POKE(ZY1000_JTAG_BASE
+0x28, tms
);
754 cur_state
= path
[state_count
];
760 ZY1000_POKE(ZY1000_JTAG_BASE
+0x20, cur_state
);
766 void embeddedice_write_dcc(jtag_tap_t
*tap
, int reg_addr
, u8
*buffer
, int little
, int count
)
768 // static int const reg_addr=0x5;
769 tap_state_t end_state
=cmd_queue_end_state
;
770 if (jtag_NextEnabledTap(jtag_NextEnabledTap(NULL
))==NULL
)
772 /* better performance via code duplication */
776 for (i
= 0; i
< count
; i
++)
778 shiftValueInner(TAP_DRSHIFT
, TAP_DRSHIFT
, 32, fast_target_buffer_get_u32(buffer
, 1));
779 shiftValueInner(TAP_DRSHIFT
, end_state
, 6, reg_addr
|(1<<5));
785 for (i
= 0; i
< count
; i
++)
787 shiftValueInner(TAP_DRSHIFT
, TAP_DRSHIFT
, 32, fast_target_buffer_get_u32(buffer
, 0));
788 shiftValueInner(TAP_DRSHIFT
, end_state
, 6, reg_addr
|(1<<5));
796 for (i
= 0; i
< count
; i
++)
798 embeddedice_write_reg_inner(tap
, reg_addr
, fast_target_buffer_get_u32(buffer
, little
));
804 int loadFile(const char *fileName
, void **data
, int *len
);
806 /* boolean parameter stored on config */
807 int boolParam(char *var
)
810 char *name
= alloc_printf("%s/%s", zylin_config_dir
, var
);
816 if (loadFile(name
, &data
, &len
) == ERROR_OK
)
820 result
= strncmp((char *) data
, "1", len
) == 0;
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)