summaryrefslogtreecommitdiff
path: root/src/jtag/jlink.c
diff options
context:
space:
mode:
authorkc8apf <kc8apf@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-04-22 06:55:34 +0000
committerkc8apf <kc8apf@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-04-22 06:55:34 +0000
commitf13f52d303d9f338bbb27f604ce57f4bb728f915 (patch)
treeef4f0031b0734b833767d6d8b210d7de55f93e0e /src/jtag/jlink.c
parent5376bfd21c300d8d12a8e8d216264b4ea1c455a7 (diff)
downloadopenocd+libswd-f13f52d303d9f338bbb27f604ce57f4bb728f915.tar.gz
openocd+libswd-f13f52d303d9f338bbb27f604ce57f4bb728f915.tar.bz2
openocd+libswd-f13f52d303d9f338bbb27f604ce57f4bb728f915.tar.xz
openocd+libswd-f13f52d303d9f338bbb27f604ce57f4bb728f915.zip
refactor jlink_execute_queue courtesy of Zach Welch <zw@superlucidity.net>
git-svn-id: svn://svn.berlios.de/openocd/trunk@1500 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/jtag/jlink.c')
-rw-r--r--src/jtag/jlink.c180
1 files changed, 99 insertions, 81 deletions
diff --git a/src/jtag/jlink.c b/src/jtag/jlink.c
index d6819687..022afe5f 100644
--- a/src/jtag/jlink.c
+++ b/src/jtag/jlink.c
@@ -130,95 +130,113 @@ jtag_interface_t jlink_interface =
.quit = jlink_quit
};
-static int jlink_execute_queue(void)
+static void jlink_execute_end_state(jtag_command_t *cmd)
+{
+ DEBUG_JTAG_IO("end_state: %i", cmd->cmd.end_state->end_state);
+
+ if (cmd->cmd.end_state->end_state != TAP_INVALID)
+ jlink_end_state(cmd->cmd.end_state->end_state);
+}
+
+static void jlink_execute_runtest(jtag_command_t *cmd)
+{
+ DEBUG_JTAG_IO("runtest %i cycles, end in %i",
+ cmd->cmd.runtest->num_cycles,
+ cmd->cmd.runtest->end_state);
+
+ if (cmd->cmd.runtest->end_state != TAP_INVALID)
+ jlink_end_state(cmd->cmd.runtest->end_state);
+
+ jlink_runtest(cmd->cmd.runtest->num_cycles);
+}
+
+static void jlink_execute_statemove(jtag_command_t *cmd)
+{
+ DEBUG_JTAG_IO("statemove end in %i", cmd->cmd.statemove->end_state);
+
+ if (cmd->cmd.statemove->end_state != TAP_INVALID)
+ {
+ jlink_end_state(cmd->cmd.statemove->end_state);
+ }
+ jlink_state_move();
+}
+
+static void jlink_execute_pathmove(jtag_command_t *cmd)
+{
+ DEBUG_JTAG_IO("pathmove: %i states, end in %i",
+ cmd->cmd.pathmove->num_states,
+ cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
+
+ jlink_path_move(cmd->cmd.pathmove->num_states,
+ cmd->cmd.pathmove->path);
+}
+
+static void jlink_execute_scan(jtag_command_t *cmd)
{
- jtag_command_t *cmd = jtag_command_queue;
int scan_size;
enum scan_type type;
u8 *buffer;
- while (cmd != NULL)
- {
- switch (cmd->type)
- {
- case JTAG_END_STATE:
- DEBUG_JTAG_IO("end_state: %i", cmd->cmd.end_state->end_state);
-
- if (cmd->cmd.end_state->end_state != TAP_INVALID)
- {
- jlink_end_state(cmd->cmd.end_state->end_state);
- }
- break;
-
- case JTAG_RUNTEST:
- DEBUG_JTAG_IO( "runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles, \
- cmd->cmd.runtest->end_state);
-
- if (cmd->cmd.runtest->end_state != TAP_INVALID)
- {
- jlink_end_state(cmd->cmd.runtest->end_state);
- }
- jlink_runtest(cmd->cmd.runtest->num_cycles);
- break;
-
- case JTAG_STATEMOVE:
- DEBUG_JTAG_IO("statemove end in %i", cmd->cmd.statemove->end_state);
-
- if (cmd->cmd.statemove->end_state != TAP_INVALID)
- {
- jlink_end_state(cmd->cmd.statemove->end_state);
- }
- jlink_state_move();
- break;
-
- case JTAG_PATHMOVE:
- DEBUG_JTAG_IO("pathmove: %i states, end in %i", \
- cmd->cmd.pathmove->num_states, \
- cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
-
- jlink_path_move(cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path);
- break;
-
- case JTAG_SCAN:
- DEBUG_JTAG_IO("scan end in %i", cmd->cmd.scan->end_state);
-
- if (cmd->cmd.scan->end_state != TAP_INVALID)
- {
- jlink_end_state(cmd->cmd.scan->end_state);
- }
-
- scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
- DEBUG_JTAG_IO("scan input, length = %d", scan_size);
+ DEBUG_JTAG_IO("scan end in %i", cmd->cmd.scan->end_state);
+
+ if (cmd->cmd.scan->end_state != TAP_INVALID)
+ jlink_end_state(cmd->cmd.scan->end_state);
+
+ scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
+ DEBUG_JTAG_IO("scan input, length = %d", scan_size);
#ifdef _DEBUG_USB_COMMS_
- jlink_debug_buffer(buffer, (scan_size + 7) / 8);
+ jlink_debug_buffer(buffer, (scan_size + 7) / 8);
#endif
- type = jtag_scan_type(cmd->cmd.scan);
- jlink_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size, cmd->cmd.scan);
- break;
-
- case JTAG_RESET:
- DEBUG_JTAG_IO("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
-
- jlink_tap_execute();
-
- if (cmd->cmd.reset->trst == 1)
- {
- tap_set_state(TAP_RESET);
- }
- jlink_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
- break;
-
- case JTAG_SLEEP:
- DEBUG_JTAG_IO("sleep %i", cmd->cmd.sleep->us);
- jlink_tap_execute();
- jtag_sleep(cmd->cmd.sleep->us);
- break;
-
- default:
- LOG_ERROR("BUG: unknown JTAG command type encountered");
- exit(-1);
- }
+ type = jtag_scan_type(cmd->cmd.scan);
+ jlink_scan(cmd->cmd.scan->ir_scan,
+ type, buffer, scan_size, cmd->cmd.scan);
+}
+
+static void jlink_execute_reset(jtag_command_t *cmd)
+{
+ DEBUG_JTAG_IO("reset trst: %i srst %i",
+ cmd->cmd.reset->trst, cmd->cmd.reset->srst);
+
+ jlink_tap_execute();
+
+ if (cmd->cmd.reset->trst == 1)
+ tap_set_state(TAP_RESET);
+
+ jlink_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
+}
+
+static void jlink_execute_sleep(jtag_command_t *cmd)
+{
+ DEBUG_JTAG_IO("sleep %i", cmd->cmd.sleep->us);
+ jlink_tap_execute();
+ jtag_sleep(cmd->cmd.sleep->us);
+}
+
+static void jlink_execute_command(jtag_command_t *cmd)
+{
+ switch (cmd->type)
+ {
+ case JTAG_END_STATE: jlink_execute_end_state(cmd); break;
+ case JTAG_RUNTEST: jlink_execute_runtest(cmd); break;
+ case JTAG_STATEMOVE: jlink_execute_statemove(cmd); break;
+ case JTAG_PATHMOVE: jlink_execute_pathmove(cmd); break;
+ case JTAG_SCAN: jlink_execute_scan(cmd); break;
+ case JTAG_RESET: jlink_execute_reset(cmd); break;
+ case JTAG_SLEEP: jlink_execute_sleep(cmd); break;
+ default:
+ LOG_ERROR("BUG: unknown JTAG command type encountered");
+ exit(-1);
+ }
+}
+
+static int jlink_execute_queue(void)
+{
+ jtag_command_t *cmd = jtag_command_queue;
+
+ while (cmd != NULL)
+ {
+ jlink_execute_command(cmd);
cmd = cmd->next;
}