minidriver build test driver "minidriver"
git-svn-id: svn://svn.berlios.de/openocd/trunk@2092 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
parent
7dd8754575
commit
14d6605cc9
11
configure.in
11
configure.in
|
@ -323,6 +323,10 @@ AC_ARG_ENABLE(ecosboard,
|
||||||
AS_HELP_STRING([--enable-ecosboard], [Enable building support for eCosBoard based JTAG debugger]),
|
AS_HELP_STRING([--enable-ecosboard], [Enable building support for eCosBoard based JTAG debugger]),
|
||||||
[build_ecosboard=$enableval], [build_ecosboard=no])
|
[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,
|
AC_ARG_ENABLE(ioutil,
|
||||||
AS_HELP_STRING([--enable-ioutil], [Enable ioutil functions - useful for standalone OpenOCD implementations]),
|
AS_HELP_STRING([--enable-ioutil], [Enable ioutil functions - useful for standalone OpenOCD implementations]),
|
||||||
[build_ioutil=$enableval], [build_ioutil=no])
|
[build_ioutil=$enableval], [build_ioutil=no])
|
||||||
|
@ -459,6 +463,12 @@ else
|
||||||
AC_DEFINE(BUILD_ECOSBOARD, 0, [0 if you don't want eCosBoard.])
|
AC_DEFINE(BUILD_ECOSBOARD, 0, [0 if you don't want eCosBoard.])
|
||||||
fi
|
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
|
if test $build_ioutil = yes; then
|
||||||
AC_DEFINE(BUILD_IOUTIL, 1, [1 if you want ioutils.])
|
AC_DEFINE(BUILD_IOUTIL, 1, [1 if you want ioutils.])
|
||||||
else
|
else
|
||||||
|
@ -835,6 +845,7 @@ AM_CONDITIONAL(DUMMY, test $build_dummy = yes)
|
||||||
AM_CONDITIONAL(GIVEIO, test $parport_use_giveio = yes)
|
AM_CONDITIONAL(GIVEIO, test $parport_use_giveio = yes)
|
||||||
AM_CONDITIONAL(EP93XX, test $build_ep93xx = yes)
|
AM_CONDITIONAL(EP93XX, test $build_ep93xx = yes)
|
||||||
AM_CONDITIONAL(ECOSBOARD, test $build_ecosboard = yes)
|
AM_CONDITIONAL(ECOSBOARD, test $build_ecosboard = yes)
|
||||||
|
AM_CONDITIONAL(MINIDUMMY, test $build_minidummy = yes)
|
||||||
AM_CONDITIONAL(IOUTIL, test $build_ioutil = yes)
|
AM_CONDITIONAL(IOUTIL, test $build_ioutil = yes)
|
||||||
AM_CONDITIONAL(HTTPD, test $build_httpd = yes)
|
AM_CONDITIONAL(HTTPD, test $build_httpd = yes)
|
||||||
AM_CONDITIONAL(AT91RM9200, test $build_at91rm9200 = yes)
|
AM_CONDITIONAL(AT91RM9200, test $build_at91rm9200 = yes)
|
||||||
|
|
|
@ -51,6 +51,12 @@ else
|
||||||
ECOSBOARDFILES =
|
ECOSBOARDFILES =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if MINIDUMMY
|
||||||
|
MINIDUMMYFILES = minidummy.c
|
||||||
|
else
|
||||||
|
MINIDUMMYFILES =
|
||||||
|
endif
|
||||||
|
|
||||||
if MINIDRIVER
|
if MINIDRIVER
|
||||||
DRIVERFILES =
|
DRIVERFILES =
|
||||||
else
|
else
|
||||||
|
@ -131,6 +137,7 @@ libjtag_la_SOURCES = \
|
||||||
$(PRESTOFILES) \
|
$(PRESTOFILES) \
|
||||||
$(USBPROGFILES) \
|
$(USBPROGFILES) \
|
||||||
$(ECOSBOARDFILES) \
|
$(ECOSBOARDFILES) \
|
||||||
|
$(MINIDUMMYFILES) \
|
||||||
$(JLINKFILES) \
|
$(JLINKFILES) \
|
||||||
$(RLINKFILES) \
|
$(RLINKFILES) \
|
||||||
$(VSLLINKFILES) \
|
$(VSLLINKFILES) \
|
||||||
|
|
|
@ -99,6 +99,9 @@ static bool hasKHz = false;
|
||||||
extern jtag_interface_t zy1000_interface;
|
extern jtag_interface_t zy1000_interface;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if BUILD_MINIDUMMY == 1
|
||||||
|
extern jtag_interface_t minidummy_interface;
|
||||||
|
#endif
|
||||||
#if BUILD_PARPORT == 1
|
#if BUILD_PARPORT == 1
|
||||||
extern jtag_interface_t parport_interface;
|
extern jtag_interface_t parport_interface;
|
||||||
#endif
|
#endif
|
||||||
|
@ -159,6 +162,9 @@ jtag_interface_t *jtag_interfaces[] = {
|
||||||
#if BUILD_ECOSBOARD == 1
|
#if BUILD_ECOSBOARD == 1
|
||||||
&zy1000_interface,
|
&zy1000_interface,
|
||||||
#endif
|
#endif
|
||||||
|
#if BUILD_MINIDUMMY == 1
|
||||||
|
&minidummy_interface,
|
||||||
|
#endif
|
||||||
#if BUILD_PARPORT == 1
|
#if BUILD_PARPORT == 1
|
||||||
&parport_interface,
|
&parport_interface,
|
||||||
#endif
|
#endif
|
||||||
|
@ -240,7 +246,7 @@ jtag_tap_t *jtag_all_taps(void)
|
||||||
int jtag_tap_count(void)
|
int jtag_tap_count(void)
|
||||||
{
|
{
|
||||||
return jtag_num_taps;
|
return jtag_num_taps;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned jtag_tap_count_enabled(void)
|
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]);
|
tap->dotted_name, tap->expected_ids[ii]);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to examine chain layout according to IEEE 1149.1 §12
|
/* Try to examine chain layout according to IEEE 1149.1 §12
|
||||||
*/
|
*/
|
||||||
static int jtag_examine_chain(void)
|
static int jtag_examine_chain(void)
|
||||||
{
|
{
|
||||||
u8 idcode_buffer[JTAG_MAX_CHAIN_SIZE * 4];
|
u8 idcode_buffer[JTAG_MAX_CHAIN_SIZE * 4];
|
||||||
unsigned device_count = 0;
|
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 */
|
/* LSB must not be 0, this indicates a device in bypass */
|
||||||
LOG_WARNING("Tap/Device does not have IDCODE");
|
LOG_WARNING("Tap/Device does not have IDCODE");
|
||||||
idcode = 0;
|
idcode=0;
|
||||||
|
|
||||||
bit_count += 1;
|
bit_count += 1;
|
||||||
}
|
}
|
||||||
|
@ -1097,9 +1103,9 @@ static int jtag_examine_chain(void)
|
||||||
* End of chain (invalid manufacturer ID) some devices, such
|
* End of chain (invalid manufacturer ID) some devices, such
|
||||||
* as AVR will output all 1's instead of TDI input value at
|
* as AVR will output all 1's instead of TDI input value at
|
||||||
* end of chain.
|
* end of chain.
|
||||||
*/
|
*/
|
||||||
if (jtag_idcode_is_final(idcode))
|
if (jtag_idcode_is_final(idcode))
|
||||||
{
|
{
|
||||||
jtag_examine_chain_end(idcode_buffer,
|
jtag_examine_chain_end(idcode_buffer,
|
||||||
bit_count + 32, JTAG_MAX_CHAIN_SIZE * 32);
|
bit_count + 32, JTAG_MAX_CHAIN_SIZE * 32);
|
||||||
break;
|
break;
|
||||||
|
@ -1115,7 +1121,7 @@ static int jtag_examine_chain(void)
|
||||||
if (!tap)
|
if (!tap)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
tap->idcode = idcode;
|
tap->idcode = idcode;
|
||||||
|
|
||||||
// ensure the TAP ID does matches what was expected
|
// ensure the TAP ID does matches what was expected
|
||||||
if (!jtag_examine_chain_match_tap(tap))
|
if (!jtag_examine_chain_match_tap(tap))
|
||||||
|
@ -1478,12 +1484,12 @@ static int jim_newtap_cmd( Jim_GetOptInfo *goi )
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
Jim_SetResult_sprintf(goi->interp,
|
Jim_SetResult_sprintf( goi->interp,
|
||||||
"newtap: %s missing required parameters",
|
"newtap: %s missing required parameters",
|
||||||
pTap->dotted_name);
|
pTap->dotted_name);
|
||||||
jtag_tap_free(pTap);
|
jtag_tap_free(pTap);
|
||||||
return JIM_ERR;
|
return JIM_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int jim_jtag_command( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
|
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;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
|
static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
|
||||||
{
|
{
|
||||||
int retval=ERROR_OK;
|
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]);
|
tap_state_t state = tap_state_by_name(args[0]);
|
||||||
if (state < 0)
|
if (state < 0)
|
||||||
{
|
{
|
||||||
command_print( cmd_ctx, "Invalid state name: %s\n", args[0] );
|
command_print( cmd_ctx, "Invalid state name: %s\n", args[0] );
|
||||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
}
|
}
|
||||||
jtag_set_end_state(state);
|
jtag_set_end_state(state);
|
||||||
jtag_execute_queue();
|
jtag_execute_queue();
|
||||||
|
|
||||||
command_print(cmd_ctx, "current endstate: %s",
|
command_print(cmd_ctx, "current endstate: %s",
|
||||||
tap_state_name(cmd_queue_end_state));
|
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);
|
jtag_set_verify(false);
|
||||||
else
|
else
|
||||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *status = jtag_will_verify() ? "enabled": "disabled";
|
const char *status = jtag_will_verify() ? "enabled": "disabled";
|
||||||
command_print(cmd_ctx, "verify jtag capture is %s", status);
|
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))
|
Loading…
Reference in New Issue