/** * usbp5_scan - launches a DR-scan or IR-scan * @cmd: the command to launch * * Launch a JTAG IR-scan or DR-scan * * Returns ERROR_OK if OK, ERROR_xxx if a read/write error occured. */ static int usbp5_scan(struct scan_command *cmd) { int scan_bits; uint8_t *buf = NULL; int retval = ERROR_OK; scan_bits = jtag_build_buffer(cmd, &buf); if (cmd->ir_scan) { retval = usbp5_state_move(TAP_IRSHIFT); if (retval != ERROR_OK) return retval; } else { retval = usbp5_state_move(TAP_DRSHIFT); if (retval != ERROR_OK) return retval; } if (cmd->end_state == TAP_DRSHIFT) { retval = usbp5_tdi_seq(buf, buf, scan_bits, NO_TAP_SHIFT); if (retval != ERROR_OK) return retval; } else { retval = usbp5_tdi_seq(buf, buf, scan_bits, TAP_SHIFT); if (retval != ERROR_OK) return retval; } if (cmd->end_state != TAP_DRSHIFT) { /* * As our JTAG is in an unstable state (IREXIT1 or DREXIT1), move it * forward to a stable IRPAUSE or DRPAUSE. */ retval = usbp5_clock_tms(0); if (retval != ERROR_OK) return retval; if (cmd->ir_scan) tap_set_state(TAP_IRPAUSE); else tap_set_state(TAP_DRPAUSE); } retval = jtag_read_buffer(buf, cmd); if (retval != ERROR_OK) return retval; if (buf) free(buf); if (cmd->end_state != TAP_DRSHIFT) { retval = usbp5_state_move(cmd->end_state); if (retval != ERROR_OK) return retval; } return ERROR_OK; }
/** * jtag_vpi_scan - launches a DR-scan or IR-scan * @cmd: the command to launch * * Launch a JTAG IR-scan or DR-scan * * Returns ERROR_OK if OK, ERROR_xxx if a read/write error occured. */ static int jtag_vpi_scan(struct scan_command *cmd) { int scan_bits; uint8_t *buf = NULL; int ret = ERROR_OK; scan_bits = jtag_build_buffer(cmd, &buf); if (cmd->ir_scan) jtag_vpi_state_move(TAP_IRSHIFT); else jtag_vpi_state_move(TAP_DRSHIFT); if(cmd->end_state == TAP_DRSHIFT) jtag_vpi_queue_tdi(buf, scan_bits, NO_TAP_SHIFT); else jtag_vpi_queue_tdi(buf, scan_bits, TAP_SHIFT); if(cmd->end_state != TAP_DRSHIFT) { /* * As our JTAG is in an unstable state (IREXIT1 or DREXIT1), move it * forward to a stable IRPAUSE or DRPAUSE. */ jtag_vpi_clock_tms(0); if (cmd->ir_scan) tap_set_state(TAP_IRPAUSE); else tap_set_state(TAP_DRPAUSE); } ret = jtag_read_buffer(buf, cmd); if (buf) free(buf); if(cmd->end_state != TAP_DRSHIFT) jtag_vpi_state_move(cmd->end_state); return ret; }
static int vsllink_execute_queue(void) { struct jtag_command *cmd = jtag_command_queue; int scan_size; enum scan_type type; uint8_t *buffer; DEBUG_JTAG_IO("-------------------------------------" " vsllink " "-------------------------------------"); while (cmd != NULL) { switch (cmd->type) { case JTAG_RUNTEST: DEBUG_JTAG_IO("runtest %i cycles, end in %s", cmd->cmd.runtest->num_cycles, tap_state_name(cmd->cmd.runtest->end_state)); vsllink_end_state(cmd->cmd.runtest->end_state); vsllink_runtest(cmd->cmd.runtest->num_cycles); break; case JTAG_TLR_RESET: DEBUG_JTAG_IO("statemove end in %s", tap_state_name(cmd->cmd.statemove->end_state)); vsllink_end_state(cmd->cmd.statemove->end_state); vsllink_state_move(); break; case JTAG_PATHMOVE: DEBUG_JTAG_IO("pathmove: %i states, end in %s", cmd->cmd.pathmove->num_states, tap_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1])); vsllink_path_move(cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path); break; case JTAG_SCAN: DEBUG_JTAG_IO("JTAG Scan..."); vsllink_end_state(cmd->cmd.scan->end_state); scan_size = jtag_build_buffer( cmd->cmd.scan, &buffer); if (cmd->cmd.scan->ir_scan) DEBUG_JTAG_IO( "JTAG Scan write IR(%d bits), " "end in %s:", scan_size, tap_state_name(cmd->cmd.scan->end_state)); else DEBUG_JTAG_IO( "JTAG Scan write DR(%d bits), " "end in %s:", scan_size, tap_state_name(cmd->cmd.scan->end_state)); #ifdef _DEBUG_JTAG_IO_ vsllink_debug_buffer(buffer, DIV_ROUND_UP(scan_size, 8)); #endif type = jtag_scan_type(cmd->cmd.scan); vsllink_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size, cmd->cmd.scan); break; case JTAG_RESET: DEBUG_JTAG_IO("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst); vsllink_tap_execute(); if (cmd->cmd.reset->trst == 1) tap_set_state(TAP_RESET); vsllink_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst); break; case JTAG_SLEEP: DEBUG_JTAG_IO("sleep %i", cmd->cmd.sleep->us); vsllink_tap_execute(); jtag_sleep(cmd->cmd.sleep->us); break; case JTAG_STABLECLOCKS: DEBUG_JTAG_IO("add %d clocks", cmd->cmd.stableclocks->num_cycles); switch (tap_get_state()) { case TAP_RESET: /* tms must be '1' to stay * n TAP_RESET mode */ scan_size = 1; break; case TAP_DRSHIFT: case TAP_IDLE: case TAP_DRPAUSE: case TAP_IRSHIFT: case TAP_IRPAUSE: /* else, tms should be '0' */ scan_size = 0; break; /* above stable states are OK */ default: LOG_ERROR("jtag_add_clocks() " "in non-stable state \"%s\"", tap_state_name(tap_get_state()) ); exit(-1); } vsllink_stableclocks(cmd->cmd.stableclocks->num_cycles, scan_size); break; case JTAG_TMS: DEBUG_JTAG_IO("add %d jtag tms", cmd->cmd.tms->num_bits); vsllink_tms(cmd->cmd.tms->num_bits, cmd->cmd.tms->bits); break; default: LOG_ERROR("BUG: unknown JTAG command type " "encountered: %d", cmd->type); exit(-1); } cmd = cmd->next; } return vsllink_tap_execute(); }