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
This commit is contained in:
drath 2007-09-05 06:22:37 +00:00
parent b930514e2f
commit 6ae83f5cf8
8 changed files with 72 additions and 39 deletions

View File

@ -146,7 +146,8 @@ bitbang_interface_t at91rm9200_bitbang =
{ {
.read = at91rm9200_read, .read = at91rm9200_read,
.write = at91rm9200_write, .write = at91rm9200_write,
.reset = at91rm9200_reset .reset = at91rm9200_reset,
.blink = 0
}; };
int at91rm9200_read(void) int at91rm9200_read(void)

View File

@ -209,6 +209,9 @@ int bitbang_execute_queue(void)
*/ */
retval = ERROR_OK; retval = ERROR_OK;
if(bitbang_interface->blink)
bitbang_interface->blink(1);
while (cmd) while (cmd)
{ {
switch (cmd->type) switch (cmd->type)
@ -278,6 +281,8 @@ int bitbang_execute_queue(void)
} }
cmd = cmd->next; cmd = cmd->next;
} }
if(bitbang_interface->blink)
bitbang_interface->blink(0);
return retval; return retval;
} }

View File

@ -27,6 +27,7 @@ typedef struct bitbang_interface_s
int (*read)(void); int (*read)(void);
void (*write)(int tck, int tms, int tdi); void (*write)(int tck, int tms, int tdi);
void (*reset)(int trst, int srst); void (*reset)(int trst, int srst);
void (*blink)(int on);
} bitbang_interface_t; } bitbang_interface_t;
extern bitbang_interface_t *bitbang_interface; extern bitbang_interface_t *bitbang_interface;

View File

@ -78,7 +78,8 @@ bitbang_interface_t ep93xx_bitbang =
{ {
.read = ep93xx_read, .read = ep93xx_read,
.write = ep93xx_write, .write = ep93xx_write,
.reset = ep93xx_reset .reset = ep93xx_reset,
.blink = 0;
}; };
int ep93xx_read(void) int ep93xx_read(void)

View File

@ -90,20 +90,33 @@ typedef struct cable_s
u8 OUTPUT_INVERT; /* data port bits that should be inverted */ u8 OUTPUT_INVERT; /* data port bits that should be inverted */
u8 INPUT_INVERT; /* status port that should be inverted */ u8 INPUT_INVERT; /* status port that should be inverted */
u8 PORT_INIT; /* initialize data port with this value */ 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;
cable_t cables[] = cable_t cables[] =
{ {
/* name tdo trst tms tck tdi srst o_inv i_inv init */ /* name tdo trst tms tck tdi srst o_inv i_inv init exit led */
{ "wiggler", 0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x01, 0x80, 0x80 }, { "wiggler", 0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x01, 0x80, 0x80, 0x80, 0x00 },
{ "wiggler_ntrst_inverted", 0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x11, 0x80, 0x80 }, { "wiggler2", 0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x01, 0x80, 0x80, 0x00, 0x20 },
{ "old_amt_wiggler", 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x11, 0x80, 0x80 }, { "wiggler_ntrst_inverted",
{ "chameleon", 0x80, 0x00, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00 }, 0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x11, 0x80, 0x80, 0x80, 0x00 },
{ "dlc5", 0x10, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x10 }, { "old_amt_wiggler", 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x11, 0x80, 0x80, 0x80, 0x00 },
{ "triton", 0x80, 0x08, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00 }, { "chameleon", 0x80, 0x00, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 },
{ "lattice", 0x40, 0x10, 0x04, 0x02, 0x01, 0x08, 0x00, 0x00, 0x18 }, { "dlc5", 0x10, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00 },
{ "flashlink", 0x20, 0x10, 0x02, 0x01, 0x04, 0x20, 0x30, 0x20, 0x00 }, { "triton", 0x80, 0x08, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 },
{ NULL, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 */ /* configuration */
@ -127,6 +140,7 @@ static unsigned long statusport;
int parport_read(void); int parport_read(void);
void parport_write(int tck, int tms, int tdi); void parport_write(int tck, int tms, int tdi);
void parport_reset(int trst, int srst); void parport_reset(int trst, int srst);
void parport_led(int on);
int parport_speed(int speed); int parport_speed(int speed);
int parport_register_commands(struct command_context_s *cmd_ctx); int parport_register_commands(struct command_context_s *cmd_ctx);
@ -155,7 +169,8 @@ bitbang_interface_t parport_bitbang =
{ {
.read = parport_read, .read = parport_read,
.write = parport_write, .write = parport_write,
.reset = parport_reset .reset = parport_reset,
.blink = parport_led
}; };
int parport_read(void) int parport_read(void)
@ -174,9 +189,24 @@ int parport_read(void)
return 0; return 0;
} }
void parport_write(int tck, int tms, int tdi) static inline void parport_write_data(void)
{ {
u8 output; 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; int i = jtag_speed + 1;
if (tck) if (tck)
@ -194,24 +224,13 @@ void parport_write(int tck, int tms, int tdi)
else else
dataport_value &= ~cable->TDI_MASK; dataport_value &= ~cable->TDI_MASK;
output = dataport_value ^ cable->OUTPUT_INVERT;
while (i-- > 0) while (i-- > 0)
#if PARPORT_USE_PPDEV == 1 parport_write_data();
ioctl(device_handle, PPWDATA, &output);
#else
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
outb(dataport, output);
#else
outb(output, dataport);
#endif
#endif
} }
/* (1) assert or (0) deassert reset lines */ /* (1) assert or (0) deassert reset lines */
void parport_reset(int trst, int srst) void parport_reset(int trst, int srst)
{ {
u8 output;
DEBUG("trst: %i, srst: %i", trst, srst); DEBUG("trst: %i, srst: %i", trst, srst);
if (trst == 0) if (trst == 0)
@ -224,18 +243,19 @@ void parport_reset(int trst, int srst)
else if (srst == 1) else if (srst == 1)
dataport_value &= ~cable->SRST_MASK; dataport_value &= ~cable->SRST_MASK;
output = dataport_value ^ cable->OUTPUT_INVERT; parport_write_data();
}
#if PARPORT_USE_PPDEV == 1 /* turn LED on parport adapter on (1) or off (0) */
ioctl(device_handle, PPWDATA, &output); void parport_led(int on)
#else {
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) u8 output;
outb(dataport, output); if (on)
#else dataport_value |= cable->LED_MASK;
outb(output, dataport); else
#endif dataport_value &= ~cable->LED_MASK;
#endif
parport_write_data();
} }
int parport_speed(int speed) int parport_speed(int speed)
@ -400,6 +420,7 @@ int parport_init(void)
parport_reset(0, 0); parport_reset(0, 0);
parport_write(0, 0, 0); parport_write(0, 0, 0);
parport_led(1);
bitbang_interface = &parport_bitbang; bitbang_interface = &parport_bitbang;
@ -408,7 +429,11 @@ int parport_init(void)
int parport_quit(void) int parport_quit(void)
{ {
u8 output;
parport_led(0);
dataport_value = cable->PORT_EXIT;
parport_write_data();
return ERROR_OK; return ERROR_OK;
} }

View File

@ -18,7 +18,7 @@
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * 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 #ifdef HAVE_CONFIG_H
#include "config.h" #include "config.h"

View File

@ -506,7 +506,7 @@ int embeddedice_handshake(arm_jtag_t *jtag_info, int hsbit, u32 timeout)
if (hsbit == EICE_COMM_CTRL_WBIT) if (hsbit == EICE_COMM_CTRL_WBIT)
hsact = 1; hsact = 1;
else if (hsbit != EICE_COMM_CTRL_RBIT) else if (hsbit == EICE_COMM_CTRL_RBIT)
hsact = 0; hsact = 0;
else else
return ERROR_INVALID_ARGUMENTS; return ERROR_INVALID_ARGUMENTS;

View File

@ -34,7 +34,7 @@
#define IMAGE_MAX_ERROR_STRING (256) #define IMAGE_MAX_ERROR_STRING (256)
#define IMAGE_MAX_SECTIONS (128) #define IMAGE_MAX_SECTIONS (128)
#define IMAGE_MEMORY_CACHE_SIZE (1024) #define IMAGE_MEMORY_CACHE_SIZE (2048)
typedef enum image_type typedef enum image_type
{ {