diff --git a/contrib/libdcc/README b/contrib/libdcc/README index 9e623070c..d67ccce3f 100644 --- a/contrib/libdcc/README +++ b/contrib/libdcc/README @@ -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 will need enabling: -** GDB ** -From the gdb prompt: monitor target_request debugmsgs enable +From the gdb prompt: +monitor target_request debugmsgs enable +monitor trace point 1 -** Telnet ** -From the Telnet prompt: target_request debugmsgs enable +From the Telnet prompt: +target_request debugmsgs enable +trace point 1 + +To see how many times the trace point was hit: +(monitor) trace point 1 Spen spen@spen-soft.co.uk diff --git a/contrib/libdcc/dcc_stdio.c b/contrib/libdcc/dcc_stdio.c index edc55c599..3d8dfc714 100644 --- a/contrib/libdcc/dcc_stdio.c +++ b/contrib/libdcc/dcc_stdio.c @@ -3,6 +3,8 @@ * Dominic.Rath@gmx.de * * Copyright (C) 2008 by Spencer Oliver * * 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 * * 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[31:24] is used for by host for write buffer */ -#define DCRDR_WRSTS *((volatile u8*)0xE000EDF8) -#define DCRDR_WRDAT *((volatile u8*)0xE000EDF9) +#define NVIC_DBG_DATA_R (*((volatile unsigned short *)0xE000EDF8)) + +#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 -void dbg_write(u32 dcc_data) +void dbg_write(unsigned long dcc_data) { int len = 4; while (len--) { /* wait for data ready */ - while (DCRDR_WRSTS & BUSY); + while (NVIC_DBG_DATA_R & BUSY); - /* write our data */ - DCRDR_WRDAT = (u8)(dcc_data & 0xff); - /* set write flag - tell host there is data */ - DCRDR_WRSTS = BUSY; + /* write our data and set write flag - tell host there is data*/ + NVIC_DBG_DATA_R = (unsigned short)(((dcc_data & 0xff) << 8) | BUSY); dcc_data >>= 8; } } #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 { asm volatile("mrc p14, 0, %0, c0, c0" : "=r" (dcc_status)); @@ -69,10 +73,14 @@ void dbg_write(u32 dcc_data) #error unsupported target #endif - -void dbg_write_u32(u32 *val, u32 len) +void dbg_trace_point(unsigned long number) { - 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) { @@ -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) { - dcc_data = val[0] | (val[1] << 8) - | ((len > 1) ? (val[2] | (val[3] << 8)) << 16 : 0x00); + dcc_data = val[0] + | ((len > 1) ? val[1] << 16: 0x0000); 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) { @@ -116,22 +124,22 @@ void dbg_write_u8(u8 *val, u32 len) dbg_write(dcc_data); - val += 2; - len -= 2; + val += 4; + len -= 4; } } -void dbg_write_str(u8 *msg) +void dbg_write_str(const char *msg) { - int len; - u32 dcc_data; + long len; + unsigned long dcc_data; 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) - { + { dcc_data = msg[0] | ((len > 1) ? msg[1] << 8 : 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)); } diff --git a/contrib/libdcc/dcc_stdio.h b/contrib/libdcc/dcc_stdio.h index d7546d7b6..d16f2a789 100644 --- a/contrib/libdcc/dcc_stdio.h +++ b/contrib/libdcc/dcc_stdio.h @@ -23,15 +23,13 @@ #ifndef DCC_STDIO_H #define DCC_STDIO_H -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned long u32; +void dbg_trace_point(unsigned long number); -void dbg_write_u32(u32 *val, u32 len); -void dbg_write_u16(u16 *val, u32 len); -void dbg_write_u8(u8 *val, u32 len); +void dbg_write_u32(const unsigned long *val, long len); +void dbg_write_u16(const unsigned short *val, long len); +void dbg_write_u8(const unsigned char *val, long len); -void dbg_write_str(u8 *msg); -void dbg_write_char(u8 msg); +void dbg_write_str(const char *msg); +void dbg_write_char(char msg); #endif /* DCC_STDIO_H */ diff --git a/contrib/libdcc/example.c b/contrib/libdcc/example.c index 42a9bd58d..d456f3955 100644 --- a/contrib/libdcc/example.c +++ b/contrib/libdcc/example.c @@ -1,6 +1,8 @@ /*************************************************************************** * Copyright (C) 2008 by Spencer Oliver * * 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 * * it under the terms of the GNU General Public License as published by * @@ -20,13 +22,37 @@ #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) { - /* enable openocd debugmsg at the gdb prompt - * monitor target_request debugmsgs enable */ - dbg_write_str("hello world"); - dbg_write_char('a'); - - while(1) {} + + dbg_write_char('t'); + 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); + } }