semihost server example program
Dependencies: SWD mbed USBLocalFileSystem BaseDAP USBDAP
LPCXpresso LPC11U68 | LPCXpresso LPC1549 | FRDM-KL46Z | EA LPC4088 QSB app-board | LPC1768 app-board | LPC810 | LPC1114FN28 | |
---|---|---|---|---|---|---|---|
server | server | server | server | server | client | client | |
SWDIO | D12 | D12 | D12 | p25 | p21 | p4(P0_2) | p12 |
SWCLK | D10 | D10 | D10 | p26 | p22 | p3(P0_3) | p3 |
nRESET *option | D6 | D6 | D6 | p34 | p30 | p1(P0_5) | p23 |
GND | GND | GND | GND | p1 | p1 | p7 | p22 |
3.3V | P3V3 | P3V3 | P3V3 | p44 | p40 | p6 | p21 |
flash write | SW2(P0_1) | SW3(P1_9) | SW1 | p14 joystick center | p14 joystick center |
client example:
Import programlpc810-semihost_helloworld
semihost client example program
tests/mydebug.cpp@18:5ed1759e863b, 2014-06-22 (annotated)
- 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?
User | Revision | Line number | New 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 |