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
- Committer:
- va009039
- Date:
- 2013-09-11
- Revision:
- 4:5e4107edcbdb
- Child:
- 12:2a7ca1f9619b
File content as of revision 4:5e4107edcbdb:
// mydebug.cpp 2013/4/22 #include "mydebug.h" #ifdef MY_DEBUG #include <string.h> void debug_hex(uint8_t* buf, int len) { for(int i = 0; i < len; i++) { if ((i%16) == 0) { debug("+%04x:", i); } debug(" %02x", buf[i]); if ((i%16) == 15) { debug("\n"); } } debug("\n"); } void debug_dap_request(uint8_t* buf, int len) { printf("uint8_t req[] = "); for(int i = 0; i < len; i++) { printf("%c0x%02x", i == 0 ? '{' : ',', buf[i]); } printf("};\n"); char* cmd; char* param = ""; char tmp[128]; uint32_t count; int disp_hex = 0; switch(buf[0]) { case 0x00: cmd = "Info"; switch(buf[1]) { case 1: param = "VENDOR"; break; case 2: param = "PRODUCT"; break; case 3: param = "SER_NUM"; break; case 4: param = "FW_VER"; break; case 0xfe: param = "PACKET_COUNT"; break; case 0xff: param = "PACKET_SIZE"; break; default: param = "???"; break; } break; case 0x01: cmd = "LED"; param = tmp; switch(buf[1]) { case 0: strcpy(tmp, "DEBUGGER_CONNECTED"); break; case 1: strcpy(tmp, "TARGET_RUNNING"); break; default: strcpy(tmp, "???"); break; } strcat(tmp, (buf[2]&0x01) ? " ON" : " OFF"); break; case 0x02: cmd = "Connect"; switch(buf[1]) { case 0: param = "AUTODETECT"; break; case 1: param = "SWD"; break; case 2: param = "JTAG"; break; default: param = "???"; break; } break; case 0x03: cmd = "Disconnect"; break; case 0x04: cmd = "TransferConfigure"; break; case 0x05: cmd = "Transfer"; disp_hex = 16; break; case 0x06: cmd = "TransferBlock"; disp_hex = 16; break; case 0x07: cmd = "TransferAbort"; break; case 0x08: cmd = "WriteABORT"; break; case 0x09: cmd = "Delay"; break; case 0x0a: cmd = "ResetTarget"; break; case 0x10: cmd = "SWJ_Pins"; snprintf(tmp, sizeof(tmp), "wait: %d us", buf[3]|buf[4]<<8|buf[5]<<16|buf[6]<<24); if (buf[2] & 0x01) { strcat(tmp, " SWCLK_TCK "); strcat(tmp, (buf[1] & 0x01) ? "ON" : "OFF"); } if (buf[2] & 0x02) { strcat(tmp, " SWDIO_TMS "); strcat(tmp, (buf[1] & 0x02) ? "ON" : "OFF"); } if (buf[2] & 0x04) { strcat(tmp, " TDI "); strcat(tmp, (buf[1] & 0x04) ? "ON" : "OFF"); } if (buf[2] & 0x08) { strcat(tmp, " TDO "); strcat(tmp, (buf[1] & 0x08) ? "ON" : "OFF"); } if (buf[2] & 0x20) { strcat(tmp, " nTRST "); strcat(tmp, (buf[1] & 0x20) ? "ON" : "OFF"); } if (buf[2] & 0x80) { strcat(tmp, " nRESET "); strcat(tmp, (buf[1] & 0x80) ? "ON" : "OFF"); } param = tmp; break; case 0x11: cmd = "SWJ_Clock"; snprintf(tmp, sizeof(tmp), "%d Hz", buf[1]|buf[2]<<8|buf[3]<<16|buf[4]<<24); param = tmp; break; case 0x12: cmd = "SWJ_Sequence"; count = buf[1]; snprintf(tmp, sizeof(tmp), "count: %d", count); param = tmp; break; case 0x13: cmd = "SWD_Configure"; snprintf(tmp, sizeof(tmp), "turnaround: %d, data_phase: %d", (buf[1]&0x03)+1, (buf[1]&0x04) ? 1 : 0); param = tmp; break; case 0x14: cmd = "JTAG_Sequence"; disp_hex = 16; break; default: cmd = "???"; disp_hex = 16; break; } debug("DAP: %s %s ", cmd, param); for(int i = 0; i < disp_hex; i++) { debug("%02x ", buf[i]); } debug("\n"); } void debug_dap_response(uint8_t* buf, int len) { printf("uint8_t res[] = "); for(int i = 0; i < len; i++) { printf("%c0x%02x", i == 0 ? '{' : ',', buf[i]); } printf("};\n"); } void debug_swd_transfer(uint8_t request, uint32_t wdata, uint32_t rdata, uint8_t ack) { debug("SWD: "); if (ack != 0x01) { debug("ERR req=%02x wdata=%08x rdata=%08x ack=%02x\n", request, wdata, rdata, ack); return; } switch(request) { case 0x00: debug("DP_ABORT %08x", wdata); break; case 0x01: debug("AP_CSW W %08x", wdata); break; case 0x02: debug("DP_IDCODE %08x", rdata); break; case 0x03: debug("AP_CSW R %08x", rdata); break; case 0x04: debug("DP_CTRL_STAT W %08x", wdata); break; case 0x05: debug("AP_TAR W %08x", wdata); break; case 0x06: debug("DP_CTRL_STAT R %08x", rdata); break; case 0x07: debug("AP_TAR R %08x", rdata); break; case 0x08: debug("DP_SELECT %08x", wdata); break; case 0x0a: debug("DP_RESEND %08x", rdata); break; //case 0x0b: debug("DP_RDBUFF W %08x", wdata); break; case 0x0d: debug("AP_DRW W %08x", wdata); break; case 0x0e: debug("DP_RDBUFF %08x", rdata); break; case 0x0f: debug("AP_DRW R %08x", rdata); break; default: debug("request=%02x wdata=%08x rdata=%08x ack=%02x", request, wdata, rdata, ack); break; } debug(" request=%02x(%s %s %x) wdata=%08x rdata=%08x ack=%02x", request, request&1?"AP":"DP", request&2?"R":"nW", request&0xfc, wdata, rdata, ack); debug("\n"); } #endif