static int set_pld_driver (urj_chain_t *chain, urj_part_t *part) { int i; uint32_t idcode; pld_driver = NULL; pld.chain = chain; pld.part = part; for (i = 0; urj_pld_drivers[i] != NULL; i++) { if (urj_pld_drivers[i]->detect (&pld) == URJ_STATUS_OK) { pld_driver = urj_pld_drivers[i]; return URJ_STATUS_OK; } } idcode = urj_tap_register_get_value (part->id); urj_log (URJ_LOG_LEVEL_ERROR, _("No PLD driver for device with ID %08x\n"), idcode); urj_error_set (URJ_ERROR_UNSUPPORTED, _("PLD not supported")); return URJ_STATUS_FAIL; }
static uint32_t dsu_readIR(urj_chain_t *chain) { urj_tap_capture_ir(chain); wir = urj_tap_register_fill(wir, 1); urj_tap_shift_register(chain, wir, dsurir, URJ_CHAIN_EXITMODE_IDLE); return urj_tap_register_get_value(dsurir); }
uint64_t emudat_value (urj_tap_register_t *r) { uint64_t value; value = urj_tap_register_get_value (r); value >>= (r->len - 32); return value; }
static uint64_t dsu_readDR(urj_chain_t *chain, int size, uint64_t wdata) { urj_tap_register_t *rwr = urj_tap_register_alloc(size); urj_tap_register_t *rrd = urj_tap_register_fill(urj_tap_register_alloc(size), 0); uint64_t rdata; urj_tap_register_set_value(rwr, wdata); urj_tap_capture_dr(chain); urj_tap_shift_register(chain, rwr, rrd, URJ_CHAIN_EXITMODE_IDLE); rdata = urj_tap_register_get_value(rrd); urj_tap_register_free(rwr); urj_tap_register_free(rrd); return rdata; }
uint32_t part_emupc_get (urj_chain_t *chain, int n, int save) { urj_part_t *part; urj_tap_register_t *r; assert (n >= 0 && n < chain->parts->len); part_scan_select (chain, n, EMUPC_SCAN); urj_tap_chain_shift_data_registers_mode (chain, 1, 1, URJ_CHAIN_EXITMODE_UPDATE); part = chain->parts->parts[n]; r = part->active_instruction->data_register->out; BFIN_PART_EMUPC (part) = urj_tap_register_get_value (r); if (save) BFIN_PART_EMUPC_ORIG (part) = BFIN_PART_EMUPC (part); return BFIN_PART_EMUPC (part); }
static uint16_t bfin_dbgstat_value (urj_part_t *part) { return urj_tap_register_get_value (part->active_instruction->data_register->out); }
static int cmd_dr_run (urj_chain_t *chain, char *params[]) { int dir = 1; urj_part_t *part; urj_tap_register_t *r; urj_data_register_t *dr; urj_part_instruction_t *active_ir; if (urj_cmd_params (params) < 1 || urj_cmd_params (params) > 2) { urj_error_set (URJ_ERROR_SYNTAX, "%s: #parameters should be >= 1 and <= 2, not %d", params[0], urj_cmd_params (params)); return URJ_STATUS_FAIL; } if (urj_cmd_test_cable (chain) != URJ_STATUS_OK) return URJ_STATUS_FAIL; part = urj_tap_chain_active_part (chain); if (part == NULL) return URJ_STATUS_FAIL; active_ir = part->active_instruction; if (active_ir == NULL) { urj_error_set (URJ_ERROR_ILLEGAL_STATE, _("%s: part without active instruction"), "dr"); return URJ_STATUS_FAIL; } dr = active_ir->data_register; if (dr == NULL) { urj_error_set (URJ_ERROR_ILLEGAL_STATE, _("%s: instruction without active data register"), "dr"); return URJ_STATUS_FAIL; } if (params[1]) { if (strcasecmp (params[1], "in") == 0) dir = 0; else if (strcasecmp (params[1], "out") == 0) dir = 1; else { int ret = urj_tap_register_set_string (dr->in, params[1]); if (ret != URJ_STATUS_OK) return ret; dir = 0; } } if (dir) r = dr->out; else r = dr->in; urj_log (URJ_LOG_LEVEL_NORMAL, "%s (0x%0*" PRIX64 ")\n", urj_tap_register_get_string (r), r->len / 4, urj_tap_register_get_value (r)); return URJ_STATUS_OK; }