X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Ftarget_request.c;h=df97a65f7975028c8341fb1f0379a9a762f7070f;hb=5ea46227b06af1a3680f62dc30715846f1e92e69;hp=e84090205bc603f2bd6f290a1dbba381eee83f33;hpb=20e4e77cdf366dedac21ff5670c54291feadfc05;p=openocd.git diff --git a/src/target/target_request.c b/src/target/target_request.c index e84090205b..df97a65f79 100644 --- a/src/target/target_request.c +++ b/src/target/target_request.c @@ -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 * @@ -27,6 +33,7 @@ #include "target_request.h" #include "binarybuffer.h" #include "command.h" +#include "trace.h" #include #include @@ -41,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) { @@ -52,37 +59,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 +123,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 +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; } @@ -141,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 @@ -172,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; } @@ -181,21 +214,23 @@ 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 { + p = &target->dbgmsg; + c = *p; while (c) { debug_msg_receiver_t *next = c->next; @@ -203,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 @@ -211,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; }