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__archive__
parent
9d4f9dbd0b
commit
eadd49bef0
|
@ -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
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue