zy1000: drop the code, deprecated in v0.10.0
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: jenkins
This commit is contained in:
parent
58b95eac48
commit
b0fe92dba7
43
configure.ac
43
configure.ac
|
@ -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
|
File diff suppressed because it is too large
Load Diff
|
@ -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..."
|
||||
}
|
Loading…
Reference in New Issue