1 /***************************************************************************
2 * Copyright (C) 2007-2009 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 ***************************************************************************/
20 /* This file supports the zy1000 debugger: http://www.zylin.com/zy1000.html
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.
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).
33 * The zy1000 revc hardware is using an Altera Nios CPU, whereas the
34 * revb is using ARM7 + Xilinx.
36 * See Zylin web pages or contact Zylin for more information.
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
48 #include <target/embeddedice.h>
49 #include <jtag/minidriver.h>
50 #include <jtag/interface.h>
51 #include "zy1000_version.h"
53 #include <cyg/hal/hal_io.h> // low level i/o
54 #include <cyg/hal/hal_diag.h>
58 #ifdef CYGPKG_HAL_NIOS2
59 #include <cyg/hal/io.h>
60 #include <cyg/firmwareutil/firmwareutil.h>
63 #define ZYLIN_VERSION GIT_ZY1000_VERSION
64 #define ZYLIN_DATE __DATE__
65 #define ZYLIN_TIME __TIME__
66 #define ZYLIN_OPENOCD GIT_OPENOCD_VERSION
67 #define ZYLIN_OPENOCD_VERSION "ZY1000 " ZYLIN_VERSION " " ZYLIN_DATE
70 static int zy1000_khz(int khz
, int *jtag_speed
)
78 *jtag_speed
= 64000/khz
;
83 static int zy1000_speed_div(int speed
, int *khz
)
97 static bool readPowerDropout(void)
100 // sample and clear power dropout
101 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x10, 0x80);
102 ZY1000_PEEK(ZY1000_JTAG_BASE
+ 0x10, state
);
104 powerDropout
= (state
& 0x80) != 0;
109 static bool readSRST(void)
112 // sample and clear SRST sensing
113 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x10, 0x00000040);
114 ZY1000_PEEK(ZY1000_JTAG_BASE
+ 0x10, state
);
116 srstAsserted
= (state
& 0x40) != 0;
120 static int zy1000_srst_asserted(int *srst_asserted
)
122 *srst_asserted
= readSRST();
126 static int zy1000_power_dropout(int *dropout
)
128 *dropout
= readPowerDropout();
132 void zy1000_reset(int trst
, int srst
)
134 LOG_DEBUG("zy1000 trst=%d, srst=%d", trst
, srst
);
137 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x14, 0x00000001);
141 /* Danger!!! if clk != 0 when in
142 * idle in TAP_IDLE, reset halt on str912 will fail.
144 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x10, 0x00000001);
149 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x14, 0x00000002);
154 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x10, 0x00000002);
157 if (trst
||(srst
&& (jtag_get_reset_config() & RESET_SRST_PULLS_TRST
)))
160 /* we're now in the RESET state until trst is deasserted */
161 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x20, TAP_RESET
);
164 /* We'll get RCLK failure when we assert TRST, so clear any false positives here */
165 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x14, 0x400);
168 /* wait for srst to float back up */
172 for (i
= 0; i
< 1000; i
++)
174 // We don't want to sense our own reset, so we clear here.
175 // There is of course a timing hole where we could loose
186 LOG_USER("SRST didn't deassert after %dms", i
);
189 LOG_USER("SRST took %dms to deassert", i
);
194 int zy1000_speed(int speed
)
200 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x10, 0x100);
201 LOG_DEBUG("jtag_speed using RCLK");
205 if (speed
> 8190 || speed
< 2)
207 LOG_USER("valid ZY1000 jtag_speed=[8190,2]. Divisor is 64MHz / even values between 8190-2, i.e. min 7814Hz, max 32MHz");
208 return ERROR_INVALID_ARGUMENTS
;
211 LOG_USER("jtag_speed %d => JTAG clk=%f", speed
, 64.0/(float)speed
);
212 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x14, 0x100);
213 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x1c, speed
&~1);
218 static bool savePower
;
221 static void setPower(bool power
)
226 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x14, 0x8);
229 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x10, 0x8);
233 COMMAND_HANDLER(handle_power_command
)
239 COMMAND_PARSE_ON_OFF(CMD_ARGV
[0], enable
);
244 LOG_INFO("Target power %s", savePower
? "on" : "off");
247 return ERROR_INVALID_ARGUMENTS
;
254 /* Give TELNET a way to find out what version this is */
255 static int jim_zy1000_version(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
257 if ((argc
< 1) || (argc
> 3))
259 const char *version_str
= NULL
;
263 version_str
= ZYLIN_OPENOCD_VERSION
;
266 const char *str
= Jim_GetString(argv
[1], NULL
);
267 const char *str2
= NULL
;
269 str2
= Jim_GetString(argv
[2], NULL
);
270 if (strcmp("openocd", str
) == 0)
272 version_str
= ZYLIN_OPENOCD
;
274 else if (strcmp("zy1000", str
) == 0)
276 version_str
= ZYLIN_VERSION
;
278 else if (strcmp("date", str
) == 0)
280 version_str
= ZYLIN_DATE
;
282 else if (strcmp("time", str
) == 0)
284 version_str
= ZYLIN_TIME
;
286 else if (strcmp("pcb", str
) == 0)
288 #ifdef CYGPKG_HAL_NIOS2
294 #ifdef CYGPKG_HAL_NIOS2
295 else if (strcmp("fpga", str
) == 0)
298 /* return a list of 32 bit integers to describe the expected
301 static char *fpga_id
= "0x12345678 0x12345678 0x12345678 0x12345678";
302 cyg_uint32 id
, timestamp
;
303 HAL_READ_UINT32(SYSID_BASE
, id
);
304 HAL_READ_UINT32(SYSID_BASE
+4, timestamp
);
305 sprintf(fpga_id
, "0x%08x 0x%08x 0x%08x 0x%08x", id
, timestamp
, SYSID_ID
, SYSID_TIMESTAMP
);
306 version_str
= fpga_id
;
307 if ((argc
>2) && (strcmp("time", str2
) == 0))
309 time_t last_mod
= timestamp
;
310 char * t
= ctime (&last_mod
) ;
323 Jim_SetResult(interp
, Jim_NewStringObj(interp
, version_str
, -1));
329 #ifdef CYGPKG_HAL_NIOS2
335 struct cyg_upgrade_info
*upgraded_file
;
338 static void report_info(void *data
, const char * format
, va_list args
)
340 char *s
= alloc_vprintf(format
, args
);
345 struct cyg_upgrade_info firmware_info
=
347 (cyg_uint8
*)0x84000000,
353 "ZylinNiosFirmware\n",
357 static int jim_zy1000_writefirmware(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
363 const char *str
= Jim_GetString(argv
[1], &length
);
367 if ((tmpFile
= open(firmware_info
.file
, O_RDWR
| O_CREAT
| O_TRUNC
)) <= 0)
372 success
= write(tmpFile
, str
, length
) == length
;
377 if (!cyg_firmware_upgrade(NULL
, firmware_info
))
385 zylinjtag_Jim_Command_powerstatus(Jim_Interp
*interp
,
387 Jim_Obj
* const *argv
)
391 Jim_WrongNumArgs(interp
, 1, argv
, "powerstatus");
396 ZY1000_PEEK(ZY1000_JTAG_BASE
+ 0x10, status
);
398 Jim_SetResult(interp
, Jim_NewIntObj(interp
, (status
&0x80) != 0));
406 int zy1000_init(void)
408 LOG_USER("%s", ZYLIN_OPENOCD_VERSION
);
410 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x10, 0x30); // Turn on LED1 & LED2
412 setPower(true); // on by default
415 /* deassert resets. Important to avoid infinite loop waiting for SRST to deassert */
417 zy1000_speed(jtag_get_speed());
422 int zy1000_quit(void)
430 int interface_jtag_execute_queue(void)
435 ZY1000_PEEK(ZY1000_JTAG_BASE
+ 0x10, empty
);
436 /* clear JTAG error register */
437 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x14, 0x400);
439 if ((empty
&0x400) != 0)
441 LOG_WARNING("RCLK timeout");
442 /* the error is informative only as we don't want to break the firmware if there
443 * is a false positive.
445 // return ERROR_FAIL;
454 static cyg_uint32
getShiftValue(void)
458 ZY1000_PEEK(ZY1000_JTAG_BASE
+ 0xc, value
);
459 VERBOSE(LOG_INFO("getShiftValue %08x", value
));
463 static cyg_uint32
getShiftValueFlip(void)
467 ZY1000_PEEK(ZY1000_JTAG_BASE
+ 0x18, value
);
468 VERBOSE(LOG_INFO("getShiftValue %08x (flipped)", value
));
474 static void shiftValueInnerFlip(const tap_state_t state
, const tap_state_t endState
, int repeat
, cyg_uint32 value
)
476 VERBOSE(LOG_INFO("shiftValueInner %s %s %d %08x (flipped)", tap_state_name(state
), tap_state_name(endState
), repeat
, value
));
480 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0xc, value
);
481 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x8, (1 << 15) | (repeat
<< 8) | (a
<< 4) | b
);
482 VERBOSE(getShiftValueFlip());
486 static void gotoEndState(tap_state_t end_state
)
488 setCurrentState(end_state
);
491 static __inline
void scanFields(int num_fields
, const struct scan_field
*fields
, tap_state_t shiftState
, int pause
)
497 for (i
= 0; i
< num_fields
; i
++)
501 uint8_t *inBuffer
= NULL
;
504 // figure out where to store the input data
505 int num_bits
= fields
[i
].num_bits
;
506 if (fields
[i
].in_value
!= NULL
)
508 inBuffer
= fields
[i
].in_value
;
511 // here we shuffle N bits out/in
515 tap_state_t pause_state
;
518 pause_state
= (shiftState
== TAP_DRSHIFT
)?TAP_DRSHIFT
:TAP_IRSHIFT
;
522 /* we have more to shift out */
523 } else if (pause
&&(i
== num_fields
-1))
525 /* this was the last to shift out this time */
526 pause_state
= (shiftState
==TAP_DRSHIFT
)?TAP_DRPAUSE
:TAP_IRPAUSE
;
529 // we have (num_bits + 7)/8 bytes of bits to toggle out.
530 // bits are pushed out LSB to MSB
532 if (fields
[i
].out_value
!= NULL
)
534 for (l
= 0; l
< k
; l
+= 8)
536 value
|=fields
[i
].out_value
[(j
+ l
)/8]<<l
;
539 /* mask away unused bits for easier debugging */
542 value
&=~(((uint32_t)0xffffffff) << k
);
545 /* Shifting by >= 32 is not defined by the C standard
546 * and will in fact shift by &0x1f bits on nios */
549 shiftValueInner(shiftState
, pause_state
, k
, value
);
551 if (inBuffer
!= NULL
)
553 // data in, LSB to MSB
554 value
= getShiftValue();
555 // we're shifting in data to MSB, shift data to be aligned for returning the value
558 for (l
= 0; l
< k
; l
+= 8)
560 inBuffer
[(j
+ l
)/8]=(value
>> l
)&0xff;
568 int interface_jtag_add_ir_scan(int num_fields
, const struct scan_field
*fields
, tap_state_t state
)
573 struct jtag_tap
*tap
, *nextTap
;
574 for (tap
= jtag_tap_next_enabled(NULL
); tap
!= NULL
; tap
= nextTap
)
576 nextTap
= jtag_tap_next_enabled(tap
);
577 int pause
= (nextTap
==NULL
);
581 scan_size
= tap
->ir_length
;
583 /* search the list */
584 for (j
= 0; j
< num_fields
; j
++)
586 if (tap
== fields
[j
].tap
)
590 scanFields(1, fields
+ j
, TAP_IRSHIFT
, pause
);
591 /* update device information */
592 buf_cpy(fields
[j
].out_value
, tap
->cur_instr
, scan_size
);
601 /* if a device isn't listed, set it to BYPASS */
602 uint8_t ones
[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
604 struct scan_field tmp
;
605 memset(&tmp
, 0, sizeof(tmp
));
606 tmp
.out_value
= ones
;
607 tmp
.num_bits
= scan_size
;
608 scanFields(1, &tmp
, TAP_IRSHIFT
, pause
);
609 /* update device information */
610 buf_cpy(tmp
.out_value
, tap
->cur_instr
, scan_size
);
623 int interface_jtag_add_plain_ir_scan(int num_fields
, const struct scan_field
*fields
, tap_state_t state
)
625 scanFields(num_fields
, fields
, TAP_IRSHIFT
, 1);
631 int interface_jtag_add_dr_scan(int num_fields
, const struct scan_field
*fields
, tap_state_t state
)
635 struct jtag_tap
*tap
, *nextTap
;
636 for (tap
= jtag_tap_next_enabled(NULL
); tap
!= NULL
; tap
= nextTap
)
638 nextTap
= jtag_tap_next_enabled(tap
);
640 int pause
= (nextTap
==NULL
);
642 for (j
= 0; j
< num_fields
; j
++)
644 if (tap
== fields
[j
].tap
)
648 scanFields(1, fields
+j
, TAP_DRSHIFT
, pause
);
653 struct scan_field tmp
;
654 /* program the scan field to 1 bit length, and ignore it's value */
656 tmp
.out_value
= NULL
;
659 scanFields(1, &tmp
, TAP_DRSHIFT
, pause
);
669 int interface_jtag_add_plain_dr_scan(int num_fields
, const struct scan_field
*fields
, tap_state_t state
)
671 scanFields(num_fields
, fields
, TAP_DRSHIFT
, 1);
677 int interface_jtag_add_tlr()
679 setCurrentState(TAP_RESET
);
686 int interface_jtag_add_reset(int req_trst
, int req_srst
)
688 zy1000_reset(req_trst
, req_srst
);
692 static int zy1000_jtag_add_clocks(int num_cycles
, tap_state_t state
, tap_state_t clockstate
)
694 /* num_cycles can be 0 */
695 setCurrentState(clockstate
);
697 /* execute num_cycles, 32 at the time. */
699 for (i
= 0; i
< num_cycles
; i
+= 32)
703 if (num_cycles
-i
< num
)
707 shiftValueInner(clockstate
, clockstate
, num
, 0);
711 /* finish in end_state */
712 setCurrentState(state
);
714 tap_state_t t
= TAP_IDLE
;
715 /* test manual drive code on any target */
717 uint8_t tms_scan
= tap_get_tms_path(t
, state
);
718 int tms_count
= tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
720 for (i
= 0; i
< tms_count
; i
++)
722 tms
= (tms_scan
>> i
) & 1;
724 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x28, tms
);
727 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x20, state
);
734 int interface_jtag_add_runtest(int num_cycles
, tap_state_t state
)
736 return zy1000_jtag_add_clocks(num_cycles
, state
, TAP_IDLE
);
739 int interface_jtag_add_clocks(int num_cycles
)
741 return zy1000_jtag_add_clocks(num_cycles
, cmd_queue_cur_state
, cmd_queue_cur_state
);
744 int interface_jtag_add_sleep(uint32_t us
)
750 int interface_jtag_add_pathmove(int num_states
, const tap_state_t
*path
)
755 /*wait for the fifo to be empty*/
760 tap_state_t cur_state
= cmd_queue_cur_state
;
764 if (tap_state_transition(cur_state
, false) == path
[state_count
])
768 else if (tap_state_transition(cur_state
, true) == path
[state_count
])
774 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state
), tap_state_name(path
[state_count
]));
779 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x28, tms
);
781 cur_state
= path
[state_count
];
787 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x20, cur_state
);
793 void embeddedice_write_dcc(struct jtag_tap
*tap
, int reg_addr
, uint8_t *buffer
, int little
, int count
)
795 // static int const reg_addr = 0x5;
796 tap_state_t end_state
= jtag_get_end_state();
797 if (jtag_tap_next_enabled(jtag_tap_next_enabled(NULL
)) == NULL
)
799 /* better performance via code duplication */
803 for (i
= 0; i
< count
; i
++)
805 shiftValueInner(TAP_DRSHIFT
, TAP_DRSHIFT
, 32, fast_target_buffer_get_u32(buffer
, 1));
806 shiftValueInner(TAP_DRSHIFT
, end_state
, 6, reg_addr
| (1 << 5));
812 for (i
= 0; i
< count
; i
++)
814 shiftValueInner(TAP_DRSHIFT
, TAP_DRSHIFT
, 32, fast_target_buffer_get_u32(buffer
, 0));
815 shiftValueInner(TAP_DRSHIFT
, end_state
, 6, reg_addr
| (1 << 5));
823 for (i
= 0; i
< count
; i
++)
825 embeddedice_write_reg_inner(tap
, reg_addr
, fast_target_buffer_get_u32(buffer
, little
));
832 static const struct command_registration zy1000_commands
[] = {
835 .handler
= handle_power_command
,
837 .help
= "Turn power switch to target on/off. "
838 "With no arguments, prints status.",
839 .usage
= "('on'|'off)",
842 .name
= "zy1000_version",
844 .jim_handler
= jim_zy1000_version
,
845 .help
= "Print version info for zy1000.",
846 .usage
= "['openocd'|'zy1000'|'date'|'time'|'pcb'|'fpga']",
849 .name
= "powerstatus",
851 .jim_handler
= zylinjtag_Jim_Command_powerstatus
,
852 .help
= "Returns power status of target",
854 #ifdef CYGPKG_HAL_NIOS2
856 .name
= "updatezy1000firmware",
858 .jim_handler
= jim_zy1000_writefirmware
,
859 .help
= "writes firmware to flash",
860 /* .usage = "some_string", */
863 COMMAND_REGISTRATION_DONE
868 struct jtag_interface zy1000_interface
=
871 .execute_queue
= NULL
,
872 .speed
= zy1000_speed
,
873 .commands
= zy1000_commands
,
877 .speed_div
= zy1000_speed_div
,
878 .power_dropout
= zy1000_power_dropout
,
879 .srst_asserted
= zy1000_srst_asserted
,
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)