X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fdrivers%2Fbitq.c;h=064f43b01146696f9e274e8d00a22efb7db3c6eb;hp=a58f6334703f428e02afd906fd7c00afddd24d70;hb=aef1fe6024ba5f16557b92436ffb970dabe5c18c;hpb=00635e28ba5c405742cae261d8551f165dc78ba3 diff --git a/src/jtag/drivers/bitq.c b/src/jtag/drivers/bitq.c index a58f633470..064f43b011 100644 --- a/src/jtag/drivers/bitq.c +++ b/src/jtag/drivers/bitq.c @@ -32,26 +32,17 @@ struct bitq_interface* bitq_interface; /* low level bit queue interface */ struct bitq_state { struct jtag_command *cmd; /* command currently processed */ int field_idx; /* index of field currently being processed */ - int bit_pos; /* position of bit curently being processed */ + int bit_pos; /* position of bit currently being processed */ int status; /* processing status */ }; static struct bitq_state bitq_in_state; -static uint8_t* bitq_in_buffer; /* buffer dynamically reallocated as needed */ -static int bitq_in_bufsize = 32; /* min. buffer size */ - /* * input queue processing does not use jtag_read_buffer() to avoid unnecessary overhead - * also the buffer for incomming data is reallocated only if necessary * no parameters, makes use of stored state information */ void bitq_in_proc(void) { - /* static information preserved between calls to increase performance */ - static uint8_t* in_buff; /* pointer to buffer for scanned data */ - static int in_idx; /* index of byte being scanned */ - static uint8_t in_mask; /* mask of next bit to be scanned */ - struct scan_field* field; int tdo; @@ -67,42 +58,14 @@ void bitq_in_proc(void) field = &bitq_in_state.cmd->cmd.scan->fields[bitq_in_state.field_idx]; if (field->in_value) { - if (bitq_in_state.bit_pos == 0) - { - /* initialize field scanning */ - in_mask = 0x01; - in_idx = 0; - if (field->in_value) - in_buff = field->in_value; - else - { - /* buffer reallocation needed? */ - if (field->num_bits > bitq_in_bufsize * 8) - { - /* buffer previously allocated? */ - if (bitq_in_buffer != NULL) - { - /* free it */ - free(bitq_in_buffer); - bitq_in_buffer = NULL; - } - /* double the buffer size until it fits */ - while (field->num_bits > bitq_in_bufsize * 8) - bitq_in_bufsize *= 2; - } - /* if necessary, allocate buffer and check for malloc error */ - if (bitq_in_buffer == NULL && (bitq_in_buffer = malloc(bitq_in_bufsize)) == NULL) - { - LOG_ERROR("malloc error"); - exit(-1); - } - in_buff = (void*) bitq_in_buffer; - } - } - /* field scanning */ while (bitq_in_state.bit_pos < field->num_bits) { + /* index of byte being scanned */ + int in_idx = bitq_in_state.bit_pos / 8; + /* mask of next bit to be scanned */ + uint8_t in_mask = 1 << (bitq_in_state.bit_pos % 8); + if ((tdo = bitq_interface->in()) < 0) { #ifdef _DEBUG_JTAG_IO_ @@ -111,16 +74,9 @@ void bitq_in_proc(void) return; } if (in_mask == 0x01) - in_buff[in_idx] = 0; + field->in_value[in_idx] = 0; if (tdo) - in_buff[in_idx] |= in_mask; - if (in_mask == 0x80) - { - in_mask = 0x01; - in_idx++; - } - else - in_mask <<= 1; + field->in_value[in_idx] |= in_mask; bitq_in_state.bit_pos++; } } @@ -221,7 +177,7 @@ void bitq_runtest(int num_cycles) } -void bitq_scan_field(struct scan_field* field, int pause) +void bitq_scan_field(struct scan_field* field, int do_pause) { int bit_cnt; int tdo_req; @@ -240,7 +196,7 @@ void bitq_scan_field(struct scan_field* field, int pause) for (bit_cnt = field->num_bits; bit_cnt > 1; bit_cnt--) bitq_io(0, 0, tdo_req); - bitq_io(pause, 0, tdo_req); + bitq_io(do_pause, 0, tdo_req); } else { @@ -259,10 +215,10 @@ void bitq_scan_field(struct scan_field* field, int pause) out_mask <<= 1; } - bitq_io(pause, ((*out_ptr) & out_mask) != 0, tdo_req); + bitq_io(do_pause, ((*out_ptr) & out_mask) != 0, tdo_req); } - if (pause) + if (do_pause) { bitq_io(0, 0, 0); if (tap_get_state() == TAP_IRSHIFT) @@ -390,9 +346,4 @@ int bitq_execute_queue(void) void bitq_cleanup(void) { - if (bitq_in_buffer != NULL) - { - free(bitq_in_buffer); - bitq_in_buffer = NULL; - } }