X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Farm11.c;h=f962cde2bb6a4aa54e5728f921942c14b846261b;hb=68c598e88d5e09728ea845a81ab279c615bbaf0f;hp=adcbe74912efba7b083b11c2b23a5fce1aa0adf6;hpb=d3f0549f08d8aac36143bca9e7f7e1308383b7c2;p=openocd.git diff --git a/src/target/arm11.c b/src/target/arm11.c index adcbe74912..f962cde2bb 100644 --- a/src/target/arm11.c +++ b/src/target/arm11.c @@ -1,6 +1,8 @@ /*************************************************************************** * 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 * * the Free Software Foundation; either version 2 of the License, or * @@ -90,8 +92,9 @@ target_type_t arm11_target = ARM11_HANDLER(run_algorithm), ARM11_HANDLER(register_commands), - ARM11_HANDLER(target_command), + ARM11_HANDLER(target_create), ARM11_HANDLER(init_target), + ARM11_HANDLER(examine), ARM11_HANDLER(quit), }; @@ -723,7 +726,8 @@ int arm11_halt(struct target_s *target) 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) { @@ -732,8 +736,8 @@ int arm11_halt(struct target_s *target) if (target->state == TARGET_HALTED) { - LOG_WARNING("target was already halted"); - return ERROR_OK; + LOG_DEBUG("target was already halted"); + return ERROR_OK; } if (arm11->trst_active) @@ -779,13 +783,15 @@ int arm11_resume(struct target_s *target, int current, u32 address, int handle_b 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; @@ -874,7 +880,8 @@ int arm11_step(struct target_s *target, int current, u32 address, int handle_bre { 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) { @@ -994,6 +1001,13 @@ int arm11_assert_reset(struct target_s *target) arm11->trst_active = true; #endif + if (target->reset_halt) + { + int retval; + if ((retval = target_halt(target))!=ERROR_OK) + return retval; + } + return ERROR_OK; } @@ -1002,7 +1016,9 @@ int arm11_deassert_reset(struct target_s *target) 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); @@ -1229,7 +1245,7 @@ int arm11_write_memory(struct target_s *target, u32 address, u32 size, u32 count LOG_ERROR("use 'arm11 memwrite burst disable' to disable fast burst mode"); if (arm11_config_memwrite_error_fatal) - exit(-1); + return ERROR_FAIL; } } #endif @@ -1335,34 +1351,26 @@ int arm11_run_algorithm(struct target_s *target, int num_mem_params, mem_param_t return ERROR_OK; } -int arm11_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target) +int arm11_target_create(struct target_s *target, Jim_Interp *interp) { FNC_INFO; - if (argc < 4) - { - LOG_ERROR("'target arm11' 4th argument "); - exit(-1); - } - - int chain_pos = strtoul(args[3], NULL, 0); - NEW(arm11_common_t, arm11, 1); arm11->target = target; /* prepare JTAG information for the new target */ - arm11->jtag_info.chain_pos = chain_pos; + arm11->jtag_info.chain_pos = target->chain_position; arm11->jtag_info.scann_size = 5; arm_jtag_setup_connection(&arm11->jtag_info); - jtag_device_t *device = jtag_get_device(chain_pos); + jtag_device_t *device = jtag_get_device(target->chain_position); 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; @@ -1371,8 +1379,16 @@ int arm11_target_command(struct command_context_s *cmd_ctx, char *cmd, char **ar } 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; @@ -1399,7 +1415,8 @@ int arm11_init_target(struct command_context_s *cmd_ctx, struct target_s *target 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) @@ -1409,8 +1426,8 @@ int arm11_init_target(struct command_context_s *cmd_ctx, struct target_s *target 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; } } @@ -1420,7 +1437,7 @@ int arm11_init_target(struct command_context_s *cmd_ctx, struct target_s *target arm11->debug_version != ARM11_DEBUG_V61) { LOG_ERROR("Only ARMv6 v6 and v6.1 architectures supported."); - exit(-1); + return ERROR_FAIL; } @@ -1446,6 +1463,8 @@ int arm11_init_target(struct command_context_s *cmd_ctx, struct target_s *target arm11_check_init(arm11, NULL); + target->type->examined = 1; + return ERROR_OK; } @@ -1528,7 +1547,7 @@ void arm11_build_reg_cache(target_t *target) 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); } @@ -1649,7 +1668,7 @@ arm11_common_t * arm11_find_target(const char * arg) 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; @@ -1701,7 +1720,7 @@ int arm11_handle_mrc_mcr(struct command_context_s *cmd_ctx, char *cmd, char **ar 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; }