]> git.sur5r.net Git - openocd/blobdiff - src/target/arm11.c
fixed gaffe: disable interrupts reset init script
[openocd] / src / target / arm11.c
index 9e131d8b5a7379a457ce38a83165d777fa5e73cf..f962cde2bb6a4aa54e5728f921942c14b846261b 100644 (file)
@@ -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,7 +92,7 @@ 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),
@@ -724,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)
     {
@@ -780,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;
@@ -875,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)
     {
@@ -1010,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);
@@ -1237,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
@@ -1343,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 <jtag chain pos>");
-       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;
@@ -1388,6 +1388,7 @@ int arm11_init_target(struct command_context_s *cmd_ctx, struct target_s *target
 int arm11_examine(struct target_s *target)
 {
     FNC_INFO;
+    int retval;
 
     arm11_common_t * arm11 = target->arch_info;
 
@@ -1414,7 +1415,8 @@ int arm11_examine(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)
@@ -1424,8 +1426,8 @@ int arm11_examine(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;
     }
     }
 
@@ -1435,7 +1437,7 @@ int arm11_examine(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;
     }
 
 
@@ -1461,6 +1463,8 @@ int arm11_examine(struct target_s *target)
 
     arm11_check_init(arm11, NULL);
 
+    target->type->examined = 1;
+    
     return ERROR_OK;
 }
 
@@ -1543,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);
     }
 
@@ -1664,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;
@@ -1716,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;
        }