Add STM32F2X/STLINK target config file.
[fw/openocd] / src / xsvf / xsvf.c
index faa55421638e70e7c8f1d971287e0d8bc19e9232..14b9e28d89c56a7a00c6e379a74921599ec429aa 100644 (file)
@@ -269,7 +269,6 @@ COMMAND_HANDLER(handle_xsvf_command)
                 */
                if (collecting_path) {
                        tap_state_t     mystate;
-                       uint8_t         uc;
 
                        switch (opcode) {
                        case XCOMMENT:
@@ -332,7 +331,7 @@ COMMAND_HANDLER(handle_xsvf_command)
                                else
                                        jtag_add_pathmove(pathlen, path);
 
-                               result = jtag_get_error();
+                               result = jtag_execute_queue();
                                if (result != ERROR_OK) {
                                        LOG_ERROR("XSVF: pathmove error %d",
                                                        result);
@@ -481,9 +480,10 @@ COMMAND_HANDLER(handle_xsvf_command)
                                        field.in_value = calloc(DIV_ROUND_UP(field.num_bits, 8), 1);
 
                                        if (tap == NULL)
-                                               jtag_add_plain_dr_scan(1, &field, jtag_set_end_state(TAP_DRPAUSE));
+                                               jtag_add_plain_dr_scan(field.num_bits, field.out_value, field.in_value,
+                                                               TAP_DRPAUSE);
                                        else
-                                               jtag_add_dr_scan(tap, 1, &field, jtag_set_end_state(TAP_DRPAUSE));
+                                               jtag_add_dr_scan(tap, 1, &field, TAP_DRPAUSE);
 
                                        jtag_check_value_mask(&field, dr_in_buf, dr_in_mask);
 
@@ -510,61 +510,65 @@ COMMAND_HANDLER(handle_xsvf_command)
                                if (xruntest)
                                {
                                        result = svf_add_statemove(TAP_IDLE);
+                                       if (result != ERROR_OK)
+                                               return result;
 
                                        if (runtest_requires_tck)
                                                jtag_add_clocks(xruntest);
                                        else
                                                jtag_add_sleep(xruntest);
-                               }
-                               else if (xendir != TAP_DRPAUSE) /* we are already in TAP_DRPAUSE */
+                               } else if (xendir != TAP_DRPAUSE) {
+                                       /* we are already in TAP_DRPAUSE */
                                        result = svf_add_statemove(xenddr);
+                                       if (result != ERROR_OK)
+                                               return result;
+                               }
                        }
                        break;
 
                case XSETSDRMASKS:
-                       LOG_ERROR("unsupported XSETSDRMASKS\n");
+                       LOG_ERROR("unsupported XSETSDRMASKS");
                        unsupported = 1;
                        break;
 
                case XSDRINC:
-                       LOG_ERROR("unsupported XSDRINC\n");
+                       LOG_ERROR("unsupported XSDRINC");
                        unsupported = 1;
                        break;
 
                case XSDRB:
-                       LOG_ERROR("unsupported XSDRB\n");
+                       LOG_ERROR("unsupported XSDRB");
                        unsupported = 1;
                        break;
 
                case XSDRC:
-                       LOG_ERROR("unsupported XSDRC\n");
+                       LOG_ERROR("unsupported XSDRC");
                        unsupported = 1;
                        break;
 
                case XSDRE:
-                       LOG_ERROR("unsupported XSDRE\n");
+                       LOG_ERROR("unsupported XSDRE");
                        unsupported = 1;
                        break;
 
                case XSDRTDOB:
-                       LOG_ERROR("unsupported XSDRTDOB\n");
+                       LOG_ERROR("unsupported XSDRTDOB");
                        unsupported = 1;
                        break;
 
                case XSDRTDOC:
-                       LOG_ERROR("unsupported XSDRTDOC\n");
+                       LOG_ERROR("unsupported XSDRTDOC");
                        unsupported = 1;
                        break;
 
                case XSDRTDOE:
-                       LOG_ERROR("unsupported XSDRTDOE\n");
+                       LOG_ERROR("unsupported XSDRTDOE");
                        unsupported = 1;
                        break;
 
                case XSTATE:
                        {
                                tap_state_t     mystate;
-                               uint8_t                 uc;
 
                                if (read(xsvf_fd, &uc, 1) < 0)
                                {
@@ -702,9 +706,10 @@ COMMAND_HANDLER(handle_xsvf_command)
 
 
                                        if (tap == NULL)
-                                               jtag_add_plain_ir_scan(1, &field, my_end_state);
+                                               jtag_add_plain_ir_scan(field.num_bits,
+                                                               field.out_value, field.in_value, my_end_state);
                                        else
-                                               jtag_add_ir_scan(tap, 1, &field, my_end_state);
+                                               jtag_add_ir_scan(tap, &field, my_end_state);
 
                                        if (xruntest)
                                        {
@@ -760,7 +765,7 @@ COMMAND_HANDLER(handle_xsvf_command)
                                   XWAIT <uint8_t wait_state> <uint8_t end_state> <uint32_t usecs>
                                */
 
-                               uint8_t wait;
+                               uint8_t wait_local;
                                uint8_t end;
                                uint8_t delay_buf[4];
 
@@ -768,7 +773,7 @@ COMMAND_HANDLER(handle_xsvf_command)
                                tap_state_t end_state;
                                int     delay;
 
-                               if (read(xsvf_fd, &wait, 1) < 0
+                               if (read(xsvf_fd, &wait_local, 1) < 0
                                  || read(xsvf_fd, &end, 1) < 0
                                  || read(xsvf_fd, delay_buf, 4) < 0)
                                {
@@ -776,7 +781,7 @@ COMMAND_HANDLER(handle_xsvf_command)
                                        break;
                                }
 
-                               wait_state = xsvf_to_tap(wait);
+                               wait_state = xsvf_to_tap(wait_local);
                                end_state  = xsvf_to_tap(end);
                                delay      = be_to_h_u32(delay_buf);
 
@@ -790,8 +795,12 @@ COMMAND_HANDLER(handle_xsvf_command)
                                {
                                        /* FIXME handle statemove errors ... */
                                        result = svf_add_statemove(wait_state);
+                                       if (result != ERROR_OK)
+                                               return result;
                                        jtag_add_sleep(delay);
                                        result = svf_add_statemove(end_state);
+                                       if (result != ERROR_OK)
+                                               return result;
                                }
                        }
                        break;
@@ -804,14 +813,14 @@ COMMAND_HANDLER(handle_xsvf_command)
 
                                uint8_t  clock_buf[4];
                                uint8_t usecs_buf[4];
-                               uint8_t wait;
+                               uint8_t wait_local;
                                uint8_t end;
                                tap_state_t wait_state;
                                tap_state_t end_state;
                                int clock_count;
                                int usecs;
 
-                               if (read(xsvf_fd, &wait, 1) < 0
+                               if (read(xsvf_fd, &wait_local, 1) < 0
                                 ||  read(xsvf_fd, &end, 1) < 0
                                 ||  read(xsvf_fd, clock_buf, 4) < 0
                                 ||  read(xsvf_fd, usecs_buf, 4) < 0)
@@ -820,7 +829,7 @@ COMMAND_HANDLER(handle_xsvf_command)
                                        break;
                                }
 
-                               wait_state = xsvf_to_tap(wait);
+                               wait_state = xsvf_to_tap(wait_local);
                                end_state  = xsvf_to_tap(end);
 
                                clock_count = be_to_h_u32(clock_buf);
@@ -846,12 +855,16 @@ COMMAND_HANDLER(handle_xsvf_command)
 
                                /* FIXME handle statemove errors ... */
                                result = svf_add_statemove(wait_state);
+                               if (result != ERROR_OK)
+                                       return result;
 
                                jtag_add_clocks(clock_count);
 
                                jtag_add_sleep(usecs);
 
                                result = svf_add_statemove(end_state);
+                               if (result != ERROR_OK)
+                                       return result;
                        }
                        break;
 
@@ -925,6 +938,8 @@ COMMAND_HANDLER(handle_xsvf_command)
                                        struct scan_field field;
 
                                        result = svf_add_statemove(loop_state);
+                                       if (result != ERROR_OK)
+                                               return result;
                                        jtag_add_clocks(loop_clocks);
                                        jtag_add_sleep(loop_usecs);
 
@@ -936,9 +951,10 @@ COMMAND_HANDLER(handle_xsvf_command)
                                                LOG_USER("LSDR retry %d", attempt);
 
                                        if (tap == NULL)
-                                               jtag_add_plain_dr_scan(1, &field, jtag_set_end_state(TAP_DRPAUSE));
+                                               jtag_add_plain_dr_scan(field.num_bits, field.out_value, field.in_value,
+                                                               TAP_DRPAUSE);
                                        else
-                                               jtag_add_dr_scan(tap, 1, &field, jtag_set_end_state(TAP_DRPAUSE));
+                                               jtag_add_dr_scan(tap, 1, &field, TAP_DRPAUSE);
 
                                        jtag_check_value_mask(&field, dr_in_buf, dr_in_mask);
 
@@ -992,7 +1008,7 @@ COMMAND_HANDLER(handle_xsvf_command)
                        break;
 
                default:
-                       LOG_ERROR("unknown xsvf command (0x%02X)\n", uc);
+                       LOG_ERROR("unknown xsvf command (0x%02X)", uc);
                        unsupported = 1;
                }
 
@@ -1002,7 +1018,11 @@ COMMAND_HANDLER(handle_xsvf_command)
 
                        /* upon error, return the TAPs to a reasonable state */
                        result = svf_add_statemove(TAP_IDLE);
+                       if (result != ERROR_OK)
+                               return result;
                        result = jtag_execute_queue();
+                       if (result != ERROR_OK)
+                               return result;
                        break;
                }
        }