semihost server example program

Dependencies:   SWD mbed USBLocalFileSystem BaseDAP USBDAP

/media/uploads/va009039/kl46z-lpc800-360x480.jpg

LPCXpresso
LPC11U68
LPCXpresso
LPC1549
FRDM-KL46ZEA LPC4088 QSB
app-board
LPC1768
app-board
LPC810LPC1114FN28
serverserverserverserverserverclientclient
SWDIOD12D12D12p25p21p4(P0_2)p12
SWCLKD10D10D10p26p22p3(P0_3)p3
nRESET
*option
D6D6D6p34p30p1(P0_5)p23
GNDGNDGNDGNDp1p1p7p22
3.3VP3V3P3V3P3V3p44p40p6p21
flash writeSW2(P0_1)SW3(P1_9)SW1p14
joystick
center
p14
joystick
center

client example:

Import programlpc810-semihost_helloworld

semihost client example program

Committer:
va009039
Date:
Sun Jun 22 12:04:16 2014 +0000
Revision:
18:5ed1759e863b
Parent:
12:2a7ca1f9619b
add LPC11U68 interface.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 18:5ed1759e863b 1 // mydebug.cpp 2014/6/22
va009039 4:5e4107edcbdb 2 #include "mydebug.h"
va009039 4:5e4107edcbdb 3 #ifdef MY_DEBUG
va009039 18:5ed1759e863b 4 #include "mbed.h"
va009039 18:5ed1759e863b 5
va009039 18:5ed1759e863b 6 struct trace_info {
va009039 18:5ed1759e863b 7 uint32_t timestamp_ms;
va009039 18:5ed1759e863b 8 const char* func;
va009039 18:5ed1759e863b 9 int line;
va009039 18:5ed1759e863b 10 uint32_t value;
va009039 18:5ed1759e863b 11 };
va009039 18:5ed1759e863b 12
va009039 18:5ed1759e863b 13 struct StTrace {
va009039 18:5ed1759e863b 14 static const int TRACE_MAX = 32;
va009039 18:5ed1759e863b 15 trace_info buf[TRACE_MAX];
va009039 18:5ed1759e863b 16 int pos;
va009039 18:5ed1759e863b 17 int count;
va009039 18:5ed1759e863b 18 Timer t;
va009039 18:5ed1759e863b 19 StTrace() {
va009039 18:5ed1759e863b 20 clear();
va009039 18:5ed1759e863b 21 t.reset();
va009039 18:5ed1759e863b 22 t.start();
va009039 18:5ed1759e863b 23 }
va009039 18:5ed1759e863b 24 void clear() {
va009039 18:5ed1759e863b 25 pos = 0;
va009039 18:5ed1759e863b 26 count = 0;
va009039 18:5ed1759e863b 27 }
va009039 18:5ed1759e863b 28 void view() {
va009039 18:5ed1759e863b 29 fprintf(stderr, "TRACE:\n");
va009039 18:5ed1759e863b 30 int n = pos;
va009039 18:5ed1759e863b 31 for(int i = 0; i < TRACE_MAX && i < count; i++) {
va009039 18:5ed1759e863b 32 if (--n < 0) {
va009039 18:5ed1759e863b 33 n = TRACE_MAX-1;
va009039 18:5ed1759e863b 34 }
va009039 18:5ed1759e863b 35 fprintf(stderr, "%d %s@%d %p\n", buf[n].timestamp_ms, buf[n].func, buf[n].line, buf[n].value);
va009039 18:5ed1759e863b 36 }
va009039 18:5ed1759e863b 37 }
va009039 18:5ed1759e863b 38 void put(const char* func, int line, uint32_t value = 0) {
va009039 18:5ed1759e863b 39 buf[pos].timestamp_ms = t.read_ms();
va009039 18:5ed1759e863b 40 buf[pos].func = func;
va009039 18:5ed1759e863b 41 buf[pos].line = line;
va009039 18:5ed1759e863b 42 buf[pos].value = value;
va009039 18:5ed1759e863b 43 if (++pos >= TRACE_MAX) {
va009039 18:5ed1759e863b 44 pos = 0;
va009039 18:5ed1759e863b 45 }
va009039 18:5ed1759e863b 46 count++;
va009039 18:5ed1759e863b 47 }
va009039 18:5ed1759e863b 48 };
va009039 18:5ed1759e863b 49
va009039 18:5ed1759e863b 50 StTrace trace;
va009039 18:5ed1759e863b 51
va009039 18:5ed1759e863b 52 void mytrace(const char* func, int line) {
va009039 18:5ed1759e863b 53 trace.put(func, line);
va009039 18:5ed1759e863b 54 }
va009039 18:5ed1759e863b 55
va009039 18:5ed1759e863b 56 void mytrace1(const char* func, int line, uint32_t value) {
va009039 18:5ed1759e863b 57 trace.put(func, line, value);
va009039 18:5ed1759e863b 58 }
va009039 18:5ed1759e863b 59
va009039 18:5ed1759e863b 60 void mytrace_view() {
va009039 18:5ed1759e863b 61 trace.view();
va009039 18:5ed1759e863b 62 }
va009039 18:5ed1759e863b 63
va009039 18:5ed1759e863b 64 void myassert(const char* func, int line, const char* expr) {
va009039 18:5ed1759e863b 65 fprintf(stderr, "\n\n%s@%d %s ASSERT!!!\n\n", func, line, expr);
va009039 18:5ed1759e863b 66 trace.view();
va009039 18:5ed1759e863b 67 trace.clear();
va009039 18:5ed1759e863b 68 exit(1);
va009039 18:5ed1759e863b 69 }
va009039 18:5ed1759e863b 70
va009039 4:5e4107edcbdb 71 void debug_hex(uint8_t* buf, int len)
va009039 4:5e4107edcbdb 72 {
va009039 4:5e4107edcbdb 73 for(int i = 0; i < len; i++) {
va009039 4:5e4107edcbdb 74 if ((i%16) == 0) {
va009039 4:5e4107edcbdb 75 debug("+%04x:", i);
va009039 4:5e4107edcbdb 76 }
va009039 4:5e4107edcbdb 77 debug(" %02x", buf[i]);
va009039 4:5e4107edcbdb 78 if ((i%16) == 15) {
va009039 4:5e4107edcbdb 79 debug("\n");
va009039 4:5e4107edcbdb 80 }
va009039 4:5e4107edcbdb 81 }
va009039 4:5e4107edcbdb 82 debug("\n");
va009039 4:5e4107edcbdb 83 }
va009039 4:5e4107edcbdb 84
va009039 4:5e4107edcbdb 85 void debug_dap_request(uint8_t* buf, int len)
va009039 4:5e4107edcbdb 86 {
va009039 12:2a7ca1f9619b 87 debug("uint8_t req[] = ");
va009039 4:5e4107edcbdb 88 for(int i = 0; i < len; i++) {
va009039 12:2a7ca1f9619b 89 debug("%c0x%02x", i == 0 ? '{' : ',', buf[i]);
va009039 4:5e4107edcbdb 90 }
va009039 12:2a7ca1f9619b 91 debug("};\n");
va009039 4:5e4107edcbdb 92 char* cmd;
va009039 4:5e4107edcbdb 93 char* param = "";
va009039 4:5e4107edcbdb 94 char tmp[128];
va009039 4:5e4107edcbdb 95 uint32_t count;
va009039 4:5e4107edcbdb 96 int disp_hex = 0;
va009039 4:5e4107edcbdb 97 switch(buf[0]) {
va009039 4:5e4107edcbdb 98 case 0x00:
va009039 4:5e4107edcbdb 99 cmd = "Info";
va009039 4:5e4107edcbdb 100 switch(buf[1]) {
va009039 4:5e4107edcbdb 101 case 1: param = "VENDOR"; break;
va009039 4:5e4107edcbdb 102 case 2: param = "PRODUCT"; break;
va009039 4:5e4107edcbdb 103 case 3: param = "SER_NUM"; break;
va009039 4:5e4107edcbdb 104 case 4: param = "FW_VER"; break;
va009039 4:5e4107edcbdb 105 case 0xfe: param = "PACKET_COUNT"; break;
va009039 4:5e4107edcbdb 106 case 0xff: param = "PACKET_SIZE"; break;
va009039 4:5e4107edcbdb 107 default: param = "???"; break;
va009039 4:5e4107edcbdb 108 }
va009039 4:5e4107edcbdb 109 break;
va009039 4:5e4107edcbdb 110 case 0x01:
va009039 4:5e4107edcbdb 111 cmd = "LED";
va009039 4:5e4107edcbdb 112 param = tmp;
va009039 4:5e4107edcbdb 113 switch(buf[1]) {
va009039 4:5e4107edcbdb 114 case 0: strcpy(tmp, "DEBUGGER_CONNECTED"); break;
va009039 4:5e4107edcbdb 115 case 1: strcpy(tmp, "TARGET_RUNNING"); break;
va009039 4:5e4107edcbdb 116 default: strcpy(tmp, "???"); break;
va009039 4:5e4107edcbdb 117 }
va009039 4:5e4107edcbdb 118 strcat(tmp, (buf[2]&0x01) ? " ON" : " OFF");
va009039 4:5e4107edcbdb 119 break;
va009039 4:5e4107edcbdb 120 case 0x02:
va009039 4:5e4107edcbdb 121 cmd = "Connect";
va009039 4:5e4107edcbdb 122 switch(buf[1]) {
va009039 4:5e4107edcbdb 123 case 0: param = "AUTODETECT"; break;
va009039 4:5e4107edcbdb 124 case 1: param = "SWD"; break;
va009039 4:5e4107edcbdb 125 case 2: param = "JTAG"; break;
va009039 4:5e4107edcbdb 126 default: param = "???"; break;
va009039 4:5e4107edcbdb 127 }
va009039 4:5e4107edcbdb 128 break;
va009039 4:5e4107edcbdb 129 case 0x03: cmd = "Disconnect"; break;
va009039 4:5e4107edcbdb 130 case 0x04: cmd = "TransferConfigure"; break;
va009039 4:5e4107edcbdb 131 case 0x05:
va009039 4:5e4107edcbdb 132 cmd = "Transfer";
va009039 4:5e4107edcbdb 133 disp_hex = 16;
va009039 4:5e4107edcbdb 134 break;
va009039 4:5e4107edcbdb 135 case 0x06:
va009039 4:5e4107edcbdb 136 cmd = "TransferBlock";
va009039 4:5e4107edcbdb 137 disp_hex = 16;
va009039 4:5e4107edcbdb 138 break;
va009039 4:5e4107edcbdb 139 case 0x07: cmd = "TransferAbort"; break;
va009039 4:5e4107edcbdb 140 case 0x08: cmd = "WriteABORT"; break;
va009039 4:5e4107edcbdb 141 case 0x09: cmd = "Delay"; break;
va009039 4:5e4107edcbdb 142 case 0x0a: cmd = "ResetTarget"; break;
va009039 4:5e4107edcbdb 143 case 0x10:
va009039 4:5e4107edcbdb 144 cmd = "SWJ_Pins";
va009039 12:2a7ca1f9619b 145 //snprintf(tmp, sizeof(tmp), "wait: %d us", buf[3]|buf[4]<<8|buf[5]<<16|buf[6]<<24);
va009039 4:5e4107edcbdb 146 if (buf[2] & 0x01) {
va009039 4:5e4107edcbdb 147 strcat(tmp, " SWCLK_TCK ");
va009039 4:5e4107edcbdb 148 strcat(tmp, (buf[1] & 0x01) ? "ON" : "OFF");
va009039 4:5e4107edcbdb 149 }
va009039 4:5e4107edcbdb 150 if (buf[2] & 0x02) {
va009039 4:5e4107edcbdb 151 strcat(tmp, " SWDIO_TMS ");
va009039 4:5e4107edcbdb 152 strcat(tmp, (buf[1] & 0x02) ? "ON" : "OFF");
va009039 4:5e4107edcbdb 153 }
va009039 4:5e4107edcbdb 154 if (buf[2] & 0x04) {
va009039 4:5e4107edcbdb 155 strcat(tmp, " TDI ");
va009039 4:5e4107edcbdb 156 strcat(tmp, (buf[1] & 0x04) ? "ON" : "OFF");
va009039 4:5e4107edcbdb 157 }
va009039 4:5e4107edcbdb 158 if (buf[2] & 0x08) {
va009039 4:5e4107edcbdb 159 strcat(tmp, " TDO ");
va009039 4:5e4107edcbdb 160 strcat(tmp, (buf[1] & 0x08) ? "ON" : "OFF");
va009039 4:5e4107edcbdb 161 }
va009039 4:5e4107edcbdb 162 if (buf[2] & 0x20) {
va009039 4:5e4107edcbdb 163 strcat(tmp, " nTRST ");
va009039 4:5e4107edcbdb 164 strcat(tmp, (buf[1] & 0x20) ? "ON" : "OFF");
va009039 4:5e4107edcbdb 165 }
va009039 4:5e4107edcbdb 166 if (buf[2] & 0x80) {
va009039 4:5e4107edcbdb 167 strcat(tmp, " nRESET ");
va009039 4:5e4107edcbdb 168 strcat(tmp, (buf[1] & 0x80) ? "ON" : "OFF");
va009039 4:5e4107edcbdb 169 }
va009039 4:5e4107edcbdb 170 param = tmp;
va009039 4:5e4107edcbdb 171 break;
va009039 4:5e4107edcbdb 172 case 0x11:
va009039 4:5e4107edcbdb 173 cmd = "SWJ_Clock";
va009039 12:2a7ca1f9619b 174 //snprintf(tmp, sizeof(tmp), "%d Hz", buf[1]|buf[2]<<8|buf[3]<<16|buf[4]<<24);
va009039 4:5e4107edcbdb 175 param = tmp;
va009039 4:5e4107edcbdb 176 break;
va009039 4:5e4107edcbdb 177 case 0x12:
va009039 4:5e4107edcbdb 178 cmd = "SWJ_Sequence";
va009039 4:5e4107edcbdb 179 count = buf[1];
va009039 12:2a7ca1f9619b 180 //snprintf(tmp, sizeof(tmp), "count: %d", count);
va009039 4:5e4107edcbdb 181 param = tmp;
va009039 4:5e4107edcbdb 182 break;
va009039 4:5e4107edcbdb 183 case 0x13:
va009039 4:5e4107edcbdb 184 cmd = "SWD_Configure";
va009039 12:2a7ca1f9619b 185 //snprintf(tmp, sizeof(tmp), "turnaround: %d, data_phase: %d", (buf[1]&0x03)+1, (buf[1]&0x04) ? 1 : 0);
va009039 4:5e4107edcbdb 186 param = tmp;
va009039 4:5e4107edcbdb 187 break;
va009039 4:5e4107edcbdb 188 case 0x14:
va009039 4:5e4107edcbdb 189 cmd = "JTAG_Sequence";
va009039 4:5e4107edcbdb 190 disp_hex = 16;
va009039 4:5e4107edcbdb 191 break;
va009039 4:5e4107edcbdb 192 default:
va009039 4:5e4107edcbdb 193 cmd = "???";
va009039 4:5e4107edcbdb 194 disp_hex = 16;
va009039 4:5e4107edcbdb 195 break;
va009039 4:5e4107edcbdb 196 }
va009039 4:5e4107edcbdb 197 debug("DAP: %s %s ", cmd, param);
va009039 4:5e4107edcbdb 198 for(int i = 0; i < disp_hex; i++) {
va009039 4:5e4107edcbdb 199 debug("%02x ", buf[i]);
va009039 4:5e4107edcbdb 200 }
va009039 4:5e4107edcbdb 201 debug("\n");
va009039 4:5e4107edcbdb 202 }
va009039 4:5e4107edcbdb 203
va009039 4:5e4107edcbdb 204 void debug_dap_response(uint8_t* buf, int len)
va009039 4:5e4107edcbdb 205 {
va009039 12:2a7ca1f9619b 206 debug("uint8_t res[] = ");
va009039 4:5e4107edcbdb 207 for(int i = 0; i < len; i++) {
va009039 12:2a7ca1f9619b 208 debug("%c0x%02x", i == 0 ? '{' : ',', buf[i]);
va009039 4:5e4107edcbdb 209 }
va009039 12:2a7ca1f9619b 210 debug("};\n");
va009039 4:5e4107edcbdb 211 }
va009039 4:5e4107edcbdb 212
va009039 4:5e4107edcbdb 213 void debug_swd_transfer(uint8_t request, uint32_t wdata, uint32_t rdata, uint8_t ack)
va009039 4:5e4107edcbdb 214 {
va009039 4:5e4107edcbdb 215 debug("SWD: ");
va009039 4:5e4107edcbdb 216 if (ack != 0x01) {
va009039 4:5e4107edcbdb 217 debug("ERR req=%02x wdata=%08x rdata=%08x ack=%02x\n", request, wdata, rdata, ack);
va009039 4:5e4107edcbdb 218 return;
va009039 4:5e4107edcbdb 219 }
va009039 4:5e4107edcbdb 220 switch(request) {
va009039 4:5e4107edcbdb 221 case 0x00: debug("DP_ABORT %08x", wdata); break;
va009039 4:5e4107edcbdb 222 case 0x01: debug("AP_CSW W %08x", wdata); break;
va009039 4:5e4107edcbdb 223 case 0x02: debug("DP_IDCODE %08x", rdata); break;
va009039 4:5e4107edcbdb 224 case 0x03: debug("AP_CSW R %08x", rdata); break;
va009039 4:5e4107edcbdb 225 case 0x04: debug("DP_CTRL_STAT W %08x", wdata); break;
va009039 4:5e4107edcbdb 226 case 0x05: debug("AP_TAR W %08x", wdata); break;
va009039 4:5e4107edcbdb 227 case 0x06: debug("DP_CTRL_STAT R %08x", rdata); break;
va009039 4:5e4107edcbdb 228 case 0x07: debug("AP_TAR R %08x", rdata); break;
va009039 4:5e4107edcbdb 229 case 0x08: debug("DP_SELECT %08x", wdata); break;
va009039 4:5e4107edcbdb 230 case 0x0a: debug("DP_RESEND %08x", rdata); break;
va009039 4:5e4107edcbdb 231 //case 0x0b: debug("DP_RDBUFF W %08x", wdata); break;
va009039 4:5e4107edcbdb 232 case 0x0d: debug("AP_DRW W %08x", wdata); break;
va009039 4:5e4107edcbdb 233 case 0x0e: debug("DP_RDBUFF %08x", rdata); break;
va009039 4:5e4107edcbdb 234 case 0x0f: debug("AP_DRW R %08x", rdata); break;
va009039 4:5e4107edcbdb 235 default:
va009039 4:5e4107edcbdb 236 debug("request=%02x wdata=%08x rdata=%08x ack=%02x", request, wdata, rdata, ack);
va009039 4:5e4107edcbdb 237 break;
va009039 4:5e4107edcbdb 238 }
va009039 4:5e4107edcbdb 239 debug(" request=%02x(%s %s %x) wdata=%08x rdata=%08x ack=%02x", request,
va009039 4:5e4107edcbdb 240 request&1?"AP":"DP", request&2?"R":"nW",
va009039 4:5e4107edcbdb 241 request&0xfc,
va009039 4:5e4107edcbdb 242 wdata, rdata, ack);
va009039 4:5e4107edcbdb 243 debug("\n");
va009039 4:5e4107edcbdb 244 }
va009039 4:5e4107edcbdb 245
va009039 4:5e4107edcbdb 246 #endif