The code for zy1000 has been marked as deprecated in release v0.10.0, 4 years ago. Time to drop it! Change-Id: I08fca2a2bf8f616f031e15fd37dac3197a40ba50 Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: http://openocd.zylin.com/6090 Tested-by: jenkinsjim
@@ -283,14 +283,6 @@ AC_ARG_ENABLE([amtjtagaccel], | |||
AS_HELP_STRING([--enable-amtjtagaccel], [Enable building the Amontec JTAG-Accelerator driver]), | |||
[build_amtjtagaccel=$enableval], [build_amtjtagaccel=no]) | |||
AC_ARG_ENABLE([zy1000_master], | |||
AS_HELP_STRING([--enable-zy1000-master], [Use ZY1000 JTAG master registers]), | |||
[build_zy1000_master=$enableval], [build_zy1000_master=no]) | |||
AC_ARG_ENABLE([zy1000], | |||
AS_HELP_STRING([--enable-zy1000], [Enable ZY1000 interface]), | |||
[build_zy1000=$enableval], [build_zy1000=no]) | |||
AS_CASE(["${host_cpu}"], | |||
[arm*|aarch64], [ | |||
AC_ARG_ENABLE([bcm2835gpio], | |||
@@ -373,16 +365,6 @@ AC_ARG_ENABLE([internal-libjaylink], | |||
[use_internal_libjaylink=$enableval], [use_internal_libjaylink=yes]) | |||
build_minidriver=no | |||
AC_MSG_CHECKING([whether to enable ZY1000 minidriver]) | |||
AS_IF([test "x$build_zy1000" = "xyes"], [ | |||
AS_IF([test "x$build_minidriver" = "xyes"], [ | |||
AC_MSG_ERROR([Multiple minidriver options have been enabled.]) | |||
]) | |||
AC_DEFINE([HAVE_JTAG_MINIDRIVER_H], [1], | |||
[Define to 1 if you have the <jtag_minidriver.h> header file.]) | |||
build_minidriver=yes | |||
]) | |||
AC_MSG_RESULT([$build_zy1000]) | |||
AC_ARG_ENABLE([remote-bitbang], | |||
AS_HELP_STRING([--enable-remote-bitbang], [Enable building support for the Remote Bitbang jtag driver]), | |||
@@ -521,18 +503,6 @@ AS_IF([test "x$build_ep93xx" = "xyes"], [ | |||
AC_DEFINE([BUILD_EP93XX], [0], [0 if you don't want ep93xx.]) | |||
]) | |||
AS_IF([test "x$build_zy1000" = "xyes"], [ | |||
AC_DEFINE([BUILD_ZY1000], [1], [1 if you want ZY1000.]) | |||
], [ | |||
AC_DEFINE([BUILD_ZY1000], [0], [0 if you don't want ZY1000.]) | |||
]) | |||
AS_IF([test "x$build_zy1000_master" = "xyes"], [ | |||
AC_DEFINE([BUILD_ZY1000_MASTER], [1], [1 if you want ZY1000 JTAG master registers.]) | |||
], [ | |||
AC_DEFINE([BUILD_ZY1000_MASTER], [0], [0 if you don't want ZY1000 JTAG master registers.]) | |||
]) | |||
AS_IF([test "x$build_at91rm9200" = "xyes"], [ | |||
build_bitbang=yes | |||
AC_DEFINE([BUILD_AT91RM9200], [1], [1 if you want at91rm9200.]) | |||
@@ -687,9 +657,6 @@ PKG_CHECK_MODULES([LIBJAYLINK], [libjaylink >= 0.2], | |||
m4_define([PROCESS_ADAPTERS], [ | |||
m4_foreach([adapter], [$1], [ | |||
AS_IF([test "x$build_zy1000" = "xyes"], [ | |||
ADAPTER_VAR([adapter])=no | |||
]) | |||
AS_IF([test $2], [ | |||
AS_IF([test "x$ADAPTER_VAR([adapter])" != "xno"], [ | |||
AC_DEFINE([BUILD_]ADAPTER_SYM([adapter]), [1], [1 if you want the ]ADAPTER_DESC([adapter]).) | |||
@@ -751,8 +718,6 @@ AM_CONDITIONAL([PARPORT], [test "x$build_parport" = "xyes"]) | |||
AM_CONDITIONAL([DUMMY], [test "x$build_dummy" = "xyes"]) | |||
AM_CONDITIONAL([GIVEIO], [test "x$parport_use_giveio" = "xyes"]) | |||
AM_CONDITIONAL([EP93XX], [test "x$build_ep93xx" = "xyes"]) | |||
AM_CONDITIONAL([ZY1000], [test "x$build_zy1000" = "xyes"]) | |||
AM_CONDITIONAL([ZY1000_MASTER], [test "x$build_zy1000_master" = "xyes"]) | |||
AM_CONDITIONAL([AT91RM9200], [test "x$build_at91rm9200" = "xyes"]) | |||
AM_CONDITIONAL([BCM2835GPIO], [test "x$build_bcm2835gpio" = "xyes"]) | |||
AM_CONDITIONAL([IMX_GPIO], [test "x$build_imx_gpio" = "xyes"]) | |||
@@ -867,11 +832,3 @@ m4_foreach([adapter], [USB1_ADAPTERS, USB0_ADAPTERS, | |||
]) | |||
]) | |||
echo | |||
AS_IF([test "x$build_zy1000" = "xyes" -o "x$build_zy1000_master" = "xyes"], [ | |||
echo 'WARNING! Deprecated configure option (--enable-zy1000, --enable-zy1000-master)' | |||
echo 'Support for the ZY1000 platform is deprecated and will be removed in the next' | |||
echo 'release. If you regularly use this platform, please report to the OpenOCD' | |||
echo 'Mailing List.' | |||
echo | |||
]) |
@@ -36,7 +36,6 @@ asynchronous transactions. | |||
- declared in @c src/jtag/minidriver.h | |||
- used @a only by the core and minidriver implementations: | |||
- @c jtag_driver.c (in-tree OpenOCD drivers) | |||
- @c zy1000/build/include/jtag_minidriver.h (ZY1000 minidriver) | |||
- future implementations (on other embedded hosts) | |||
- interface device drivers do @b not need this API. | |||
@@ -298,7 +298,6 @@ The OpenOCD Bug Tracker is hosted on SourceForge: | |||
@cindex dongles | |||
@cindex FTDI | |||
@cindex wiggler | |||
@cindex zy1000 | |||
@cindex printer port | |||
@cindex USB Adapter | |||
@cindex RTCK | |||
@@ -307,12 +306,7 @@ Defined: @b{dongle}: A small device that plugs into a computer and serves as | |||
an adapter .... [snip] | |||
In the OpenOCD case, this generally refers to @b{a small adapter} that | |||
attaches to your computer via USB or the parallel port. One | |||
exception is the Ultimate Solutions ZY1000, packaged as a small box you | |||
attach via an ethernet cable. The ZY1000 has the advantage that it does not | |||
require any drivers to be installed on the developer PC. It also has | |||
a built in web interface. It supports RTCK/RCLK or adaptive clocking | |||
and has a built-in relay to power cycle targets remotely. | |||
attaches to your computer via USB or the parallel port. | |||
@section Choosing a Dongle | |||
@@ -334,26 +328,6 @@ Ethernet port needed? | |||
RTCK support (also known as ``adaptive clocking'')? | |||
@end enumerate | |||
@section Stand-alone JTAG Probe | |||
The ZY1000 from Ultimate Solutions is technically not a dongle but a | |||
stand-alone JTAG probe that, unlike most dongles, doesn't require any drivers | |||
running on the developer's host computer. | |||
Once installed on a network using DHCP or a static IP assignment, users can | |||
access the ZY1000 probe locally or remotely from any host with access to the | |||
IP address assigned to the probe. | |||
The ZY1000 provides an intuitive web interface with direct access to the | |||
OpenOCD debugger. | |||
Users may also run a GDBSERVER directly on the ZY1000 to take full advantage | |||
of GCC & GDB to debug any distribution of embedded Linux or NetBSD running on | |||
the target. | |||
The ZY1000 supports RTCK & RCLK or adaptive clocking and has a built-in relay | |||
to power cycle the target remotely. | |||
For more information, visit: | |||
@b{ZY1000} See: @url{http://www.ultsol.com/index.php/component/content/article/8/210-zylin-zy1000-main} | |||
@section USB FT2232 Based | |||
There are many USB JTAG dongles on the market, many of them based | |||
@@ -3222,20 +3196,6 @@ The string will be of the format "DDDD:BB:SS.F" such as "0000:65:00.1". | |||
@end deffn | |||
@end deffn | |||
@deffn {Interface Driver} {ZY1000} | |||
This is the Zylin ZY1000 JTAG debugger. | |||
@end deffn | |||
@quotation Note | |||
This defines some driver-specific commands, | |||
which are not currently documented here. | |||
@end quotation | |||
@deffn Command power [@option{on}|@option{off}] | |||
Turn power switch to target on/off. | |||
No arguments: print status. | |||
@end deffn | |||
@deffn {Interface Driver} {bcm2835gpio} | |||
This SoC is present in Raspberry Pi which is a cheap single-board computer | |||
exposing some GPIOs on its expansion header. | |||
@@ -8,10 +8,6 @@ CLEANFILES += %D%/minidriver_imp.h | |||
if MINIDRIVER | |||
if ZY1000 | |||
JTAG_SRCS += %D%/zy1000/zy1000.c | |||
JTAG_MINIDRIVER_DIR = %D%/zy1000 | |||
endif | |||
if MINIDRIVER_DUMMY | |||
JTAG_SRCS += %D%/minidummy/minidummy.c | |||
JTAG_MINIDRIVER_DIR = %D%/minidummy | |||
@@ -42,9 +42,7 @@ | |||
* that contain an adapter_driver structure that can added to this list. | |||
*/ | |||
#if BUILD_ZY1000 == 1 | |||
extern struct adapter_driver zy1000_adapter_driver; | |||
#elif defined(BUILD_MINIDRIVER_DUMMY) | |||
#if defined(BUILD_MINIDRIVER_DUMMY) | |||
extern struct adapter_driver minidummy_adapter_driver; | |||
#else /* standard drivers */ | |||
#if BUILD_PARPORT == 1 | |||
@@ -162,9 +160,7 @@ extern struct adapter_driver rshim_dap_adapter_driver; | |||
* or some number of standard driver interfaces, never both. | |||
*/ | |||
struct adapter_driver *adapter_drivers[] = { | |||
#if BUILD_ZY1000 == 1 | |||
&zy1000_adapter_driver, | |||
#elif defined(BUILD_MINIDRIVER_DUMMY) | |||
#if defined(BUILD_MINIDRIVER_DUMMY) | |||
&minidummy_adapter_driver, | |||
#else /* standard drivers */ | |||
#if BUILD_PARPORT == 1 | |||
@@ -46,15 +46,6 @@ | |||
typedef enum tap_state { | |||
TAP_INVALID = -1, | |||
#if BUILD_ZY1000 | |||
/* These are the old numbers. Leave as-is for now... */ | |||
TAP_RESET = 0, TAP_IDLE = 8, | |||
TAP_DRSELECT = 1, TAP_DRCAPTURE = 2, TAP_DRSHIFT = 3, TAP_DREXIT1 = 4, | |||
TAP_DRPAUSE = 5, TAP_DREXIT2 = 6, TAP_DRUPDATE = 7, | |||
TAP_IRSELECT = 9, TAP_IRCAPTURE = 10, TAP_IRSHIFT = 11, TAP_IREXIT1 = 12, | |||
TAP_IRPAUSE = 13, TAP_IREXIT2 = 14, TAP_IRUPDATE = 15, | |||
#else | |||
/* Proper ARM recommended numbers */ | |||
TAP_DREXIT2 = 0x0, | |||
TAP_DREXIT1 = 0x1, | |||
@@ -72,8 +63,6 @@ typedef enum tap_state { | |||
TAP_IRUPDATE = 0xd, | |||
TAP_IRCAPTURE = 0xe, | |||
TAP_RESET = 0x0f, | |||
#endif | |||
} tap_state_t; | |||
/** | |||
@@ -29,7 +29,7 @@ proc init_reset { mode } { | |||
######### | |||
# TODO: power_restore and power_dropout are currently neither | |||
# documented nor supported except on ZY1000. | |||
# documented nor supported. | |||
proc power_restore {} { | |||
echo "Sensed power restore, running reset init and halting GDB." | |||
@@ -55,7 +55,7 @@ proc power_dropout {} { | |||
######### | |||
# TODO: srst_deasserted and srst_asserted are currently neither | |||
# documented nor supported except on ZY1000. | |||
# documented nor supported. | |||
proc srst_deasserted {} { | |||
echo "Sensed nSRST deasserted, running reset init and halting GDB." | |||
@@ -1,182 +0,0 @@ | |||
/*************************************************************************** | |||
* Copyright (C) 2007-2010 by Øyvind Harboe * | |||
* * | |||
* This program is free software; you can redistribute it and/or modify * | |||
* it under the terms of the GNU General Public License as published by * | |||
* the Free Software Foundation; either version 2 of the License, or * | |||
* (at your option) any later version. * | |||
* * | |||
* This program is distributed in the hope that it will be useful, * | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of * | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | |||
* GNU General Public License for more details. * | |||
* * | |||
* You should have received a copy of the GNU General Public License * | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. * | |||
***************************************************************************/ | |||
/* used to test manual mode */ | |||
#define TEST_MANUAL() 0 | |||
#define VERBOSE(a) | |||
#if BUILD_ZY1000_MASTER | |||
#define ZY1000_PEEK(a, b) do {b = *((volatile uint32_t *)(a)); } while (0) | |||
#define ZY1000_POKE(a, b) do {*((volatile uint32_t *)(a)) = b; } while (0) | |||
extern volatile void *zy1000_jtag_master; | |||
#define ZY1000_JTAG_BASE ((unsigned long)zy1000_jtag_master) | |||
#else | |||
/* redirect this to TCP/IP */ | |||
#define ZY1000_JTAG_BASE 0 | |||
extern void zy1000_tcpout(uint32_t address, uint32_t data); | |||
extern uint32_t zy1000_tcpin(uint32_t address); | |||
#define ZY1000_PEEK(a, b) b = zy1000_tcpin(a) | |||
#define ZY1000_POKE(a, b) zy1000_tcpout(a, b) | |||
#endif | |||
#if BUILD_ZY1000_MASTER | |||
/* FIFO empty? */ | |||
static inline void waitIdle(void) | |||
{ | |||
uint32_t empty; | |||
do { | |||
ZY1000_PEEK(ZY1000_JTAG_BASE + 0x10, empty); | |||
} while ((empty & 0x100) == 0); | |||
} | |||
static inline void zy1000_flush_readqueue(void) | |||
{ | |||
/* Not used w/hardware fifo */ | |||
} | |||
static inline void zy1000_flush_callbackqueue(void) | |||
{ | |||
/* Not used w/hardware fifo */ | |||
} | |||
#else | |||
extern void waitIdle(void); | |||
void zy1000_flush_readqueue(void); | |||
void zy1000_flush_callbackqueue(void); | |||
void zy1000_jtag_add_callback4(jtag_callback_t callback, | |||
jtag_callback_data_t data0, | |||
jtag_callback_data_t data1, | |||
jtag_callback_data_t data2, | |||
jtag_callback_data_t data3); | |||
void zy1000_jtag_add_callback(jtag_callback1_t callback, jtag_callback_data_t data0); | |||
#endif | |||
static inline void waitQueue(void) | |||
{ | |||
/* waitIdle(); */ | |||
} | |||
static inline void sampleShiftRegister(void) | |||
{ | |||
#if 0 | |||
uint32_t dummy; | |||
waitIdle(); | |||
ZY1000_PEEK(ZY1000_JTAG_BASE + 0xc, dummy); | |||
#endif | |||
} | |||
static inline void setCurrentState(enum tap_state state) | |||
{ | |||
uint32_t a; | |||
a = state; | |||
int repeat = 0; | |||
if (state == TAP_RESET) { | |||
/* The FPGA nor we know the current state of the CPU TAP */ | |||
/* controller. This will move it to TAP for sure. */ | |||
/* */ | |||
/* 5 should be enough here, 7 is what OpenOCD uses */ | |||
repeat = 7; | |||
} | |||
waitQueue(); | |||
sampleShiftRegister(); | |||
ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (repeat << 8) | (a << 4) | a); | |||
} | |||
/* | |||
* Enter state and cause repeat transitions *out* of that state. So if the endState != state, then | |||
* the transition from state to endState counts as a transition out of state. | |||
*/ | |||
static inline void shiftValueInner(const enum tap_state state, | |||
const enum tap_state endState, | |||
int repeat, | |||
uint32_t value) | |||
{ | |||
uint32_t a, b; | |||
a = state; | |||
b = endState; | |||
waitQueue(); | |||
sampleShiftRegister(); | |||
ZY1000_POKE(ZY1000_JTAG_BASE + 0xc, value); | |||
#if 1 | |||
#if TEST_MANUAL() | |||
if ((state == TAP_DRSHIFT) && (endState != TAP_DRSHIFT)) { | |||
int i; | |||
setCurrentState(state); | |||
for (i = 0; i < repeat; i++) { | |||
int tms; | |||
tms = 0; | |||
if ((i == repeat-1) && (state != endState)) | |||
tms = 1; | |||
/* shift out value */ | |||
waitIdle(); | |||
ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, (((value >> i)&1) << 1) | tms); | |||
} | |||
waitIdle(); | |||
ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0); | |||
waitIdle(); | |||
/* ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, TAP_DRSHIFT); // set this state and things | |||
* break => expected */ | |||
ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, TAP_DRPAUSE); /* set this and things will | |||
* work => expected. Not | |||
* setting this is not | |||
* sufficient to make things | |||
* break. */ | |||
setCurrentState(endState); | |||
} else | |||
ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (repeat << 8) | (a << 4) | b); | |||
#else | |||
/* fast version */ | |||
ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (repeat << 8) | (a << 4) | b); | |||
#endif | |||
#else | |||
/* maximum debug version */ | |||
if ((repeat > 0) && ((state == TAP_DRSHIFT) || (state == TAP_SI))) { | |||
int i; | |||
/* sample shift register for every bit. */ | |||
for (i = 0; i < repeat-1; i++) { | |||
sampleShiftRegister(); | |||
ZY1000_POKE(ZY1000_JTAG_BASE + 0xc, value >> i); | |||
ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (1 << 8) | (a << 4) | a); | |||
} | |||
sampleShiftRegister(); | |||
ZY1000_POKE(ZY1000_JTAG_BASE + 0xc, value >> (repeat-1)); | |||
ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (1 << 8) | (a << 4) | b); | |||
} else { | |||
sampleShiftRegister(); | |||
ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (repeat << 8) | (a << 4) | b); | |||
} | |||
sampleShiftRegister(); | |||
#endif | |||
} | |||
#if BUILD_ZY1000_MASTER | |||
#define interface_jtag_add_callback(callback, in) callback(in) | |||
#define interface_jtag_add_callback4(callback, in, data1, data2, \ | |||
data3) jtag_set_error(callback(in, data1, data2, data3)) | |||
#else | |||
#define interface_jtag_add_callback(callback, in) zy1000_jtag_add_callback(callback, in) | |||
#define interface_jtag_add_callback4(callback, in, data1, data2, data3) zy1000_jtag_add_callback4( \ | |||
callback, \ | |||
in, \ | |||
data1, \ | |||
data2, \ | |||
data3) | |||
#endif |
@@ -1,117 +0,0 @@ | |||
#Script for ZY1000 | |||
#Atmel ties SRST & TRST together, at which point it makes | |||
#no sense to use TRST, but use TMS instead. | |||
# | |||
#The annoying thing with tying SRST & TRST together is that | |||
#there is no way to halt the CPU *before and during* the | |||
#SRST reset, which means that the CPU will run a number | |||
#of cycles before it can be halted(as much as milliseconds). | |||
reset_config srst_only srst_pulls_trst | |||
if { [info exists CHIPNAME] } { | |||
set _CHIPNAME $CHIPNAME | |||
} else { | |||
set _CHIPNAME zy1000 | |||
} | |||
if { [info exists ENDIAN] } { | |||
set _ENDIAN $ENDIAN | |||
} else { | |||
set _ENDIAN little | |||
} | |||
#jtag scan chain | |||
if { [info exists CPUTAPID] } { | |||
set _CPUTAPID $CPUTAPID | |||
} else { | |||
set _CPUTAPID 0x1f0f0f0f | |||
} | |||
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID | |||
set _TARGETNAME $_CHIPNAME.cpu | |||
target create $_TARGETNAME arm7tdmi -endian $_ENDIAN -chain-position $_TARGETNAME | |||
# at CPU CLK <32kHz this must be disabled | |||
arm7_9 fast_memory_access enable | |||
arm7_9 dcc_downloads enable | |||
set _FLASHNAME $_CHIPNAME.flash | |||
flash bank $_FLASHNAME cfi 0x01000000 0x200000 2 2 $_TARGETNAME | |||
$_TARGETNAME configure -event reset-init { | |||
# Set up chip selects & timings | |||
mww 0xFFE00000 0x0100273D | |||
mww 0xFFE00004 0x08002125 | |||
mww 0xFFEe0008 0x02002125 | |||
mww 0xFFE0000c 0x03002125 | |||
mww 0xFFE00010 0x40000000 | |||
mww 0xFFE00014 0x50000000 | |||
mww 0xFFE00018 0x60000000 | |||
mww 0xFFE0001c 0x70000000 | |||
mww 0xFFE00020 0x00000001 | |||
mww 0xFFE00024 0x00000000 | |||
# remap | |||
mww 0xFFFFF124 0xFFFFFFFF | |||
mww 0xffff0010 0x100 | |||
mww 0xffff0034 0x100 | |||
#disable 16x5x UART interrupts | |||
mww 0x08020004 0 | |||
} | |||
$_TARGETNAME configure -event gdb-attach { | |||
# Without this gdb-attach will first time as probe will fail | |||
reset init | |||
} | |||
# required for usable performance. Used for lots of | |||
# other things than flash programming. | |||
$_TARGETNAME configure -work-area-phys 0x00020000 -work-area-size 0x20000 -work-area-backup 0 | |||
adapter speed 16000 | |||
proc production_info {} { | |||
return "Serial number is official MAC number. Format XXXXXXXXXXXX" | |||
} | |||
# There is no return value from this procedure. If it is | |||
# successful it does not throw an exception | |||
# | |||
# Progress messages are output via puts | |||
proc production {firmwarefile serialnumber} { | |||
if {[string length $serialnumber]!=12} { | |||
echo "Invalid serial number" | |||
return | |||
} | |||
echo "Power cycling target" | |||
power off | |||
sleep 3000 | |||
power on | |||
sleep 1000 | |||
reset init | |||
flash write_image erase $firmwarefile 0x1000000 bin | |||
verify_image $firmwarefile 0x1000000 bin | |||
# Big endian... weee!!!! | |||
echo "Setting MAC number to $serialnumber" | |||
flash fillw [expr 0x1030000-0x8] "0x[string range $serialnumber 2 3][string range $serialnumber 0 1]0000" 1 | |||
flash fillw [expr 0x1030000-0x4] "0x[string range $serialnumber 10 11][string range $serialnumber 8 9][string range $serialnumber 6 7][string range $serialnumber 4 5]" 1 | |||
echo "Production successful" | |||
} | |||
proc production_test {} { | |||
power on | |||
sleep 1000 | |||
target_request debugmsgs enable | |||
reset run | |||
sleep 25000 | |||
target_request debugmsgs disable | |||
return "See IP address above..." | |||
} |