Kees Jongenburger <kees.jongenburger@gmail.com> old" syntax target command appears...
[fw/openocd] / src / target / target_request.c
index 9dc58607986744b6c3e5d45553130ef68e1a48dd..b266fea5ed48d0854a1305f16eb7433df1f8dcb4 100644 (file)
@@ -2,6 +2,12 @@
  *   Copyright (C) 2007 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
+ *   Copyright (C) 2007,2008 Ã˜yvind Harboe                                 *
+ *   oyvind.harboe@zylin.com                                               *
+ *                                                                         *
+ *   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     *
@@ -42,7 +48,7 @@ int target_asciimsg(target_t *target, u32 length)
        target->type->target_request_data(target, CEIL(length, 4), (u8*)msg);
        msg[length] = 0;
        
-       DEBUG("%s", msg);
+       LOG_DEBUG("%s", msg);
        
        while (c)
        {
@@ -53,6 +59,13 @@ int target_asciimsg(target_t *target, u32 length)
        return ERROR_OK;
 }
 
+int target_charmsg(target_t *target, u8 msg)
+{
+       LOG_USER_N("%c", msg);
+       
+       return ERROR_OK;
+}
+
 int target_hexmsg(target_t *target, int size, u32 length)
 {
        u8 *data = malloc(CEIL(length * size, 4) * 4);
@@ -61,7 +74,7 @@ int target_hexmsg(target_t *target, int size, u32 length)
        debug_msg_receiver_t *c = target->dbgmsg;
        int i;
        
-       DEBUG("size: %i, length: %i", size, length);
+       LOG_DEBUG("size: %i, length: %i", size, length);
 
        target->type->target_request_data(target, CEIL(length * size, 4), (u8*)data);
 
@@ -83,6 +96,8 @@ int target_hexmsg(target_t *target, int size, u32 length)
                
                if ((i%8 == 7) || (i == length - 1))
                {
+                       LOG_DEBUG("%s", line);
+                       
                        while (c)
                        {
                                command_print(c->cmd_ctx, "%s", line);
@@ -120,11 +135,14 @@ int target_request(target_t *target, u32 request)
                                target_hexmsg(target, (request & 0xff00) >> 8, (request & 0xffff0000) >> 16);
                        }
                        break;
+               case TARGET_REQ_DEBUGCHAR:
+                       target_charmsg(target, (request & 0x00ff0000) >> 16);
+                       break;
 /*             case TARGET_REQ_SEMIHOSTING:
  *                     break;
  */
                default:
-                       ERROR("unknown target request: %2.2x", target_req_cmd);
+                       LOG_ERROR("unknown target request: %2.2x", target_req_cmd);
                        break;
        }
        
@@ -153,23 +171,26 @@ int add_debug_msg_receiver(struct command_context_s *cmd_ctx, target_t *target)
        (*p)->cmd_ctx = cmd_ctx;
        (*p)->next = NULL;
        
+       /* enable callback */
+       target->dbg_msg_enabled = 1;
+       
        return ERROR_OK;
 }
 
 debug_msg_receiver_t* find_debug_msg_receiver(struct command_context_s *cmd_ctx, target_t *target)
 {
-       int all_targets = 0;
+       int do_all_targets = 0;
        debug_msg_receiver_t **p = &target->dbgmsg;
        
        /* if no target has been specified search all of them */
        if (target == NULL)
        {
                /* if no targets haven been specified */
-               if (targets == NULL)
+               if (all_targets == NULL)
                        return NULL;
 
-               target = targets;
-               all_targets = 1;
+               target = all_targets;
+               do_all_targets = 1;
        }
        
        do
@@ -184,7 +205,7 @@ debug_msg_receiver_t* find_debug_msg_receiver(struct command_context_s *cmd_ctx,
                }
                
                target = target->next;
-       } while (target && all_targets);
+       } while (target && do_all_targets);
        
        return NULL;
 }
@@ -193,17 +214,17 @@ int delete_debug_msg_receiver(struct command_context_s *cmd_ctx, target_t *targe
 {
        debug_msg_receiver_t **p;
        debug_msg_receiver_t *c;
-       int all_targets = 0;
+       int do_all_targets = 0;
        
        /* if no target has been specified search all of them */
        if (target == NULL)
        {
                /* if no targets haven been specified */
-               if (targets == NULL)
+               if (all_targets == NULL)
                        return ERROR_OK;
                
-               target = targets;
-               all_targets = 1;
+               target = all_targets;
+               do_all_targets = 1;
        }
 
        do
@@ -217,6 +238,11 @@ int delete_debug_msg_receiver(struct command_context_s *cmd_ctx, target_t *targe
                        {
                                *p = next;
                                free(c);
+                               if (*p == NULL)
+                               {
+                                       /* disable callback */
+                                       target->dbg_msg_enabled = 0;
+                               }
                                return ERROR_OK;
                        }
                        else
@@ -225,7 +251,7 @@ int delete_debug_msg_receiver(struct command_context_s *cmd_ctx, target_t *targe
                }
        
                target = target->next;
-       } while (target && all_targets);
+       } while (target && do_all_targets);
        
        return ERROR_OK;
 }
@@ -278,7 +304,7 @@ int target_request_register_commands(struct command_context_s *cmd_ctx)
                register_command(cmd_ctx, NULL, "target_request", NULL, COMMAND_ANY, "target_request commands");
        
        register_command(cmd_ctx, target_request_cmd, "debugmsgs", handle_target_request_debugmsgs_command,
-               COMMAND_EXEC, "enable/disable reception of debug messgages from target");
+               COMMAND_EXEC, "enable/disable reception of debug messages from target");
 
        return ERROR_OK;
 }