summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2007-09-05 06:22:37 +0000
committerdrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2007-09-05 06:22:37 +0000
commit6ae83f5cf8ddf505498b535cb167550a54271606 (patch)
tree521470759649a89c029a0e141d897b0428dee56e
parentb930514e2f3e2a83e075e8c19ae0d38bbd2b27dc (diff)
downloadopenocd+libswd-6ae83f5cf8ddf505498b535cb167550a54271606.tar.gz
openocd+libswd-6ae83f5cf8ddf505498b535cb167550a54271606.tar.bz2
openocd+libswd-6ae83f5cf8ddf505498b535cb167550a54271606.tar.xz
openocd+libswd-6ae83f5cf8ddf505498b535cb167550a54271606.zip
Patch by Michael Schwingen that
- adds support for the Altium universal JTAG cable - adds support for "wiggler2" cable (basically a wiggler with added LED, documentation coming soon) - adds LED support. The LED is turned on during data transfer - works fine on Altium and wiggler2. - adds PORT_EXIT pattern that is written to port when exiting, in order to turn off power on cables that get their power from parallel port data lines - move port writes (with the system-specific ifdefs) to one central function - increased image cache size to 2KB (might require more adaptive cache handling, e.g. LRU) git-svn-id: svn://svn.berlios.de/openocd/trunk@204 b42882b7-edfa-0310-969c-e2dbd0fdcd60
-rw-r--r--src/jtag/at91rm9200.c3
-rw-r--r--src/jtag/bitbang.c5
-rw-r--r--src/jtag/bitbang.h1
-rw-r--r--src/jtag/ep93xx.c3
-rw-r--r--src/jtag/parport.c93
-rw-r--r--src/openocd.c2
-rw-r--r--src/target/embeddedice.c2
-rw-r--r--src/target/image.h2
8 files changed, 72 insertions, 39 deletions
diff --git a/src/jtag/at91rm9200.c b/src/jtag/at91rm9200.c
index d532e3e7..b1ddb2df 100644
--- a/src/jtag/at91rm9200.c
+++ b/src/jtag/at91rm9200.c
@@ -146,7 +146,8 @@ bitbang_interface_t at91rm9200_bitbang =
{
.read = at91rm9200_read,
.write = at91rm9200_write,
- .reset = at91rm9200_reset
+ .reset = at91rm9200_reset,
+ .blink = 0
};
int at91rm9200_read(void)
diff --git a/src/jtag/bitbang.c b/src/jtag/bitbang.c
index 198a741f..19afdbf0 100644
--- a/src/jtag/bitbang.c
+++ b/src/jtag/bitbang.c
@@ -209,6 +209,9 @@ int bitbang_execute_queue(void)
*/
retval = ERROR_OK;
+ if(bitbang_interface->blink)
+ bitbang_interface->blink(1);
+
while (cmd)
{
switch (cmd->type)
@@ -278,6 +281,8 @@ int bitbang_execute_queue(void)
}
cmd = cmd->next;
}
+ if(bitbang_interface->blink)
+ bitbang_interface->blink(0);
return retval;
}
diff --git a/src/jtag/bitbang.h b/src/jtag/bitbang.h
index 7049f435..da006a16 100644
--- a/src/jtag/bitbang.h
+++ b/src/jtag/bitbang.h
@@ -27,6 +27,7 @@ typedef struct bitbang_interface_s
int (*read)(void);
void (*write)(int tck, int tms, int tdi);
void (*reset)(int trst, int srst);
+ void (*blink)(int on);
} bitbang_interface_t;
extern bitbang_interface_t *bitbang_interface;
diff --git a/src/jtag/ep93xx.c b/src/jtag/ep93xx.c
index 88ed50c1..7311c19a 100644
--- a/src/jtag/ep93xx.c
+++ b/src/jtag/ep93xx.c
@@ -78,7 +78,8 @@ bitbang_interface_t ep93xx_bitbang =
{
.read = ep93xx_read,
.write = ep93xx_write,
- .reset = ep93xx_reset
+ .reset = ep93xx_reset,
+ .blink = 0;
};
int ep93xx_read(void)
diff --git a/src/jtag/parport.c b/src/jtag/parport.c
index b9087d9f..b666eb12 100644
--- a/src/jtag/parport.c
+++ b/src/jtag/parport.c
@@ -90,20 +90,33 @@ typedef struct cable_s
u8 OUTPUT_INVERT; /* data port bits that should be inverted */
u8 INPUT_INVERT; /* status port that should be inverted */
u8 PORT_INIT; /* initialize data port with this value */
+ u8 PORT_EXIT; /* de-initialize data port with this value */
+ u8 LED_MASK; /* data port bit for LED */
} cable_t;
cable_t cables[] =
{
- /* name tdo trst tms tck tdi srst o_inv i_inv init */
- { "wiggler", 0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x01, 0x80, 0x80 },
- { "wiggler_ntrst_inverted", 0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x11, 0x80, 0x80 },
- { "old_amt_wiggler", 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x11, 0x80, 0x80 },
- { "chameleon", 0x80, 0x00, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00 },
- { "dlc5", 0x10, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x10 },
- { "triton", 0x80, 0x08, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00 },
- { "lattice", 0x40, 0x10, 0x04, 0x02, 0x01, 0x08, 0x00, 0x00, 0x18 },
- { "flashlink", 0x20, 0x10, 0x02, 0x01, 0x04, 0x20, 0x30, 0x20, 0x00 },
- { NULL, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
+ /* name tdo trst tms tck tdi srst o_inv i_inv init exit led */
+ { "wiggler", 0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x01, 0x80, 0x80, 0x80, 0x00 },
+ { "wiggler2", 0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x01, 0x80, 0x80, 0x00, 0x20 },
+ { "wiggler_ntrst_inverted",
+ 0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x11, 0x80, 0x80, 0x80, 0x00 },
+ { "old_amt_wiggler", 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x11, 0x80, 0x80, 0x80, 0x00 },
+ { "chameleon", 0x80, 0x00, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 },
+ { "dlc5", 0x10, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00 },
+ { "triton", 0x80, 0x08, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 },
+ { "lattice", 0x40, 0x10, 0x04, 0x02, 0x01, 0x08, 0x00, 0x00, 0x18, 0x18, 0x00 },
+ { "flashlink", 0x20, 0x10, 0x02, 0x01, 0x04, 0x20, 0x30, 0x20, 0x00, 0x00, 0x00 },
+/* Altium Universal JTAG cable. Set the cable to Xilinx Mode and wire to target as follows:
+ HARD TCK - Target TCK
+ HARD TMS - Target TMS
+ HARD TDI - Target TDI
+ HARD TDO - Target TDO
+ SOFT TCK - Target TRST
+ SOFT TDI - Target SRST
+*/
+ { "altium", 0x10, 0x20, 0x04, 0x02, 0x01, 0x80, 0x00, 0x00, 0x10, 0x00, 0x08 },
+ { NULL, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
};
/* configuration */
@@ -127,6 +140,7 @@ static unsigned long statusport;
int parport_read(void);
void parport_write(int tck, int tms, int tdi);
void parport_reset(int trst, int srst);
+void parport_led(int on);
int parport_speed(int speed);
int parport_register_commands(struct command_context_s *cmd_ctx);
@@ -155,7 +169,8 @@ bitbang_interface_t parport_bitbang =
{
.read = parport_read,
.write = parport_write,
- .reset = parport_reset
+ .reset = parport_reset,
+ .blink = parport_led
};
int parport_read(void)
@@ -174,9 +189,24 @@ int parport_read(void)
return 0;
}
-void parport_write(int tck, int tms, int tdi)
+static inline void parport_write_data(void)
{
u8 output;
+ output = dataport_value ^ cable->OUTPUT_INVERT;
+
+#if PARPORT_USE_PPDEV == 1
+ ioctl(device_handle, PPWDATA, &output);
+#else
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+ outb(dataport, output);
+#else
+ outb(output, dataport);
+#endif
+#endif
+}
+
+void parport_write(int tck, int tms, int tdi)
+{
int i = jtag_speed + 1;
if (tck)
@@ -194,24 +224,13 @@ void parport_write(int tck, int tms, int tdi)
else
dataport_value &= ~cable->TDI_MASK;
- output = dataport_value ^ cable->OUTPUT_INVERT;
-
while (i-- > 0)
-#if PARPORT_USE_PPDEV == 1
- ioctl(device_handle, PPWDATA, &output);
-#else
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
- outb(dataport, output);
-#else
- outb(output, dataport);
-#endif
-#endif
+ parport_write_data();
}
/* (1) assert or (0) deassert reset lines */
void parport_reset(int trst, int srst)
{
- u8 output;
DEBUG("trst: %i, srst: %i", trst, srst);
if (trst == 0)
@@ -224,18 +243,19 @@ void parport_reset(int trst, int srst)
else if (srst == 1)
dataport_value &= ~cable->SRST_MASK;
- output = dataport_value ^ cable->OUTPUT_INVERT;
+ parport_write_data();
+}
-#if PARPORT_USE_PPDEV == 1
- ioctl(device_handle, PPWDATA, &output);
-#else
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
- outb(dataport, output);
-#else
- outb(output, dataport);
-#endif
-#endif
+/* turn LED on parport adapter on (1) or off (0) */
+void parport_led(int on)
+{
+ u8 output;
+ if (on)
+ dataport_value |= cable->LED_MASK;
+ else
+ dataport_value &= ~cable->LED_MASK;
+ parport_write_data();
}
int parport_speed(int speed)
@@ -400,6 +420,7 @@ int parport_init(void)
parport_reset(0, 0);
parport_write(0, 0, 0);
+ parport_led(1);
bitbang_interface = &parport_bitbang;
@@ -408,7 +429,11 @@ int parport_init(void)
int parport_quit(void)
{
+ u8 output;
+ parport_led(0);
+ dataport_value = cable->PORT_EXIT;
+ parport_write_data();
return ERROR_OK;
}
diff --git a/src/openocd.c b/src/openocd.c
index 26a218b9..81aae390 100644
--- a/src/openocd.c
+++ b/src/openocd.c
@@ -18,7 +18,7 @@
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
-#define OPENOCD_VERSION "Open On-Chip Debugger (2007-08-25 12:00 CEST)"
+#define OPENOCD_VERSION "Open On-Chip Debugger (2007-09-05 09:00 CEST)"
#ifdef HAVE_CONFIG_H
#include "config.h"
diff --git a/src/target/embeddedice.c b/src/target/embeddedice.c
index 4d76bcaf..11f2e6c2 100644
--- a/src/target/embeddedice.c
+++ b/src/target/embeddedice.c
@@ -506,7 +506,7 @@ int embeddedice_handshake(arm_jtag_t *jtag_info, int hsbit, u32 timeout)
if (hsbit == EICE_COMM_CTRL_WBIT)
hsact = 1;
- else if (hsbit != EICE_COMM_CTRL_RBIT)
+ else if (hsbit == EICE_COMM_CTRL_RBIT)
hsact = 0;
else
return ERROR_INVALID_ARGUMENTS;
diff --git a/src/target/image.h b/src/target/image.h
index ec52acb4..e8f585bb 100644
--- a/src/target/image.h
+++ b/src/target/image.h
@@ -34,7 +34,7 @@
#define IMAGE_MAX_ERROR_STRING (256)
#define IMAGE_MAX_SECTIONS (128)
-#define IMAGE_MEMORY_CACHE_SIZE (1024)
+#define IMAGE_MEMORY_CACHE_SIZE (2048)
typedef enum image_type
{