jtag: linuxgpiod: drop extra parenthesis
[openocd.git] / contrib / libdcc / dcc_stdio.c
blob9ad633b61c3ab54398b0f9c2261a0648ec169353
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 /***************************************************************************
4 * Copyright (C) 2008 by Dominic Rath *
5 * Dominic.Rath@gmx.de *
6 * Copyright (C) 2008 by Spencer Oliver *
7 * spen@spen-soft.co.uk *
8 * Copyright (C) 2008 by Frederik Kriewtz *
9 * frederik@kriewitz.eu *
10 ***************************************************************************/
12 #include "dcc_stdio.h"
14 #define TARGET_REQ_TRACEMSG 0x00
15 #define TARGET_REQ_DEBUGMSG_ASCII 0x01
16 #define TARGET_REQ_DEBUGMSG_HEXMSG(size) (0x01 | ((size & 0xff) << 8))
17 #define TARGET_REQ_DEBUGCHAR 0x02
19 #if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_6SM__)
21 /* we use the System Control Block DCRDR reg to simulate a arm7_9 dcc channel
22 * DCRDR[7:0] is used by target for status
23 * DCRDR[15:8] is used by target for write buffer
24 * DCRDR[23:16] is used for by host for status
25 * DCRDR[31:24] is used for by host for write buffer */
27 #define NVIC_DBG_DATA_R (*((volatile unsigned short *)0xE000EDF8))
29 #define BUSY 1
31 void dbg_write(unsigned long dcc_data)
33 int len = 4;
35 while (len--)
37 /* wait for data ready */
38 while (NVIC_DBG_DATA_R & BUSY);
40 /* write our data and set write flag - tell host there is data*/
41 NVIC_DBG_DATA_R = (unsigned short)(((dcc_data & 0xff) << 8) | BUSY);
42 dcc_data >>= 8;
46 #elif defined(__ARM_ARCH_4T__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5T__)
48 void dbg_write(unsigned long dcc_data)
50 unsigned long dcc_status;
52 do {
53 asm volatile("mrc p14, 0, %0, c0, c0" : "=r" (dcc_status));
54 } while (dcc_status & 0x2);
56 asm volatile("mcr p14, 0, %0, c1, c0" : : "r" (dcc_data));
59 #else
60 #error unsupported target
61 #endif
63 void dbg_trace_point(unsigned long number)
65 dbg_write(TARGET_REQ_TRACEMSG | (number << 8));
68 void dbg_write_u32(const unsigned long *val, long len)
70 dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(4) | ((len & 0xffff) << 16));
72 while (len > 0)
74 dbg_write(*val);
76 val++;
77 len--;
81 void dbg_write_u16(const unsigned short *val, long len)
83 unsigned long dcc_data;
85 dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(2) | ((len & 0xffff) << 16));
87 while (len > 0)
89 dcc_data = val[0]
90 | ((len > 1) ? val[1] << 16: 0x0000);
92 dbg_write(dcc_data);
94 val += 2;
95 len -= 2;
99 void dbg_write_u8(const unsigned char *val, long len)
101 unsigned long dcc_data;
103 dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(1) | ((len & 0xffff) << 16));
105 while (len > 0)
107 dcc_data = val[0]
108 | ((len > 1) ? val[1] << 8 : 0x00)
109 | ((len > 2) ? val[2] << 16 : 0x00)
110 | ((len > 3) ? val[3] << 24 : 0x00);
112 dbg_write(dcc_data);
114 val += 4;
115 len -= 4;
119 void dbg_write_str(const char *msg)
121 long len;
122 unsigned long dcc_data;
124 for (len = 0; msg[len] && (len < 65536); len++);
126 dbg_write(TARGET_REQ_DEBUGMSG_ASCII | ((len & 0xffff) << 16));
128 while (len > 0)
130 dcc_data = msg[0]
131 | ((len > 1) ? msg[1] << 8 : 0x00)
132 | ((len > 2) ? msg[2] << 16 : 0x00)
133 | ((len > 3) ? msg[3] << 24 : 0x00);
134 dbg_write(dcc_data);
136 msg += 4;
137 len -= 4;
141 void dbg_write_char(char msg)
143 dbg_write(TARGET_REQ_DEBUGCHAR | ((msg & 0xff) << 16));