]> git.sur5r.net Git - openocd/blobdiff - src/target/target_request.c
Reset wip. Just adding hooks. This is just to reduce the size of the actual change...
[openocd] / src / target / target_request.c
index e84090205bc603f2bd6f290a1dbba381eee83f33..3487f160285a0e16d11ab8e3563940fd272a5e11 100644 (file)
@@ -27,6 +27,7 @@
 #include "target_request.h"
 #include "binarybuffer.h"
 #include "command.h"
+#include "trace.h"
 
 #include <stdlib.h>
 #include <string.h>
@@ -41,7 +42,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)
        {
@@ -52,37 +53,57 @@ 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)
 {
-       if (size == 1)
-       {
-               u8 *data = malloc(CEIL(length * sizeof(u8), 4) * 4);
-               
-               target->type->target_request_data(target, CEIL(length * sizeof(u8), 4), (u8*)data);
-               
-               free(data);
-       }
-       else if (size == 2)
-       {
-               u16 *data = malloc(CEIL(length * sizeof(u16), 4) * 4);
-               
-               target->type->target_request_data(target, CEIL(length * sizeof(u16), 4), (u8*)data);
+       u8 *data = malloc(CEIL(length * size, 4) * 4);
+       char line[128];
+       int line_len;
+       debug_msg_receiver_t *c = target->dbgmsg;
+       int i;
+       
+       LOG_DEBUG("size: %i, length: %i", size, length);
 
-               free(data);
-       }
-       else if (size == 4)
-       {
-               u32 *data = malloc(CEIL(length * sizeof(u32), 4) * 4);
-               
-               target->type->target_request_data(target, CEIL(length * sizeof(u32), 4), (u8*)data);
+       target->type->target_request_data(target, CEIL(length * size, 4), (u8*)data);
 
-               free(data);
-       }
-       else
+       line_len = 0;
+       for (i = 0; i < length; i++)
        {
-               ERROR("invalid debug message type");
+               switch (size)
+               {
+                       case 4:
+                               line_len += snprintf(line + line_len, 128 - line_len, "%8.8x ", le_to_h_u32(data + (4*i)));
+                               break;
+                       case 2:
+                               line_len += snprintf(line + line_len, 128 - line_len, "%4.4x ", le_to_h_u16(data + (2*i)));
+                               break;
+                       case 1:
+                               line_len += snprintf(line + line_len, 128 - line_len, "%2.2x ", data[i]);
+                               break;
+               }
+               
+               if ((i%8 == 7) || (i == length - 1))
+               {
+                       LOG_DEBUG("%s", line);
+                       
+                       while (c)
+                       {
+                               command_print(c->cmd_ctx, "%s", line);
+                               c = c->next;
+                       }
+                       c = target->dbgmsg;
+                       line_len = 0;
+               }
        }
        
+       free(data);
+
        return ERROR_OK;
 }
 
@@ -96,7 +117,7 @@ int target_request(target_t *target, u32 request)
        switch (target_req_cmd)
        {
                case TARGET_REQ_TRACEMSG:
-                       DEBUG("tracepoint: %i", (request & 0xffffff00) >> 8);
+                       trace_point(target, (request & 0xffffff00) >> 8);
                        break;
                case TARGET_REQ_DEBUGMSG:
                        if (((request & 0xff00) >> 8) == 0)
@@ -108,11 +129,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;
        }
        
@@ -141,6 +165,9 @@ 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;
 }
 
@@ -196,6 +223,8 @@ int delete_debug_msg_receiver(struct command_context_s *cmd_ctx, target_t *targe
 
        do
        {
+               p = &target->dbgmsg;
+               c = *p;
                while (c)
                {
                        debug_msg_receiver_t *next = c->next;
@@ -203,6 +232,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