- tap_set_state(path[i - start]);
- }
- if ((i > 0) && ((i & 7) == 0))
- {
- vsllink_usb_out_buffer_idx++;
- vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx] = 0;
- }
-
- tap_set_end_state(tap_get_state());
-}
-
-static void vsllink_path_move_normal(int num_states, tap_state_t *path)
-{
- int i, tms_len, tms_cmd_pos, path_idx = 0;
-
- if (vsllink_tms_data_len > 0)
- {
- // there are vsllink_tms_data_len more tms bits to be shifted
- // so there are vsllink_tms_data_len + num_states tms bits in all
- tms_len = vsllink_tms_data_len + num_states;
- if (tms_len <= 16)
- {
- // merge into last tms shift
- if (tms_len < 8)
- {
- // just append tms data to the last tms byte
- vsllink_add_path(vsllink_tms_data_len, num_states, path);
- }
- else if (tms_len == 8)
- {
- // end last tms shift command
- (*vsllink_tms_cmd_pos)--;
- vsllink_add_path(vsllink_tms_data_len, num_states, path);
- }
- else if (tms_len < 16)
- {
- if ((*vsllink_tms_cmd_pos & VSLLINK_CMDJTAGSEQ_LENMSK) < VSLLINK_CMDJTAGSEQ_LENMSK)
- {
- // every tms shift command can contain VSLLINK_CMDJTAGSEQ_LENMSK + 1 bytes in most
- // there is enought tms length in the current tms shift command
- (*vsllink_tms_cmd_pos)++;
- vsllink_add_path(vsllink_tms_data_len, num_states, path);
- }
- else
- {
- // every tms shift command can contain VSLLINK_CMDJTAGSEQ_LENMSK + 1 bytes in most
- // not enough tms length in the current tms shift command
- // so a new command should be added
- // first decrease byte length of last tms shift command
- (*vsllink_tms_cmd_pos)--;
- // append tms data to the last tms byte
- vsllink_add_path(vsllink_tms_data_len, 8 - vsllink_tms_data_len, path);
- path += 8 - vsllink_tms_data_len;
- // add new command(3 bytes)
- vsllink_tap_ensure_space(0, 3);
- vsllink_tms_cmd_pos = &vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx];
- vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = VSLLINK_CMDJTAGSEQ_TMSBYTE | 1;
- vsllink_add_path(0, num_states - (8 - vsllink_tms_data_len), path);
- }
- }
- else if (tms_len == 16)
- {
- // end last tms shift command
- vsllink_add_path(vsllink_tms_data_len, num_states, path);
- }
-
- vsllink_tms_data_len = (vsllink_tms_data_len + num_states) & 7;
- if (vsllink_tms_data_len == 0)
- {
- vsllink_tms_cmd_pos = NULL;
- }
- num_states = 0;
- }
- else
- {
- vsllink_add_path(vsllink_tms_data_len, 16 - vsllink_tms_data_len, path);
-
- path += 16 - vsllink_tms_data_len;
- num_states -= 16 - vsllink_tms_data_len;
- vsllink_tms_data_len = 0;
- vsllink_tms_cmd_pos = NULL;
- }
- }
-
- if (num_states > 0)
- {
- // Normal operation, don't need to append tms data
- vsllink_tms_data_len = num_states & 7;
-
- while (num_states > 0)
- {
- if (num_states > ((VSLLINK_CMDJTAGSEQ_LENMSK + 1) * 8))
- {
- i = (VSLLINK_CMDJTAGSEQ_LENMSK + 1) * 8;
- }
- else
- {
- i = num_states;
- }
- tms_len = (i + 7) >> 3;
- vsllink_tap_ensure_space(0, tms_len + 2);
- tms_cmd_pos = vsllink_usb_out_buffer_idx;
- vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = VSLLINK_CMDJTAGSEQ_TMSBYTE | (tms_len - 1);
-
- vsllink_add_path(0, i, path + path_idx);
-
- path_idx += i;
- num_states -= i;
- }
-
- if (vsllink_tms_data_len > 0)
- {
- if (tms_len < (VSLLINK_CMDJTAGSEQ_LENMSK + 1))
- {
- vsllink_tms_cmd_pos = &vsllink_usb_out_buffer[tms_cmd_pos];
- (*vsllink_tms_cmd_pos)++;
- }
- else
- {
- vsllink_usb_out_buffer[tms_cmd_pos]--;
-
- tms_len = vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx];
- vsllink_tap_ensure_space(0, 3);
- vsllink_tms_cmd_pos = &vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx];
- vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = VSLLINK_CMDJTAGSEQ_TMSBYTE | 1;
- vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx] = tms_len;
- }
- }
- }
-}
-static void vsllink_path_move_dma(int num_states, tap_state_t *path)
-{
- int i, j = 0;
-
- if (tap_length & 7)
- {
- if ((8 - (tap_length & 7)) < num_states)
- {
- j = 8 - (tap_length & 7);
- }
- else
- {
- j = num_states;
- }
- for (i = 0; i < j; i++)
- {
- if (path[i] == tap_state_transition(tap_get_state(), false))
- {
- vsllink_tap_append_step(0, 0);
- }
- else if (path[i] == tap_state_transition(tap_get_state(), true))
- {
- vsllink_tap_append_step(1, 0);
- }
- else
- {
- LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(tap_get_state()), tap_state_name(path[i]));
- exit(-1);
- }
- tap_set_state(path[i]);
- }
- num_states -= j;
- }
-
- if (num_states > 0)
- {
- vsllink_tap_ensure_space(0, num_states);