]> git.sur5r.net Git - openocd/commitdiff
Partially fix USBprog and JLink adapters on XScale target
authormifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Sun, 19 Apr 2009 19:15:09 +0000 (19:15 +0000)
committermifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Sun, 19 Apr 2009 19:15:09 +0000 (19:15 +0000)
Thanks to Peter Denison <openwrt(at)marshadder.org>

git-svn-id: svn://svn.berlios.de/openocd/trunk@1471 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/jtag/jlink.c
src/jtag/usbprog.c

index 0c5f40ddcb62fc7aa9984fb7e419425350a6beaa..4e41ec47bab5a2261a6095233aa59c977fc36ad5 100644 (file)
@@ -433,7 +433,10 @@ void jlink_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size, sca
        /* Move to appropriate scan state */
        jlink_end_state(ir_scan ? TAP_IRSHIFT : TAP_DRSHIFT);
 
-       jlink_state_move();
+       /* Only move if we're not already there */
+       if (tap_get_state() != tap_get_end_state())
+               jlink_state_move();
+
        jlink_end_state(saved_end_state);
 
        /* Scan */
index 816668855dcc84206cd7dd73c97249b8eae9e03d..e22c7e037ccd46cb8a853dc393113c99939d3b1b 100644 (file)
@@ -265,6 +265,10 @@ void usbprog_path_move(pathmove_command_t *cmd)
        int num_states = cmd->num_states;
        int state_count;
 
+       /* There may be queued transitions, and before following a specified
+          path, we must flush those queued transitions */
+       usbprog_jtag_tms_send(usbprog_jtag_handle);
+
        state_count = 0;
        while (num_states)
        {
@@ -323,6 +327,10 @@ void usbprog_runtest(int num_cycles)
                usbprog_write(0, 0, 0);
        }
 
+#ifdef _DEBUG_JTAG_IO_
+       LOG_DEBUG("runtest: cur_state %s end_state %s", tap_state_name(tap_get_state()), tap_state_name(tap_get_end_state()));
+#endif
+
        /* finish in end_state */
        /*
        usbprog_end_state(saved_end_state);
@@ -340,9 +348,10 @@ void usbprog_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
        else
                usbprog_end_state(TAP_DRSHIFT);
 
-       /* usbprog_jtag_tms_send(usbprog_jtag_handle); */
+       /* Only move if we're not already there */
+       if (tap_get_state() != tap_get_end_state())
+               usbprog_state_move();
 
-       usbprog_state_move();
        usbprog_end_state(saved_end_state);
 
        usbprog_jtag_tms_send(usbprog_jtag_handle);
@@ -358,6 +367,7 @@ void usbprog_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
        }
        f(usbprog_jtag_handle, (char *)buffer, scan_size);
 
+       /* The adapter does the transition to PAUSE internally */
        if (ir_scan)
                tap_set_state(TAP_IRPAUSE);
        else