Add jtag_queue_command() by Michael Bruck <mbruck@digenius.de> [7/8]
[openocd.git] / src / jtag / jtag.c
index 55d035a494203ff600ec0c3693bdc64cf4b2374a..54735b89db9be1ae674d1e8e3dc53436f8724317 100644 (file)
@@ -33,7 +33,7 @@
 #ifdef HAVE_STRINGS_H
 #include <strings.h>
 #endif
-#include <assert.h>
+
 
 int jtag_flush_queue_count; /* count # of flushes for profiling / debugging purposes */
 
@@ -97,6 +97,7 @@ tap_state_t cmd_queue_end_state = TAP_RESET;
 tap_state_t cmd_queue_cur_state = TAP_RESET;
 
 int jtag_verify_capture_ir = 1;
+int jtag_verify = 1;
 
 /* how long the OpenOCD should wait before attempting JTAG communication after reset lines deasserted (in ms) */
 static int jtag_nsrst_delay = 0; /* default to no nSRST delay */
@@ -259,6 +260,7 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *argv
 static int Jim_Command_flush_count(Jim_Interp *interp, int argc, Jim_Obj *const *args);
 
 static int handle_verify_ircapture_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+static int handle_verify_jtag_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 
 jtag_tap_t *jtag_AllTaps(void)
 {
@@ -437,6 +439,21 @@ jtag_command_t** jtag_get_last_command_p(void)
        return last_comand_pointer;
 }
 
+
+void jtag_queue_command(jtag_command_t * cmd)
+{
+       jtag_command_t **last_cmd;
+
+       last_cmd = jtag_get_last_command_p();
+
+       *last_cmd = cmd;
+
+       (*last_cmd)->next = NULL;
+
+       last_comand_pointer = &((*last_cmd)->next);
+}
+
+
 void* cmd_queue_alloc(size_t size)
 {
        cmd_queue_page_t **p_page = &cmd_queue_pages;
@@ -550,49 +567,49 @@ void jtag_add_ir_scan_noverify(int num_fields, scan_field_t *fields, tap_state_t
 
 void jtag_add_ir_scan(int num_fields, scan_field_t *fields, tap_state_t state)
 {
-       /* 8 x 32 bit id's is enough for all invoations */
-       int j;
-       for (j = 0; j < num_fields; j++)
+       if (jtag_verify&&jtag_verify_capture_ir)
        {
-               fields[j].check_value=NULL;
-               fields[j].check_mask=NULL;
-               /* if we are to run a verification of the ir scan, we need to get the input back.
-                * We may have to allocate space if the caller didn't ask for the input back.
-                */
-               if (jtag_verify_capture_ir)
+               /* 8 x 32 bit id's is enough for all invoations */
+               int j;
+               for (j = 0; j < num_fields; j++)
                {
+                       fields[j].check_value=NULL;
+                       fields[j].check_mask=NULL;
+                       /* if we are to run a verification of the ir scan, we need to get the input back.
+                        * We may have to allocate space if the caller didn't ask for the input back.
+                        */
                        fields[j].check_value=fields[j].tap->expected;
                        fields[j].check_mask=fields[j].tap->expected_mask;
                }
+               jtag_add_scan_check(jtag_add_ir_scan_noverify, num_fields, fields, state);
+       } else
+       {
+               jtag_add_ir_scan_noverify(num_fields, fields, state);
        }
-
-       jtag_add_scan_check(jtag_add_ir_scan_noverify, num_fields, fields, state);
 }
 
 int MINIDRIVER(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
 {
-       jtag_command_t **last_cmd;
        jtag_tap_t *tap;
        int j;
        int x;
        int nth_tap;
        int scan_size = 0;
 
-       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_SCAN;
+       jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+       
+       jtag_queue_command(cmd);
+       
+       cmd->type = JTAG_SCAN;
 
        /* allocate memory for ir scan command */
-       (*last_cmd)->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t));
-       (*last_cmd)->cmd.scan->ir_scan = 1;
+       cmd->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t));
+       cmd->cmd.scan->ir_scan = true;
        x = jtag_NumEnabledTaps();
-       (*last_cmd)->cmd.scan->num_fields = x;  /* one field per device */
-       (*last_cmd)->cmd.scan->fields = cmd_queue_alloc(x  * sizeof(scan_field_t));
-       (*last_cmd)->cmd.scan->end_state = state;
+       cmd->cmd.scan->num_fields = x;  /* one field per device */
+       cmd->cmd.scan->fields = cmd_queue_alloc(x  * sizeof(scan_field_t));
+       cmd->cmd.scan->end_state = state;
 
        nth_tap = -1;
        tap = NULL;
@@ -609,9 +626,9 @@ int MINIDRIVER(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields,
                assert(nth_tap < x );
 
                scan_size = tap->ir_length;
-               (*last_cmd)->cmd.scan->fields[nth_tap].tap = tap;
-               (*last_cmd)->cmd.scan->fields[nth_tap].num_bits = scan_size;
-               (*last_cmd)->cmd.scan->fields[nth_tap].in_value = NULL; /* do not collect input for tap's in bypass */
+               cmd->cmd.scan->fields[nth_tap].tap = tap;
+               cmd->cmd.scan->fields[nth_tap].num_bits = scan_size;
+               cmd->cmd.scan->fields[nth_tap].in_value = NULL; /* do not collect input for tap's in bypass */
 
                /* search the list */
                for (j = 0; j < num_fields; j++)
@@ -619,8 +636,8 @@ int MINIDRIVER(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields,
                        if (tap == fields[j].tap)
                        {
                                found = 1;
-                               (*last_cmd)->cmd.scan->fields[nth_tap].in_value = fields[j].in_value;
-                               (*last_cmd)->cmd.scan->fields[nth_tap].out_value = buf_cpy(fields[j].out_value, cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
+                               cmd->cmd.scan->fields[nth_tap].in_value = fields[j].in_value;
+                               cmd->cmd.scan->fields[nth_tap].out_value = buf_cpy(fields[j].out_value, cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
 
                                tap->bypass = 0;
                                break;
@@ -630,12 +647,12 @@ int MINIDRIVER(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields,
                if (!found)
                {
                        /* if a tap isn't listed, set it to BYPASS */
-                       (*last_cmd)->cmd.scan->fields[nth_tap].out_value = buf_set_ones(cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
+                       cmd->cmd.scan->fields[nth_tap].out_value = buf_set_ones(cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
                        tap->bypass = 1;
                }
 
                /* update device information */
-               buf_cpy((*last_cmd)->cmd.scan->fields[nth_tap].out_value, tap->cur_instr, scan_size);
+               buf_cpy(cmd->cmd.scan->fields[nth_tap].out_value, tap->cur_instr, scan_size);
        }
        assert(nth_tap == (x-1));
 
@@ -655,32 +672,31 @@ void jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, tap_state_t st
 
 int MINIDRIVER(interface_jtag_add_plain_ir_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
 {
-       int i;
-       jtag_command_t **last_cmd;
+       /* allocate memory for a new list member */
 
-       last_cmd = jtag_get_last_command_p();
+       jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+       
+       jtag_queue_command(cmd);
 
-       /* 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_SCAN;
+       cmd->type = JTAG_SCAN;
 
        /* allocate memory for ir scan command */
-       (*last_cmd)->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t));
-       (*last_cmd)->cmd.scan->ir_scan = 1;
-       (*last_cmd)->cmd.scan->num_fields = num_fields;
-       (*last_cmd)->cmd.scan->fields = cmd_queue_alloc(num_fields * sizeof(scan_field_t));
-       (*last_cmd)->cmd.scan->end_state = state;
+       cmd->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t));
+       cmd->cmd.scan->ir_scan = true;
+       cmd->cmd.scan->num_fields = num_fields;
+       cmd->cmd.scan->fields = cmd_queue_alloc(num_fields * sizeof(scan_field_t));
+       cmd->cmd.scan->end_state = state;
 
-       for( i = 0 ; i < num_fields ; i++ ){
+       for (int i = 0; i < num_fields; i++)
+       {
                int num_bits = fields[i].num_bits;
                int num_bytes = CEIL(fields[i].num_bits, 8);
-               (*last_cmd)->cmd.scan->fields[i].tap = fields[i].tap;
-               (*last_cmd)->cmd.scan->fields[i].num_bits = num_bits;
-               (*last_cmd)->cmd.scan->fields[i].out_value = buf_cpy(fields[i].out_value, cmd_queue_alloc(num_bytes), num_bits);
-               (*last_cmd)->cmd.scan->fields[i].in_value = fields[i].in_value;
+               cmd->cmd.scan->fields[i].tap = fields[i].tap;
+               cmd->cmd.scan->fields[i].num_bits = num_bits;
+               cmd->cmd.scan->fields[i].out_value = buf_cpy(fields[i].out_value, cmd_queue_alloc(num_bytes), num_bits);
+               cmd->cmd.scan->fields[i].in_value = fields[i].in_value;
        }
+
        return ERROR_OK;
 }
 
@@ -718,7 +734,7 @@ static void jtag_add_scan_check(void (*jtag_add_scan)(int num_fields, scan_field
                        if (fields[i].num_bits<=32)
                        {
                                /* This is enough space and we're executing this synchronously */
-                               fields[i].in_value=(u8 *)&fields[i].intmp;
+                               fields[i].in_value=fields[i].intmp;
                        } else
                        {
                                fields[i].in_value=(u8 *)malloc(CEIL(fields[i].num_bits, 8));
@@ -752,12 +768,15 @@ static void jtag_add_scan_check(void (*jtag_add_scan)(int num_fields, scan_field
 
 void jtag_add_dr_scan_check(int num_fields, scan_field_t *fields, tap_state_t state)
 {
-       jtag_add_scan_check(jtag_add_dr_scan, num_fields, fields, state);
+       if (jtag_verify)
+       {
+               jtag_add_scan_check(jtag_add_dr_scan, num_fields, fields, state);
+       } else
+       {
+               jtag_add_dr_scan(num_fields, fields, state);
+       }
 }
 
-
-
-
 int MINIDRIVER(interface_jtag_add_dr_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
 {
        int j;
@@ -766,7 +785,6 @@ int MINIDRIVER(interface_jtag_add_dr_scan)(int num_fields, scan_field_t *fields,
        int field_count = 0;
        int scan_size;
 
-       jtag_command_t **last_cmd = jtag_get_last_command_p();
        jtag_tap_t *tap;
 
        /* count devices in bypass */
@@ -783,17 +801,19 @@ int MINIDRIVER(interface_jtag_add_dr_scan)(int num_fields, scan_field_t *fields,
        }
 
        /* 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_SCAN;
+       
+       jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+       
+       jtag_queue_command(cmd);
+       
+       cmd->type = JTAG_SCAN;
 
        /* allocate memory for dr scan command */
-       (*last_cmd)->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t));
-       (*last_cmd)->cmd.scan->ir_scan = 0;
-       (*last_cmd)->cmd.scan->num_fields = num_fields + bypass_devices;
-       (*last_cmd)->cmd.scan->fields = cmd_queue_alloc((num_fields + bypass_devices) * sizeof(scan_field_t));
-       (*last_cmd)->cmd.scan->end_state = state;
+       cmd->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t));
+       cmd->cmd.scan->ir_scan = false;
+       cmd->cmd.scan->num_fields = num_fields + bypass_devices;
+       cmd->cmd.scan->fields = cmd_queue_alloc((num_fields + bypass_devices) * sizeof(scan_field_t));
+       cmd->cmd.scan->end_state = state;
 
        tap = NULL;
        nth_tap = -1;
@@ -804,7 +824,7 @@ int MINIDRIVER(interface_jtag_add_dr_scan)(int num_fields, scan_field_t *fields,
                        break;
                }
                int found = 0;
-               (*last_cmd)->cmd.scan->fields[field_count].tap = tap;
+               cmd->cmd.scan->fields[field_count].tap = tap;
 
                for (j = 0; j < num_fields; j++)
                {
@@ -812,9 +832,9 @@ int MINIDRIVER(interface_jtag_add_dr_scan)(int num_fields, scan_field_t *fields,
                        {
                                found = 1;
                                scan_size = fields[j].num_bits;
-                               (*last_cmd)->cmd.scan->fields[field_count].num_bits = scan_size;
-                               (*last_cmd)->cmd.scan->fields[field_count].out_value = buf_cpy(fields[j].out_value, cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
-                               (*last_cmd)->cmd.scan->fields[field_count].in_value = fields[j].in_value;
+                               cmd->cmd.scan->fields[field_count].num_bits = scan_size;
+                               cmd->cmd.scan->fields[field_count].out_value = buf_cpy(fields[j].out_value, cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
+                               cmd->cmd.scan->fields[field_count].in_value = fields[j].in_value;
                                field_count++;
                        }
                }
@@ -829,9 +849,9 @@ int MINIDRIVER(interface_jtag_add_dr_scan)(int num_fields, scan_field_t *fields,
                        }
 #endif
                        /* program the scan field to 1 bit length, and ignore it's value */
-                       (*last_cmd)->cmd.scan->fields[field_count].num_bits = 1;
-                       (*last_cmd)->cmd.scan->fields[field_count].out_value = NULL;
-                       (*last_cmd)->cmd.scan->fields[field_count].in_value = NULL;
+                       cmd->cmd.scan->fields[field_count].num_bits = 1;
+                       cmd->cmd.scan->fields[field_count].out_value = NULL;
+                       cmd->cmd.scan->fields[field_count].in_value = NULL;
                        field_count++;
                }
                else
@@ -846,6 +866,9 @@ int MINIDRIVER(interface_jtag_add_dr_scan)(int num_fields, scan_field_t *fields,
 #endif
                }
        }
+
+       /* field_count represents the true number of fields setup*/
+       (*last_cmd)->cmd.scan->num_fields = field_count;
        return ERROR_OK;
 }
 
@@ -860,7 +883,6 @@ void MINIDRIVER(interface_jtag_add_dr_out)(jtag_tap_t *target_tap,
        int scan_size;
        int bypass_devices = 0;
 
-       jtag_command_t **last_cmd = jtag_get_last_command_p();
        jtag_tap_t *tap;
 
        /* count devices in bypass */
@@ -877,17 +899,18 @@ void MINIDRIVER(interface_jtag_add_dr_out)(jtag_tap_t *target_tap,
        }
 
        /* 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_SCAN;
+       jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+
+       jtag_queue_command(cmd);
+
+       cmd->type = JTAG_SCAN;
 
        /* allocate memory for dr scan command */
-       (*last_cmd)->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t));
-       (*last_cmd)->cmd.scan->ir_scan = 0;
-       (*last_cmd)->cmd.scan->num_fields = num_fields + bypass_devices;
-       (*last_cmd)->cmd.scan->fields = cmd_queue_alloc((num_fields + bypass_devices) * sizeof(scan_field_t));
-       (*last_cmd)->cmd.scan->end_state = end_state;
+       cmd->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t));
+       cmd->cmd.scan->ir_scan = false;
+       cmd->cmd.scan->num_fields = num_fields + bypass_devices;
+       cmd->cmd.scan->fields = cmd_queue_alloc((num_fields + bypass_devices) * sizeof(scan_field_t));
+       cmd->cmd.scan->end_state = end_state;
 
        tap = NULL;
        nth_tap = -1;
@@ -897,7 +920,7 @@ void MINIDRIVER(interface_jtag_add_dr_out)(jtag_tap_t *target_tap,
                        break;
                }
                nth_tap++;
-               (*last_cmd)->cmd.scan->fields[field_count].tap = tap;
+               cmd->cmd.scan->fields[field_count].tap = tap;
 
                if (tap == target_tap)
                {
@@ -915,9 +938,9 @@ void MINIDRIVER(interface_jtag_add_dr_out)(jtag_tap_t *target_tap,
                                u8 out_value[4];
                                scan_size = num_bits[j];
                                buf_set_u32(out_value, 0, scan_size, value[j]);
-                               (*last_cmd)->cmd.scan->fields[field_count].num_bits = scan_size;
-                               (*last_cmd)->cmd.scan->fields[field_count].out_value = buf_cpy(out_value, cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
-                               (*last_cmd)->cmd.scan->fields[field_count].in_value = NULL;
+                               cmd->cmd.scan->fields[field_count].num_bits = scan_size;
+                               cmd->cmd.scan->fields[field_count].out_value = buf_cpy(out_value, cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
+                               cmd->cmd.scan->fields[field_count].in_value = NULL;
                                field_count++;
                        }
                } else
@@ -931,9 +954,9 @@ void MINIDRIVER(interface_jtag_add_dr_out)(jtag_tap_t *target_tap,
                        }
 #endif
                        /* program the scan field to 1 bit length, and ignore it's value */
-                       (*last_cmd)->cmd.scan->fields[field_count].num_bits = 1;
-                       (*last_cmd)->cmd.scan->fields[field_count].out_value = NULL;
-                       (*last_cmd)->cmd.scan->fields[field_count].in_value = NULL;
+                       cmd->cmd.scan->fields[field_count].num_bits = 1;
+                       cmd->cmd.scan->fields[field_count].out_value = NULL;
+                       cmd->cmd.scan->fields[field_count].in_value = NULL;
                        field_count++;
                }
        }
@@ -952,30 +975,28 @@ void jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, tap_state_t st
 
 int MINIDRIVER(interface_jtag_add_plain_dr_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
 {
-       int i;
-       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_SCAN;
+       jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+
+       jtag_queue_command(cmd);
+
+       cmd->type = JTAG_SCAN;
 
        /* allocate memory for scan command */
-       (*last_cmd)->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t));
-       (*last_cmd)->cmd.scan->ir_scan = 0;
-       (*last_cmd)->cmd.scan->num_fields = num_fields;
-       (*last_cmd)->cmd.scan->fields = cmd_queue_alloc(num_fields * sizeof(scan_field_t));
-       (*last_cmd)->cmd.scan->end_state = state;
+       cmd->cmd.scan = cmd_queue_alloc(sizeof(scan_command_t));
+       cmd->cmd.scan->ir_scan = false;
+       cmd->cmd.scan->num_fields = num_fields;
+       cmd->cmd.scan->fields = cmd_queue_alloc(num_fields * sizeof(scan_field_t));
+       cmd->cmd.scan->end_state = state;
 
-       for (i = 0; i < num_fields; i++)
+       for (int i = 0; i < num_fields; i++)
        {
                int num_bits = fields[i].num_bits;
                int num_bytes = CEIL(fields[i].num_bits, 8);
-               (*last_cmd)->cmd.scan->fields[i].tap = fields[i].tap;
-               (*last_cmd)->cmd.scan->fields[i].num_bits = num_bits;
-               (*last_cmd)->cmd.scan->fields[i].out_value = buf_cpy(fields[i].out_value, cmd_queue_alloc(num_bytes), num_bits);
-               (*last_cmd)->cmd.scan->fields[i].in_value = fields[i].in_value;
+               cmd->cmd.scan->fields[i].tap = fields[i].tap;
+               cmd->cmd.scan->fields[i].num_bits = num_bits;
+               cmd->cmd.scan->fields[i].out_value = buf_cpy(fields[i].out_value, cmd_queue_alloc(num_bytes), num_bits);
+               cmd->cmd.scan->fields[i].in_value = fields[i].in_value;
        }
 
        return ERROR_OK;
@@ -994,16 +1015,16 @@ void jtag_add_tlr(void)
 int MINIDRIVER(interface_jtag_add_tlr)(void)
 {
        tap_state_t state = TAP_RESET;
-       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;
+       jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+
+       jtag_queue_command(cmd);
 
-       (*last_cmd)->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
-       (*last_cmd)->cmd.statemove->end_state = state;
+       cmd->type = JTAG_STATEMOVE;
+
+       cmd->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
+       cmd->cmd.statemove->end_state = state;
 
        return ERROR_OK;
 }
@@ -1048,38 +1069,35 @@ void jtag_add_pathmove(int num_states, tap_state_t *path)
 
 int MINIDRIVER(interface_jtag_add_pathmove)(int num_states, tap_state_t *path)
 {
-       jtag_command_t **last_cmd = jtag_get_last_command_p();
-       int i;
-
        /* 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_PATHMOVE;
+       jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+
+       jtag_queue_command(cmd);
+
+       cmd->type = JTAG_PATHMOVE;
 
-       (*last_cmd)->cmd.pathmove = cmd_queue_alloc(sizeof(pathmove_command_t));
-       (*last_cmd)->cmd.pathmove->num_states = num_states;
-       (*last_cmd)->cmd.pathmove->path = cmd_queue_alloc(sizeof(tap_state_t) * num_states);
+       cmd->cmd.pathmove = cmd_queue_alloc(sizeof(pathmove_command_t));
+       cmd->cmd.pathmove->num_states = num_states;
+       cmd->cmd.pathmove->path = cmd_queue_alloc(sizeof(tap_state_t) * num_states);
 
-       for (i = 0; i < num_states; i++)
-               (*last_cmd)->cmd.pathmove->path[i] = path[i];
+       for (int i = 0; i < num_states; i++)
+               cmd->cmd.pathmove->path[i] = path[i];
 
        return ERROR_OK;
 }
 
 int MINIDRIVER(interface_jtag_add_runtest)(int num_cycles, tap_state_t 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_cmd)->next = NULL;
-       last_comand_pointer = &((*last_cmd)->next);
-       (*last_cmd)->type = JTAG_RUNTEST;
+       jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+
+       jtag_queue_command(cmd);
 
-       (*last_cmd)->cmd.runtest = cmd_queue_alloc(sizeof(runtest_command_t));
-       (*last_cmd)->cmd.runtest->num_cycles = num_cycles;
-       (*last_cmd)->cmd.runtest->end_state = state;
+       cmd->type = JTAG_RUNTEST;
+
+       cmd->cmd.runtest = cmd_queue_alloc(sizeof(runtest_command_t));
+       cmd->cmd.runtest->num_cycles = num_cycles;
+       cmd->cmd.runtest->end_state = state;
 
        return ERROR_OK;
 }
@@ -1099,16 +1117,16 @@ void jtag_add_runtest(int num_cycles, tap_state_t state)
 
 int MINIDRIVER(interface_jtag_add_clocks)( int num_cycles )
 {
-       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_STABLECLOCKS;
+       jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+
+       jtag_queue_command(cmd);
+
+       cmd->type = JTAG_STABLECLOCKS;
+
+       cmd->cmd.stableclocks = cmd_queue_alloc(sizeof(stableclocks_command_t));
+       cmd->cmd.stableclocks->num_cycles = num_cycles;
 
-       (*last_cmd)->cmd.stableclocks = cmd_queue_alloc(sizeof(stableclocks_command_t));
-       (*last_cmd)->cmd.stableclocks->num_cycles = num_cycles;
        return ERROR_OK;
 }
 
@@ -1239,17 +1257,16 @@ void jtag_add_reset(int req_tlr_or_trst, int req_srst)
 
 int MINIDRIVER(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;
+       jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+
+       jtag_queue_command(cmd);
 
-       (*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;
+       cmd->type = JTAG_RESET;
+
+       cmd->cmd.reset = cmd_queue_alloc(sizeof(reset_command_t));
+       cmd->cmd.reset->trst = req_trst;
+       cmd->cmd.reset->srst = req_srst;
 
        return ERROR_OK;
 }
@@ -1265,16 +1282,15 @@ void jtag_add_end_state(tap_state_t state)
 
 int MINIDRIVER(interface_jtag_add_sleep)(u32 us)
 {
-       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_SLEEP;
+       jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
 
-       (*last_cmd)->cmd.sleep = cmd_queue_alloc(sizeof(sleep_command_t));
-       (*last_cmd)->cmd.sleep->us = us;
+       jtag_queue_command(cmd);
+
+       cmd->type = JTAG_SLEEP;
+
+       cmd->cmd.sleep = cmd_queue_alloc(sizeof(sleep_command_t));
+       cmd->cmd.sleep->us = us;
 
        return ERROR_OK;
 }
@@ -1308,7 +1324,7 @@ int jtag_build_buffer(scan_command_t *cmd, u8 **buffer)
        int i;
 
        bit_count = jtag_scan_size(cmd);
-       *buffer = malloc(CEIL(bit_count, 8));
+       *buffer = calloc(1,CEIL(bit_count, 8));
 
        bit_count = 0;
 
@@ -2292,6 +2308,8 @@ int jtag_register_commands(struct command_context_s *cmd_ctx)
 
        register_command(cmd_ctx, NULL, "verify_ircapture", handle_verify_ircapture_command,
                COMMAND_ANY, "verify value captured during Capture-IR <enable|disable>");
+       register_command(cmd_ctx, NULL, "verify_jtag", handle_verify_jtag_command,
+               COMMAND_ANY, "verify value capture <enable|disable>");
        return ERROR_OK;
 }
 
@@ -2866,7 +2884,7 @@ static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, c
        /*          "statename" */
        /* at the end of the arguments. */
        /* assume none. */
-       endstate = TAP_INVALID;
+       endstate = cmd_queue_end_state;
        if( argc >= 4 ){
                /* have at least one pair of numbers. */
                /* is last pair the magic text? */
@@ -2889,9 +2907,11 @@ static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, c
                }
        }
 
-       fields = malloc(sizeof(scan_field_t) * argc / 2);
+       int num_fields = argc / 2;
+
+       fields = malloc(sizeof(scan_field_t) * num_fields);
 
-       for (i = 0; i < argc / 2; i++)
+       for (i = 0; i < num_fields; i++)
        {
                tap = jtag_TapByString( args[i*2] );
                if (tap==NULL)
@@ -2901,24 +2921,23 @@ static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, c
                }
                int field_size = tap->ir_length;
                fields[i].tap = tap;
+               fields[i].num_bits = field_size;
                fields[i].out_value = malloc(CEIL(field_size, 8));
                buf_set_u32(fields[i].out_value, 0, field_size, strtoul(args[i*2+1], NULL, 0));
                fields[i].in_value = NULL;
        }
 
-       jtag_add_ir_scan(argc / 2, fields, TAP_INVALID);
        /* did we have an endstate? */
-       if (endstate != TAP_INVALID)
-               jtag_add_end_state(endstate);
+       jtag_add_ir_scan(num_fields, fields, endstate);
 
-       jtag_execute_queue();
+       int retval=jtag_execute_queue();
 
-       for (i = 0; i < argc / 2; i++)
+       for (i = 0; i < num_fields; i++)
                free(fields[i].out_value);
 
        free (fields);
 
-       return ERROR_OK;
+       return retval;
 }
 
 static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args)
@@ -2947,7 +2966,7 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args
        }
 
        /* assume no endstate */
-       endstate = TAP_INVALID;
+       endstate = cmd_queue_end_state;
        /* validate arguments as numbers */
        e = JIM_OK;
        for (i = 2; i < argc; i+=2)
@@ -3019,10 +3038,7 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args
                field_count++;
        }
 
-       jtag_add_dr_scan(num_fields, fields, TAP_INVALID);
-       /* did we get an end state? */
-       if (endstate != TAP_INVALID)
-               jtag_add_end_state(endstate);
+       jtag_add_dr_scan(num_fields, fields, endstate);
 
        retval = jtag_execute_queue();
        if (retval != ERROR_OK)
@@ -3088,6 +3104,31 @@ static int handle_verify_ircapture_command(struct command_context_s *cmd_ctx, ch
        return ERROR_OK;
 }
 
+static int handle_verify_jtag_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+{
+       if (argc == 1)
+       {
+               if (strcmp(args[0], "enable") == 0)
+               {
+                       jtag_verify = 1;
+               }
+               else if (strcmp(args[0], "disable") == 0)
+               {
+                       jtag_verify = 0;
+               } else
+               {
+                       return ERROR_COMMAND_SYNTAX_ERROR;
+               }
+       } else if (argc != 0)
+       {
+               return ERROR_COMMAND_SYNTAX_ERROR;
+       }
+
+       command_print(cmd_ctx, "verify jtag capture is %s", (jtag_verify) ? "enabled": "disabled");
+
+       return ERROR_OK;
+}
+
 int jtag_power_dropout(int *dropout)
 {
        return jtag->power_dropout(dropout);
@@ -3266,23 +3307,23 @@ static struct
 
        /* to state: */
        /*      RESET                   IDLE                            DRSHIFT                 DRPAUSE                 IRSHIFT                 IRPAUSE */                      /* from state: */
-       {       B8(1111111,7),  B8(0,1),                        B8(00101,5),    B8(01010,5),            B8(001101,6),   B8(010110,6) },         /* RESET */
-       {       B8(1111111,7),  B8(0,1),                        B8(001,3),              B8(0101,4),             B8(0011,4),     B8(01011,5) },          /* IDLE */
+       {       B8(1111111,7),  B8(0000000,7),  B8(00101,5),            B8(01010,5),    B8(001101,6),   B8(010110,6) },         /* RESET */
+       {       B8(1111111,7),  B8(0000000,7),  B8(001,3),                      B8(0101,4),             B8(0011,4),     B8(01011,5) },          /* IDLE */
        {       B8(1111111,7),  B8(011,3),              B8(00111,5),            B8(01,2),               B8(001111,6),   B8(0101111,7) },                /* DRSHIFT */
-       {       B8(1111111,7),  B8(011,3),              B8(01,2),               B8(0,1),                        B8(001111,6),   B8(0101111,7) },                /* DRPAUSE */
+       {       B8(1111111,7),  B8(011,3),              B8(01,2),               B8(0,1),                B8(001111,6),   B8(0101111,7) },                /* DRPAUSE */
        {       B8(1111111,7),  B8(011,3),              B8(00111,5),            B8(010111,6),   B8(001111,6),   B8(01,2) },                     /* IRSHIFT */
        {       B8(1111111,7),  B8(011,3),              B8(00111,5),            B8(010111,6),   B8(01,2),               B8(0,1) }                       /* IRPAUSE */
 
 #else  /* this is the old table, converted from hex and with the bit_count set to 7 for each combo, like before */
 
        /* to state: */
-       /*      RESET                   IDLE                            DRSHIFT                 DRPAUSE                 IRSHIFT                 IRPAUSE */                      /* from state: */
-       {       B8(1111111,7),  B8(0000000,7),  B8(0010111,7),  B8(0001010,7),  B8(0011011,7),  B8(0010110,7) },                /* RESET */
-       {       B8(1111111,7),  B8(0000000,7),  B8(0100101,7),  B8(0000101,7),  B8(0101011,7),  B8(0001011,7) },                /* IDLE */
-       {       B8(1111111,7),  B8(0110001,7),  B8(0000000,7),  B8(0000001,7),  B8(0001111,7),  B8(0101111,7) },                /* DRSHIFT */
-       {       B8(1111111,7),  B8(0110000,7),  B8(0100000,7),  B8(0010111,7),  B8(0011110,7),  B8(0101111,7) },                /* DRPAUSE */
-       {       B8(1111111,7),  B8(0110001,7),  B8(0000111,7),  B8(0010111,7),  B8(0000000,7),  B8(0000001,7) },                /* IRSHIFT */
-       {       B8(1111111,7),  B8(0110000,7),  B8(0011100,7),  B8(0010111,7),  B8(0100000,7),  B8(0101111,7) }                 /* IRPAUSE */
+       /*      RESET                   IDLE                    DRSHIFT                 DRPAUSE                 IRSHIFT                 IRPAUSE         */              /* from state: */
+       {       B8(1111111,7),  B8(0000000,7),  B8(0010111,7),  B8(0001010,7),  B8(0011011,7),  B8(0010110,7) },        /* RESET */
+       {       B8(1111111,7),  B8(0000000,7),  B8(0100101,7),  B8(0000101,7),  B8(0101011,7),  B8(0001011,7) },        /* IDLE */
+       {       B8(1111111,7),  B8(0110001,7),  B8(0000000,7),  B8(0000001,7),  B8(0001111,7),  B8(0101111,7) },        /* DRSHIFT */
+       {       B8(1111111,7),  B8(0110000,7),  B8(0100000,7),  B8(0010111,7),  B8(0011110,7),  B8(0101111,7) },        /* DRPAUSE */
+       {       B8(1111111,7),  B8(0110001,7),  B8(0000111,7),  B8(0010111,7),  B8(0000000,7),  B8(0000001,7) },        /* IRSHIFT */
+       {       B8(1111111,7),  B8(0110000,7),  B8(0011100,7),  B8(0010111,7),  B8(0011110,7),  B8(0101111,7) },        /* IRPAUSE */
 
 #endif
 
@@ -3559,4 +3600,12 @@ tap_state_t jtag_debug_state_machine(const void *tms_buf, const void *tdi_buf,
 }
 #endif // _DEBUG_JTAG_IO_
 
+#ifndef HAVE_JTAG_MINIDRIVER_H
+void jtag_alloc_in_value32(scan_field_t *field)
+{
+       field->in_value=(u8 *)cmd_queue_alloc(4);
+}
+#endif
+
+
 /*-----</Cable Helper API>--------------------------------------*/

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)