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 ***************************************************************************/
23 #include "embeddedice.h"
24 #include "minidriver.h"
25 #include <jtag/interface.h>
26 #include "zy1000_version.h"
28 #include <cyg/hal/hal_io.h> // low level i/o
29 #include <cyg/hal/hal_diag.h>
33 #define ZYLIN_VERSION GIT_ZY1000_VERSION
34 #define ZYLIN_DATE __DATE__
35 #define ZYLIN_TIME __TIME__
36 #define ZYLIN_OPENOCD GIT_OPENOCD_VERSION
37 #define ZYLIN_OPENOCD_VERSION "ZY1000 " ZYLIN_VERSION " " ZYLIN_DATE
40 static int zy1000_khz(int khz
, int *jtag_speed
)
48 *jtag_speed
= 64000/khz
;
53 static int zy1000_speed_div(int speed
, int *khz
)
67 static bool readPowerDropout(void)
70 // sample and clear power dropout
71 HAL_WRITE_UINT32(ZY1000_JTAG_BASE
+ 0x10, 0x80);
72 HAL_READ_UINT32(ZY1000_JTAG_BASE
+ 0x10, state
);
74 powerDropout
= (state
& 0x80) != 0;
79 static bool readSRST(void)
82 // sample and clear SRST sensing
83 HAL_WRITE_UINT32(ZY1000_JTAG_BASE
+ 0x10, 0x00000040);
84 HAL_READ_UINT32(ZY1000_JTAG_BASE
+ 0x10, state
);
86 srstAsserted
= (state
& 0x40) != 0;
90 static int zy1000_srst_asserted(int *srst_asserted
)
92 *srst_asserted
= readSRST();
96 static int zy1000_power_dropout(int *dropout
)
98 *dropout
= readPowerDropout();
102 void zy1000_reset(int trst
, int srst
)
104 LOG_DEBUG("zy1000 trst=%d, srst=%d", trst
, srst
);
107 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x14, 0x00000001);
111 /* Danger!!! if clk != 0 when in
112 * idle in TAP_IDLE, reset halt on str912 will fail.
114 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x10, 0x00000001);
119 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x14, 0x00000002);
124 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x10, 0x00000002);
127 if (trst
||(srst
&& (jtag_get_reset_config() & RESET_SRST_PULLS_TRST
)))
130 /* we're now in the RESET state until trst is deasserted */
131 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x20, TAP_RESET
);
134 /* We'll get RCLK failure when we assert TRST, so clear any false positives here */
135 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x14, 0x400);
138 /* wait for srst to float back up */
142 for (i
= 0; i
< 1000; i
++)
144 // We don't want to sense our own reset, so we clear here.
145 // There is of course a timing hole where we could loose
156 LOG_USER("SRST didn't deassert after %dms", i
);
159 LOG_USER("SRST took %dms to deassert", i
);
164 int zy1000_speed(int speed
)
170 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x10, 0x100);
171 LOG_DEBUG("jtag_speed using RCLK");
175 if (speed
> 8190 || speed
< 2)
177 LOG_USER("valid ZY1000 jtag_speed=[8190,2]. Divisor is 64MHz / even values between 8190-2, i.e. min 7814Hz, max 32MHz");
178 return ERROR_INVALID_ARGUMENTS
;
181 LOG_USER("jtag_speed %d => JTAG clk=%f", speed
, 64.0/(float)speed
);
182 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x14, 0x100);
183 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x1c, speed
&~1);
188 static bool savePower
;
191 static void setPower(bool power
)
196 HAL_WRITE_UINT32(ZY1000_JTAG_BASE
+ 0x14, 0x8);
199 HAL_WRITE_UINT32(ZY1000_JTAG_BASE
+ 0x10, 0x8);
203 COMMAND_HANDLER(handle_power_command
)
209 COMMAND_PARSE_ON_OFF(CMD_ARGV
[0], enable
);
214 LOG_INFO("Target power %s", savePower
? "on" : "off");
217 return ERROR_INVALID_ARGUMENTS
;
224 /* Give TELNET a way to find out what version this is */
225 static int jim_zy1000_version(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
227 if ((argc
< 1) || (argc
> 3))
229 const char *version_str
= NULL
;
233 version_str
= ZYLIN_OPENOCD_VERSION
;
236 const char *str
= Jim_GetString(argv
[1], NULL
);
237 const char *str2
= NULL
;
239 str2
= Jim_GetString(argv
[2], NULL
);
240 if (strcmp("openocd", str
) == 0)
242 version_str
= ZYLIN_OPENOCD
;
244 else if (strcmp("zy1000", str
) == 0)
246 version_str
= ZYLIN_VERSION
;
248 else if (strcmp("date", str
) == 0)
250 version_str
= ZYLIN_DATE
;
252 else if (strcmp("time", str
) == 0)
254 version_str
= ZYLIN_TIME
;
256 else if (strcmp("pcb", str
) == 0)
258 #ifdef CYGPKG_HAL_NIOS2
264 #ifdef CYGPKG_HAL_NIOS2
265 else if (strcmp("fpga", str
) == 0)
268 /* return a list of 32 bit integers to describe the expected
271 static char *fpga_id
= "0x12345678 0x12345678 0x12345678 0x12345678";
272 cyg_uint32 id
, timestamp
;
273 HAL_READ_UINT32(SYSID_BASE
, id
);
274 HAL_READ_UINT32(SYSID_BASE
+4, timestamp
);
275 sprintf(fpga_id
, "0x%08x 0x%08x 0x%08x 0x%08x", id
, timestamp
, SYSID_ID
, SYSID_TIMESTAMP
);
276 version_str
= fpga_id
;
277 if ((argc
>2) && (strcmp("time", str2
) == 0))
279 time_t last_mod
= timestamp
;
280 char * t
= ctime (&last_mod
) ;
293 Jim_SetResult(interp
, Jim_NewStringObj(interp
, version_str
, -1));
299 #ifdef CYGPKG_HAL_NIOS2
300 static int jim_zy1000_writefirmware(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
307 const char *str
= Jim_GetString(argv
[1], &length
);
309 /* BUG!!!! skip header! */
310 void *firmware_address
=0x4000000;
311 int firmware_length
=0x100000;
313 if (length
>firmware_length
)
318 if ((stat
= flash_erase((void *)firmware_address
, firmware_length
, (void **)&err_addr
)) != 0)
323 if ((stat
= flash_program(firmware_address
, str
, length
, (void **)&err_addr
)) != 0)
331 zylinjtag_Jim_Command_powerstatus(Jim_Interp
*interp
,
333 Jim_Obj
* const *argv
)
337 Jim_WrongNumArgs(interp
, 1, argv
, "powerstatus");
342 ZY1000_PEEK(ZY1000_JTAG_BASE
+ 0x10, status
);
344 Jim_SetResult(interp
, Jim_NewIntObj(interp
, (status
&0x80) != 0));
352 int zy1000_init(void)
354 LOG_USER("%s", ZYLIN_OPENOCD_VERSION
);
356 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x10, 0x30); // Turn on LED1 & LED2
358 setPower(true); // on by default
361 /* deassert resets. Important to avoid infinite loop waiting for SRST to deassert */
363 zy1000_speed(jtag_get_speed());
368 int zy1000_quit(void)
376 int interface_jtag_execute_queue(void)
381 ZY1000_PEEK(ZY1000_JTAG_BASE
+ 0x10, empty
);
382 /* clear JTAG error register */
383 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x14, 0x400);
385 if ((empty
&0x400) != 0)
387 LOG_WARNING("RCLK timeout");
388 /* the error is informative only as we don't want to break the firmware if there
389 * is a false positive.
391 // return ERROR_FAIL;
400 static cyg_uint32
getShiftValue(void)
404 ZY1000_PEEK(ZY1000_JTAG_BASE
+ 0xc, value
);
405 VERBOSE(LOG_INFO("getShiftValue %08x", value
));
409 static cyg_uint32
getShiftValueFlip(void)
413 ZY1000_PEEK(ZY1000_JTAG_BASE
+ 0x18, value
);
414 VERBOSE(LOG_INFO("getShiftValue %08x (flipped)", value
));
420 static void shiftValueInnerFlip(const tap_state_t state
, const tap_state_t endState
, int repeat
, cyg_uint32 value
)
422 VERBOSE(LOG_INFO("shiftValueInner %s %s %d %08x (flipped)", tap_state_name(state
), tap_state_name(endState
), repeat
, value
));
426 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0xc, value
);
427 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x8, (1 << 15) | (repeat
<< 8) | (a
<< 4) | b
);
428 VERBOSE(getShiftValueFlip());
432 static void gotoEndState(tap_state_t end_state
)
434 setCurrentState(end_state
);
437 static __inline
void scanFields(int num_fields
, const struct scan_field
*fields
, tap_state_t shiftState
, int pause
)
443 for (i
= 0; i
< num_fields
; i
++)
447 uint8_t *inBuffer
= NULL
;
450 // figure out where to store the input data
451 int num_bits
= fields
[i
].num_bits
;
452 if (fields
[i
].in_value
!= NULL
)
454 inBuffer
= fields
[i
].in_value
;
457 // here we shuffle N bits out/in
461 tap_state_t pause_state
;
464 pause_state
= (shiftState
== TAP_DRSHIFT
)?TAP_DRSHIFT
:TAP_IRSHIFT
;
468 /* we have more to shift out */
469 } else if (pause
&&(i
== num_fields
-1))
471 /* this was the last to shift out this time */
472 pause_state
= (shiftState
==TAP_DRSHIFT
)?TAP_DRPAUSE
:TAP_IRPAUSE
;
475 // we have (num_bits + 7)/8 bytes of bits to toggle out.
476 // bits are pushed out LSB to MSB
478 if (fields
[i
].out_value
!= NULL
)
480 for (l
= 0; l
< k
; l
+= 8)
482 value
|=fields
[i
].out_value
[(j
+ l
)/8]<<l
;
485 /* mask away unused bits for easier debugging */
488 value
&=~(((uint32_t)0xffffffff) << k
);
491 /* Shifting by >= 32 is not defined by the C standard
492 * and will in fact shift by &0x1f bits on nios */
495 shiftValueInner(shiftState
, pause_state
, k
, value
);
497 if (inBuffer
!= NULL
)
499 // data in, LSB to MSB
500 value
= getShiftValue();
501 // we're shifting in data to MSB, shift data to be aligned for returning the value
504 for (l
= 0; l
< k
; l
+= 8)
506 inBuffer
[(j
+ l
)/8]=(value
>> l
)&0xff;
514 int interface_jtag_add_ir_scan(int num_fields
, const struct scan_field
*fields
, tap_state_t state
)
519 struct jtag_tap
*tap
, *nextTap
;
520 for (tap
= jtag_tap_next_enabled(NULL
); tap
!= NULL
; tap
= nextTap
)
522 nextTap
= jtag_tap_next_enabled(tap
);
523 int pause
= (nextTap
==NULL
);
527 scan_size
= tap
->ir_length
;
529 /* search the list */
530 for (j
= 0; j
< num_fields
; j
++)
532 if (tap
== fields
[j
].tap
)
536 scanFields(1, fields
+ j
, TAP_IRSHIFT
, pause
);
537 /* update device information */
538 buf_cpy(fields
[j
].out_value
, tap
->cur_instr
, scan_size
);
547 /* if a device isn't listed, set it to BYPASS */
548 uint8_t ones
[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
550 struct scan_field tmp
;
551 memset(&tmp
, 0, sizeof(tmp
));
552 tmp
.out_value
= ones
;
553 tmp
.num_bits
= scan_size
;
554 scanFields(1, &tmp
, TAP_IRSHIFT
, pause
);
555 /* update device information */
556 buf_cpy(tmp
.out_value
, tap
->cur_instr
, scan_size
);
569 int interface_jtag_add_plain_ir_scan(int num_fields
, const struct scan_field
*fields
, tap_state_t state
)
571 scanFields(num_fields
, fields
, TAP_IRSHIFT
, 1);
577 int interface_jtag_add_dr_scan(int num_fields
, const struct scan_field
*fields
, tap_state_t state
)
581 struct jtag_tap
*tap
, *nextTap
;
582 for (tap
= jtag_tap_next_enabled(NULL
); tap
!= NULL
; tap
= nextTap
)
584 nextTap
= jtag_tap_next_enabled(tap
);
586 int pause
= (nextTap
==NULL
);
588 for (j
= 0; j
< num_fields
; j
++)
590 if (tap
== fields
[j
].tap
)
594 scanFields(1, fields
+j
, TAP_DRSHIFT
, pause
);
599 struct scan_field tmp
;
600 /* program the scan field to 1 bit length, and ignore it's value */
602 tmp
.out_value
= NULL
;
605 scanFields(1, &tmp
, TAP_DRSHIFT
, pause
);
615 int interface_jtag_add_plain_dr_scan(int num_fields
, const struct scan_field
*fields
, tap_state_t state
)
617 scanFields(num_fields
, fields
, TAP_DRSHIFT
, 1);
623 int interface_jtag_add_tlr()
625 setCurrentState(TAP_RESET
);
632 int interface_jtag_add_reset(int req_trst
, int req_srst
)
634 zy1000_reset(req_trst
, req_srst
);
638 static int zy1000_jtag_add_clocks(int num_cycles
, tap_state_t state
, tap_state_t clockstate
)
640 /* num_cycles can be 0 */
641 setCurrentState(clockstate
);
643 /* execute num_cycles, 32 at the time. */
645 for (i
= 0; i
< num_cycles
; i
+= 32)
649 if (num_cycles
-i
< num
)
653 shiftValueInner(clockstate
, clockstate
, num
, 0);
657 /* finish in end_state */
658 setCurrentState(state
);
660 tap_state_t t
= TAP_IDLE
;
661 /* test manual drive code on any target */
663 uint8_t tms_scan
= tap_get_tms_path(t
, state
);
664 int tms_count
= tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
666 for (i
= 0; i
< tms_count
; i
++)
668 tms
= (tms_scan
>> i
) & 1;
670 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x28, tms
);
673 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x20, state
);
680 int interface_jtag_add_runtest(int num_cycles
, tap_state_t state
)
682 return zy1000_jtag_add_clocks(num_cycles
, state
, TAP_IDLE
);
685 int interface_jtag_add_clocks(int num_cycles
)
687 return zy1000_jtag_add_clocks(num_cycles
, cmd_queue_cur_state
, cmd_queue_cur_state
);
690 int interface_jtag_add_sleep(uint32_t us
)
696 int interface_jtag_add_pathmove(int num_states
, const tap_state_t
*path
)
701 /*wait for the fifo to be empty*/
706 tap_state_t cur_state
= cmd_queue_cur_state
;
710 if (tap_state_transition(cur_state
, false) == path
[state_count
])
714 else if (tap_state_transition(cur_state
, true) == path
[state_count
])
720 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state
), tap_state_name(path
[state_count
]));
725 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x28, tms
);
727 cur_state
= path
[state_count
];
733 ZY1000_POKE(ZY1000_JTAG_BASE
+ 0x20, cur_state
);
739 void embeddedice_write_dcc(struct jtag_tap
*tap
, int reg_addr
, uint8_t *buffer
, int little
, int count
)
741 // static int const reg_addr = 0x5;
742 tap_state_t end_state
= jtag_get_end_state();
743 if (jtag_tap_next_enabled(jtag_tap_next_enabled(NULL
)) == NULL
)
745 /* better performance via code duplication */
749 for (i
= 0; i
< count
; i
++)
751 shiftValueInner(TAP_DRSHIFT
, TAP_DRSHIFT
, 32, fast_target_buffer_get_u32(buffer
, 1));
752 shiftValueInner(TAP_DRSHIFT
, end_state
, 6, reg_addr
| (1 << 5));
758 for (i
= 0; i
< count
; i
++)
760 shiftValueInner(TAP_DRSHIFT
, TAP_DRSHIFT
, 32, fast_target_buffer_get_u32(buffer
, 0));
761 shiftValueInner(TAP_DRSHIFT
, end_state
, 6, reg_addr
| (1 << 5));
769 for (i
= 0; i
< count
; i
++)
771 embeddedice_write_reg_inner(tap
, reg_addr
, fast_target_buffer_get_u32(buffer
, little
));
778 static const struct command_registration zy1000_commands
[] = {
781 .handler
= &handle_power_command
,
783 .help
= "turn power switch to target on/off. No arguments - print status.",
784 .usage
= "power <on/off>",
787 .name
= "zy1000_version",
789 .jim_handler
= &jim_zy1000_version
,
790 .help
= "print version info for zy1000",
793 .name
= "powerstatus",
795 .jim_handler
= & zylinjtag_Jim_Command_powerstatus
,
796 .help
= "print power status of target",
798 #ifdef CYGPKG_HAL_NIOS2
800 .name
= "updatezy1000firmware",
802 .jim_handler
= &jim_zy1000_writefirmware
,
803 .help
= "writes firmware to flash",
806 COMMAND_REGISTRATION_DONE
811 struct jtag_interface zy1000_interface
=
814 .execute_queue
= NULL
,
815 .speed
= zy1000_speed
,
816 .commands
= zy1000_commands
,
820 .speed_div
= zy1000_speed_div
,
821 .power_dropout
= zy1000_power_dropout
,
822 .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)