git-svn-id: svn://svn.berlios.de/openocd/trunk@2092 b42882b7-edfa-0310-969c-e2dbd0fdcd60tags/v0.2.0
@@ -323,6 +323,10 @@ AC_ARG_ENABLE(ecosboard, | |||
AS_HELP_STRING([--enable-ecosboard], [Enable building support for eCosBoard based JTAG debugger]), | |||
[build_ecosboard=$enableval], [build_ecosboard=no]) | |||
AC_ARG_ENABLE(minidummy, | |||
AS_HELP_STRING([--enable-minidummy], [Enable building support for minidummy driver]), | |||
[build_minidummy=$enableval], [build_minidummy=no]) | |||
AC_ARG_ENABLE(ioutil, | |||
AS_HELP_STRING([--enable-ioutil], [Enable ioutil functions - useful for standalone OpenOCD implementations]), | |||
[build_ioutil=$enableval], [build_ioutil=no]) | |||
@@ -459,6 +463,12 @@ else | |||
AC_DEFINE(BUILD_ECOSBOARD, 0, [0 if you don't want eCosBoard.]) | |||
fi | |||
if test $build_minidummy = yes; then | |||
AC_DEFINE(BUILD_MINIDUMMY, 1, [1 if you want minidummy.]) | |||
else | |||
AC_DEFINE(BUILD_MINIDUMMY, 0, [0 if you don't want minidummy.]) | |||
fi | |||
if test $build_ioutil = yes; then | |||
AC_DEFINE(BUILD_IOUTIL, 1, [1 if you want ioutils.]) | |||
else | |||
@@ -835,6 +845,7 @@ AM_CONDITIONAL(DUMMY, test $build_dummy = yes) | |||
AM_CONDITIONAL(GIVEIO, test $parport_use_giveio = yes) | |||
AM_CONDITIONAL(EP93XX, test $build_ep93xx = yes) | |||
AM_CONDITIONAL(ECOSBOARD, test $build_ecosboard = yes) | |||
AM_CONDITIONAL(MINIDUMMY, test $build_minidummy = yes) | |||
AM_CONDITIONAL(IOUTIL, test $build_ioutil = yes) | |||
AM_CONDITIONAL(HTTPD, test $build_httpd = yes) | |||
AM_CONDITIONAL(AT91RM9200, test $build_at91rm9200 = yes) | |||
@@ -51,6 +51,12 @@ else | |||
ECOSBOARDFILES = | |||
endif | |||
if MINIDUMMY | |||
MINIDUMMYFILES = minidummy.c | |||
else | |||
MINIDUMMYFILES = | |||
endif | |||
if MINIDRIVER | |||
DRIVERFILES = | |||
else | |||
@@ -131,6 +137,7 @@ libjtag_la_SOURCES = \ | |||
$(PRESTOFILES) \ | |||
$(USBPROGFILES) \ | |||
$(ECOSBOARDFILES) \ | |||
$(MINIDUMMYFILES) \ | |||
$(JLINKFILES) \ | |||
$(RLINKFILES) \ | |||
$(VSLLINKFILES) \ | |||
@@ -99,6 +99,9 @@ static bool hasKHz = false; | |||
extern jtag_interface_t zy1000_interface; | |||
#endif | |||
#if BUILD_MINIDUMMY == 1 | |||
extern jtag_interface_t minidummy_interface; | |||
#endif | |||
#if BUILD_PARPORT == 1 | |||
extern jtag_interface_t parport_interface; | |||
#endif | |||
@@ -159,6 +162,9 @@ jtag_interface_t *jtag_interfaces[] = { | |||
#if BUILD_ECOSBOARD == 1 | |||
&zy1000_interface, | |||
#endif | |||
#if BUILD_MINIDUMMY == 1 | |||
&minidummy_interface, | |||
#endif | |||
#if BUILD_PARPORT == 1 | |||
&parport_interface, | |||
#endif | |||
@@ -240,7 +246,7 @@ jtag_tap_t *jtag_all_taps(void) | |||
int jtag_tap_count(void) | |||
{ | |||
return jtag_num_taps; | |||
} | |||
} | |||
unsigned jtag_tap_count_enabled(void) | |||
{ | |||
@@ -1058,12 +1064,12 @@ static bool jtag_examine_chain_match_tap(const struct jtag_tap_s *tap) | |||
tap->dotted_name, tap->expected_ids[ii]); | |||
} | |||
return false; | |||
} | |||
} | |||
/* Try to examine chain layout according to IEEE 1149.1 §12 | |||
*/ | |||
static int jtag_examine_chain(void) | |||
{ | |||
{ | |||
u8 idcode_buffer[JTAG_MAX_CHAIN_SIZE * 4]; | |||
unsigned device_count = 0; | |||
@@ -1087,7 +1093,7 @@ static int jtag_examine_chain(void) | |||
{ | |||
/* LSB must not be 0, this indicates a device in bypass */ | |||
LOG_WARNING("Tap/Device does not have IDCODE"); | |||
idcode = 0; | |||
idcode=0; | |||
bit_count += 1; | |||
} | |||
@@ -1097,9 +1103,9 @@ static int jtag_examine_chain(void) | |||
* End of chain (invalid manufacturer ID) some devices, such | |||
* as AVR will output all 1's instead of TDI input value at | |||
* end of chain. | |||
*/ | |||
*/ | |||
if (jtag_idcode_is_final(idcode)) | |||
{ | |||
{ | |||
jtag_examine_chain_end(idcode_buffer, | |||
bit_count + 32, JTAG_MAX_CHAIN_SIZE * 32); | |||
break; | |||
@@ -1115,7 +1121,7 @@ static int jtag_examine_chain(void) | |||
if (!tap) | |||
continue; | |||
tap->idcode = idcode; | |||
tap->idcode = idcode; | |||
// ensure the TAP ID does matches what was expected | |||
if (!jtag_examine_chain_match_tap(tap)) | |||
@@ -1478,12 +1484,12 @@ static int jim_newtap_cmd( Jim_GetOptInfo *goi ) | |||
return ERROR_OK; | |||
} | |||
Jim_SetResult_sprintf(goi->interp, | |||
"newtap: %s missing required parameters", | |||
pTap->dotted_name); | |||
Jim_SetResult_sprintf( goi->interp, | |||
"newtap: %s missing required parameters", | |||
pTap->dotted_name); | |||
jtag_tap_free(pTap); | |||
return JIM_ERR; | |||
} | |||
return JIM_ERR; | |||
} | |||
static int jim_jtag_command( Jim_Interp *interp, int argc, Jim_Obj *const *argv ) | |||
{ | |||
@@ -2133,7 +2139,6 @@ static int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, ch | |||
return ERROR_OK; | |||
} | |||
static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) | |||
{ | |||
int retval=ERROR_OK; | |||
@@ -2218,11 +2223,11 @@ static int handle_endstate_command(struct command_context_s *cmd_ctx, char *cmd, | |||
tap_state_t state = tap_state_by_name(args[0]); | |||
if (state < 0) | |||
{ | |||
command_print( cmd_ctx, "Invalid state name: %s\n", args[0] ); | |||
return ERROR_COMMAND_SYNTAX_ERROR; | |||
} | |||
jtag_set_end_state(state); | |||
jtag_execute_queue(); | |||
command_print( cmd_ctx, "Invalid state name: %s\n", args[0] ); | |||
return ERROR_COMMAND_SYNTAX_ERROR; | |||
} | |||
jtag_set_end_state(state); | |||
jtag_execute_queue(); | |||
command_print(cmd_ctx, "current endstate: %s", | |||
tap_state_name(cmd_queue_end_state)); | |||
@@ -2571,7 +2576,7 @@ static int handle_verify_jtag_command(struct command_context_s *cmd_ctx, char *c | |||
jtag_set_verify(false); | |||
else | |||
return ERROR_COMMAND_SYNTAX_ERROR; | |||
} | |||
} | |||
const char *status = jtag_will_verify() ? "enabled": "disabled"; | |||
command_print(cmd_ctx, "verify jtag capture is %s", status); | |||
@@ -0,0 +1,190 @@ | |||
/*************************************************************************** | |||
* Copyright (C) 2007-2008 by Øyvind Harboe * | |||
* * | |||
* This program is free software; you can redistribute it and/or modify * | |||
* it under the terms of the GNU General Public License as published by * | |||
* the Free Software Foundation; either version 2 of the License, or * | |||
* (at your option) any later version. * | |||
* * | |||
* This program is distributed in the hope that it will be useful, * | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of * | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | |||
* GNU General Public License for more details. * | |||
* * | |||
* You should have received a copy of the GNU General Public License * | |||
* along with this program; if not, write to the * | |||
* Free Software Foundation, Inc., * | |||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * | |||
***************************************************************************/ | |||
#ifdef HAVE_CONFIG_H | |||
#include "config.h" | |||
#endif | |||
#include "embeddedice.h" | |||
#include "minidriver.h" | |||
#include "interface.h" | |||
jtag_interface_t minidummy_interface = | |||
{ | |||
.name = "minidummy", | |||
.execute_queue = NULL, | |||
.speed = NULL, | |||
.register_commands = NULL, | |||
.init = NULL, | |||
.quit = NULL, | |||
.khz = NULL, | |||
.speed_div = NULL, | |||
.power_dropout = NULL, | |||
.srst_asserted = NULL, | |||
}; | |||
int interface_jtag_execute_queue(void) | |||
{ | |||
/* synchronously do the operation here */ | |||
return ERROR_OK; | |||
} | |||
extern int jtag_check_value(u8 *captured, void *priv); | |||
int interface_jtag_set_end_state(tap_state_t state) | |||
{ | |||
return ERROR_OK; | |||
} | |||
int interface_jtag_add_ir_scan(int num_fields, const scan_field_t *fields, tap_state_t state) | |||
{ | |||
/* synchronously do the operation here */ | |||
return ERROR_OK; | |||
} | |||
int interface_jtag_add_plain_ir_scan(int num_fields, const scan_field_t *fields, tap_state_t state) | |||
{ | |||
/* synchronously do the operation here */ | |||
return ERROR_OK; | |||
} | |||
/*extern jtag_command_t **jtag_get_last_command_p(void);*/ | |||
int interface_jtag_add_dr_scan(int num_fields, const scan_field_t *fields, tap_state_t state) | |||
{ | |||
/* synchronously do the operation here */ | |||
return ERROR_OK; | |||
} | |||
int interface_jtag_add_plain_dr_scan(int num_fields, const scan_field_t *fields, tap_state_t state) | |||
{ | |||
/* synchronously do the operation here */ | |||
return ERROR_OK; | |||
} | |||
int interface_jtag_add_tlr() | |||
{ | |||
/* synchronously do the operation here */ | |||
return ERROR_OK; | |||
} | |||
int interface_jtag_add_reset(int req_trst, int req_srst) | |||
{ | |||
/* synchronously do the operation here */ | |||
return ERROR_OK; | |||
} | |||
int interface_jtag_add_runtest(int num_cycles, tap_state_t state) | |||
{ | |||
/* synchronously do the operation here */ | |||
return ERROR_OK; | |||
} | |||
int interface_jtag_add_clocks(int num_cycles) | |||
{ | |||
/* synchronously do the operation here */ | |||
return ERROR_OK; | |||
} | |||
int interface_jtag_add_sleep(u32 us) | |||
{ | |||
jtag_sleep(us); | |||
return ERROR_OK; | |||
} | |||
int interface_jtag_add_pathmove(int num_states, const tap_state_t *path) | |||
{ | |||
int state_count; | |||
int tms = 0; | |||
state_count = 0; | |||
tap_state_t cur_state=cmd_queue_cur_state; | |||
while (num_states) | |||
{ | |||
if (tap_state_transition(cur_state, false) == path[state_count]) | |||
{ | |||
tms = 0; | |||
} | |||
else if (tap_state_transition(cur_state, true) == path[state_count]) | |||
{ | |||
tms = 1; | |||
} | |||
else | |||
{ | |||
LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state), tap_state_name(path[state_count])); | |||
exit(-1); | |||
} | |||
/* synchronously do the operation here */ | |||
cur_state = path[state_count]; | |||
state_count++; | |||
num_states--; | |||
} | |||
/* synchronously do the operation here */ | |||
return ERROR_OK; | |||
} | |||
void embeddedice_write_dcc(jtag_tap_t *tap, int reg_addr, u8 *buffer, int little, int count) | |||
{ | |||
int i; | |||
for (i = 0; i < count; i++) | |||
{ | |||
embeddedice_write_reg_inner(tap, reg_addr, fast_target_buffer_get_u32(buffer, little)); | |||
buffer += 4; | |||
} | |||
} | |||
@@ -0,0 +1,43 @@ | |||
/*************************************************************************** | |||
* Copyright (C) 2007-2008 by Øyvind Harboe * | |||
* * | |||
* This program is free software; you can redistribute it and/or modify * | |||
* it under the terms of the GNU General Public License as published by * | |||
* the Free Software Foundation; either version 2 of the License, or * | |||
* (at your option) any later version. * | |||
* * | |||
* This program is distributed in the hope that it will be useful, * | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of * | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | |||
* GNU General Public License for more details. * | |||
* * | |||
* You should have received a copy of the GNU General Public License * | |||
* along with this program; if not, write to the * | |||
* Free Software Foundation, Inc., * | |||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * | |||
***************************************************************************/ | |||
static __inline__ void interface_jtag_add_dr_out_core(jtag_tap_t *target_tap, | |||
int num_fields, | |||
const int *num_bits, | |||
const u32 *value, | |||
enum tap_state end_state) | |||
{ | |||
/* synchronously do the operation here */ | |||
} | |||
static __inline__ void interface_jtag_add_dr_out(jtag_tap_t *target_tap, | |||
int num_fields, | |||
const int *num_bits, | |||
const u32 *value, | |||
enum tap_state end_state) | |||
{ | |||
/* synchronously do the operation here */ | |||
} | |||
#define interface_jtag_add_callback(callback, in) callback(in) | |||
#define interface_jtag_add_callback4(callback, in, data1, data2, data3) jtag_set_error(callback(in, data1, data2, data3)) |