URL
https://opencores.org/ocsvn/adv_debug_sys/adv_debug_sys/trunk
Subversion Repositories adv_debug_sys
Compare Revisions
- This comparison shows the changes necessary to convert path
/adv_debug_sys/tags
- from Rev 26 to Rev 27
- ↔ Reverse comparison
Rev 26 → Rev 27
/ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/sim_lib/modelsim_win32/Makefile
File deleted
\ No newline at end of file
/ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/sim_lib/modelsim_win32/jp-io-vpi.dll
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/sim_lib/modelsim_win32/jp-io-vpi.dll
Property changes :
Deleted: svn:executable
Deleted: svn:mime-type
## -1 +0,0 ##
-application/octet-stream
\ No newline at end of property
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/sim_lib/modelsim_linux_x86/Makefile
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/sim_lib/modelsim_linux_x86/Makefile (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/sim_lib/modelsim_linux_x86/Makefile (nonexistent)
@@ -1,20 +0,0 @@
-
-SRCDIR=../src/
-CC = gcc
-
-# The location of the ModelSim installation, used
-# to build the C lib for VPI. Must contain a subdir with
-# vpi_user.h.
-MODEL=/opt/modelsim
-
-
-
-default: vpi
-
-# This is for ModelSim under Linux (x86/32)
-# If RH v7.1 or lower, add -noinhibit-exec
-jp-io-vpi.so: $(SRCDIR)jp-io-vpi.c Makefile
- $(CC) -c -I$(MODEL)/modeltech/include $(SRCDIR)jp-io-vpi.c -o jp-io-vpi.o
- $(CC) -shared -Bsymbolic -o jp-io-vpi.so jp-io-vpi.o -lc
-
-vpi: jp-io-vpi.so Makefile
\ No newline at end of file
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/sim_lib/icarus/Makefile
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/sim_lib/icarus/Makefile (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/sim_lib/icarus/Makefile (nonexistent)
@@ -1,12 +0,0 @@
-
-SRCDIR=../src/
-
-
-
-default: vpi
-
-# This is for the Icarus simulator.
-jp-io-vpi.vpi: $(SRCDIR)jp-io-vpi.c
- iverilog-vpi $(SRCDIR)jp-io-vpi.c
-
-vpi: jp-io-vpi.vpi Makefile
\ No newline at end of file
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/sim_lib/src/jp-io-vpi.c
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/sim_lib/src/jp-io-vpi.c (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/sim_lib/src/jp-io-vpi.c (nonexistent)
@@ -1,371 +0,0 @@
-/* jp-io-vpi.c -- JTAG communications vpi plugin
- Copyright (C) 2004 György Jeney, nog@sdf.lonestar.org
- Modifications copyright (C) 2008 Nathan Yawn, nathan.yawn@opencores.org
-
- This file is part of OpenRISC 1000 Architectural Simulator.
-
- 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, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-/* This plugs into an rtl simulator via vpi */
-
-#include
-#include
-#include
-#include
-#include
-
-#ifdef WIN32
-#include
-#else
-#include
-#include
-#include
-#include
-#include
-#endif
-
-#include
-
-/* The vpi<->jp connection is `mastered' by jp1. Therefore we just sit doing
- * `nothing', waiting for jp1 to request or send us some data */
-static uint8_t vpi_out; /* data that the sim gives to us */
-
-#ifdef WIN32
-SOCKET jp_comm_m;
-SOCKET jp_comm;
-char msgbuf[64];
-char * get_ws_error(void);
-#define GET_ERR_MSG get_ws_error()
-#ifndef EAGAIN
-#define EAGAIN WSAEWOULDBLOCK
-#endif
-#ifndef EWOULDBLOCK
-#define EWOULDBLOCK WSAEWOULDBLOCK
-#endif
-#else
-static int jp_comm_m; /* The listening socket */
-static int jp_comm; /* The socket for communitateing with jp1 */
-#define GET_ERR_MSG strerror(errno)
-#endif
-
-#ifndef SOCKET_ERROR
-#define SOCKET_ERROR -1
-#endif
-
-
-static int jp_got_con; /* Have we got a connection ? */
-
-static int count_comp; /* Has the predetermined cycle-count been reached ? */
-static int jp_waiting; /* Is jp-waiting for count_comp ? */
-
-int jp_check_con();
-
-/*---------------------------------------------[ VPI interface to the sim ]---*/
-/* Sends a byte from the sim */
-int vpi_jp_out(char *xx)
-{
- vpiHandle sys = vpi_handle(vpiSysTfCall, 0);
- vpiHandle argv = vpi_iterate(vpiArgument, sys);
- s_vpi_value value;
-
- if(!argv) {
- vpi_printf("$jp_out: missing destination argument\n");
- vpi_free_object(argv);
- return 0;
- }
- vpiHandle dat_to = vpi_scan(argv);
- if(vpi_get(vpiType, dat_to) != vpiNet) {
- vpi_printf("$jp_out: Must have a net as argument!!\n");
- vpi_free_object(argv);
- return 0;
- }
-
- value.format = vpiVectorVal;
- vpi_get_value(dat_to, &value);
-
- if((value.value.vector->bval & 1)) {
- vpi_free_object(argv);
- return 0;
- }
- vpi_out = value.value.vector->aval & 1;
-
- vpi_free_object(argv);
-
- return 0;
-}
-
-/* Sends a byte to the sim */
-int vpi_jp_in(char *xx)
-{
- int ret;
- uint8_t dat;
- s_vpi_vecval vec;
-
- s_vpi_value value;
- vpiHandle sys = vpi_handle(vpiSysTfCall, 0);
- vpiHandle argv;
- vpiHandle dat_to;
-
- vpiHandle dat_to_index;
-
- if(!jp_got_con) {
- if(!jp_check_con())
- return 0;
- }
-
- ret = recv(jp_comm, &dat, 1, 0);
- if(!ret)
- return 0;
- if(ret == SOCKET_ERROR)
- {
-#ifdef WIN32
- if(WSAGetLastError() == WSAEWOULDBLOCK)
-#else
- if(errno == EAGAIN)
-#endif
- {
- return 0;
- }
- else {
- vpi_printf("Socket recv error: %s\n", GET_ERR_MSG);
- return 0;
- }
-
-}
-
-
- if(dat & 0x80) {
- switch(dat & 0x7f) {
- case 0:
- /* jp1 wants the TDO */
- send(jp_comm, &vpi_out, 1, 0);
- return 0;
- case 1:
- /* jp wants a time-out */
- if(count_comp) {
- dat = 0xFF; /* A value of 0xFF is expected, but not required */
- send(jp_comm, &dat, 1, 0);
- }
- else {
- jp_waiting = 1;
- }
- return 0;
- }
- }
-
- argv = vpi_iterate(vpiArgument, sys);
-
- /* We got the data, acknowledge it and send it on to the sim */
- if(!argv) {
- vpi_printf("$jp_in: missing destination argument\n");
- vpi_free_object(argv);
- return 0;
- }
- dat_to = vpi_scan(argv);
- if(vpi_get(vpiType, dat_to) != vpiReg) {
- vpi_printf("$jp_in: Must have a register (vpiReg) as argument (type is %d)!!\n", vpi_get(vpiType, dat_to));
- vpi_free_object(argv);
- return 0;
- }
-
- value.format = vpiVectorVal;
-
- vec.aval = (dat & 0xf) | 0x10;
- vec.bval = 0;
- value.value.vector = &vec;
- vpi_put_value(dat_to, &value, 0, vpiNoDelay);
-
- vpi_free_object(argv);
-
- dat |= 0x10;
- ret = send(jp_comm, &dat, 1, 0);
-
- count_comp = 0;
-
- return 0;
-}
-
-/* tells us that we reached a predetermined cycle count */
-int jp_wait_time(char *xx)
-{
- uint8_t dat = 0xFF;
- if(jp_waiting) {
- send(jp_comm, &dat, 1, 0);
- jp_waiting = 0;
- }
-
- count_comp = 1;
- return 0;
-}
-
-/*---------------------------------------------------[ VPI<->jp functions ]---*/
-int init_sock(char *xx)
-{
-
- struct sockaddr_in addr;
- int ret;
- vpiHandle sys = vpi_handle(vpiSysTfCall, 0);
- vpiHandle argv = vpi_iterate(vpiArgument, sys);
- s_vpi_value value;
-
- if(!argv) {
- vpi_printf("$jp_init: missing port argument\n");
- return 0;
- }
- vpiHandle sock = vpi_scan(argv);
-/* orig
- if(vpi_get(vpiConstType, sock) != vpiStringConst) {
- vpi_printf("$jp_init: Must have a string as argument!!\n");
- vpi_free_object(argv);
- return 0;
- }
-*/
-
-#ifdef WIN32
- WSADATA wsaData;
- ret = WSAStartup(MAKEWORD(2,2), &wsaData); // must be called before all socket operations
- if(ret != 0) {
- vpi_printf("$jp_init: Winsock startup failed.");
- return 0;
- }
-#endif
-
- value.format = vpiStringVal;
- vpi_get_value(sock, &value);
-
- addr.sin_family = AF_INET;
- addr.sin_port = atoi(value.value.str);
- addr.sin_addr.s_addr = INADDR_ANY;
- memset(addr.sin_zero, '\0', sizeof(addr.sin_zero));
-
- jp_comm_m = socket(PF_INET, SOCK_STREAM, 0);
-#ifdef WIN32
- if(jp_comm_m == INVALID_SOCKET)
-#else
- if(jp_comm_m < 0)
-#endif
- {
- fprintf(stderr, "Unable to create comm socket: %s\n", GET_ERR_MSG);
- return 0;
- }
-
- if(bind(jp_comm_m, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) {
- fprintf(stderr, "Unable to bind the socket: %s\n", GET_ERR_MSG);
- return 0;
- }
-
- if(listen(jp_comm_m, 1) == SOCKET_ERROR) {
- fprintf(stderr, "Unable to listen: %s\n", GET_ERR_MSG);
- return 0;
- }
-
-#ifdef WIN32
- u_long arg = 1;
- ioctlsocket(jp_comm_m, FIONBIO, &arg);
-#else
- ret = fcntl(jp_comm_m, F_GETFL);
- ret |= O_NONBLOCK;
- fcntl(jp_comm_m, F_SETFL, ret);
-#endif
-
- jp_got_con = 0;
- jp_waiting = 0;
- return 0;
-}
-
-/* Checks to see if we got a connection */
-int jp_check_con()
-{
- int ret;
-
- if((jp_comm = accept(jp_comm_m, NULL, NULL)) == SOCKET_ERROR) {
-#ifdef WIN32
- if(WSAGetLastError() == WSAEWOULDBLOCK)
-#else
- if(errno == EAGAIN)
-#endif
- return 0;
- fprintf(stderr, "Unable to accept connection: %s\n", GET_ERR_MSG);
- return 0;
- }
-
-
- // Set the comm socket to non-blocking.
- // Close the server socket, so that the port can be taken again
- // if the simulator is reset.
-#ifdef WIN32
- u_long arg = 1;
- ioctlsocket(jp_comm, FIONBIO, &arg);
- closesocket(jp_comm_m);
-#else
- ret = fcntl(jp_comm, F_GETFL);
- ret |= O_NONBLOCK;
- fcntl(jp_comm, F_SETFL, ret);
- close(jp_comm_m);
-#endif
-
- vpi_printf("JTAG communication connected!\n");
- jp_got_con = 1;
- return 1;
-}
-
-/*------------------------------------------------------------[ VPI stuff ]---*/
-static void jtag_register()
-{
- s_vpi_systf_data tf_data;
-
- tf_data.type = vpiSysTask;
- tf_data.tfname = "$jp_in";
- tf_data.calltf = vpi_jp_in;
- tf_data.compiletf = 0;
- tf_data.sizetf = 0;
- vpi_register_systf(&tf_data);
-
- tf_data.type = vpiSysTask;
- tf_data.tfname = "$jp_out";
- tf_data.calltf = vpi_jp_out;
- tf_data.compiletf = 0;
- tf_data.sizetf = 0;
- vpi_register_systf(&tf_data);
-
- tf_data.type = vpiSysTask;
- tf_data.tfname = "$jp_init";
- tf_data.calltf = init_sock;
- tf_data.compiletf = 0;
- tf_data.sizetf = 0;
- vpi_register_systf(&tf_data);
-
- tf_data.type = vpiSysTask;
- tf_data.tfname = "$jp_wait_time";
- tf_data.calltf = jp_wait_time;
- tf_data.compiletf = 0;
- tf_data.sizetf = 0;
- vpi_register_systf(&tf_data);
-}
-
-void (*vlog_startup_routines[])() = {
- jtag_register,
- 0
-};
-
-
-#ifdef WIN32
-char *get_ws_error(void)
-{
- snprintf(msgbuf, 64, "%d", WSAGetLastError());
- return msgbuf;
-}
-#endif
-
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_xpc_dlc9.h
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_xpc_dlc9.h (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_xpc_dlc9.h (nonexistent)
@@ -1,14 +0,0 @@
-
-#ifndef _CABLE_XPC_DLC9_H_
-#define _CABLE_XPC_DLC9_H_
-
-#include
-
-int cable_xpcusb_init();
-int cable_xpcusb_out(uint8_t value);
-int cable_xpcusb_inout(uint8_t value, uint8_t *inval);
-int cable_xpcusb_opt(int c, char *str);
-int cable_xpcusb_read_write_bit(uint8_t packet_out, uint8_t *bit_in);
-
-
-#endif
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_usbblaster.h
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_usbblaster.h (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_usbblaster.h (nonexistent)
@@ -1,15 +0,0 @@
-
-#ifndef _CABLE_USBBLASTER_H_
-#define _CABLE_USBBLASTER_H_
-
-#include
-
-int cable_usbblaster_init();
-int cable_usbblaster_out(uint8_t value);
-int cable_usbblaster_inout(uint8_t value, uint8_t *in_bit);
-int cable_usbblaster_write_stream(uint32_t *stream, int len_bits, int set_last_bit);
-int cable_usbblaster_read_stream(uint32_t *outstream, uint32_t *instream, int len_bits, int set_last_bit);
-int cable_usbblaster_opt(int c, char *str);
-void cable_usbblaster_wait();
-
-#endif
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/errcodes.c
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/errcodes.c (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/errcodes.c (nonexistent)
@@ -1,54 +0,0 @@
-/* errcodes.c - Error code to plaintext translator for the advanced JTAG bridge
- Copyright(C) 2008 Nathan Yawn
-
- 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, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include
-#include "errcodes.h"
-
-// We can declare the error string with a fixed size, because it can't
-// have more than ALL of the error strings in it. Be sure to expand it
-// as more errors are added. Also, put a space at the end of each
-// error string, as there may be multiple errors.
-char errstr[256];
-char *get_err_string(int err)
-{
- errstr[0] = '\0';
-
- if(err & APP_ERR_COMM)
- strcat(errstr, "\'JTAG comm error\' ");
- if(err & APP_ERR_MALLOC)
- strcat(errstr, "\'malloc failed\' ");
- if(err & APP_ERR_MAX_RETRY)
- strcat(errstr, "\'max retries\' ");
- if(err & APP_ERR_CRC)
- strcat(errstr, "\'CRC mismatch\' ");
- if(err & APP_ERR_MAX_BUS_ERR)
- strcat(errstr, "\'max WishBone bus errors\' ");
- if(err & APP_ERR_CABLE_INVALID)
- strcat(errstr, "\'Invalid cable\' ");
- if(err & APP_ERR_INIT_FAILED)
- strcat(errstr, "\'init failed\' ");
- if(err & APP_ERR_BAD_PARAM)
- strcat(errstr, "\'bad command line parameter\' ");
- if(err & APP_ERR_CONNECT)
- strcat(errstr, "\'connection failed\' ");
- if(err & APP_ERR_USB)
- strcat(errstr, "\'USB\' ");
- if(err & APP_ERR_CABLENOTFOUND)
- strcat(errstr, "\'cable not found\' ");
- return errstr;
-}
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/opencores_tap.h
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/opencores_tap.h (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/opencores_tap.h (nonexistent)
@@ -1,24 +0,0 @@
-#ifndef _OPENCORES_TAP_H_
-#define _OPENCODER_TAP_H_
-
-
-// Information on the OpenCores JTAG TAP
-// Included as a default, in place of a BSDL file
-// with the data.
-
-#define JI_SIZE (4)
-enum jtag_instr
- {
- JI_EXTEST = 0x0,
- JI_SAMPLE_PRELOAD = 0x1,
- JI_IDCODE = 0x2,
- JI_CHAIN_SELECT = 0x3,
- JI_INTEST = 0x4,
- JI_CLAMP = 0x5,
- JI_CLAMPZ = 0x6,
- JI_HIGHZ = 0x7,
- JI_DEBUG = 0x8,
- JI_BYPASS = 0xF
- };
-
-#endif
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/errcodes.h
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/errcodes.h (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/errcodes.h (nonexistent)
@@ -1,22 +0,0 @@
-#ifndef _ERRCODES_H_
-#define _ERRCODES_H_
-
-// Errors in high-level chain transactions
-// An error is a 32-bit bit-encoded value
-#define APP_ERR_NONE 0x0
-#define APP_ERR_COMM 0x1
-#define APP_ERR_MALLOC 0x2
-#define APP_ERR_MAX_RETRY 0x4
-#define APP_ERR_CRC 0x08
-#define APP_ERR_MAX_BUS_ERR 0x10
-#define APP_ERR_CABLE_INVALID 0x20
-#define APP_ERR_INIT_FAILED 0x40
-#define APP_ERR_BAD_PARAM 0x080
-#define APP_ERR_CONNECT 0x100
-#define APP_ERR_USB 0x200
-#define APP_ERR_CABLENOTFOUND 0x400
-#define APP_ERR_TEST_FAIL 0x0800
-
-char *get_err_string(int errval);
-
-#endif
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_common.c
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_common.c (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_common.c (nonexistent)
@@ -1,358 +0,0 @@
-/* cable_common.c -- Interface to the low-level cable drivers
- Copyright (C) 2001 Marko Mlinar, markom@opencores.org
- Copyright (C) 2004 György Jeney, nog@sdf.lonestar.org
- Copyright (C) 2008 Nathan Yawn, nathan.yawn@opencores.org
-
- 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, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-
-
-#include
-#include
-
-
-#include "cable_common.h"
-#include "cable_parallel.h"
-#include "cable_sim.h"
-#include "cable_usbblaster.h"
-#include "cable_ft2232.h"
-#include "cable_xpc_dlc9.h"
-#include "errcodes.h"
-
-#define debug(...) //fprintf(stderr, __VA_ARGS__ )
-
-static struct jtag_cable {
- const char *name;
- int (*inout_func)(uint8_t, uint8_t *);
- int (*out_func)(uint8_t);
- int (*init_func)();
- void (*wait_func)();
- int (*opt_func)(int, char *);
- int (*bit_out_func)(uint8_t);
- int (*bit_inout_func)(uint8_t, uint8_t *);
- int (*stream_out_func)(uint32_t *, int, int);
- int (*stream_inout_func)(uint32_t *, uint32_t *, int, int);
- int (*flush_func)();
- const char *opts;
- const char *help;
-} jtag_cables[] = {
- { "rtl_sim",
- cable_rtl_sim_inout,
- cable_rtl_sim_out,
- cable_rtl_sim_init,
- NULL,
- cable_rtl_sim_opt,
- cable_common_write_bit,
- cable_common_read_write_bit,
- cable_common_write_stream,
- cable_common_read_stream,
- NULL,
- "d:",
- "-d [directory] Directory in which gdb_in.dat/gdb_out.dat may be found\n" },
- { "vpi",
- cable_vpi_inout,
- cable_vpi_out,
- cable_vpi_init,
- cable_vpi_wait,
- cable_vpi_opt,
- cable_common_write_bit,
- cable_common_read_write_bit,
- cable_common_write_stream,
- cable_common_read_stream,
- NULL,
- "s:p:",
- "-p [port] Port number that the VPI module is listening on\n\t-s [server] Server that the VPI module is running on\n" },
- { "xpc3",
- cable_xpc3_inout,
- cable_xpc3_out,
- cable_parallel_init,
- cable_parallel_phys_wait,
- cable_parallel_opt,
- cable_common_write_bit,
- cable_common_read_write_bit,
- cable_common_write_stream,
- cable_common_read_stream,
- NULL,
- "p:",
- "-p [port] Which port to use when communicating with the parport hardware (eg. 0x378)\n" },
- { "xess",
- cable_xess_inout,
- cable_xess_out,
- cable_parallel_init,
- cable_parallel_phys_wait,
- cable_parallel_opt,
- cable_common_write_bit,
- cable_common_read_write_bit,
- cable_common_write_stream,
- cable_common_read_stream,
- NULL,
- "p:",
- "-p [port] Which port to use when communicating with the parport hardware (eg. 0x378)\n" },
-#ifdef __SUPPORT_USB_CABLES__
- { "usbblaster",
- cable_usbblaster_inout,
- cable_usbblaster_out,
- cable_usbblaster_init,
- NULL,
- cable_usbblaster_opt,
- cable_common_write_bit,
- cable_common_read_write_bit,
- cable_usbblaster_write_stream,
- cable_usbblaster_read_stream,
- NULL,
- "",
- "no options\n" },
- { "xpc_usb",
- cable_xpcusb_inout,
- cable_xpcusb_out,
- cable_xpcusb_init,
- NULL,
- cable_xpcusb_opt,
- cable_common_write_bit,
- cable_xpcusb_read_write_bit,
- cable_common_write_stream,
- cable_common_read_stream,
- NULL,
- "",
- "no options\n" },
-#ifdef __SUPPORT_FTDI_CABLES__
- { "ft2232",
- NULL,
- NULL,
- cable_ftdi_init,
- NULL,
- cable_ftdi_opt,
- cable_ftdi_write_bit,
- cable_ftdi_read_write_bit,
- cable_ftdi_write_stream,
- cable_ftdi_read_stream,
- cable_ftdi_flush,
- "",
- "no options\n" },
-#endif // __SUPPORT_FTDI_CABLES__
-#endif // __SUPPORT_USB_CABLES__
- { NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL } };
-
-static struct jtag_cable *jtag_cable_in_use = NULL; /* The currently selected cable */
-
-
-/////////////////////////////////////////////////////////////////////////////////////
-// Cable subsystem / init functions
-
-
-/* Selects a cable for use */
-int cable_select(const char *cable)
-{
- int i;
-
- for(i = 0; jtag_cables[i].name; i++) {
- if(!strcmp(cable, jtag_cables[i].name)) {
- jtag_cable_in_use = &jtag_cables[i];
- return APP_ERR_NONE;
- }
- }
-
- return APP_ERR_CABLE_INVALID;
-}
-
-/* Calls the init function of the cable
- */
-int cable_init()
-{
- return jtag_cable_in_use->init_func();
-}
-
-/* Parses command-line options specific to the selected cable */
-int cable_parse_opt(int c, char *str)
-{
- return jtag_cable_in_use->opt_func(c, str);
-}
-
-const char *cable_get_args()
-{
- if(jtag_cable_in_use != NULL)
- return jtag_cable_in_use->opts;
- else
- return NULL;
-}
-
-/* Prints a (short) useage message for each available cable */
-void cable_print_help()
-{
- int i;
- printf("Available cables: ");
-
- for(i = 0; jtag_cables[i].name; i++) {
- if(i)
- printf(", ");
- printf("%s", jtag_cables[i].name);
- }
-
- printf("\n\nOptions availible for the cables:\n");
- for(i = 0; jtag_cables[i].name; i++) {
- if(!jtag_cables[i].help)
- continue;
- printf(" %s:\n %s", jtag_cables[i].name, jtag_cables[i].help);
- }
-}
-
-
-/////////////////////////////////////////////////////////////////////////////////
-// Cable API Functions
-
-int cable_write_stream(uint32_t *stream, int len_bits, int set_last_bit) {
- return jtag_cable_in_use->stream_out_func(stream, len_bits, set_last_bit);
-}
-
-int cable_read_write_stream(uint32_t *outstream, uint32_t *instream, int len_bits, int set_last_bit) {
- return jtag_cable_in_use->stream_inout_func(outstream, instream, len_bits, set_last_bit);
-}
-
-int cable_write_bit(uint8_t packet) {
- return jtag_cable_in_use->bit_out_func(packet);
-}
-
-int cable_read_write_bit(uint8_t packet_out, uint8_t *bit_in) {
- return jtag_cable_in_use->bit_inout_func(packet_out, bit_in);
-}
-
-int cable_flush(void) {
- if(jtag_cable_in_use->flush_func != NULL)
- return jtag_cable_in_use->flush_func();
- return APP_ERR_NONE;
-}
-
-
-/////////////////////////////////////////////////////////////////////////////////////
-// Common functions which may or may not be used by individual drivers
-
-
-/* Note that these make no assumption as to the starting state of the clock,
- * and they leave the clock HIGH. But, these need to interface with other routines (like
- * the byte-shift mode in the USB-Blaster), which begin by assuming that a new
- * data bit is available at TDO, which only happens after a FALLING edge of TCK.
- * So, routines which assume new data is available will need to start by dropping
- * the clock.
- */
-int cable_common_write_bit(uint8_t packet) {
- uint8_t data = TRST_BIT; // TRST is active low, don't clear unless /set/ in 'packet'
- int err = APP_ERR_NONE;
-
- /* Write data, drop clock */
- if(packet & TDO) data |= TDI_BIT;
- if(packet & TMS) data |= TMS_BIT;
- if(packet & TRST) data &= ~TRST_BIT;
-
- err |= jtag_cable_in_use->out_func(data);
- if (jtag_cable_in_use->wait_func != NULL) jtag_cable_in_use->wait_func();
-
- /* raise clock, to do write */
- err |= jtag_cable_in_use->out_func(data | TCLK_BIT);
- if (jtag_cable_in_use->wait_func != NULL) jtag_cable_in_use->wait_func();
-
- return err;
-}
-
-int cable_common_read_write_bit(uint8_t packet_out, uint8_t *bit_in) {
- uint8_t data = TRST_BIT; // TRST is active low, don't clear unless /set/ in 'packet'
- int err = APP_ERR_NONE;
-
- /* Write data, drop clock */
- if(packet_out & TDO) data |= TDI_BIT;
- if(packet_out & TMS) data |= TMS_BIT;
- if(packet_out & TRST) data &= ~TRST_BIT;
-
- err |= jtag_cable_in_use->out_func(data); // drop the clock to make data available, set the out data
- if (jtag_cable_in_use->wait_func != NULL) jtag_cable_in_use->wait_func();
- err |= jtag_cable_in_use->inout_func((data | TCLK_BIT), bit_in); // read in bit, clock high for out bit.
- if (jtag_cable_in_use->wait_func != NULL) jtag_cable_in_use->wait_func();
-
- return err;
-}
-
-
-/* Writes bitstream via bit-bang. Can be used by any driver which does not have a high-speed transfer function.
- * Transfers LSB to MSB of stream[0], then LSB to MSB of stream[1], etc.
- */
-int cable_common_write_stream(uint32_t *stream, int len_bits, int set_last_bit) {
- int i;
- int index = 0;
- int bits_this_index = 0;
- uint8_t out;
- int err = APP_ERR_NONE;
-
- debug("writeSrrm%d(", len_bits);
- for(i = 0; i < len_bits - 1; i++) {
- out = (stream[index] >> bits_this_index) & 1;
- err |= cable_write_bit(out);
- debug("%i", out);
- bits_this_index++;
- if(bits_this_index >= 32) {
- index++;
- bits_this_index = 0;
- }
- }
-
- out = (stream[index] >>(len_bits - 1)) & 0x1;
- if(set_last_bit) out |= TMS;
- err |= cable_write_bit(out);
- debug("%i)\n", out);
- return err;
-}
-
-/* Gets bitstream via bit-bang. Can be used by any driver which does not have a high-speed transfer function.
- * Transfers LSB to MSB of stream[0], then LSB to MSB of stream[1], etc.
- */
-int cable_common_read_stream(uint32_t *outstream, uint32_t *instream, int len_bits, int set_last_bit) {
- int i;
- int index = 0;
- int bits_this_index = 0;
- uint8_t inval, outval;
- int err = APP_ERR_NONE;
-
- instream[0] = 0;
-
- debug("readStrm%d(", len_bits);
- for(i = 0; i < (len_bits - 1); i++) {
- outval = (outstream[index] >> bits_this_index) & 0x1;
- err |= cable_read_write_bit(outval, &inval);
- debug("%i", inval);
- instream[index] |= (inval << bits_this_index);
- bits_this_index++;
- if(bits_this_index >= 32) {
- index++;
- bits_this_index = 0;
- instream[index] = 0; // It's safe to do this, because there's always at least one more bit
- }
- }
-
- if (set_last_bit)
- outval = ((outstream[index] >> (len_bits - 1)) & 1) | TMS;
- else
- outval = (outstream[index] >> (len_bits - 1)) & 1;
-
- err |= cable_read_write_bit(outval, &inval);
- debug("%i", inval);
- instream[index] |= (inval << bits_this_index);
-
- debug(") = 0x%lX\n", instream[0]);
-
- return err;
-}
-
-
-
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/bsdl_parse.c
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/bsdl_parse.c (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/bsdl_parse.c (nonexistent)
@@ -1,487 +0,0 @@
-/* bsdl_parse.c - BSDL parser for the advanced JTAG bridge
- Copyright(C) 2008 Nathan Yawn
-
- 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, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include
-#include
-#include // isspace(), etc.
-#include // malloc(), strtoul(), etc.
-#include "bsdl.h" // has constants
-
-
-#define debug(...) //fprintf(stderr, __VA_ARGS__ )
-
-char * strtoupper(char *str);
-int get_line(char *filedata, int startpos, char **linedata, int filesize);
-char * strchr_s(char *str, char *chars);
-void parse_opcodes(char *cmdbuf, uint32_t *debug_cmd, uint32_t *user1_cmd, uint32_t *idcode_cmd);
-
-// We assume that no value will be more than 128 chars
-char tmpbuf[128];
-
-
- /////////////////////////////////////////////////////////////////
- // API call: extract desired info from 1 BSDL fise
-
-bsdlinfo *parse_extract_values(char *bsdlfilename)
-{
- FILE *fd;
- int filesize;
- bsdlinfo *ret;
- char *filedata;
- char *linedata;
- char *token;
- char *last;
- char *cmdbuf;
- int filepos = 0;
- int i,j;
- char done,valid,opens;
-
- int IR_size = -1;
- uint8_t found_IR_size = 0;
- uint32_t debug_cmd = TAP_CMD_INVALID;
- uint32_t user1_cmd = TAP_CMD_INVALID;
- uint32_t idcode_cmd = TAP_CMD_INVALID;
- uint8_t found_cmds = 0;
- uint32_t idcode = 0;
- uint32_t idcode_mask = 0xFFFFFFFF; // 'X' is a valid char in an IDCODE, set 0's here for X's.
- uint8_t found_idcode = 0;
- char *entityname = NULL;
-
- // Open the file
- fd = fopen(bsdlfilename, "r");
- if(fd == NULL) {
- printf("ERROR: failed to open BSDL file %s\n", bsdlfilename);
- return NULL;
- }
-
- fseek(fd, 0, SEEK_END);
- filesize = ftell(fd);
- fseek(fd, 0, SEEK_SET);
-
- filedata = (char *) malloc(filesize);
- if(filedata == NULL) {
- printf("ERROR: failed to allocate memory for BSDL file %s\n", bsdlfilename);
- return NULL;
- }
-
- if(fread(filedata, 1, filesize, fd) < filesize) { // 1 long read will be faster than many short ones
- printf("Warning: failed to read entire BSDL file %s\n", bsdlfilename);
- }
-
- fclose(fd);
-
-
- // while there's more data and not all values have been found
- while((filepos < filesize) && (!found_IR_size || !found_cmds || !found_idcode))
- {
- // Get a line. Replace any "--" with a \0 char
- filepos = get_line(filedata, filepos, &linedata, filesize);
-
- // look for each value
- token = strtok_r(linedata, " \t", &last);
- if(token == NULL) {
- printf("ERROR: End of file reached before END statement is BSDL file \'%s\'\n", bsdlfilename);
- break;
- }
-
- if(!strcmp(strtoupper(token), "ENTITY")) {
- // Parse an entity line
- token = strtok_r(NULL, " \t", &last);
- if(token != NULL) {
- entityname = (char *) malloc(strlen(token));
- if(entityname != NULL) strcpy(entityname, token);
- debug("Found entity \'%s\'\n", entityname);
- } else {
- printf("Parse error near ENTITY token in file %s\n", bsdlfilename);
- }
- }
- else if(!strcmp(strtoupper(token), "CONSTANT")) {
- // Parse a constant declaration...we ignore them, just get lines until we find a ';' char
- // assume nothing else useful comes on the line after the ';'
- // Slightly awkward, since we have to search the rest of the line after the strtok, then possible
- // new lines as well.
- token = strtok_r(NULL, " \t", &last); // debug...don't worry about error, token only used in printf
- debug("Ignoring constant \'%s\'\n", token); // debug
- while(strchr(last, ';') == NULL) {
- filepos = get_line(filedata, filepos, &last, filesize);
- }
- }
- else if(!strcmp(strtoupper(token), "GENERIC")) {
- // Parse a generic declaration...we ignore them, just get lines until we find a ';' char
- // assume nothing else useful comes on the line after the ';'
- // Slightly awkward, since we have to search the rest of the line after the strtok, then possible
- // new lines as well.
- token = strtok_r(NULL, " \t", &last); // debug...don't worry about error, token only used in printf
- debug("Ignoring generic \'%s\'\n", token); // debug
- while(strchr(last, ';') == NULL) {
- filepos = get_line(filedata, filepos, &last, filesize);
- }
- }
- else if(!strcmp(strtoupper(token), "USE")) {
- // Parse a 'use' declaration...we ignore them, just get lines until we find a ';' char
- // assume nothing else useful comes on the line after the ';'
- // Note that there may be no space after the token, so add ';' to the tokenizing list in the debug bits.
- // Slightly awkward, since we have to search the rest of the line after the strtok, then possible
- // new lines as well.
- token = strtok_r(NULL, " \t;", &last); // debug ...don't worry about error, token only used in printf
- debug("Ignoring use \'%s\'\n", token); // debug
- while(strchr(last, ';') == NULL) {
- filepos = get_line(filedata, filepos, &last, filesize);
- }
- }
- else if(!strcmp(strtoupper(token), "END")) {
- // We're done, whether we've found what we want or not. Eject eject eject...
- debug("Found END token, stopping parser\n");
- break;
- }
- else if(!strcmp(strtoupper(token), "PORT")) {
- // Parse a port list. Find a '(', find a ')', find a ';'.
- // Note that "()" pairs may occur in between.
- // 'last' must be set in the first two strchr() calls so that the next strchr() call will
- // begin parsing after the previous char position. Otherwise, e.g. a ';' before the ')' but on the same
- // line would (incorrectly) satisfy the search.
- while((last = strchr(last, '(')) == NULL) {
- filepos = get_line(filedata, filepos, &last, filesize);
- }
- opens = 1;
- last++; // don't leave 'last' pointing at the '(' char, since we're looking for another
-
- do {
- while((last = strchr_s(last, "()")) == NULL) {
- filepos = get_line(filedata, filepos, &last, filesize); // *** abort if new line is empty
- }
- if(*last == '(') opens++;
- else if(*last == ')') opens--;
- last++; // don't leave last pointing at the same "()" char, since we're looking for another
- } while(opens);
-
-
- while(strchr(last, ';') == NULL) {
- filepos = get_line(filedata, filepos, &last, filesize);
- }
- debug("Ignored port statement\n");
- }
- else if(!strcmp(strtoupper(token), "ATTRIBUTE")) {
- // Parse an attribute
- token = strtok_r(NULL, " \t", &last); // *** check for error
- if(!strcmp(strtoupper(token), "INSTRUCTION_LENGTH")) {
- // Find ':', then "entity", then "is", then take anything before the ';' as the value
- while((last = strchr(last, ':')) == NULL) {
- filepos = get_line(filedata, filepos, &last, filesize); // *** check last actually has data?
- }
- while((last = strstr(last, "entity")) == NULL) { // don't do strtoupper() here, that would do the entire line
- filepos = get_line(filedata, filepos, &last, filesize); // *** check last actually has data?
- }
- while((last = strstr(last, "is")) == NULL) {
- filepos = get_line(filedata, filepos, &last, filesize); // *** check last actually has data?
- }
-
- // scan until the end of the line looking for data
- j = 0;
- done = 0;
- while(*last != '\0') {
- if(isdigit(*last)) tmpbuf[j++] = *last;
- else if(*last == ';') { done = 1; break;}
- last++;
- }
- // May need to go to additional lines
- while(!done) {
- filepos = get_line(filedata, filepos, &linedata, filesize); // *** break if linedata has no data
- while(*linedata != '\0') {
- if(isdigit(*linedata)) tmpbuf[j++] = *linedata;
- else if(*linedata == ';') { done = 1; break;}
- linedata++;
- }
- }
-
- tmpbuf[j] = '\0';
- IR_size = strtoul(tmpbuf, NULL, 0);
- found_IR_size = 1;
- debug("Found IR size %i (%s)\n", IR_size, tmpbuf);
- } // end if INSTRUCTION_LENGTH
-
- else if(!strcmp(strtoupper(token), "INSTRUCTION_OPCODE")) {
- // Find ": entity is"
- while((last = strchr(last, ':')) == NULL) {
- filepos = get_line(filedata, filepos, &last, filesize); // *** check last actually has data?
- }
- while((last = strstr(last, "entity")) == NULL) { // don't do strtoupper() here, that would do the entire line
- filepos = get_line(filedata, filepos, &last, filesize); // *** check last actually has data?
- }
- while((last = strstr(last, "is")) == NULL) {
- filepos = get_line(filedata, filepos, &last, filesize); // *** check last actually has data?
- }
-
- // We're going to copy the entire attribute (all commands) into a temp. buffer. We need a big enough buffer,
- // and we can't just scan for ';' to find out because there's a '\0' at the end of this line.
- // But, it can't be bigger than the entire rest of the file, so...
- cmdbuf = (char *) malloc(filesize-filepos);
- // Parse until ';', and grab everything between each pair of "" found
- // Note that 'last' still points at "is"
- j = 0;
- done = 0;
- valid = 0;
- while(*last != '\0') {
- if(*last == ';') { done = 1; break;} // Put this first in case of badly formed BSDL files
- else if(valid && (*last != '\"')) cmdbuf[j++] = *last;
- else if(*last == '\"') valid = !valid;
- last++;
- }
- // May need to go to additional lines
- while(!done) {
- filepos = get_line(filedata, filepos, &linedata, filesize); // *** break if linedata has no data
- while(*linedata != '\0') {
- if(valid && (*linedata != '\"')) cmdbuf[j++] = *linedata;
- else if(*linedata == '\"') valid = !valid;
- else if(*linedata == ';') { done = 1; break;}
- linedata++;
- }
- }
- cmdbuf[j] = '\0';
-
- // Parse the opcodes attribute. This is an exercise unto itself, so do it in another function.
- parse_opcodes(cmdbuf, &debug_cmd, &user1_cmd, &idcode_cmd);
- found_cmds = 1;
- free(cmdbuf);
-
- } // end if INSTRUCTION_OPCODE
-
- else if(!strcmp(strtoupper(token), "IDCODE_REGISTER")) {
- // Find : entity is
- while((last = strchr(last, ':')) == NULL) {
- filepos = get_line(filedata, filepos, &last, filesize); // *** check last actually has data?
- }
- while((last = strstr(last, "entity")) == NULL) { // don't do strtoupper() here, that would do the entire line
- filepos = get_line(filedata, filepos, &last, filesize); // *** check last actually has data?
- }
- while((last = strstr(last, "is")) == NULL) {
- filepos = get_line(filedata, filepos, &last, filesize); // *** check last actually has data?
- }
-
- // Parse until ';', and grab everything between each pair of "" found
- // Note that 'last' still points at "is"
- j = 0;
- done = 0;
- valid = 0;
- while(*last != '\0') {
- if(*last == ';') { done = 1; break;} // Put this first in case of badly formed BSDL files
- else if(valid && (*last != '\"')) tmpbuf[j++] = *last;
- else if(*last == '\"') valid = !valid;
- last++;
- }
- // May need to go to additional lines
- while(!done) {
- filepos = get_line(filedata, filepos, &linedata, filesize); // *** break if linedata has no data
- while(*linedata != '\0') {
- if(valid && (*linedata != '\"')) tmpbuf[j++] = *linedata;
- else if(*linedata == '\"') valid = !valid;
- else if(*linedata == ';') { done = 1; break;}
- linedata++;
- }
- }
- tmpbuf[j] = '\0';
-
- // Parse the tmpbuf
- if(j != 32) printf("Warning: found %i chars (expected 32) while getting IDCODE in BSDL file %s.\n", j, bsdlfilename); // Sanity check
- debug("Got IDCODE string \'%s\'\n", tmpbuf);
- for(i = 0; i < j; i++) {
- if(tmpbuf[i] == '1') idcode |= 0x1<<(31-i);
- else if(toupper(tmpbuf[i]) == 'X') idcode_mask &= ~(0x1<<(31-i));
- }
- debug("Found IDCODE 0x%08X (%s), mask is 0x%08X\n", idcode, tmpbuf, idcode_mask);
- found_idcode = 1;
-
- } // end if IDCODE_REGISTER
-
- else {
- debug("Ignoring attribute \'%s\'\n", token);
- // Consume chars until ';' found
- while(strchr(last, ';') == NULL) {
- filepos = get_line(filedata, filepos, &last, filesize);
- }
- }
- }
- else {
- debug("Unknown token \'%s\' found in BSDL file %s\n", token, bsdlfilename);
- }
- }
-
- free(filedata);
-
- // Put the data in a struct for return and storage
- ret = (bsdlinfo *) malloc(sizeof(bsdlinfo));
- if(ret == NULL) {
- printf("Error: out of memory, unable to store BSDL info for file %s\n", bsdlfilename);
- return NULL;
- }
-
- ret->name = entityname; // this was malloc'd, so it's persistant, this is safe
- ret->idcode = idcode;
- ret->idcode_mask = idcode_mask;
- ret->IR_size = IR_size;
- ret->cmd_debug = debug_cmd;
- ret->cmd_user1 = user1_cmd;
- ret->cmd_idcode = idcode_cmd;
- ret->next = NULL;
-
- return ret;
-}
-
-
-
-//////////////////////////////////////////////////////////////////////////////////////////////
-// Local / helper functions
-
-
-// Returns 1 line from a complete file buffer pointed to by *filedata. Removes leading
-// whitespace, ignores comment lines, removes trailing comments (comments denoted by "--")
-// startpos: index in filedata[] to start looking for a new line.
-// linedata: set to point to the first char of the new line.
-// filesize: used so we don't go past the end of filedata[]
-// The return value is the first index after the returned line. This may be 1 past the end of the buffer.
-int get_line(char *filedata, int startpos, char **linedata, int filesize)
-{
- int lineidx = startpos;
- unsigned char loop;
- char *commentptr;
-
- do {
- loop = 0;
- while(isspace(filedata[lineidx]) && (lineidx < filesize)) lineidx++; // burn leading whitespace chars
-
- if(lineidx >= (filesize-1)) { // We look at the data at lineidx and lineidx+1...don't look at invalid offsets.
- lineidx = filesize-1;
- break;
- }
-
- if((filedata[lineidx] == '-') && (filedata[lineidx+1] == '-'))
- { // then this is a full-line comment, with no useful data
- while(((filedata[lineidx] != '\n') && (filedata[lineidx] != '\r')) && (lineidx < filesize))
- lineidx++; // burn comment line up to CR/LF
- loop = 1;
- }
- } while(loop);
-
- // Set the line pointer
- *linedata = &filedata[lineidx];
-
- // Put a NULL char at the newline
- while(!iscntrl(filedata[lineidx]) && (lineidx < filesize)) lineidx++;
- if(lineidx >= filesize) { // Don't write past the end of the array.
- lineidx = filesize-1;
- }
- filedata[lineidx] = '\0';
-
- // Put a NULL at the first "--" string, if any
- commentptr = strstr(*linedata, "--");
- if(commentptr != NULL) *commentptr = '\0';
-
- return lineidx+1;
-}
-
-
-// In-place string capitalizer
-char * strtoupper(char *str)
-{
- int i = 0;
-
- while(str[i] != '\0') {
- str[i] = toupper(str[i]);
- i++;
- }
-
- return str;
-}
-
-// Searches a string 'str' for the first occurance of any
-// character in the string 'chars'. Returns a pointer to
-// the char in 'str' if one is found, returns NULL if
-// none of the chars in 'chars' are present in 'str'.
-char * strchr_s(char *str, char *chars)
-{
- int slen = strlen(chars);
- char *ptr = str;
- int i;
-
- while(*ptr != '\0') {
- for(i = 0; i < slen; i++) {
- if(*ptr == chars[i])
- return ptr;
- }
- ptr++;
- }
-
- return NULL;
-}
-
-
-// Parses a string with command name / opcode pairs of the format
-// EXTEST (1111000000),SAMPLE (1111000001), [...]
-// There may or may not be a space between the name and the open paren.
-// We do not assume a comma after the last close paren.
-#define TARGET_DEBUG 1
-#define TARGET_USER1 2
-#define TARGET_IDCODE 3
-void parse_opcodes(char *cmdbuf, uint32_t *debug_cmd, uint32_t *user1_cmd, uint32_t *idcode_cmd)
-{
- char *saveptr = NULL;
- char *cmd;
- char *token;
- char *saveptr2;
- int target;
- int opcode;
-
- cmd = strtok_r(cmdbuf, ",", &saveptr);
- while(cmd != NULL)
- {
- // 'cmd' should now have one pair in the form "EXTEST (1111000000)"
- target = 0;
- token = strtok_r(cmd, " \t(", &saveptr2);
- if(!strcmp(strtoupper(token), "DEBUG")) {
- target = TARGET_DEBUG;
- debug("Found DEBUG opcode: ");
- }
- else if(!strcmp(strtoupper(token), "USER1")) {
- target = TARGET_USER1;
- debug("Found USER1 opcode:");
- }
- else if(!strcmp(strtoupper(token), "IDCODE")) {
- target = TARGET_IDCODE;
- debug("Found IDCODE opcode: ");
- }
-
- if(target) { // don't parse opcode number unless necessary
- token = strtok_r(NULL, " \t()", &saveptr2);
- if(token != NULL) {
- opcode = strtoul(token, NULL, 2); // *** Test for errors
- debug("0x%X (%s)\n", opcode, token);
-
- if(target == TARGET_DEBUG) *debug_cmd = opcode;
- else if(target == TARGET_USER1) *user1_cmd = opcode;
- else if(target == TARGET_IDCODE) *idcode_cmd = opcode;
- }
- else {
- printf("Error: failed to find opcode value after identifier.\n");
- }
- }
-
- cmd = strtok_r(NULL, ",", &saveptr);
- }
-
-
-}
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_sim.c
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_sim.c (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_sim.c (nonexistent)
@@ -1,259 +0,0 @@
-/* cable_sim.c - Simulation connection drivers for the Advanced JTAG Bridge
- Copyright (C) 2001 Marko Mlinar, markom@opencores.org
- Copyright (C) 2004 György Jeney, nog@sdf.lonestar.org
-
-
- 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, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-
-
-#include "cable_common.h"
-#include "errcodes.h"
-
-#define debug(...) //fprintf(stderr, __VA_ARGS__ )
-
-/* Only used in the vpi */
-static int vpi_comm;
-static int vpi_port = 4567;
-static char *vpi_server = "localhost";
-
-/* Only used for the rtl_sim */
-static char *gdb_in = "gdb_in.dat";
-static char *gdb_out = "gdb_out.dat";
-
-
-
-/*-------------------------------------------[ rtl_sim specific functions ]---*/
-int cable_rtl_sim_init()
-{
- FILE *fin = fopen (gdb_in, "wt+");
- if(!fin) {
- fprintf(stderr, "Can not open %s\n", gdb_in);
- return APP_ERR_INIT_FAILED;
- }
- fclose(fin);
- return APP_ERR_NONE;
-}
-
-int cable_rtl_sim_out(uint8_t value)
-{
- FILE *fout;
- int num_read;
- int r;
- debug("O (%x)\n", value);
- fout = fopen(gdb_in, "wt+");
- fprintf(fout, "F\n");
- fflush(fout);
- fclose(fout);
- fout = fopen(gdb_out, "wt+");
- fprintf(fout, "%02X\n", value);
- fflush(fout);
- fclose(fout);
- do {
- fout = fopen(gdb_out, "rt");
- r = fscanf(fout,"%x", &num_read);
- fclose(fout);
- usleep(1000);
- debug(" (Ack %x) ", num_read);
- } while(!r || (num_read != (0x10 | value)));
- debug("\n");
- return APP_ERR_NONE;
-}
-
-uint8_t cable_rtl_sim_inout(uint8_t value, uint8_t *inval)
-{
- FILE *fin = 0;
- char ch;
- uint8_t data;
- debug("IO (");
-
- while(1) {
- fin = fopen(gdb_in, "rt");
- if(!fin) {
- usleep(1000);
- continue;
- }
- ch = fgetc(fin);
- fclose(fin);
- if((ch != '0') && (ch != '1')) {
- usleep(1000);
- continue;
- }
- else
- break;
- }
- data = ch == '1' ? 1 : 0;
-
- debug("%x,", data);
-
- cable_rtl_sim_out(value);
-
- debug("%x)\n", value);
-
- *inval = data;
- return APP_ERR_NONE;
-}
-
-
-int cable_rtl_sim_opt(int c, char *str)
-{
- switch(c) {
- case 'd':
- if(!(gdb_in = malloc(strlen(str) + 12))) { /* 12 == strlen("gdb_in.dat") + 2 */
- fprintf(stderr, "Unable to allocate enough memory\n");
- return APP_ERR_MALLOC;
- }
- if(!(gdb_out = malloc(strlen(str) + 13))) { /* 13 == strlen("gdb_out.dat") + 2 */
- fprintf(stderr, "Unable to allocate enough memory\n");
- free(gdb_in);
- return APP_ERR_MALLOC;
- }
-
- sprintf(gdb_in, "%s/gdb_in.dat", str);
- sprintf(gdb_out, "%s/gdb_out.dat", str);
- break;
- default:
- fprintf(stderr, "Unknown parameter '%c'\n", c);
- return APP_ERR_BAD_PARAM;
- }
- return APP_ERR_NONE;
-}
-
-/*-----------------------------------------------[ VPI specific functions ]---*/
-int cable_vpi_init()
-{
- struct sockaddr_in addr;
- struct hostent *he;
-
- if((vpi_comm = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
- fprintf(stderr, "Unable to create socket (%s)\n", strerror(errno));
- return APP_ERR_CONNECT;
- }
-
-
- if((he = gethostbyname(vpi_server)) == NULL) {
- perror("gethostbyname");
- return APP_ERR_CONNECT;
- }
-
- addr.sin_family = AF_INET;
- addr.sin_port = vpi_port;
- addr.sin_addr = *((struct in_addr *)he->h_addr);
- memset(addr.sin_zero, '\0', sizeof(addr.sin_zero));
-
- if(connect(vpi_comm, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
- fprintf(stderr, "Unable to connect to %s port %d (%s)\n", vpi_server, vpi_port,
- strerror(errno));
- return APP_ERR_CONNECT;
- }
-
- debug("VPI connected!");
-
- return APP_ERR_NONE;
-}
-
-int cable_vpi_out(uint8_t value)
-{
- uint8_t ack;
- int ret;
-
- /* Send the data to the socket */
- ret = send(vpi_comm, &value, 1, 0);
- debug("Sent %d, ret %d\n", value, ret);
-
- do {
- /* Ok, read the data */
- ret = recv(vpi_comm, &ack, 1, 0);
- if(ret < 0) {
- printf("Error during receive (%s)\n", strerror(errno));
- return APP_ERR_CONNECT;
- }
- } while(ack != (value | 0x10));
- return APP_ERR_NONE;
-}
-
-int cable_vpi_inout(uint8_t value, uint8_t *inval)
-{
- uint8_t dat;
-
- /* ask vpi to send us the out-bit */
- dat = 0x80;
- send(vpi_comm, &dat, 1, 0);
-
- /* Wait and read the data */
- recv(vpi_comm, &dat, 1, 0);
-
- if(dat > 1)
- fprintf(stderr, "Unexpected value: %i\n", dat);
-
- cable_vpi_out(value);
-
- *inval = dat;
- return APP_ERR_NONE;
-}
-
-void cable_vpi_wait()
-{
- uint8_t dat = 0x81;
-
- /* Get the sim to reply when the timeout has been reached */
- if(send(vpi_comm, &dat, 1, 0) < 1) {
- fprintf(stderr, "Failed to send pkt in cable_vpi_wait(): %s\n", strerror(errno));
- }
-
- /* block, waiting for the data */
- if(recv(vpi_comm, &dat, 1, 0) < 1) {
- fprintf(stderr, "Recv failed in cable_vpi_wait(): %s\n", strerror(errno));
- }
-
- if(dat != 0xFF)
- fprintf(stderr, "Warning: got wrong byte waiting for timeout: 0x%X\n", dat);
-
-}
-
-int cable_vpi_opt(int c, char *str)
-{
- switch(c) {
- case 'p':
- if((vpi_port = atoi(str)) == 0) {
- fprintf(stderr, "Bad port value for VPI sim: %s\n", str);
- return APP_ERR_BAD_PARAM;
- }
- break;
- case 's':
- vpi_server = strdup(str);
- if(vpi_server == NULL) {
- fprintf(stderr, "Unable to allocate enough memory for server string\n");
- return APP_ERR_MALLOC;
- }
- break;
- default:
- fprintf(stderr, "Unknown parameter '%c'\n", c);
- return APP_ERR_BAD_PARAM;
- }
- return APP_ERR_NONE;
-}
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_parallel.c
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_parallel.c (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_parallel.c (nonexistent)
@@ -1,191 +0,0 @@
-/* cable_parallel.c - Parallel cable drivers (XPC3 and XESS) for the Advanced JTAG Bridge
- Copyright (C) 2001 Marko Mlinar, markom@opencores.org
- Copyright (C) 2004 György Jeney, nog@sdf.lonestar.org
-
-
- 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, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-
-
-#include
-#include // for inb(), outb()
-#include
-#include
-
-#include "cable_common.h"
-#include "errcodes.h"
-
-
-#define LPT_READ (base+1)
-#define LPT_WRITE base
-
-// Common functions used by both cable types
-static int cable_parallel_out(uint8_t value);
-static int cable_parallel_inout(uint8_t value, uint8_t *inval);
-
-
-static int base = 0x378;
-
-
-
-/////////////////////////////////////////////////////////////////////////////////
-/*-------------------------------------[ Parallel port specific functions ]---*/
-///////////////////////////////////////////////////////////////////////////////
-
-int cable_parallel_init()
-{
-
- //#ifndef WIN32
- if (ioperm(base, 3, 1)) {
- fprintf(stderr, "Couldn't get the port at %x\n", base);
- perror("Root privileges are required.\n");
- return APP_ERR_INIT_FAILED;
- }
- printf("Connected to parallel port at %x\n", base);
- printf("Dropping root privileges.\n");
- setreuid(getuid(), getuid());
- //#endif
-
- return APP_ERR_NONE;
-}
-
-
-int cable_parallel_opt(int c, char *str)
-{
- switch(c) {
- case 'p':
- if(!sscanf(str, "%x", &base)) {
- fprintf(stderr, "p parameter must have a hex number as parameter\n");
- return APP_ERR_BAD_PARAM;
- }
- break;
- default:
- fprintf(stderr, "Unknown parameter '%c'\n", c);
- return APP_ERR_BAD_PARAM;
- }
- return APP_ERR_NONE;
-}
-
-/*-----------------------------------------[ Physical board wait function ]---*/
-void cable_parallel_phys_wait()
-{
- usleep(10);
-}
-
-/*----------------------------------------------[ xpc3 specific functions ]---*/
-int cable_xpc3_out(uint8_t value)
-{
- uint8_t out = 0;
-
- /* First convert the bits in value byte to the ones that the cable wants */
- if(value & TCLK_BIT)
- out |= 0x02; /* D1 pin 3 */
- if(value & TRST_BIT)
- out |= 0x10; /* Not used */
- if(value & TDI_BIT)
- out |= 0x01; /* D0 pin 2 */
- if(value & TMS_BIT)
- out |= 0x04; /* D2 pin 4 */
-
- return cable_parallel_out(out);
-}
-
-int cable_xpc3_inout(uint8_t value, uint8_t *inval)
-{
- uint8_t in;
- int retval;
- uint8_t out = 0;
-
- /* First convert the bits in value byte to the ones that the cable wants */
- if(value & TCLK_BIT)
- out |= 0x02; /* D1 pin 3 */
- if(value & TRST_BIT)
- out |= 0x10; /* Not used */
- if(value & TDI_BIT)
- out |= 0x01; /* D0 pin 2 */
- if(value & TMS_BIT)
- out |= 0x04; /* D2 pin 4 */
-
- retval = cable_parallel_inout(out, &in);
-
- if(in & 0x10) /* S6 pin 13 */
- *inval = 1;
- else
- *inval = 0;
-
- return retval;
-}
-
-/*----------------------------------------------[ xess specific functions ]---*/
-int cable_xess_out(uint8_t value)
-{
- uint8_t out = 0;
-
- /* First convert the bits in value byte to the ones that the cable wants */
- if(value & TCLK_BIT)
- out |= 0x04; /* D2 pin 4 */
- if(value & TRST_BIT)
- out |= 0x08; /* D3 pin 5 */
- if(value & TDI_BIT)
- out |= 0x10; /* D4 pin 6 */
- if(value & TMS_BIT)
- out |= 0x20; /* D3 pin 5 */
-
- return cable_parallel_out(out);
-}
-
-uint8_t cable_xess_inout(uint8_t value, uint8_t *inval)
-{
- uint8_t in;
- int retval;
- uint8_t out = 0;
-
- /* First convert the bits in value byte to the ones that the cable wants */
- if(value & TCLK_BIT)
- out |= 0x04; /* D2 pin 4 */
- if(value & TRST_BIT)
- out |= 0x08; /* D3 pin 5 */
- if(value & TDI_BIT)
- out |= 0x10; /* D4 pin 6 */
- if(value & TMS_BIT)
- out |= 0x20; /* D3 pin 5 */
-
- retval = cable_parallel_inout(out, &in);
-
- if(in & 0x20) /* S5 pin 12*/
- *inval = 1;
- else
- *inval = 0;
-
- return retval;
-}
-
-
-/*----------------------------------------------[ common helper functions ]---*/
-// 'static' for internal access only
-
-static int cable_parallel_out(uint8_t value)
-{
- outb(value, LPT_WRITE);
- return APP_ERR_NONE;
-}
-
-static int cable_parallel_inout(uint8_t value, uint8_t *inval)
-{
- *inval = inb(LPT_READ);
- outb(value, LPT_WRITE);
-
- return APP_ERR_NONE;
-}
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_common.h
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_common.h (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_common.h (nonexistent)
@@ -1,44 +0,0 @@
-
-#ifndef _CABLE_COMMON_H_
-#define _CABLE_COMMON_H_
-
-#include
-
-// Defines to use in the 'packet' args of cable_write_bit()
-// and cable_read_write_bit(). Note that while TRST is
-// active low for JTAG hardware, here the TRST bit
-// should be set when you want the TRST wire active
-// (JTAG TAP to be reset).
-#define TRST (0x04)
-#define TMS (0x02)
-#define TDO (0x01)
-
-// These should only be used in the cable_* files.
-#define TCLK_BIT (0x01)
-#define TRST_BIT (0x02)
-#define TDI_BIT (0x04)
-#define TMS_BIT (0x08)
-#define TDO_BIT (0x20)
-
-// Cable subsystem / init routines
-int cable_select(const char *cable);
-int cable_init();
-int cable_parse_opt(int c, char *str);
-const char *cable_get_args();
-void cable_print_help();
-
-
-// Cable API routines
-int cable_write_bit(uint8_t packet);
-int cable_read_write_bit(uint8_t packet_out, uint8_t *bit_in);
-int cable_write_stream(uint32_t *stream, int len_bits, int set_last_bit);
-int cable_read_write_stream(uint32_t *outstream, uint32_t *instream, int len_bits, int set_last_bit);
-int cable_flush(void);
-
-// Common functions for lower-level drivers to use as desired
-int cable_common_write_bit(uint8_t packet);
-int cable_common_read_write_bit(uint8_t packet_out, uint8_t *bit_in);
-int cable_common_write_stream(uint32_t *stream, int len_bits, int set_last_bit);
-int cable_common_read_stream(uint32_t *outstream, uint32_t *instream, int len_bits, int set_last_bit);
-
-#endif
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/bsdl_parse.h
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/bsdl_parse.h (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/bsdl_parse.h (nonexistent)
@@ -1,9 +0,0 @@
-#ifndef _BSDL_PARSE_H_
-#define _BSDL_PARSE_H_
-
-#include "bsdl.h" // need definition of bsdlinfo here
-
-
-bsdlinfo * parse_extract_values(char *bsdlfilename);
-
-#endif
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_sim.h
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_sim.h (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/cable_sim.h (nonexistent)
@@ -1,20 +0,0 @@
-
-#ifndef _CABLE_SIM_H_
-#define _CABLE_SIM_H_
-
-#include
-
-int cable_rtl_sim_init();
-int cable_rtl_sim_out(uint8_t value);
-int cable_rtl_sim_inout(uint8_t value, uint8_t *inval);
-void cable_rtl_sim_wait();
-int cable_rtl_sim_opt(int c, char *str);
-
-int cable_vpi_init();
-int cable_vpi_out(uint8_t value);
-int cable_vpi_inout(uint8_t value, uint8_t *inval);
-void cable_vpi_wait();
-int cable_vpi_opt(int c, char *str);
-
-
-#endif
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/doc/License_FDL-1.2.txt
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/doc/License_FDL-1.2.txt (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/doc/License_FDL-1.2.txt (nonexistent)
@@ -1,397 +0,0 @@
- GNU Free Documentation License
- Version 1.2, November 2002
-
-
- Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-0. PREAMBLE
-
-The purpose of this License is to make a manual, textbook, or other
-functional and useful document "free" in the sense of freedom: to
-assure everyone the effective freedom to copy and redistribute it,
-with or without modifying it, either commercially or noncommercially.
-Secondarily, this License preserves for the author and publisher a way
-to get credit for their work, while not being considered responsible
-for modifications made by others.
-
-This License is a kind of "copyleft", which means that derivative
-works of the document must themselves be free in the same sense. It
-complements the GNU General Public License, which is a copyleft
-license designed for free software.
-
-We have designed this License in order to use it for manuals for free
-software, because free software needs free documentation: a free
-program should come with manuals providing the same freedoms that the
-software does. But this License is not limited to software manuals;
-it can be used for any textual work, regardless of subject matter or
-whether it is published as a printed book. We recommend this License
-principally for works whose purpose is instruction or reference.
-
-
-1. APPLICABILITY AND DEFINITIONS
-
-This License applies to any manual or other work, in any medium, that
-contains a notice placed by the copyright holder saying it can be
-distributed under the terms of this License. Such a notice grants a
-world-wide, royalty-free license, unlimited in duration, to use that
-work under the conditions stated herein. The "Document", below,
-refers to any such manual or work. Any member of the public is a
-licensee, and is addressed as "you". You accept the license if you
-copy, modify or distribute the work in a way requiring permission
-under copyright law.
-
-A "Modified Version" of the Document means any work containing the
-Document or a portion of it, either copied verbatim, or with
-modifications and/or translated into another language.
-
-A "Secondary Section" is a named appendix or a front-matter section of
-the Document that deals exclusively with the relationship of the
-publishers or authors of the Document to the Document's overall subject
-(or to related matters) and contains nothing that could fall directly
-within that overall subject. (Thus, if the Document is in part a
-textbook of mathematics, a Secondary Section may not explain any
-mathematics.) The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal,
-commercial, philosophical, ethical or political position regarding
-them.
-
-The "Invariant Sections" are certain Secondary Sections whose titles
-are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License. If a
-section does not fit the above definition of Secondary then it is not
-allowed to be designated as Invariant. The Document may contain zero
-Invariant Sections. If the Document does not identify any Invariant
-Sections then there are none.
-
-The "Cover Texts" are certain short passages of text that are listed,
-as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License. A Front-Cover Text may
-be at most 5 words, and a Back-Cover Text may be at most 25 words.
-
-A "Transparent" copy of the Document means a machine-readable copy,
-represented in a format whose specification is available to the
-general public, that is suitable for revising the document
-straightforwardly with generic text editors or (for images composed of
-pixels) generic paint programs or (for drawings) some widely available
-drawing editor, and that is suitable for input to text formatters or
-for automatic translation to a variety of formats suitable for input
-to text formatters. A copy made in an otherwise Transparent file
-format whose markup, or absence of markup, has been arranged to thwart
-or discourage subsequent modification by readers is not Transparent.
-An image format is not Transparent if used for any substantial amount
-of text. A copy that is not "Transparent" is called "Opaque".
-
-Examples of suitable formats for Transparent copies include plain
-ASCII without markup, Texinfo input format, LaTeX input format, SGML
-or XML using a publicly available DTD, and standard-conforming simple
-HTML, PostScript or PDF designed for human modification. Examples of
-transparent image formats include PNG, XCF and JPG. Opaque formats
-include proprietary formats that can be read and edited only by
-proprietary word processors, SGML or XML for which the DTD and/or
-processing tools are not generally available, and the
-machine-generated HTML, PostScript or PDF produced by some word
-processors for output purposes only.
-
-The "Title Page" means, for a printed book, the title page itself,
-plus such following pages as are needed to hold, legibly, the material
-this License requires to appear in the title page. For works in
-formats which do not have any title page as such, "Title Page" means
-the text near the most prominent appearance of the work's title,
-preceding the beginning of the body of the text.
-
-A section "Entitled XYZ" means a named subunit of the Document whose
-title either is precisely XYZ or contains XYZ in parentheses following
-text that translates XYZ in another language. (Here XYZ stands for a
-specific section name mentioned below, such as "Acknowledgements",
-"Dedications", "Endorsements", or "History".) To "Preserve the Title"
-of such a section when you modify the Document means that it remains a
-section "Entitled XYZ" according to this definition.
-
-The Document may include Warranty Disclaimers next to the notice which
-states that this License applies to the Document. These Warranty
-Disclaimers are considered to be included by reference in this
-License, but only as regards disclaiming warranties: any other
-implication that these Warranty Disclaimers may have is void and has
-no effect on the meaning of this License.
-
-
-2. VERBATIM COPYING
-
-You may copy and distribute the Document in any medium, either
-commercially or noncommercially, provided that this License, the
-copyright notices, and the license notice saying this License applies
-to the Document are reproduced in all copies, and that you add no other
-conditions whatsoever to those of this License. You may not use
-technical measures to obstruct or control the reading or further
-copying of the copies you make or distribute. However, you may accept
-compensation in exchange for copies. If you distribute a large enough
-number of copies you must also follow the conditions in section 3.
-
-You may also lend copies, under the same conditions stated above, and
-you may publicly display copies.
-
-
-3. COPYING IN QUANTITY
-
-If you publish printed copies (or copies in media that commonly have
-printed covers) of the Document, numbering more than 100, and the
-Document's license notice requires Cover Texts, you must enclose the
-copies in covers that carry, clearly and legibly, all these Cover
-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
-the back cover. Both covers must also clearly and legibly identify
-you as the publisher of these copies. The front cover must present
-the full title with all words of the title equally prominent and
-visible. You may add other material on the covers in addition.
-Copying with changes limited to the covers, as long as they preserve
-the title of the Document and satisfy these conditions, can be treated
-as verbatim copying in other respects.
-
-If the required texts for either cover are too voluminous to fit
-legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto adjacent
-pages.
-
-If you publish or distribute Opaque copies of the Document numbering
-more than 100, you must either include a machine-readable Transparent
-copy along with each Opaque copy, or state in or with each Opaque copy
-a computer-network location from which the general network-using
-public has access to download using public-standard network protocols
-a complete Transparent copy of the Document, free of added material.
-If you use the latter option, you must take reasonably prudent steps,
-when you begin distribution of Opaque copies in quantity, to ensure
-that this Transparent copy will remain thus accessible at the stated
-location until at least one year after the last time you distribute an
-Opaque copy (directly or through your agents or retailers) of that
-edition to the public.
-
-It is requested, but not required, that you contact the authors of the
-Document well before redistributing any large number of copies, to give
-them a chance to provide you with an updated version of the Document.
-
-
-4. MODIFICATIONS
-
-You may copy and distribute a Modified Version of the Document under
-the conditions of sections 2 and 3 above, provided that you release
-the Modified Version under precisely this License, with the Modified
-Version filling the role of the Document, thus licensing distribution
-and modification of the Modified Version to whoever possesses a copy
-of it. In addition, you must do these things in the Modified Version:
-
-A. Use in the Title Page (and on the covers, if any) a title distinct
- from that of the Document, and from those of previous versions
- (which should, if there were any, be listed in the History section
- of the Document). You may use the same title as a previous version
- if the original publisher of that version gives permission.
-B. List on the Title Page, as authors, one or more persons or entities
- responsible for authorship of the modifications in the Modified
- Version, together with at least five of the principal authors of the
- Document (all of its principal authors, if it has fewer than five),
- unless they release you from this requirement.
-C. State on the Title page the name of the publisher of the
- Modified Version, as the publisher.
-D. Preserve all the copyright notices of the Document.
-E. Add an appropriate copyright notice for your modifications
- adjacent to the other copyright notices.
-F. Include, immediately after the copyright notices, a license notice
- giving the public permission to use the Modified Version under the
- terms of this License, in the form shown in the Addendum below.
-G. Preserve in that license notice the full lists of Invariant Sections
- and required Cover Texts given in the Document's license notice.
-H. Include an unaltered copy of this License.
-I. Preserve the section Entitled "History", Preserve its Title, and add
- to it an item stating at least the title, year, new authors, and
- publisher of the Modified Version as given on the Title Page. If
- there is no section Entitled "History" in the Document, create one
- stating the title, year, authors, and publisher of the Document as
- given on its Title Page, then add an item describing the Modified
- Version as stated in the previous sentence.
-J. Preserve the network location, if any, given in the Document for
- public access to a Transparent copy of the Document, and likewise
- the network locations given in the Document for previous versions
- it was based on. These may be placed in the "History" section.
- You may omit a network location for a work that was published at
- least four years before the Document itself, or if the original
- publisher of the version it refers to gives permission.
-K. For any section Entitled "Acknowledgements" or "Dedications",
- Preserve the Title of the section, and preserve in the section all
- the substance and tone of each of the contributor acknowledgements
- and/or dedications given therein.
-L. Preserve all the Invariant Sections of the Document,
- unaltered in their text and in their titles. Section numbers
- or the equivalent are not considered part of the section titles.
-M. Delete any section Entitled "Endorsements". Such a section
- may not be included in the Modified Version.
-N. Do not retitle any existing section to be Entitled "Endorsements"
- or to conflict in title with any Invariant Section.
-O. Preserve any Warranty Disclaimers.
-
-If the Modified Version includes new front-matter sections or
-appendices that qualify as Secondary Sections and contain no material
-copied from the Document, you may at your option designate some or all
-of these sections as invariant. To do this, add their titles to the
-list of Invariant Sections in the Modified Version's license notice.
-These titles must be distinct from any other section titles.
-
-You may add a section Entitled "Endorsements", provided it contains
-nothing but endorsements of your Modified Version by various
-parties--for example, statements of peer review or that the text has
-been approved by an organization as the authoritative definition of a
-standard.
-
-You may add a passage of up to five words as a Front-Cover Text, and a
-passage of up to 25 words as a Back-Cover Text, to the end of the list
-of Cover Texts in the Modified Version. Only one passage of
-Front-Cover Text and one of Back-Cover Text may be added by (or
-through arrangements made by) any one entity. If the Document already
-includes a cover text for the same cover, previously added by you or
-by arrangement made by the same entity you are acting on behalf of,
-you may not add another; but you may replace the old one, on explicit
-permission from the previous publisher that added the old one.
-
-The author(s) and publisher(s) of the Document do not by this License
-give permission to use their names for publicity for or to assert or
-imply endorsement of any Modified Version.
-
-
-5. COMBINING DOCUMENTS
-
-You may combine the Document with other documents released under this
-License, under the terms defined in section 4 above for modified
-versions, provided that you include in the combination all of the
-Invariant Sections of all of the original documents, unmodified, and
-list them all as Invariant Sections of your combined work in its
-license notice, and that you preserve all their Warranty Disclaimers.
-
-The combined work need only contain one copy of this License, and
-multiple identical Invariant Sections may be replaced with a single
-copy. If there are multiple Invariant Sections with the same name but
-different contents, make the title of each such section unique by
-adding at the end of it, in parentheses, the name of the original
-author or publisher of that section if known, or else a unique number.
-Make the same adjustment to the section titles in the list of
-Invariant Sections in the license notice of the combined work.
-
-In the combination, you must combine any sections Entitled "History"
-in the various original documents, forming one section Entitled
-"History"; likewise combine any sections Entitled "Acknowledgements",
-and any sections Entitled "Dedications". You must delete all sections
-Entitled "Endorsements".
-
-
-6. COLLECTIONS OF DOCUMENTS
-
-You may make a collection consisting of the Document and other documents
-released under this License, and replace the individual copies of this
-License in the various documents with a single copy that is included in
-the collection, provided that you follow the rules of this License for
-verbatim copying of each of the documents in all other respects.
-
-You may extract a single document from such a collection, and distribute
-it individually under this License, provided you insert a copy of this
-License into the extracted document, and follow this License in all
-other respects regarding verbatim copying of that document.
-
-
-7. AGGREGATION WITH INDEPENDENT WORKS
-
-A compilation of the Document or its derivatives with other separate
-and independent documents or works, in or on a volume of a storage or
-distribution medium, is called an "aggregate" if the copyright
-resulting from the compilation is not used to limit the legal rights
-of the compilation's users beyond what the individual works permit.
-When the Document is included in an aggregate, this License does not
-apply to the other works in the aggregate which are not themselves
-derivative works of the Document.
-
-If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one half of
-the entire aggregate, the Document's Cover Texts may be placed on
-covers that bracket the Document within the aggregate, or the
-electronic equivalent of covers if the Document is in electronic form.
-Otherwise they must appear on printed covers that bracket the whole
-aggregate.
-
-
-8. TRANSLATION
-
-Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of section 4.
-Replacing Invariant Sections with translations requires special
-permission from their copyright holders, but you may include
-translations of some or all Invariant Sections in addition to the
-original versions of these Invariant Sections. You may include a
-translation of this License, and all the license notices in the
-Document, and any Warranty Disclaimers, provided that you also include
-the original English version of this License and the original versions
-of those notices and disclaimers. In case of a disagreement between
-the translation and the original version of this License or a notice
-or disclaimer, the original version will prevail.
-
-If a section in the Document is Entitled "Acknowledgements",
-"Dedications", or "History", the requirement (section 4) to Preserve
-its Title (section 1) will typically require changing the actual
-title.
-
-
-9. TERMINATION
-
-You may not copy, modify, sublicense, or distribute the Document except
-as expressly provided for under this License. Any other attempt to
-copy, modify, sublicense or distribute the Document is void, and will
-automatically terminate your rights under this License. However,
-parties who have received copies, or rights, from you under this
-License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-
-10. FUTURE REVISIONS OF THIS LICENSE
-
-The Free Software Foundation may publish new, revised versions
-of the GNU Free Documentation License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns. See
-http://www.gnu.org/copyleft/.
-
-Each version of the License is given a distinguishing version number.
-If the Document specifies that a particular numbered version of this
-License "or any later version" applies to it, you have the option of
-following the terms and conditions either of that specified version or
-of any later version that has been published (not as a draft) by the
-Free Software Foundation. If the Document does not specify a version
-number of this License, you may choose any version ever published (not
-as a draft) by the Free Software Foundation.
-
-
-ADDENDUM: How to use this License for your documents
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and
-license notices just after the title page:
-
- Copyright (c) YEAR YOUR NAME.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.2
- or any later version published by the Free Software Foundation;
- with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
- A copy of the license is included in the section entitled "GNU
- Free Documentation License".
-
-If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
-replace the "with...Texts." line with this:
-
- with the Invariant Sections being LIST THEIR TITLES, with the
- Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
-
-If you have Invariant Sections without Cover Texts, or some other
-combination of the three, merge those two alternatives to suit the
-situation.
-
-If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License,
-to permit their use in free software.
Index: ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/doc/adv_jtag_bridge.pdf
===================================================================
--- ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/doc/adv_jtag_bridge.pdf (revision 26)
+++ ADS_RELEASE_1_2_0/trunk/Software/adv_jtag_bridge/doc/adv_jtag_bridge.pdf (nonexistent)
@@ -1,2502 +0,0 @@
-%PDF-1.4
-%äüöß
-2 0 obj
-<>
-stream
-xœm‘ËNÄ0E÷ù
-¯‘ì8FŠ"Ñy ±¨Ä±âµa˜Íü>Ž[`è J©cßú»h Žæ:”0’“3åv^àþ>´ØžÃ›Fã˜-C ÞzŸárKà$z}(Hµ£‚®º‚\;.èkç†*Ùˆ©J¦¯Ts“\i8 #zæïU¾ÒÐãZEÜjBÑ?Ž7f3šÝ‚ËÇlpB&.¸¸qµ–ܬý| +§"h9}z‡3rœÍXÌ"°²¦…Yøß(ר#Ç…:.®q3+·ú^¶š$jš<å°;…#Å#8EzÚ´ŽÈo¯üd’õìú u½¼ÃÝù.sßz9²i11y
-BF‘Ò0õ¿<;øT}
-endstream
-endobj
-
-3 0 obj
-290
-endobj
-
-5 0 obj
-<>
-stream
-xœVËëãF¾ç¯ð¹àt¤yØ3ÄÉÂÞ¶
-ôPzêJ·°{Ùõšñ#öþÚp<ôIŸ¤‘;Cóåô©qMëè5Ò³øùù÷æ§ïšd“Ÿÿ<]Ÿ§˜Î}ãq çó·æû6€ÍóŸGr£»¹‰þ»Ñ]2Æ\n‡è}tÁùܦÑ%¸ª4Üè}O¿;<ìwÉAnýè0“BOg餼G—²§.m÷"ó/Ï÷§ûóôa.’?¸‹„ŒßI‡‚DÈઘ·' ¯bn{F>ïÓÁ`“µ!~YÝôˆ{ä—žÃÒû½n!.õñ!pòªÁª–ô¨%DÞ€(È~"àüjº0•ð‹mÞ
-5¼ &5¡~«…Í„‘mY€ª&0<Û*€ddû†©³#Ø ÈqÄÞÐÌY‰û!ÏѤ!?ÿ:f¾ëÏaËüE,ÿ‹XþQÊÖ, ÀWŽ¥¬¹íÊ)‹®d€'PÄÞHk¬!ê2*¹&Ž—„gJ!N(«€ÓÞݖͤgÂHI4¬/XŠZú……
-SZØÑ„œFáUdûZ¤"§"rŽd4{*ì
-Í»CŠœãcoQœÂ9m(Vhjs‘·‰"CÇ+9®Bµˆ¥=‘Ÿ¥7hñ®<ÐP2ɪ®†êfm€:™õÂÊÒÅIá1'+!ïU|ÖW*¼"
-¢ÿ—n7”c?zzÆuOÒfÁÏuÉ.*}N£ý”?"”n‰´ÃÏ[„F÷z¹”ô¥Ä4#%ë[ÔŠ–íÒºJª¿fÄkŽlÆšü`)$\Ìoƒë"šæÞñÐ:ZÅM+FMNˆµæ‹ò7”^DÒÅÏU'N=½Òçè`HÞÕÖ^|)<±tŸS /龎$:p_Ê@nàR9ˆzh–*ýxrç®ù²²üûÍ@mûc“¢¾ýÝüøJ=À6‰«Þt¥_vÜÕñVÂùn¿¸9_,òPÒI/ø%á‹ö7·M˜»ÉQۄw†oN8КØÄ _à›x`KâCšö2DÑ ¥@@ÒÙsL[J€«¶Þœä5n.–*q—ö#ŸVuOÕ¥¢åfU4YSÃ"uÑÉücŸ‡µ$×Ì•-˜W7@^¥,L(0…~åËX_峋†ïʼn!tlT/Úž×ÊõņÕ2Ü80 Z>×ÓJ6îô›%LÈÁ㸃º]ryBøFBCçJËÙP£¤+yѽøª£ñúUBly*’;BœÄQ?÷R.Lw°kµEžŠl9g‚!Dà«Ï'x{™˜9ˆ2WÞ
-VEûÀÛ+]<
-ûsÆŒ:®Éy,,XÄD§¥I5ȸT4æïÆ9}rç
-Ïr—ÂAÐ^‰‰òÍ#Ð+}oñ»—êç–B>]ÈX_ÃìŽz¶è¤š¯è
-endstream
-endobj
-
-6 0 obj
-1105
-endobj
-
-8 0 obj
-<>
-stream
-xœVÁŽÛ ½û+8¯F²,%›¸RoÛFê¡êÝ^šJÙK¿0fìÅNeÉ3™yƒ#[%þ6w!ÅA†¡UÞÎÇ÷ÛOñõIüi¤ˆÏÛ¯ÆØÖ ëdÛ
--л^Ÿš¾o=AVµ†CÊȶ#¬ï8º›
-*P2P¶^*oÅúw>Gç‚A>‡[œ¡|·<bényrHçÈ`"f#h„6‚F¬49\dÆ{–áEd ªG–°ZdÙá*²»˜+{ºFê^8õúC|˜:¡¬¸¾~¤z0 µìâÁ;”¤¿_?5—kóÒ¼ˆè3ÒYTˆ0\éóǵ¢|<äM¤tâä·øÒ°éMP>gÏo‚r:£|~ƘX¡ÅH“ê2)N
-)a\¹Œ”P®^FJ(‘Îh"E‰eRœR¸L)¡\ªŒ”P"ÑDŠRˤ8)¤„q¹2RB¹d)¡D:£LÃDš&3iƸliF¹tiFiABb÷TÁr]ÊÝQ°œ¾ÒêËQ–¨âÔ4´W꽊¬Wô®
-s_Aû¥^פt’~(ù}mî‹h]mÞ³•fbóŠêÙ¼"O6¯£tƒm~
-ïBáCW&Þs}Ì^™F(ÈW¦‰7&ÞºÜKs¯bwÖÌ»h.Yˆ—,DO.”Ñ¡0U.°²/NühyÄùiËh·åï9ž)™ŸÃ8º÷÷¹ø°`–°–.•ŒÖJk[Ö)I5kâQº0Ñ…-CC`ïnË?e°FàVUð84%pÕÊÊ^ázœGÕExƒŽ\£;³ßgú¾â0BãjàÄïpÊÿINŠf“6Õ@ë åíÈýÔC
-.%ñÓN
-`Ó?Õ Fà°‡BŠ÷óY1õž˜¡T¹úº±O©„´jÃæ´-¬ll[©F¦`œ:\yçÞÂÐÏÛSδéDÛtô‘Ng
--øصpŒ`iCZQÑ'Ú¯™2ŽE™Ò 5?›ýï*DúwÏ¢÷R·^*d¯K*¤FðŸ
-©˜†4§+Òn×1iäy,ËãÁÓê9¾.%|ÃTÆi›Â³QasSóNL€É;èYYµ+6Ë…ýßþ ÝP
-endstream
-endobj
-
-9 0 obj
-854
-endobj
-
-11 0 obj
-<>
-stream
-xœíšKÛ6Çïþ:°K_"@X[ò¡· z(zk ‡É%_¿3¤${—yÄ”“BXÅ{)zþ?΋dÞ}Ý}îX·gøRsÀ»±tÿòw÷û/Ý¿áMº¾|Ú/;¥}g€ »üÕýz–×ÝåãŽõ~/S^:fÃKéÁ±—Û_„ÿóòÛn¼ì>dGeü â¨Ðq£rÍ,àà@1ÅΞÓ(àøwÂÇFä¬?ÈìÌþ—ß÷îéî%>¤Íªé„ñ—raæ^Ì”¾â‰~|ïD F6"TœÁHSˆ\Ñÿ Ï%´„Æqs£·–ü'«
-JªMÐße@˜à{儬0/
-/^!1•…΋¼àœòiä³S×?±µ¶ OÕÒôèL(Ää ¾ØÆ¢ËÐâ…8yÅŒ áO{nÜ–
-_€“{IfÔZºÈ_þÕÖd‡þ`KÂÓâR
-~V?.u¿·AV8y¥bäà,|szÿp¯S*AQŸ…¯‘™Wké6‚B]þÄnk p†‰gÁóñçDÊEG?,i§"ÌFO¿Þ²)½5ɤ¾ô{ü%ønéuÄŠ€¢/“™[kѾ¹œ[N"û;.ËI„¢)D£({„BF,F
-ïO%”BÀsjÿ†Ù«ªœÚ²¬rpÊȃ.é¬g—áýºÜåÌÓ2#¶6éÃEÚ潎N¢Û:JT aFGˆáïur2¶Öùrî 'ÑmAݬ<9ô±— ‰ù?OyÇ0W-U(ë¸ÍcKpA“Ì<³5
-O \]øĦkÂËöDƒË0« jCWbu¢Ù)1ÀC†ZIOzªVn°Â!”3pôs€ã=?sÙ^g¿ÄSküHW‘ØnÙ®gpfî¦c1Šê
-|G>”³M–®µv[¸ÞcbGÇÇšŽ²—Ù¦dÐ' 7y¦à¸Tc<=ˆyÙÓJ¾oϤ7ÙǶ¶õwQk“«=µþ%ºX‹HüwôªkݵP&N8CPhf¯b¾w,NŸßZê&`ÕEÕo«„’¤•&ß’¤`?w’Pº9GQƒˆY‹yÞ”p(;÷þ\k›6Ðï{/ëÄÊuÀf»’¾qI/ÌÛQq{bÞÆ\Kî%¹˜Ü#Zk±ëÊ&v,+9HÎÓ6á÷˜¸u—rSyÙpŃ–¶sc¶6ás\ï^ȉ¥±ø)/daEÚ+–±jŸêòà¼a.¼Â""Öd¡J¦Ý¤1–ò¥Õ
-FåÜs[›ú¡">(eèÕ³k/îµãN¨¤yz9Ww¾Ð°l'M°ËmÎhë(7tk•~ÌWNKköJŒÊ$»iÏqÀkœŽ0„qî…B!|FœCS螊’úHKûˆNALç ÎiÍYvY $úÔÜœ[Ãô”ÕaJ¬Œ0‰c%‚ ›´îbéÚsœÏ¾pQ>2‡n ²ƒµÖrû×]º&–]Ó52z£ë‰š½KCiMO›¤µµ©³µ{–D·-1¤0‘´×BJlW,ád “ø9V‡uëÍánPÓ«±ÈŸÕ32“jÍÓPUç#±+ñq=@û¡ûsD2á
-endstream
-endobj
-
-12 0 obj
-1258
-endobj
-
-14 0 obj
-<>
-stream
-xœÅ\I‹#˾ϯÐÙ0í\k!è.©¾=ðÁøæ|0ø]ü÷™‘‘K¥Ô3`„ZReeÆËKzÓ—ÿ~ûÏE]¾«ðvÑ&¼®{|ýýï—?ÿáòïôeü÷û?¿}üøæ—·í²ª-üàÇß.üt½Ä÷ÿøËU}ܾ۫:nýñ§oß~«.]íÛ>ºô~ÓWõˆ/{|ùL+¹ÛwsU&½÷ðÝhé°õ°ü/í`Y}û®Ó
-¦¼,±oý%lºØÝ–¸‡¸Ârƒ…·kú>Þ†›7{Y¼}s°´¹h“–¶æW†c/agújŒy8åÂV—xçtz}ÕÆ)ã´Òïáct8Ïv¥ËîZ©C›ð>^¯FÇ«–ôS“èÂo`K.ê0Kxµtûpýy„ïîñÍg\Ý¥¥kãzÊ«Åx\õ‘¶›¯K¿\Âés~fðLñ*»¥kî°ioQd|évKüC‡7ï7½Ò76ÉâgÓ*jAºWXUÓ(¡…+Xx7`DTü«{EÔ÷Åî¤=I8m`dä´Û-‹¥¢[oþjÞã—´kÑFé7*ÝÓÀ2Râþ›8²ðMÁn°ð3(t0ÀýÕ®’ 7Ÿc4é_P¤ »ÞÓAhÏî¯?nÛ5.Õ~¶»G@ãŠÅ*FÚõÍw ™ah|xí`øËlŽiágF÷N™d¶À7Gº.#”H•ÌwÃe;Ša Qƒ¦Ú$^kÙ,Ä'p õ‹Öc™óñøw:Pü6ž n’~þà*Y=Fx`#þ^ñG-]
-ºØ“ ù*î˜È@—(ˆ¤Ût±&í
-;LÖ‚DŠÍ uINDCÖPYÑ ¿zóÛÕ.IœAÑÈ#f1Íÿ½zÏàÞ<“»2\ÃÈk£‰ª°;€==j*ˆ,ý~\
-ümÜ|¸}¨Ï§aéÖ`u54$ý¾½ÕXš,B+î$IÕ$š{êˆu~ö~01%–˜ß)áp`Z8<“Å<ÕÌvƒ <)!…á_ØžÛÂlB€lq›½¹–ä€ã2·Í“¬(Œ$40© Ù,OÛXé%*Bby»›é/ã%ùô‡´t¦ˆQb•&毙;À‚Ù(vD?“ã±[ä.
-yAãõ¶rI¯Ù="ÁU6ð6Øj’Dâ 2{üü´ò–8ëYûÐqïÍt`U
-UâŠþ™šx¸åÈ„9EKºW>×rDãÇœÀ°ÕQW¢‚ ûK4,<6¯ž>ÉX˜A½ßø‘® ;‡5Ž²ÔGWœ}£ÇΞ(³.Ú4Ìż‹é^ÖÝôÚ
-ËG‡ÎD¼Êr:à\¦4æãf}v†á0ሠz°>8°ÉË%%É@Rì’Ró N²ÜdÇÉÖøÚ2EâÏêP,‘1Ÿ¼VسÏ,ìäà’$Ê•4^/–»6®á¤%e.þ¼Ü(¸FR¬ûë=$Þ-t3¬íÚñ£è÷’r¾C/IÎÝ*{_câ2Íõc¦ÂŒFôý8@"—É&ÇýÖ°ôÒ{o\ñÿ)½'ÎZ)x=ßOÐUJþ(-ØJTAôÕ¥‡Øí!ƒJŒŽl¤µzªìLkµ¦úRñPO9÷£©†Vxu!@g‰”‘|GrcAçJFŸýðÍéœj1/”ó}×>Z@á2˜ŠÈ@”!mâ.ÉgfŒ9çK7à6$‰2ƒÎy²MJØÊxŠÛ×·Ú™€Z é>¡,uR£e9ȃ_ÍY\¥ýAÀ‹¤ Œs“¾ŸHekîžÓé¯Â&ó‚T”6#¼gÈHŒ´ÄsèÇ¥±N3`7ûæk`£¹}„»Ù{SÜæå ôIüU—éax) (f5ú¢Oæ—‹_©ç:'•`3°ê‚¿ó¸@zz’WêK®—
-•5:t–4p¿ :¨ø¼&p™;ùŽayÌÆÞ3CrÙC^Qù͸kkEFÄéʃ‚Ô ŽÌ/ÆlA¼XÉ‚LWŒO¹ )+þÔ,ÈM¤ÃÏ‹Kl\ÒÌÛëœ Á¾xü!o[‚5¶ÀÌô¾á"O—)$8ÅjV<ášQ{§Ä‹n$Ê$çÊÙµI-êWhHfÑÌ˸œ*y~V-™?
-’U'xsK#U¡ÅÇ5,\Á矩1›rÁ´2žé’©ë9¯q)8¸ýR^óqõN¥*¢6ç´@ÔR’Ü ·¶»›#—¨üe©à¨)Áß1¥!Â
-^ I f–ûj¼Jrrª¸¡¦X•_£Ë6/õ¤hªªI‘¬Ûα2ÉJJÊì!Œ<ü€¿Äkºô+Ê”´¾”p¼¨{ßYöšÈqôÁPêa…UIÒƒrÆ^ìë¥NdºUü5É¡õ«M$%¦j\I£ÂN2ÁÊ»ù)1ÝŸwªƒæ~»/'
-åÒj9)¥ëMÚÙ-Yi‘röË£%ÕVÇ\Œ2pr ýš.ËÅÁ@¡øC•ìiÜi}•%×c{ô\¾¥ÂzÜÖØÅFeÙ ºo)Ê«:WWã‡ãòªŽ©mGÙ(E%Rá1…×Ýgª´™¦dK€QgjS<1¡dUDr`uOÀØwëÜyÆÛæ8yú‘°‹krtÎȵ«°SìûŽñáë•ã¤E4\oXM¦ˆ¸äÞ|²4*;¼7IÞ![bmá¼î0cæÁ‚‚¢†KõVΫ›H¥ŸÍë›'
-é;€ÌÒ«&A‘#ëÎ!,³z½¶õJ÷HJ)µÖ¨nU…:ë`91 Sz¢§X«µ‘ JY‰ O
-ÞtšÖÄ?‹K(d·Lý趬’nÛŒ‚êR)Šõ\Îê,c°]¨‹Aù=K+CÙ!)•½IVÖÒV£”+d!™y¶ò‚J I>XIÚ;Í0U{Sêm„‰âéNCáÈD.gWƒ*<•f‘sÐyk¹ð¸}!G»uƒ’¸LÌ-3s¦bšº±ÌNTš0³ë&õ;+~×þRT/X¦’Ixi/æjãf{®uJ²ü§j¯cŸ:jS¤~~×P+êU€yÞ¤ÎòôX"oe?1³®-Á?:¦úÏ葶#I
-7åTöù˜"Ü‹±°eVÞ1ä¦Q![¦Ö7Û*jQÍScÿòžŸ ‹mÓ¥´ã#5ÄYɲT7ïðãæê*Ÿ~b¤UjY¤ÀÙî!)yöÌf½eÛûçȦ)á1OÞ`(tyÜWN|»0©µŠc