From: kc8apf at B. <kc...@ma...> - 2009-05-21 06:48:17
|
Author: kc8apf Date: 2009-05-21 06:48:15 +0200 (Thu, 21 May 2009) New Revision: 1865 Modified: trunk/src/jtag/jtag.c Log: Author: Michael Bruck <mb...@di...> -jtag.c, interface_jtag_add_ir_scan(): - use pointer 'field' instead of scan->fields[nth_tap] - add assertion to ensure that input data has correct size for TAP's IR Modified: trunk/src/jtag/jtag.c =================================================================== --- trunk/src/jtag/jtag.c 2009-05-21 04:45:57 UTC (rev 1864) +++ trunk/src/jtag/jtag.c 2009-05-21 04:48:15 UTC (rev 1865) @@ -618,10 +618,8 @@ */ int MINIDRIVER(interface_jtag_add_ir_scan)(int in_num_fields, const scan_field_t *in_fields, tap_state_t state) { - int nth_tap; + size_t num_taps = jtag_NumEnabledTaps(); - int num_taps = jtag_NumEnabledTaps(); - jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t)); scan_command_t * scan = cmd_queue_alloc(sizeof(scan_command_t)); scan_field_t * out_fields = cmd_queue_alloc(num_taps * sizeof(scan_field_t)); @@ -636,16 +634,15 @@ scan->fields = out_fields; scan->end_state = state; - nth_tap = -1; + scan_field_t * field = out_fields; /* keep track where we insert data */ + + /* loop over all enabled TAPs */ + for (jtag_tap_t * tap = jtag_NextEnabledTap(NULL); tap != NULL; tap = jtag_NextEnabledTap(tap)) { int found = 0; - nth_tap++; - - assert(nth_tap < num_taps); - size_t scan_size = tap->ir_length; /* search the list */ @@ -656,8 +653,10 @@ found = 1; tap->bypass = 0; + + assert(in_fields[j].num_bits == tap->ir_length); /* input fields must have the same length as the TAP's IR */ - cmd_queue_scan_field_clone(scan->fields + nth_tap, in_fields + j); + cmd_queue_scan_field_clone(field, in_fields + j); break; } @@ -665,20 +664,22 @@ if (!found) { - /* if a tap isn't listed, set it to BYPASS */ + /* if a TAP isn't listed in input fields, set it to BYPASS */ tap->bypass = 1; - scan->fields[nth_tap].tap = tap; - scan->fields[nth_tap].num_bits = scan_size; - scan->fields[nth_tap].out_value = buf_set_ones(cmd_queue_alloc(CEIL(scan_size, 8)), scan_size); - scan->fields[nth_tap].in_value = NULL; /* do not collect input for tap's in bypass */ + field->tap = tap; + field->num_bits = scan_size; + field->out_value = buf_set_ones(cmd_queue_alloc(CEIL(scan_size, 8)), scan_size); + field->in_value = NULL; /* do not collect input for tap's in bypass */ } /* update device information */ - buf_cpy(scan->fields[nth_tap].out_value, tap->cur_instr, scan_size); + buf_cpy(field->out_value, tap->cur_instr, scan_size); + + field++; } - assert(nth_tap == (num_taps - 1)); + assert(field == out_fields + num_taps); /* paranoia: jtag_NumEnabledTaps() and jtag_NextEnabledTap() not in sync */ return ERROR_OK; } |