- fix typo's
[fw/openocd] / src / target / arm9tdmi.c
index 5bb7e3998138d06210afb11cc43a773770715b87..0937c2abd58657ebe26b74b0808ad8e545e04a4a 100644 (file)
@@ -2,6 +2,9 @@
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
+ *   Copyright (C) 2008 by Spencer Oliver                                  *
+ *   spen@spen-soft.co.uk                                                  *
+ *                                                                         *
  *   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     *
@@ -46,9 +49,10 @@ int arm9tdmi_register_commands(struct command_context_s *cmd_ctx);
 int handle_arm9tdmi_catch_vectors_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 
 /* forward declarations */
-int arm9tdmi_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
+int arm9tdmi_target_create( struct target_s *target, Jim_Interp *interp );
+
 int arm9tdmi_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
-int arm9tdmi_quit();
+int arm9tdmi_quit(void);
                
 target_type_t arm9tdmi_target =
 {
@@ -66,7 +70,6 @@ target_type_t arm9tdmi_target =
        .assert_reset = arm7_9_assert_reset,
        .deassert_reset = arm7_9_deassert_reset,
        .soft_reset_halt = arm7_9_soft_reset_halt,
-       .prepare_reset_halt = arm7_9_prepare_reset_halt,
 
        .get_gdb_reg_list = armv4_5_get_gdb_reg_list,
 
@@ -74,6 +77,7 @@ target_type_t arm9tdmi_target =
        .write_memory = arm7_9_write_memory,
        .bulk_write_memory = arm7_9_bulk_write_memory,
        .checksum_memory = arm7_9_checksum_memory,
+       .blank_check_memory = arm7_9_blank_check_memory,
        
        .run_algorithm = armv4_5_run_algorithm,
        
@@ -83,8 +87,9 @@ target_type_t arm9tdmi_target =
        .remove_watchpoint = arm7_9_remove_watchpoint,
 
        .register_commands = arm9tdmi_register_commands,
-       .target_command = arm9tdmi_target_command,
+       .target_create = arm9tdmi_target_create,
        .init_target = arm9tdmi_init_target,
+       .examine = arm9tdmi_examine,
        .quit = arm9tdmi_quit
 };
 
@@ -101,15 +106,6 @@ arm9tdmi_vector_t arm9tdmi_vectors[] =
        {0, 0},
 };
 
-int arm9tdmi_jtag_error_handler(u8 *in_value, void *priv)
-{
-       char *caller = priv;
-       
-       DEBUG("caller: %s", caller);
-       
-       return ERROR_JTAG_QUEUE_FAILED;
-}
-
 int arm9tdmi_examine_debug_reason(target_t *target)
 {
        /* get pointers to arch-specific information */
@@ -160,7 +156,7 @@ int arm9tdmi_examine_debug_reason(target_t *target)
                arm_jtag_scann(&arm7_9->jtag_info, 0x1);
                arm_jtag_set_instr(&arm7_9->jtag_info, arm7_9->jtag_info.intest_instr, NULL);
 
-               jtag_add_dr_scan(3, fields, TAP_PD, NULL);
+               jtag_add_dr_scan(3, fields, TAP_PD);
                jtag_execute_queue();
                
                fields[0].in_value = NULL;
@@ -170,7 +166,7 @@ int arm9tdmi_examine_debug_reason(target_t *target)
                fields[2].in_value = NULL;
                fields[2].out_value = instructionbus;
                
-               jtag_add_dr_scan(3, fields, TAP_PD, NULL);
+               jtag_add_dr_scan(3, fields, TAP_PD);
 
                if (debug_reason & 0x4)
                        if (debug_reason & 0x2)
@@ -243,7 +239,7 @@ int arm9tdmi_clock_out(arm_jtag_t *jtag_info, u32 instr, u32 out, u32 *in, int s
        fields[2].in_handler = NULL;
        fields[2].in_handler_priv = NULL;
 
-       jtag_add_dr_scan(3, fields, -1, NULL);
+       jtag_add_dr_scan(3, fields, -1);
 
        jtag_add_runtest(0, -1);
        
@@ -253,10 +249,10 @@ int arm9tdmi_clock_out(arm_jtag_t *jtag_info, u32 instr, u32 out, u32 *in, int s
                
                if (in)
                {
-                       DEBUG("instr: 0x%8.8x, out: 0x%8.8x, in: 0x%8.8x", instr, out, *in);
+                       LOG_DEBUG("instr: 0x%8.8x, out: 0x%8.8x, in: 0x%8.8x", instr, out, *in);
                }
                else
-                       DEBUG("instr: 0x%8.8x, out: 0x%8.8x", instr, out);
+                       LOG_DEBUG("instr: 0x%8.8x, out: 0x%8.8x", instr, out);
        }
 #endif
 
@@ -303,7 +299,7 @@ int arm9tdmi_clock_data_in(arm_jtag_t *jtag_info, u32 *in)
        fields[2].in_handler = NULL;
        fields[2].in_handler_priv = NULL;
        
-       jtag_add_dr_scan(3, fields, -1, NULL);
+       jtag_add_dr_scan(3, fields, -1);
 
        jtag_add_runtest(0, -1);
        
@@ -313,11 +309,11 @@ int arm9tdmi_clock_data_in(arm_jtag_t *jtag_info, u32 *in)
                        
                if (in)
                {
-                       DEBUG("in: 0x%8.8x", *in);
+                       LOG_DEBUG("in: 0x%8.8x", *in);
                }
                else
                {
-                       ERROR("BUG: called with in == NULL");
+                       LOG_ERROR("BUG: called with in == NULL");
                }
        }
 #endif
@@ -379,7 +375,7 @@ int arm9tdmi_clock_data_in_endianness(arm_jtag_t *jtag_info, void *in, int size,
        fields[2].in_handler = NULL;
        fields[2].in_handler_priv = NULL;
        
-       jtag_add_dr_scan(3, fields, -1, NULL);
+       jtag_add_dr_scan(3, fields, -1);
 
        jtag_add_runtest(0, -1);
        
@@ -389,11 +385,11 @@ int arm9tdmi_clock_data_in_endianness(arm_jtag_t *jtag_info, void *in, int size,
                        
                if (in)
                {
-                       DEBUG("in: 0x%8.8x", *in);
+                       LOG_DEBUG("in: 0x%8.8x", *(u32*)in);
                }
                else
                {
-                       ERROR("BUG: called with in == NULL");
+                       LOG_ERROR("BUG: called with in == NULL");
                }
        }
 #endif
@@ -553,7 +549,7 @@ void arm9tdmi_write_xpsr(target_t *target, u32 xpsr, int spsr)
        arm7_9_common_t *arm7_9 = armv4_5->arch_info;
        arm_jtag_t *jtag_info = &arm7_9->jtag_info;
                
-       DEBUG("xpsr: %8.8x, spsr: %i", xpsr, spsr);
+       LOG_DEBUG("xpsr: %8.8x, spsr: %i", xpsr, spsr);
 
        /* MSR1 fetched */
        arm9tdmi_clock_out(jtag_info, ARMV4_5_MSR_IM(xpsr & 0xff, 0, 1, spsr), 0, NULL, 0);
@@ -589,7 +585,7 @@ void arm9tdmi_write_xpsr_im8(target_t *target, u8 xpsr_im, int rot, int spsr)
        arm7_9_common_t *arm7_9 = armv4_5->arch_info;
        arm_jtag_t *jtag_info = &arm7_9->jtag_info;
                
-       DEBUG("xpsr_im: %2.2x, rot: %i, spsr: %i", xpsr_im, rot, spsr);
+       LOG_DEBUG("xpsr_im: %2.2x, rot: %i, spsr: %i", xpsr_im, rot, spsr);
        
        /* MSR fetched */
        arm9tdmi_clock_out(jtag_info, ARMV4_5_MSR_IM(xpsr_im, rot, 1, spsr), 0, NULL, 0);
@@ -754,7 +750,7 @@ void arm9tdmi_branch_resume(target_t *target)
 
 void arm9tdmi_branch_resume_thumb(target_t *target)
 {
-       DEBUG("-");
+       LOG_DEBUG("-");
        
        /* get pointers to arch-specific information */
        armv4_5_common_t *armv4_5 = target->arch_info;
@@ -852,21 +848,47 @@ void arm9tdmi_build_reg_cache(target_t *target)
        reg_cache_t **cache_p = register_get_last_cache_p(&target->reg_cache);
        /* get pointers to arch-specific information */
        armv4_5_common_t *armv4_5 = target->arch_info;
-       arm7_9_common_t *arm7_9 = armv4_5->arch_info;
-       arm_jtag_t *jtag_info = &arm7_9->jtag_info;
 
        (*cache_p) = armv4_5_build_reg_cache(target, armv4_5);
        armv4_5->core_cache = (*cache_p);
-       
-       /* one extra register (vector catch) */
-       (*cache_p)->next = embeddedice_build_reg_cache(target, arm7_9);
-       arm7_9->eice_cache = (*cache_p)->next;
+}
 
+
+int arm9tdmi_examine(struct target_s *target)
+{
+       /* get pointers to arch-specific information */
+       int retval;
+       armv4_5_common_t *armv4_5 = target->arch_info;
+       arm7_9_common_t *arm7_9 = armv4_5->arch_info;
+       if (!target->type->examined)
+       {
+               reg_cache_t **cache_p = register_get_last_cache_p(&target->reg_cache);
+               reg_cache_t *t;
+               /* one extra register (vector catch) */
+               t=embeddedice_build_reg_cache(target, arm7_9);
+               if (t==NULL)
+                       return ERROR_FAIL;
+               (*cache_p) = t;
+               arm7_9->eice_cache = (*cache_p);
+       
+               if (arm7_9->etm_ctx)
+               {
+                       arm_jtag_t *jtag_info = &arm7_9->jtag_info;
+                       (*cache_p)->next = etm_build_reg_cache(target, jtag_info, arm7_9->etm_ctx);
+                       arm7_9->etm_ctx->reg_cache = (*cache_p)->next;
+               }
+               target->type->examined = 1;
+       }
+       if ((retval=embeddedice_setup(target))!=ERROR_OK)
+               return retval;
+       if ((retval=arm7_9_setup(target))!=ERROR_OK)
+               return retval;
        if (arm7_9->etm_ctx)
        {
-               (*cache_p)->next->next = etm_build_reg_cache(target, jtag_info, arm7_9->etm_ctx);
-               arm7_9->etm_ctx->reg_cache = (*cache_p)->next->next;
+               if ((retval=etm_setup(target))!=ERROR_OK)
+                       return retval;
        }
+       return ERROR_OK;
 }
 
 int arm9tdmi_init_target(struct command_context_s *cmd_ctx, struct target_s *target)
@@ -878,13 +900,13 @@ int arm9tdmi_init_target(struct command_context_s *cmd_ctx, struct target_s *tar
        
 }
 
-int arm9tdmi_quit()
+int arm9tdmi_quit(void)
 {
        
        return ERROR_OK;
 }
 
-int arm9tdmi_init_arch_info(target_t *target, arm9tdmi_common_t *arm9tdmi, int chain_pos, char *variant)
+int arm9tdmi_init_arch_info(target_t *target, arm9tdmi_common_t *arm9tdmi, int chain_pos, const char *variant)
 {
        armv4_5_common_t *armv4_5;
        arm7_9_common_t *arm7_9;
@@ -932,8 +954,6 @@ int arm9tdmi_init_arch_info(target_t *target, arm9tdmi_common_t *arm9tdmi, int c
        arm7_9->arm_bkpt = 0xdeeedeee;
        arm7_9->thumb_bkpt = 0xdeee;
        
-       arm7_9->sw_bkpts_use_wp = 1;
-       arm7_9->sw_bkpts_enabled = 0;
        arm7_9->dbgreq_adjust_pc = 3;
        arm7_9->arch_info = arm9tdmi;
        
@@ -991,25 +1011,12 @@ int arm9tdmi_get_arch_pointers(target_t *target, armv4_5_common_t **armv4_5_p, a
 }
 
 
-/* target arm9tdmi <endianess> <startup_mode> <chain_pos> <variant>*/
-int arm9tdmi_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target)
+
+int arm9tdmi_target_create(struct target_s *target, Jim_Interp *interp)
 {
-       int chain_pos;
-       char *variant = NULL;
-       arm9tdmi_common_t *arm9tdmi = malloc(sizeof(arm9tdmi_common_t));
+       arm9tdmi_common_t *arm9tdmi = calloc(1,sizeof(arm9tdmi_common_t));
 
-       if (argc < 4)
-       {
-               ERROR("'target arm9tdmi' requires at least one additional argument");
-               exit(-1);
-       }
-       
-       chain_pos = strtoul(args[3], NULL, 0);
-       
-       if (argc >= 5)
-               variant = args[4];
-       
-       arm9tdmi_init_arch_info(target, arm9tdmi, chain_pos, variant);
+       arm9tdmi_init_arch_info(target, arm9tdmi, target->chain_position, target->variant);
        
        return ERROR_OK;
 }