Signed-off-by: Frederik Kriewitz <frederik@kriewitz.eu> libdcc bugfixes + trace point function

git-svn-id: svn://svn.berlios.de/openocd/trunk@1028 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
oharboe 2008-10-08 05:05:57 +00:00
parent 9d4f9dbd0b
commit eadd49bef0
4 changed files with 85 additions and 48 deletions

View File

@ -3,11 +3,16 @@ This code is an example of using the openocd debug message system.
Before the message output is seen in the debug window, the functionality Before the message output is seen in the debug window, the functionality
will need enabling: will need enabling:
** GDB ** From the gdb prompt:
From the gdb prompt: monitor target_request debugmsgs enable monitor target_request debugmsgs enable
monitor trace point 1
** Telnet ** From the Telnet prompt:
From the Telnet prompt: target_request debugmsgs enable target_request debugmsgs enable
trace point 1
To see how many times the trace point was hit:
(monitor) trace point 1
Spen Spen
spen@spen-soft.co.uk spen@spen-soft.co.uk

View File

@ -3,6 +3,8 @@
* Dominic.Rath@gmx.de * * Dominic.Rath@gmx.de *
* Copyright (C) 2008 by Spencer Oliver * * Copyright (C) 2008 by Spencer Oliver *
* spen@spen-soft.co.uk * * spen@spen-soft.co.uk *
* Copyright (C) 2008 by Frederik Kriewtz *
* frederik@kriewitz.eu *
* * * *
* This program is free software; you can redistribute it and/or modify * * 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 * * it under the terms of the GNU General Public License as published by *
@ -30,33 +32,35 @@
* DCRDR[23:16] is used for by host for status * DCRDR[23:16] is used for by host for status
* DCRDR[31:24] is used for by host for write buffer */ * DCRDR[31:24] is used for by host for write buffer */
#define DCRDR_WRSTS *((volatile u8*)0xE000EDF8) #define NVIC_DBG_DATA_R (*((volatile unsigned short *)0xE000EDF8))
#define DCRDR_WRDAT *((volatile u8*)0xE000EDF9)
#define TARGET_REQ_TRACEMSG 0x00
#define TARGET_REQ_DEBUGMSG_ASCII 0x01
#define TARGET_REQ_DEBUGMSG_HEXMSG(size) (0x01 | ((size & 0xff) << 8))
#define TARGET_REQ_DEBUGCHAR 0x02
#define BUSY 1 #define BUSY 1
void dbg_write(u32 dcc_data) void dbg_write(unsigned long dcc_data)
{ {
int len = 4; int len = 4;
while (len--) while (len--)
{ {
/* wait for data ready */ /* wait for data ready */
while (DCRDR_WRSTS & BUSY); while (NVIC_DBG_DATA_R & BUSY);
/* write our data */ /* write our data and set write flag - tell host there is data*/
DCRDR_WRDAT = (u8)(dcc_data & 0xff); NVIC_DBG_DATA_R = (unsigned short)(((dcc_data & 0xff) << 8) | BUSY);
/* set write flag - tell host there is data */
DCRDR_WRSTS = BUSY;
dcc_data >>= 8; dcc_data >>= 8;
} }
} }
#elif defined(__ARM_ARCH_4T__) || defined(__ARM_ARCH_5TE__) #elif defined(__ARM_ARCH_4T__) || defined(__ARM_ARCH_5TE__)
void dbg_write(u32 dcc_data) void dbg_write(unsigned long dcc_data)
{ {
u32 dcc_status; unsigned long dcc_status;
do { do {
asm volatile("mrc p14, 0, %0, c0, c0" : "=r" (dcc_status)); asm volatile("mrc p14, 0, %0, c0, c0" : "=r" (dcc_status));
@ -69,10 +73,14 @@ void dbg_write(u32 dcc_data)
#error unsupported target #error unsupported target
#endif #endif
void dbg_trace_point(unsigned long number)
void dbg_write_u32(u32 *val, u32 len)
{ {
dbg_write(0x01 | 0x0400 | ((len & 0xffff) << 16)); dbg_write(TARGET_REQ_TRACEMSG | (number << 8));
}
void dbg_write_u32(const unsigned long *val, long len)
{
dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(4) | ((len & 0xffff) << 16));
while (len > 0) while (len > 0)
{ {
@ -83,16 +91,16 @@ void dbg_write_u32(u32 *val, u32 len)
} }
} }
void dbg_write_u16(u16 *val, u32 len) void dbg_write_u16(const unsigned short *val, long len)
{ {
u32 dcc_data; unsigned long dcc_data;
dbg_write(0x01 | 0x0200 | ((len & 0xffff) << 16)); dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(2) | ((len & 0xffff) << 16));
while (len > 0) while (len > 0)
{ {
dcc_data = val[0] | (val[1] << 8) dcc_data = val[0]
| ((len > 1) ? (val[2] | (val[3] << 8)) << 16 : 0x00); | ((len > 1) ? val[1] << 16: 0x0000);
dbg_write(dcc_data); dbg_write(dcc_data);
@ -101,11 +109,11 @@ void dbg_write_u16(u16 *val, u32 len)
} }
} }
void dbg_write_u8(u8 *val, u32 len) void dbg_write_u8(const unsigned char *val, long len)
{ {
u32 dcc_data; unsigned long dcc_data;
dbg_write(0x01 | 0x0100 | ((len & 0xffff) << 16)); dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(1) | ((len & 0xffff) << 16));
while (len > 0) while (len > 0)
{ {
@ -116,22 +124,22 @@ void dbg_write_u8(u8 *val, u32 len)
dbg_write(dcc_data); dbg_write(dcc_data);
val += 2; val += 4;
len -= 2; len -= 4;
} }
} }
void dbg_write_str(u8 *msg) void dbg_write_str(const char *msg)
{ {
int len; long len;
u32 dcc_data; unsigned long dcc_data;
for (len = 0; msg[len] && (len < 65536); len++); for (len = 0; msg[len] && (len < 65536); len++);
dbg_write(0x01 | ((len & 0xffff) << 16)); dbg_write(TARGET_REQ_DEBUGMSG_ASCII | ((len & 0xffff) << 16));
while (len > 0) while (len > 0)
{ {
dcc_data = msg[0] dcc_data = msg[0]
| ((len > 1) ? msg[1] << 8 : 0x00) | ((len > 1) ? msg[1] << 8 : 0x00)
| ((len > 2) ? msg[2] << 16 : 0x00) | ((len > 2) ? msg[2] << 16 : 0x00)
@ -143,7 +151,7 @@ void dbg_write_str(u8 *msg)
} }
} }
void dbg_write_char(u8 msg) void dbg_write_char(char msg)
{ {
dbg_write(0x02 | ((msg & 0xff) << 16)); dbg_write(TARGET_REQ_DEBUGCHAR | ((msg & 0xff) << 16));
} }

View File

@ -23,15 +23,13 @@
#ifndef DCC_STDIO_H #ifndef DCC_STDIO_H
#define DCC_STDIO_H #define DCC_STDIO_H
typedef unsigned char u8; void dbg_trace_point(unsigned long number);
typedef unsigned short u16;
typedef unsigned long u32;
void dbg_write_u32(u32 *val, u32 len); void dbg_write_u32(const unsigned long *val, long len);
void dbg_write_u16(u16 *val, u32 len); void dbg_write_u16(const unsigned short *val, long len);
void dbg_write_u8(u8 *val, u32 len); void dbg_write_u8(const unsigned char *val, long len);
void dbg_write_str(u8 *msg); void dbg_write_str(const char *msg);
void dbg_write_char(u8 msg); void dbg_write_char(char msg);
#endif /* DCC_STDIO_H */ #endif /* DCC_STDIO_H */

View File

@ -1,6 +1,8 @@
/*************************************************************************** /***************************************************************************
* Copyright (C) 2008 by Spencer Oliver * * Copyright (C) 2008 by Spencer Oliver *
* spen@spen-soft.co.uk * * spen@spen-soft.co.uk *
* Copyright (C) 2008 by Frederik Kriewtz *
* frederik@kriewitz.eu *
* * * *
* This program is free software; you can redistribute it and/or modify * * 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 * * it under the terms of the GNU General Public License as published by *
@ -20,13 +22,37 @@
#include "dcc_stdio.h" #include "dcc_stdio.h"
/* enable openocd debugmsg at the gdb prompt:
* monitor target_request debugmsgs enable
*
* create a trace point:
* monitor trace point 1
*
* to show how often the trace point was hit:
* monitor trace point
*/
int main(void) int main(void)
{ {
/* enable openocd debugmsg at the gdb prompt
* monitor target_request debugmsgs enable */
dbg_write_str("hello world"); dbg_write_str("hello world");
dbg_write_char('a');
dbg_write_char('t');
while(1) {} dbg_write_char('e');
dbg_write_char('s');
dbg_write_char('t');
dbg_write_char('\n');
unsigned long test_u32 = 0x01234567;
dbg_write_u32(&test_u32, 1);
static const unsigned short test_u16[] = {0x0123, 0x4567, 0x89AB, 0xCDEF, 0x0123, 0x4567, 0x89AB, 0xCDEF};
dbg_write_u16(test_u16, 8);
static const unsigned char test_u8[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0XDD, 0xEE, 0xFF};
dbg_write_u8(test_u8, 16);
while(1)
{
dbg_trace_point(0);
}
} }