+ struct scan_field fields[3];
+ uint8_t field0_in[4];
+ uint8_t field1_out[1];
+ uint8_t field2_out[1];
+ int retval;
+ uint32_t hsact;
+ struct timeval now;
+ struct timeval timeout_end;
+
+ if (hsbit == EICE_COMM_CTRL_WBIT)
+ hsact = 1;
+ else if (hsbit == EICE_COMM_CTRL_RBIT)
+ hsact = 0;
+ else {
+ LOG_ERROR("Invalid arguments");
+ return ERROR_COMMAND_SYNTAX_ERROR;
+ }
+
+ retval = arm_jtag_scann(jtag_info, 0x2, TAP_IDLE);
+ if (retval != ERROR_OK)
+ return retval;
+ retval = arm_jtag_set_instr(jtag_info->tap, jtag_info->intest_instr, NULL, TAP_IDLE);
+ if (retval != ERROR_OK)
+ return retval;
+
+ fields[0].num_bits = 32;
+ fields[0].out_value = NULL;
+ fields[0].in_value = field0_in;
+
+ fields[1].num_bits = 5;
+ fields[1].out_value = field1_out;
+ field1_out[0] = eice_regs[EICE_COMMS_DATA].addr;
+ fields[1].in_value = NULL;
+
+ fields[2].num_bits = 1;
+ fields[2].out_value = field2_out;
+ field2_out[0] = 0;
+ fields[2].in_value = NULL;
+
+ jtag_add_dr_scan(jtag_info->tap, 3, fields, TAP_IDLE);
+ gettimeofday(&timeout_end, NULL);
+ timeval_add_time(&timeout_end, 0, timeout * 1000);
+ do {
+ jtag_add_dr_scan(jtag_info->tap, 3, fields, TAP_IDLE);
+ retval = jtag_execute_queue();
+ if (retval != ERROR_OK)
+ return retval;
+
+ if (buf_get_u32(field0_in, hsbit, 1) == hsact)
+ return ERROR_OK;
+
+ gettimeofday(&now, NULL);
+ } while (timeval_compare(&now, &timeout_end) <= 0);
+
+ LOG_ERROR("embeddedice handshake timeout");
+ return ERROR_TARGET_TIMEOUT;