uint32_t part_emudat_get (urj_chain_t *chain, int n, int exit) { urj_part_t *part; urj_tap_register_t *r; uint64_t value; assert (exit == URJ_CHAIN_EXITMODE_UPDATE || exit == URJ_CHAIN_EXITMODE_IDLE); if (exit == URJ_CHAIN_EXITMODE_IDLE) { assert (urj_tap_state (chain) & URJ_TAP_STATE_IDLE); urj_tap_chain_defer_clock (chain, 0, 0, 1); urj_tap_chain_wait_ready (chain); } if (part_scan_select (chain, n, EMUDAT_SCAN) < 0) return -1; 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; value = emudat_value (r); /* TODO Is it good to check EMUDOF here if it's available? */ return value; }
void part_emudat_defer_get (urj_chain_t *chain, int n, int exit) { int i; urj_parts_t *ps; assert (exit == URJ_CHAIN_EXITMODE_UPDATE || exit == URJ_CHAIN_EXITMODE_IDLE); if (exit == URJ_CHAIN_EXITMODE_IDLE) { assert (urj_tap_state (chain) & URJ_TAP_STATE_IDLE); urj_tap_chain_defer_clock (chain, 0, 0, 1); urj_tap_chain_wait_ready (chain); } if (part_scan_select (chain, n, EMUDAT_SCAN) < 0) abort (); if (!chain || !chain->parts) return; ps = chain->parts; for (i = 0; i < ps->len; i++) { if (ps->parts[i]->active_instruction == NULL) { urj_log (URJ_LOG_LEVEL_ERROR, _("Part %d without active instruction\n"), i); return; } if (ps->parts[i]->active_instruction->data_register == NULL) { urj_log (URJ_LOG_LEVEL_ERROR, _("Part %d without data register\n"), i); return; } } urj_tap_capture_dr (chain); /* new implementation: split into defer + retrieve part shift the data register of each part in the chain one by one */ for (i = 0; i < ps->len; i++) { urj_tap_defer_shift_register (chain, ps->parts[i]->active_instruction->data_register->in, ps->parts[i]->active_instruction->data_register->out, (i + 1) == ps->len ? URJ_CHAIN_EXITMODE_UPDATE : URJ_CHAIN_EXITMODE_SHIFT); } }
/** * bus->driver->(*initbus) * */ static int arm9tdmi_bus_init (urj_bus_t *bus) { unsigned int i, status, success; if (urj_tap_state (bus->chain) != URJ_TAP_STATE_RUN_TEST_IDLE) { /* silently skip initialization if TAP isn't in RUNTEST/IDLE state this is required to avoid interfering with detect when initbus is contained in the part description file URJ_BUS_INIT() will be called latest by URJ_BUS_PREPARE() */ return URJ_STATUS_OK; } if (scann == NULL) scann = urj_part_find_data_register (bus->part, "SCANN"); if (scan1 == NULL) scan1 = urj_part_find_data_register (bus->part, "SCAN1"); if (scan2 == NULL) scan2 = urj_part_find_data_register (bus->part, "SCAN2"); if (!(scann)) { urj_error_set (URJ_ERROR_NOTFOUND, _("SCANN register")); return URJ_STATUS_FAIL; } if (!(scan1)) { urj_error_set (URJ_ERROR_NOTFOUND, _("SCAN1 register")); return URJ_STATUS_FAIL; } if (!(scan2)) { urj_error_set (URJ_ERROR_NOTFOUND, _("SCAN2 register")); return URJ_STATUS_FAIL; } /* * select scan chain 2 -- EmbeddedICE-RT */ arm9tdmi_select_scanchain(bus, 2); urj_part_set_instruction (bus->part, "INTEST2"); urj_tap_chain_shift_instructions (bus->chain); arm9tdmi_ice_write(bus, ARM9TDMI_ICE_DBGCTL, 0x3); urj_part_set_instruction (bus->part, "RESTART"); urj_tap_chain_shift_instructions (bus->chain); i = 0; success = 0; status = 0; while (i++ < 10) { urj_part_set_instruction (bus->part, "INTEST2"); urj_tap_chain_shift_instructions (bus->chain); arm9tdmi_ice_read(bus, ARM9TDMI_ICE_DBGSTAT, &status); if (status & 0x01) { success = 1; break; } urj_part_set_instruction (bus->part, "RESTART"); urj_tap_chain_shift_instructions (bus->chain); usleep(100); } if (!success) { urj_error_set (URJ_ERROR_TIMEOUT, _("Failed to enter debug mode, ctrl=%s"), urj_tap_register_get_string (scan2->out)); return URJ_STATUS_FAIL; } arm9tdmi_ice_write(bus, ARM9TDMI_ICE_DBGCTL, 0x00); urj_log (URJ_LOG_LEVEL_NORMAL, _("The target is halted in ")); if (status & 0x10) urj_log (URJ_LOG_LEVEL_NORMAL, _("THUMB mode.\n")); else urj_log (URJ_LOG_LEVEL_NORMAL, _("ARM mode.\n")); /* select scan chain 1, and use INTEST instruction */ arm9tdmi_select_scanchain(bus, 1); urj_part_set_instruction (bus->part, "INTEST1"); urj_tap_chain_shift_instructions_mode (bus->chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE); bus->initialized = 1; return URJ_STATUS_OK; }