duan ellis target tcl work in progress
[fw/openocd] / src / target / xscale.c
index d776e2107d200cd730427737a40900b76f4f9a61..87fb6acd190f4d3b86d75fe136b23bee4ffd1f8e 100644 (file)
@@ -2,6 +2,9 @@
  *   Copyright (C) 2006, 2007 by Dominic Rath                              *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
+ *   Copyright (C) 2007,2008 Ã˜yvind 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     *
@@ -52,7 +55,7 @@ int xscale_register_commands(struct command_context_s *cmd_ctx);
 /* forward declarations */
 int xscale_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
 int xscale_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
-int xscale_quit();
+int xscale_quit(void);
 
 int xscale_arch_state(struct target_s *target);
 int xscale_poll(target_t *target);
@@ -484,41 +487,43 @@ int xscale_read_tx(target_t *target, int consume)
 
        for (;;)
        {
-               int i;
-               for (i=0; i<100; i++)
+               /* if we want to consume the register content (i.e. clear TX_READY),
+                * we have to go straight from Capture-DR to Shift-DR
+                * otherwise, we go from Capture-DR to Exit1-DR to Pause-DR
+               */
+               if (consume)
+                       jtag_add_pathmove(3, path);
+               else
                {
-                       /* if we want to consume the register content (i.e. clear TX_READY),
-                        * we have to go straight from Capture-DR to Shift-DR
-                        * otherwise, we go from Capture-DR to Exit1-DR to Pause-DR
-                       */
-                       if (consume)
-                               jtag_add_pathmove(3, path);
-                       else
-                       {
-                               jtag_add_pathmove(sizeof(noconsume_path)/sizeof(*noconsume_path), noconsume_path);
-                       }
-       
-                       jtag_add_dr_scan(3, fields, TAP_RTI);
-       
-                       if ((retval = jtag_execute_queue()) != ERROR_OK)
-                       {
-                               LOG_ERROR("JTAG error while reading TX");
-                               return ERROR_TARGET_TIMEOUT;
-                       }
-       
-                       gettimeofday(&now, NULL);
-                       if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec)))
-                       {
-                               LOG_ERROR("time out reading TX register");
-                               return ERROR_TARGET_TIMEOUT;
-                       }
-                       if (!((!(field0_in & 1)) && consume))
-                       {
-                               goto done;
-                       }
+                       jtag_add_pathmove(sizeof(noconsume_path)/sizeof(*noconsume_path), noconsume_path);
+               }
+
+               jtag_add_dr_scan(3, fields, TAP_RTI);
+
+               if ((retval = jtag_execute_queue()) != ERROR_OK)
+               {
+                       LOG_ERROR("JTAG error while reading TX");
+                       return ERROR_TARGET_TIMEOUT;
+               }
+
+               gettimeofday(&now, NULL);
+               if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec)))
+               {
+                       LOG_ERROR("time out reading TX register");
+                       return ERROR_TARGET_TIMEOUT;
+               }
+               if (!((!(field0_in & 1)) && consume))
+               {
+                       goto done;
+               }
+               if (debug_level>=3)
+               {
+                       LOG_DEBUG("waiting 100ms");
+                       alive_sleep(100); /* avoid flooding the logs */
+               } else
+               {
+                       keep_alive();
                }
-               LOG_DEBUG("waiting 10ms");
-               usleep(10*1000); /* avoid flooding the logs */
        } 
        done:
 
@@ -582,28 +587,30 @@ int xscale_write_rx(target_t *target)
        LOG_DEBUG("polling RX");
        for (;;)
        {
-               int i;
-               for (i=0; i<10; i++)
+               jtag_add_dr_scan(3, fields, TAP_RTI);
+
+               if ((retval = jtag_execute_queue()) != ERROR_OK)
                {
-                       jtag_add_dr_scan(3, fields, TAP_RTI);
-       
-                       if ((retval = jtag_execute_queue()) != ERROR_OK)
-                       {
-                               LOG_ERROR("JTAG error while writing RX");
-                               return retval;
-                       }
-       
-                       gettimeofday(&now, NULL);
-                       if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec)))
-                       {
-                               LOG_ERROR("time out writing RX register");
-                               return ERROR_TARGET_TIMEOUT;
-                       }
-                       if (!(field0_in & 1))
-                               goto done;
+                       LOG_ERROR("JTAG error while writing RX");
+                       return retval;
+               }
+
+               gettimeofday(&now, NULL);
+               if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec)))
+               {
+                       LOG_ERROR("time out writing RX register");
+                       return ERROR_TARGET_TIMEOUT;
+               }
+               if (!(field0_in & 1))
+                       goto done;
+               if (debug_level>=3)
+               {
+                       LOG_DEBUG("waiting 100ms");
+                       alive_sleep(100); /* avoid flooding the logs */
+               } else
+               {
+                       keep_alive();
                }
-               LOG_DEBUG("waiting 10ms");
-               usleep(10*1000); /* wait 10ms to avoid flooding the logs */
        }
        done:
        
@@ -976,7 +983,7 @@ int xscale_arch_state(struct target_s *target)
                        "MMU: %s, D-Cache: %s, I-Cache: %s"
                        "%s",
                         armv4_5_state_strings[armv4_5->core_state],
-                        target_debug_reason_strings[target->debug_reason],
+                        Jim_Nvp_value2name_simple( nvp_target_debug_reason, target->debug_reason )->name ,
                         armv4_5_mode_strings[armv4_5_mode_to_number(armv4_5->core_mode)],
                         buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32),
                         buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32),
@@ -1218,7 +1225,8 @@ int xscale_halt(target_t *target)
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->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)
        {
@@ -1551,7 +1559,8 @@ int xscale_assert_reset(target_t *target)
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->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);
 
        /* select DCSR instruction (set endstate to R-T-I to ensure we don't
         * end up in T-L-R, which would reset JTAG
@@ -1577,6 +1586,13 @@ int xscale_assert_reset(target_t *target)
 
        target->state = TARGET_RESET;
 
+    if (target->reset_halt)
+    {
+       int retval;
+               if ((retval = target_halt(target))!=ERROR_OK)
+                       return retval;
+    }
+
        return ERROR_OK;
 }
 
@@ -2979,7 +2995,7 @@ int xscale_init_target(struct command_context_s *cmd_ctx, struct target_s *targe
        return ERROR_OK;
 }
 
-int xscale_quit()
+int xscale_quit(void)
 {
 
        return ERROR_OK;