示例#1
0
void jtag_add_pathmove(int num_states, const tap_state_t *path)
{
	tap_state_t cur_state = cmd_queue_cur_state;

	/* the last state has to be a stable state */
	if (!tap_is_state_stable(path[num_states - 1])) {
		LOG_ERROR("BUG: TAP path doesn't finish in a stable state");
		jtag_set_error(ERROR_JTAG_NOT_STABLE_STATE);
		return;
	}

	for (int i = 0; i < num_states; i++) {
		if (path[i] == TAP_RESET) {
			LOG_ERROR("BUG: TAP_RESET is not a valid state for pathmove sequences");
			jtag_set_error(ERROR_JTAG_STATE_INVALID);
			return;
		}

		if (tap_state_transition(cur_state, true) != path[i] &&
				tap_state_transition(cur_state, false) != path[i]) {
			LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition",
				tap_state_name(cur_state), tap_state_name(path[i]));
			jtag_set_error(ERROR_JTAG_TRANSITION_INVALID);
			return;
		}
		cur_state = path[i];
	}

	jtag_checks();

	jtag_set_error(interface_jtag_add_pathmove(num_states, path));
	cmd_queue_cur_state = path[num_states - 1];
}
示例#2
0
void jtag_add_ir_scan_noverify(struct jtag_tap *active, const struct scan_field *in_fields,
	tap_state_t state)
{
	jtag_prelude(state);

	int retval = interface_jtag_add_ir_scan(active, in_fields, state);
	jtag_set_error(retval);
}
示例#3
0
void jtag_add_tlr(void)
{
	jtag_prelude(TAP_RESET);
	jtag_set_error(interface_jtag_add_tlr());

	/* NOTE: order here matches TRST path in jtag_add_reset() */
	jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
	jtag_notify_event(JTAG_TRST_ASSERTED);
}
示例#4
0
/** Verify data shifted out from Scan Chain Register (SCREG). */
static void arm11_in_handler_SCAN_N(uint8_t *in_value)
{
	/* Don't expect JTAG layer to modify bits we didn't ask it to read */
	uint8_t v = *in_value & 0x1F;

	if (v != 0x10)
	{
		LOG_ERROR("'arm11 target' JTAG error SCREG OUT 0x%02x", v);
		jtag_set_error(ERROR_FAIL);
	}
}
示例#5
0
void jtag_add_dr_scan(struct jtag_tap *active, int in_num_fields, const struct scan_field *in_fields,
		tap_state_t state)
{
	assert(state != TAP_RESET);

	jtag_prelude(state);

	int retval;
	retval = interface_jtag_add_dr_scan(active, in_num_fields, in_fields, state);
	jtag_set_error(retval);
}
示例#6
0
void jtag_add_plain_dr_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits,
	tap_state_t state)
{
	assert(out_bits != NULL);
	assert(state != TAP_RESET);

	jtag_prelude(state);

	int retval;
	retval = interface_jtag_add_plain_dr_scan(num_bits, out_bits, in_bits, state);
	jtag_set_error(retval);
}
示例#7
0
/**
 * If supported by the underlying adapter, this clocks a raw bit sequence
 * onto TMS for switching betwen JTAG and SWD modes.
 *
 * DO NOT use this to bypass the integrity checks and logging provided
 * by the jtag_add_pathmove() and jtag_add_statemove() calls.
 *
 * @param nbits How many bits to clock out.
 * @param seq The bit sequence.  The LSB is bit 0 of seq[0].
 * @param state The JTAG tap state to record on completion.  Use
 *	TAP_INVALID to represent being in in SWD mode.
 *
 * @todo Update naming conventions to stop assuming everything is JTAG.
 */
int jtag_add_tms_seq(unsigned nbits, const uint8_t *seq, enum tap_state state)
{
	int retval;

	if (!(jtag->supported & DEBUG_CAP_TMS_SEQ))
		return ERROR_JTAG_NOT_IMPLEMENTED;

	jtag_checks();
	cmd_queue_cur_state = state;

	retval = interface_add_tms_seq(nbits, seq, state);
	jtag_set_error(retval);
	return retval;
}