X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=contrib%2Flibdcc%2Fdcc_stdio.c;h=a25e7dd169bc5aa4f3b5443a3d372f3cf2f9023c;hp=3d8dfc7141f66c819685897b5ec663656fc269aa;hb=983f5a1ae932d40109031cfec8162f820cfc6f39;hpb=eadd49bef0960e015de084a41571c32e2ffbff41 diff --git a/contrib/libdcc/dcc_stdio.c b/contrib/libdcc/dcc_stdio.c index 3d8dfc7141..a25e7dd169 100644 --- a/contrib/libdcc/dcc_stdio.c +++ b/contrib/libdcc/dcc_stdio.c @@ -24,6 +24,11 @@ #include "dcc_stdio.h" +#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 + #if defined(__ARM_ARCH_7M__) /* we use the cortex_m3 DCRDR reg to simulate a arm7_9 dcc channel @@ -32,40 +37,35 @@ * DCRDR[23:16] is used for by host for status * DCRDR[31:24] is used for by host for write buffer */ -#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 NVIC_DBG_DATA_R (*((volatile unsigned short *)0xE000EDF8)) #define BUSY 1 void dbg_write(unsigned long dcc_data) { int len = 4; - + while (len--) { /* wait for data ready */ while (NVIC_DBG_DATA_R & 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__) - +#elif defined(__ARM_ARCH_4T__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5T__) + void dbg_write(unsigned long dcc_data) { unsigned long dcc_status; - + do { asm volatile("mrc p14, 0, %0, c0, c0" : "=r" (dcc_status)); } while (dcc_status & 0x2); - + asm volatile("mcr p14, 0, %0, c1, c0" : : "r" (dcc_data)); } @@ -74,18 +74,18 @@ void dbg_write(unsigned long dcc_data) #endif void dbg_trace_point(unsigned long number) -{ +{ 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) { dbg_write(*val); - + val++; len--; } @@ -94,23 +94,23 @@ void dbg_write_u32(const unsigned long *val, long len) void dbg_write_u16(const unsigned short *val, long len) { unsigned long dcc_data; - + dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(2) | ((len & 0xffff) << 16)); while (len > 0) { dcc_data = val[0] | ((len > 1) ? val[1] << 16: 0x0000); - + dbg_write(dcc_data); - + val += 2; len -= 2; } } void dbg_write_u8(const unsigned char *val, long len) -{ +{ unsigned long dcc_data; dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(1) | ((len & 0xffff) << 16)); @@ -121,9 +121,9 @@ void dbg_write_u8(const unsigned char *val, long len) | ((len > 1) ? val[1] << 8 : 0x00) | ((len > 2) ? val[2] << 16 : 0x00) | ((len > 3) ? val[3] << 24 : 0x00); - + dbg_write(dcc_data); - + val += 4; len -= 4; } @@ -133,11 +133,11 @@ void dbg_write_str(const char *msg) { long len; unsigned long dcc_data; - + for (len = 0; msg[len] && (len < 65536); len++); - + dbg_write(TARGET_REQ_DEBUGMSG_ASCII | ((len & 0xffff) << 16)); - + while (len > 0) { dcc_data = msg[0] @@ -152,6 +152,6 @@ void dbg_write_str(const char *msg) } void dbg_write_char(char msg) -{ +{ dbg_write(TARGET_REQ_DEBUGCHAR | ((msg & 0xff) << 16)); }