- svn:eol-style=native. Let's see how that works out :-)
git-svn-id: svn://svn.berlios.de/openocd/trunk@349
b42882b7-edfa-0310-969c-
e2dbd0fdcd60
#include "string.h"
#include <unistd.h>
#include "string.h"
#include <unistd.h>
+#ifndef INTERFACE
+/* this allows JTAG devices to implement the entire jtag_xxx() layer in hw/sw */
+#define INTERFACE(a) a
+#endif
+
+
+/* note that this is not marked as static as it must be available from outside jtag.c for those
+ that implement the jtag_xxx() minidriver layer
+*/
+int jtag_error=ERROR_OK;
+
+
char* tap_state_strings[16] =
{
"tlr",
char* tap_state_strings[16] =
{
"tlr",
int jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state)
{
int jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state)
{
- jtag_command_t **last_cmd;
- jtag_device_t *device;
- int i, j;
- int scan_size = 0;
-
if (jtag_trst == 1)
{
WARNING("JTAG command queued, while TRST is low (TAP in reset)");
if (jtag_trst == 1)
{
WARNING("JTAG command queued, while TRST is low (TAP in reset)");
+ jtag_error=ERROR_JTAG_TRST_ASSERTED;
return ERROR_JTAG_TRST_ASSERTED;
}
return ERROR_JTAG_TRST_ASSERTED;
}
+ if (state != -1)
+ cmd_queue_end_state = state;
+
+ if (cmd_queue_cur_state == TAP_TLR && cmd_queue_end_state != TAP_TLR)
+ jtag_call_event_callbacks(JTAG_TRST_RELEASED);
+
+ if (cmd_queue_end_state == TAP_TLR)
+ jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
+
+ cmd_queue_cur_state = cmd_queue_end_state;
+
+ int retval=interface_jtag_add_ir_scan(num_fields, fields, state);
+ if (retval!=ERROR_OK)
+ jtag_error=retval;
+ return retval;
+}
+
+int INTERFACE(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields, enum tap_state state)
+{
+ jtag_command_t **last_cmd;
+ jtag_device_t *device;
+ int i, j;
+ int scan_size = 0;
+
+
last_cmd = jtag_get_last_command_p();
/* allocate memory for a new list member */
last_cmd = jtag_get_last_command_p();
/* allocate memory for a new list member */
(*last_cmd)->cmd.scan->num_fields = jtag_num_devices; /* one field per device */
(*last_cmd)->cmd.scan->fields = cmd_queue_alloc(jtag_num_devices * sizeof(scan_field_t));
(*last_cmd)->cmd.scan->end_state = state;
(*last_cmd)->cmd.scan->num_fields = jtag_num_devices; /* one field per device */
(*last_cmd)->cmd.scan->fields = cmd_queue_alloc(jtag_num_devices * sizeof(scan_field_t));
(*last_cmd)->cmd.scan->end_state = state;
-
- if (state != -1)
- cmd_queue_end_state = state;
- if (cmd_queue_cur_state == TAP_TLR && cmd_queue_end_state != TAP_TLR)
- jtag_call_event_callbacks(JTAG_TRST_RELEASED);
-
- if (cmd_queue_end_state == TAP_TLR)
- jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
-
- cmd_queue_cur_state = cmd_queue_end_state;
-
for (i = 0; i < jtag_num_devices; i++)
{
int found = 0;
for (i = 0; i < jtag_num_devices; i++)
{
int found = 0;
}
int jtag_add_statemove(enum tap_state state)
{
}
int jtag_add_statemove(enum tap_state state)
{
- jtag_command_t **last_cmd = jtag_get_last_command_p();
-
if (jtag_trst == 1)
{
WARNING("JTAG command queued, while TRST is low (TAP in reset)");
if (jtag_trst == 1)
{
WARNING("JTAG command queued, while TRST is low (TAP in reset)");
- return ERROR_JTAG_TRST_ASSERTED;
+ return jtag_error=ERROR_JTAG_TRST_ASSERTED;
- /* allocate memory for a new list member */
- *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
- last_comand_pointer = &((*last_cmd)->next);
- (*last_cmd)->next = NULL;
- (*last_cmd)->type = JTAG_STATEMOVE;
-
- (*last_cmd)->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
- (*last_cmd)->cmd.statemove->end_state = state;
-
if (state != -1)
cmd_queue_end_state = state;
if (state != -1)
cmd_queue_end_state = state;
jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
cmd_queue_cur_state = cmd_queue_end_state;
jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
cmd_queue_cur_state = cmd_queue_end_state;
+
+ return interface_jtag_add_statemove(state);
+}
+
+int INTERFACE(interface_jtag_add_statemove)(enum tap_state state)
+{
+ jtag_command_t **last_cmd = jtag_get_last_command_p();
+
+ /* allocate memory for a new list member */
+ *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+ last_comand_pointer = &((*last_cmd)->next);
+ (*last_cmd)->next = NULL;
+ (*last_cmd)->type = JTAG_STATEMOVE;
+
+ (*last_cmd)->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
+ (*last_cmd)->cmd.statemove->end_state = state;
+
-int jtag_add_runtest(int num_cycles, enum tap_state state)
+int INTERFACE(interface_jtag_add_runtest)(int num_cycles, enum tap_state state)
{
jtag_command_t **last_cmd = jtag_get_last_command_p();
{
jtag_command_t **last_cmd = jtag_get_last_command_p();
- if (jtag_trst == 1)
- {
- WARNING("JTAG command queued, while TRST is low (TAP in reset)");
- return ERROR_JTAG_TRST_ASSERTED;
- }
-
/* allocate memory for a new list member */
*last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
(*last_cmd)->next = NULL;
/* allocate memory for a new list member */
*last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
(*last_cmd)->next = NULL;
(*last_cmd)->cmd.runtest->num_cycles = num_cycles;
(*last_cmd)->cmd.runtest->end_state = state;
(*last_cmd)->cmd.runtest->num_cycles = num_cycles;
(*last_cmd)->cmd.runtest->end_state = state;
+ return ERROR_OK;
+}
+
+int jtag_add_runtest(int num_cycles, enum tap_state state)
+{
+ if (jtag_trst == 1)
+ {
+ jtag_error=ERROR_JTAG_QUEUE_FAILED;
+ WARNING("JTAG command queued, while TRST is low (TAP in reset)");
+ return ERROR_JTAG_TRST_ASSERTED;
+ }
+
if (state != -1)
cmd_queue_end_state = state;
if (state != -1)
cmd_queue_end_state = state;
cmd_queue_cur_state = cmd_queue_end_state;
cmd_queue_cur_state = cmd_queue_end_state;
+ /* executed by sw or hw fifo */
+ return interface_jtag_add_runtest(num_cycles, state);
}
int jtag_add_reset(int req_trst, int req_srst)
{
int trst_with_tms = 0;
}
int jtag_add_reset(int req_trst, int req_srst)
{
int trst_with_tms = 0;
-
- jtag_command_t **last_cmd = jtag_get_last_command_p();
if (req_trst == -1)
req_trst = jtag_trst;
if (req_trst == -1)
req_trst = jtag_trst;
/* Make sure that jtag_reset_config allows the requested reset */
/* if SRST pulls TRST, we can't fulfill srst == 1 with trst == 0 */
if (((jtag_reset_config & RESET_SRST_PULLS_TRST) && (req_srst == 1)) && (req_trst == 0))
/* Make sure that jtag_reset_config allows the requested reset */
/* if SRST pulls TRST, we can't fulfill srst == 1 with trst == 0 */
if (((jtag_reset_config & RESET_SRST_PULLS_TRST) && (req_srst == 1)) && (req_trst == 0))
- return ERROR_JTAG_RESET_WOULD_ASSERT_TRST;
+ {
+ return jtag_error=ERROR_JTAG_RESET_WOULD_ASSERT_TRST;
+ }
/* if TRST pulls SRST, we reset with TAP T-L-R */
if (((jtag_reset_config & RESET_TRST_PULLS_SRST) && (req_trst == 1)) && (req_srst == 0))
/* if TRST pulls SRST, we reset with TAP T-L-R */
if (((jtag_reset_config & RESET_TRST_PULLS_SRST) && (req_trst == 1)) && (req_srst == 0))
if (req_srst && !(jtag_reset_config & RESET_HAS_SRST))
{
ERROR("requested nSRST assertion, but the current configuration doesn't support this");
if (req_srst && !(jtag_reset_config & RESET_HAS_SRST))
{
ERROR("requested nSRST assertion, but the current configuration doesn't support this");
- return ERROR_JTAG_RESET_CANT_SRST;
+ return jtag_error=ERROR_JTAG_RESET_CANT_SRST;
}
if (req_trst && !(jtag_reset_config & RESET_HAS_TRST))
}
if (req_trst && !(jtag_reset_config & RESET_HAS_TRST))
req_trst = 0;
trst_with_tms = 1;
}
req_trst = 0;
trst_with_tms = 1;
}
-
- /* allocate memory for a new list member */
- *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
- (*last_cmd)->next = NULL;
- last_comand_pointer = &((*last_cmd)->next);
- (*last_cmd)->type = JTAG_RESET;
-
- (*last_cmd)->cmd.reset = cmd_queue_alloc(sizeof(reset_command_t));
- (*last_cmd)->cmd.reset->trst = req_trst;
- (*last_cmd)->cmd.reset->srst = req_srst;
jtag_trst = req_trst;
jtag_srst = req_srst;
jtag_trst = req_trst;
jtag_srst = req_srst;
- last_cmd = &((*last_cmd)->next);
-
- /* allocate memory for a new list member */
- *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
- (*last_cmd)->next = NULL;
- last_comand_pointer = &((*last_cmd)->next);
- (*last_cmd)->type = JTAG_STATEMOVE;
-
- (*last_cmd)->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
- (*last_cmd)->cmd.statemove->end_state = TAP_TLR;
-
jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
cmd_queue_cur_state = TAP_TLR;
cmd_queue_end_state = TAP_TLR;
jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
cmd_queue_cur_state = TAP_TLR;
cmd_queue_end_state = TAP_TLR;
jtag_add_sleep(jtag_ntrst_delay * 1000);
}
}
jtag_add_sleep(jtag_ntrst_delay * 1000);
}
}
+ retval = interface_jtag_add_reset(req_trst, req_srst);
+ if (retval!=ERROR_OK)
+ jtag_error=retval;
+
+ if (trst_with_tms)
+ {
+ jtag_add_statemove(TAP_TLR);
+ }
+
+ return retval;
+
+}
+
+int INTERFACE(interface_jtag_add_reset)(int req_trst, int req_srst)
+{
+ jtag_command_t **last_cmd = jtag_get_last_command_p();
+ /* allocate memory for a new list member */
+ *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+ (*last_cmd)->next = NULL;
+ last_comand_pointer = &((*last_cmd)->next);
+ (*last_cmd)->type = JTAG_RESET;
+
+ (*last_cmd)->cmd.reset = cmd_queue_alloc(sizeof(reset_command_t));
+ (*last_cmd)->cmd.reset->trst = req_trst;
+ (*last_cmd)->cmd.reset->srst = req_srst;
+
+
-int jtag_execute_queue(void)
+int INTERFACE(interface_jtag_execute_queue)(void)
jtag_command_queue = NULL;
last_comand_pointer = &jtag_command_queue;
jtag_command_queue = NULL;
last_comand_pointer = &jtag_command_queue;
+ jtag_error=ERROR_OK;
+
+ return retval;
+}
+
+int jtag_execute_queue(void)
+{
+ int retval=interface_jtag_execute_queue();
+ if (retval!=ERROR_OK)
+ return retval;
+ retval=jtag_error;
+ jtag_error=ERROR_OK;
u8 *out_mask; /* only masked bits care */
u8 *in_value; /* pointer to a 32-bit memory location to take data scanned out */
/* in_check_value/mask, in_handler_error_handler, in_handler_priv can be used by the in handler, otherwise they contain garbage */
u8 *out_mask; /* only masked bits care */
u8 *in_value; /* pointer to a 32-bit memory location to take data scanned out */
/* in_check_value/mask, in_handler_error_handler, in_handler_priv can be used by the in handler, otherwise they contain garbage */
- u8 *in_check_value; /* used to validate scan results */
- u8 *in_check_mask; /* check specified bits against check_value */
+ u8 *in_check_value; /* used to validate scan results */
+ u8 *in_check_mask; /* check specified bits against check_value */
in_handler_t in_handler; /* process received buffer using this handler */
void *in_handler_priv; /* additional information for the in_handler */
} scan_field_t;
in_handler_t in_handler; /* process received buffer using this handler */
void *in_handler_priv; /* additional information for the in_handler */
} scan_field_t;
enum scan_type
{
/* IN: from device to host, OUT: from host to device */
enum scan_type
{
/* IN: from device to host, OUT: from host to device */
/* JTAG interface, can be implemented with a software or hardware fifo */
extern int jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
/* JTAG interface, can be implemented with a software or hardware fifo */
extern int jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+extern int interface_jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
extern int jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
extern int jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+extern int interface_jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
extern int jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
extern int jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+extern int interface_jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
extern int jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
extern int jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+extern int interface_jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
/* execute a state transition within the JTAG standard, but the exact path
* path that is taken is undefined. Many implementations use precisely
* 7 clocks to perform a transition, but it could be more or less
/* execute a state transition within the JTAG standard, but the exact path
* path that is taken is undefined. Many implementations use precisely
* 7 clocks to perform a transition, but it could be more or less
* side effects.
*/
extern int jtag_add_statemove(enum tap_state endstate);
* side effects.
*/
extern int jtag_add_statemove(enum tap_state endstate);
+extern int interface_jtag_add_statemove(enum tap_state endstate);
/* A list of unambigious single clock state transitions, not
* all drivers can support this, but it is required for e.g.
* XScale and Xilinx support
*/
extern int jtag_add_pathmove(int num_states, enum tap_state *path);
/* A list of unambigious single clock state transitions, not
* all drivers can support this, but it is required for e.g.
* XScale and Xilinx support
*/
extern int jtag_add_pathmove(int num_states, enum tap_state *path);
+extern int interface_jtag_add_pathmove(int num_states, enum tap_state *path);
/* cycle precisely num_cycles in the TAP_RTI state */
extern int jtag_add_runtest(int num_cycles, enum tap_state endstate);
/* cycle precisely num_cycles in the TAP_RTI state */
extern int jtag_add_runtest(int num_cycles, enum tap_state endstate);
+extern int interface_jtag_add_runtest(int num_cycles, enum tap_state endstate);
extern int jtag_add_reset(int trst, int srst);
extern int jtag_add_reset(int trst, int srst);
+extern int interface_jtag_add_reset(int trst, int srst);
extern int jtag_add_end_state(enum tap_state endstate);
extern int jtag_add_end_state(enum tap_state endstate);
+extern int inteface_jtag_add_end_state(enum tap_state endstate);
extern int jtag_add_sleep(u32 us);
extern int jtag_add_sleep(u32 us);
+extern int interface_jtag_add_sleep(u32 us);
/*
* For software FIFO implementations, the queued commands can be executed
* during this call or earlier. A sw queue might decide to push out
/*
* For software FIFO implementations, the queued commands can be executed
* during this call or earlier. A sw queue might decide to push out
* at some time between the jtag_add_xxx() fn call and jtag_execute_queue().
*/
extern int jtag_execute_queue(void);
* at some time between the jtag_add_xxx() fn call and jtag_execute_queue().
*/
extern int jtag_execute_queue(void);
+/* can be implemented by hw+sw */
+extern int interface_jtag_execute_queue(void);
/* JTAG support functions */
extern void jtag_set_check_value(scan_field_t *field, u8 *value, u8 *mask, error_handler_t *in_error_handler);
/* JTAG support functions */
extern void jtag_set_check_value(scan_field_t *field, u8 *value, u8 *mask, error_handler_t *in_error_handler);
#define ERROR_JTAG_RESET_WOULD_ASSERT_TRST (-105)
#define ERROR_JTAG_RESET_CANT_SRST (-106)
#define ERROR_JTAG_DEVICE_ERROR (-107)
#define ERROR_JTAG_RESET_WOULD_ASSERT_TRST (-105)
#define ERROR_JTAG_RESET_CANT_SRST (-106)
#define ERROR_JTAG_DEVICE_ERROR (-107)
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)