/***************************************************************************
* Copyright (C) 2008 digenius technology GmbH. *
+ *
+ * Copyright (C) 2008 Oyvind Harboe oyvind.harboe@zylin.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
ARM11_HANDLER(register_commands),
ARM11_HANDLER(target_command),
ARM11_HANDLER(init_target),
+ ARM11_HANDLER(examine),
ARM11_HANDLER(quit),
};
arm11_common_t * arm11 = target->arch_info;
- LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
+ LOG_DEBUG("target->state: %s",
+ Jim_Nvp_value2name_simple( nvp_target_state, target->state )->name );
if (target->state == TARGET_UNKNOWN)
{
arm11_common_t * arm11 = target->arch_info;
- LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
+ LOG_DEBUG("target->state: %s",
+ Jim_Nvp_value2name_simple( nvp_target_state, target->state )->name );
+
if (target->state != TARGET_HALTED)
- {
- LOG_WARNING("target was not halted");
- return ERROR_TARGET_NOT_HALTED;
- }
+ {
+ LOG_ERROR("Target not halted");
+ return ERROR_TARGET_NOT_HALTED;
+ }
if (!current)
R(PC) = address;
{
FNC_INFO;
- LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
+ LOG_DEBUG("target->state: %s",
+ Jim_Nvp_value2name_simple( nvp_target_state, target->state )->name );
if (target->state != TARGET_HALTED)
{
arm11->trst_active = true;
#endif
+ if (target->reset_halt)
+ {
+ int retval;
+ if ((retval = target_halt(target))!=ERROR_OK)
+ return retval;
+ }
+
return ERROR_OK;
}
FNC_INFO;
#if 0
- LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
+ LOG_DEBUG("target->state: %s",
+ Jim_Nvp_value2name_simple( nvp_target_state, target->state )->name );
+
/* deassert reset lines */
jtag_add_reset(0, 0);
LOG_ERROR("use 'arm11 memwrite burst disable' to disable fast burst mode");
if (arm11_config_memwrite_error_fatal)
- exit(-1);
+ return ERROR_FAIL;
}
}
#endif
if (argc < 4)
{
- LOG_ERROR("'target arm11' 4th argument <jtag chain pos>");
- exit(-1);
+ return ERROR_COMMAND_SYNTAX_ERROR;
}
int chain_pos = strtoul(args[3], NULL, 0);
if (device->ir_length != 5)
{
- LOG_ERROR("'target arm11' expects 'jtag_device 5 0x01 0x1F 0x1E'");
- exit(-1);
+ LOG_ERROR("'target arm11' expects 'jtag_device 5 0x01 0x1F 0x1E'");
+ return ERROR_COMMAND_SYNTAX_ERROR;
}
target->arch_info = arm11;
}
int arm11_init_target(struct command_context_s *cmd_ctx, struct target_s *target)
+{
+ /* Initialize anything we can set up without talking to the target */
+ return ERROR_OK;
+}
+
+/* talk to the target and set things up */
+int arm11_examine(struct target_s *target)
{
FNC_INFO;
+ int retval;
arm11_common_t * arm11 = target->arch_info;
arm11_add_dr_scan_vc(asizeof(chain0_fields), chain0_fields, TAP_RTI);
- jtag_execute_queue();
+ if ((retval=jtag_execute_queue())!=ERROR_OK)
+ return retval;
switch (arm11->device_id & 0x0FFFF000)
case 0x07B76000: LOG_INFO("found ARM1176"); break;
default:
{
- LOG_ERROR("'target arm11' expects IDCODE 0x*7B*7****");
- exit(-1);
+ LOG_ERROR("'target arm11' expects IDCODE 0x*7B*7****");
+ return ERROR_FAIL;
}
}
arm11->debug_version != ARM11_DEBUG_V61)
{
LOG_ERROR("Only ARMv6 v6 and v6.1 architectures supported.");
- exit(-1);
+ return ERROR_FAIL;
}
arm11_check_init(arm11, NULL);
+ target->type->examined = 1;
+
return ERROR_OK;
}
ARM11_REGCACHE_COUNT != asizeof(arm11_reg_defs) ||
ARM11_REGCACHE_COUNT != ARM11_RC_MAX)
{
- LOG_ERROR("arm11->reg_values inconsistent (%d " ZU " " ZU " %d)", ARM11_REGCACHE_COUNT, asizeof(arm11->reg_values), asizeof(arm11_reg_defs), ARM11_RC_MAX);
+ LOG_ERROR("BUG: arm11->reg_values inconsistent (%d " ZU " " ZU " %d)", ARM11_REGCACHE_COUNT, asizeof(arm11->reg_values), asizeof(arm11_reg_defs), ARM11_RC_MAX);
exit(-1);
}
size_t jtag_target = strtoul(arg, NULL, 0);
{target_t * t;
- for (t = targets; t; t = t->next)
+ for (t = all_targets; t; t = t->next)
{
if (t->type != &arm11_target)
continue;
if (values[i] > arm11_coproc_instruction_limits[i])
{
LOG_ERROR("Parameter %ld out of bounds (%d max). %s",
- i + 2, arm11_coproc_instruction_limits[i],
+ (long)(i + 2), arm11_coproc_instruction_limits[i],
read ? arm11_mrc_syntax : arm11_mcr_syntax);
return -1;
}