void dump_field(const struct scan_field *field) { static const char * const op_string[] = {"-", "r", "w", "?"}; static const char * const status_string[] = {"+", "?", "F", "b"}; if (debug_level < LOG_LVL_DEBUG) return; assert(field->out_value != NULL); uint64_t out = buf_get_u64(field->out_value, 0, field->num_bits); unsigned int out_op = get_field(out, DTM_DMI_OP); unsigned int out_data = get_field(out, DTM_DMI_DATA); unsigned int out_address = out >> DTM_DMI_ADDRESS_OFFSET; if (field->in_value) { uint64_t in = buf_get_u64(field->in_value, 0, field->num_bits); unsigned int in_op = get_field(in, DTM_DMI_OP); unsigned int in_data = get_field(in, DTM_DMI_DATA); unsigned int in_address = in >> DTM_DMI_ADDRESS_OFFSET; log_printf_lf(LOG_LVL_DEBUG, __FILE__, __LINE__, __PRETTY_FUNCTION__, "%db %s %08x @%02x -> %s %08x @%02x", field->num_bits, op_string[out_op], out_data, out_address, status_string[in_op], in_data, in_address); } else {
int mips_ejtag_drscan_38(struct mips_ejtag *ejtag_info, uint64_t *data) { struct jtag_tap *tap; tap = ejtag_info->tap; if (tap == NULL) return ERROR_FAIL; mips_ejtag_set_instr(ejtag_info, EJTAG_DCR_FDC); struct scan_field field; uint8_t t[5], r[5]; int retval; field.num_bits = 38; field.out_value = &t; buf_set_u64(t, 0, field.num_bits, *data); field.in_value = r; jtag_add_dr_scan(tap, 1, &field, TAP_IDLE); retval = jtag_execute_queue(); if (retval != ERROR_OK) { LOG_ERROR("register read failed"); return retval; } *data = buf_get_u64(field.in_value, 0, 64); keep_alive(); return ERROR_OK; }