USB composite device example program, drag-and-drop flash writer.
Dependencies: SWD USBDevice mbed BaseDAP
tests/mydebug.cpp@0:2385683c867a, 2013-09-17 (annotated)
- Committer:
- va009039
- Date:
- Tue Sep 17 04:33:44 2013 +0000
- Revision:
- 0:2385683c867a
- Child:
- 1:ea8e179320d7
first commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 0:2385683c867a | 1 | // mydebug.cpp 2013/4/22 |
va009039 | 0:2385683c867a | 2 | #include "mydebug.h" |
va009039 | 0:2385683c867a | 3 | #ifdef MY_DEBUG |
va009039 | 0:2385683c867a | 4 | #include <string.h> |
va009039 | 0:2385683c867a | 5 | void debug_hex(uint8_t* buf, int len) |
va009039 | 0:2385683c867a | 6 | { |
va009039 | 0:2385683c867a | 7 | for(int i = 0; i < len; i++) { |
va009039 | 0:2385683c867a | 8 | if ((i%16) == 0) { |
va009039 | 0:2385683c867a | 9 | debug("+%04x:", i); |
va009039 | 0:2385683c867a | 10 | } |
va009039 | 0:2385683c867a | 11 | debug(" %02x", buf[i]); |
va009039 | 0:2385683c867a | 12 | if ((i%16) == 15) { |
va009039 | 0:2385683c867a | 13 | debug("\n"); |
va009039 | 0:2385683c867a | 14 | } |
va009039 | 0:2385683c867a | 15 | } |
va009039 | 0:2385683c867a | 16 | debug("\n"); |
va009039 | 0:2385683c867a | 17 | } |
va009039 | 0:2385683c867a | 18 | |
va009039 | 0:2385683c867a | 19 | void debug_dap_request(uint8_t* buf, int len) |
va009039 | 0:2385683c867a | 20 | { |
va009039 | 0:2385683c867a | 21 | printf("uint8_t req[] = "); |
va009039 | 0:2385683c867a | 22 | for(int i = 0; i < len; i++) { |
va009039 | 0:2385683c867a | 23 | printf("%c0x%02x", i == 0 ? '{' : ',', buf[i]); |
va009039 | 0:2385683c867a | 24 | } |
va009039 | 0:2385683c867a | 25 | printf("};\n"); |
va009039 | 0:2385683c867a | 26 | char* cmd; |
va009039 | 0:2385683c867a | 27 | char* param = ""; |
va009039 | 0:2385683c867a | 28 | char tmp[128]; |
va009039 | 0:2385683c867a | 29 | uint32_t count; |
va009039 | 0:2385683c867a | 30 | int disp_hex = 0; |
va009039 | 0:2385683c867a | 31 | switch(buf[0]) { |
va009039 | 0:2385683c867a | 32 | case 0x00: |
va009039 | 0:2385683c867a | 33 | cmd = "Info"; |
va009039 | 0:2385683c867a | 34 | switch(buf[1]) { |
va009039 | 0:2385683c867a | 35 | case 1: param = "VENDOR"; break; |
va009039 | 0:2385683c867a | 36 | case 2: param = "PRODUCT"; break; |
va009039 | 0:2385683c867a | 37 | case 3: param = "SER_NUM"; break; |
va009039 | 0:2385683c867a | 38 | case 4: param = "FW_VER"; break; |
va009039 | 0:2385683c867a | 39 | case 0xfe: param = "PACKET_COUNT"; break; |
va009039 | 0:2385683c867a | 40 | case 0xff: param = "PACKET_SIZE"; break; |
va009039 | 0:2385683c867a | 41 | default: param = "???"; break; |
va009039 | 0:2385683c867a | 42 | } |
va009039 | 0:2385683c867a | 43 | break; |
va009039 | 0:2385683c867a | 44 | case 0x01: |
va009039 | 0:2385683c867a | 45 | cmd = "LED"; |
va009039 | 0:2385683c867a | 46 | param = tmp; |
va009039 | 0:2385683c867a | 47 | switch(buf[1]) { |
va009039 | 0:2385683c867a | 48 | case 0: strcpy(tmp, "DEBUGGER_CONNECTED"); break; |
va009039 | 0:2385683c867a | 49 | case 1: strcpy(tmp, "TARGET_RUNNING"); break; |
va009039 | 0:2385683c867a | 50 | default: strcpy(tmp, "???"); break; |
va009039 | 0:2385683c867a | 51 | } |
va009039 | 0:2385683c867a | 52 | strcat(tmp, (buf[2]&0x01) ? " ON" : " OFF"); |
va009039 | 0:2385683c867a | 53 | break; |
va009039 | 0:2385683c867a | 54 | case 0x02: |
va009039 | 0:2385683c867a | 55 | cmd = "Connect"; |
va009039 | 0:2385683c867a | 56 | switch(buf[1]) { |
va009039 | 0:2385683c867a | 57 | case 0: param = "AUTODETECT"; break; |
va009039 | 0:2385683c867a | 58 | case 1: param = "SWD"; break; |
va009039 | 0:2385683c867a | 59 | case 2: param = "JTAG"; break; |
va009039 | 0:2385683c867a | 60 | default: param = "???"; break; |
va009039 | 0:2385683c867a | 61 | } |
va009039 | 0:2385683c867a | 62 | break; |
va009039 | 0:2385683c867a | 63 | case 0x03: cmd = "Disconnect"; break; |
va009039 | 0:2385683c867a | 64 | case 0x04: cmd = "TransferConfigure"; break; |
va009039 | 0:2385683c867a | 65 | case 0x05: |
va009039 | 0:2385683c867a | 66 | cmd = "Transfer"; |
va009039 | 0:2385683c867a | 67 | disp_hex = 16; |
va009039 | 0:2385683c867a | 68 | break; |
va009039 | 0:2385683c867a | 69 | case 0x06: |
va009039 | 0:2385683c867a | 70 | cmd = "TransferBlock"; |
va009039 | 0:2385683c867a | 71 | disp_hex = 16; |
va009039 | 0:2385683c867a | 72 | break; |
va009039 | 0:2385683c867a | 73 | case 0x07: cmd = "TransferAbort"; break; |
va009039 | 0:2385683c867a | 74 | case 0x08: cmd = "WriteABORT"; break; |
va009039 | 0:2385683c867a | 75 | case 0x09: cmd = "Delay"; break; |
va009039 | 0:2385683c867a | 76 | case 0x0a: cmd = "ResetTarget"; break; |
va009039 | 0:2385683c867a | 77 | case 0x10: |
va009039 | 0:2385683c867a | 78 | cmd = "SWJ_Pins"; |
va009039 | 0:2385683c867a | 79 | snprintf(tmp, sizeof(tmp), "wait: %d us", buf[3]|buf[4]<<8|buf[5]<<16|buf[6]<<24); |
va009039 | 0:2385683c867a | 80 | if (buf[2] & 0x01) { |
va009039 | 0:2385683c867a | 81 | strcat(tmp, " SWCLK_TCK "); |
va009039 | 0:2385683c867a | 82 | strcat(tmp, (buf[1] & 0x01) ? "ON" : "OFF"); |
va009039 | 0:2385683c867a | 83 | } |
va009039 | 0:2385683c867a | 84 | if (buf[2] & 0x02) { |
va009039 | 0:2385683c867a | 85 | strcat(tmp, " SWDIO_TMS "); |
va009039 | 0:2385683c867a | 86 | strcat(tmp, (buf[1] & 0x02) ? "ON" : "OFF"); |
va009039 | 0:2385683c867a | 87 | } |
va009039 | 0:2385683c867a | 88 | if (buf[2] & 0x04) { |
va009039 | 0:2385683c867a | 89 | strcat(tmp, " TDI "); |
va009039 | 0:2385683c867a | 90 | strcat(tmp, (buf[1] & 0x04) ? "ON" : "OFF"); |
va009039 | 0:2385683c867a | 91 | } |
va009039 | 0:2385683c867a | 92 | if (buf[2] & 0x08) { |
va009039 | 0:2385683c867a | 93 | strcat(tmp, " TDO "); |
va009039 | 0:2385683c867a | 94 | strcat(tmp, (buf[1] & 0x08) ? "ON" : "OFF"); |
va009039 | 0:2385683c867a | 95 | } |
va009039 | 0:2385683c867a | 96 | if (buf[2] & 0x20) { |
va009039 | 0:2385683c867a | 97 | strcat(tmp, " nTRST "); |
va009039 | 0:2385683c867a | 98 | strcat(tmp, (buf[1] & 0x20) ? "ON" : "OFF"); |
va009039 | 0:2385683c867a | 99 | } |
va009039 | 0:2385683c867a | 100 | if (buf[2] & 0x80) { |
va009039 | 0:2385683c867a | 101 | strcat(tmp, " nRESET "); |
va009039 | 0:2385683c867a | 102 | strcat(tmp, (buf[1] & 0x80) ? "ON" : "OFF"); |
va009039 | 0:2385683c867a | 103 | } |
va009039 | 0:2385683c867a | 104 | param = tmp; |
va009039 | 0:2385683c867a | 105 | break; |
va009039 | 0:2385683c867a | 106 | case 0x11: |
va009039 | 0:2385683c867a | 107 | cmd = "SWJ_Clock"; |
va009039 | 0:2385683c867a | 108 | snprintf(tmp, sizeof(tmp), "%d Hz", buf[1]|buf[2]<<8|buf[3]<<16|buf[4]<<24); |
va009039 | 0:2385683c867a | 109 | param = tmp; |
va009039 | 0:2385683c867a | 110 | break; |
va009039 | 0:2385683c867a | 111 | case 0x12: |
va009039 | 0:2385683c867a | 112 | cmd = "SWJ_Sequence"; |
va009039 | 0:2385683c867a | 113 | count = buf[1]; |
va009039 | 0:2385683c867a | 114 | snprintf(tmp, sizeof(tmp), "count: %d", count); |
va009039 | 0:2385683c867a | 115 | param = tmp; |
va009039 | 0:2385683c867a | 116 | break; |
va009039 | 0:2385683c867a | 117 | case 0x13: |
va009039 | 0:2385683c867a | 118 | cmd = "SWD_Configure"; |
va009039 | 0:2385683c867a | 119 | snprintf(tmp, sizeof(tmp), "turnaround: %d, data_phase: %d", (buf[1]&0x03)+1, (buf[1]&0x04) ? 1 : 0); |
va009039 | 0:2385683c867a | 120 | param = tmp; |
va009039 | 0:2385683c867a | 121 | break; |
va009039 | 0:2385683c867a | 122 | case 0x14: |
va009039 | 0:2385683c867a | 123 | cmd = "JTAG_Sequence"; |
va009039 | 0:2385683c867a | 124 | disp_hex = 16; |
va009039 | 0:2385683c867a | 125 | break; |
va009039 | 0:2385683c867a | 126 | default: |
va009039 | 0:2385683c867a | 127 | cmd = "???"; |
va009039 | 0:2385683c867a | 128 | disp_hex = 16; |
va009039 | 0:2385683c867a | 129 | break; |
va009039 | 0:2385683c867a | 130 | } |
va009039 | 0:2385683c867a | 131 | debug("DAP: %s %s ", cmd, param); |
va009039 | 0:2385683c867a | 132 | for(int i = 0; i < disp_hex; i++) { |
va009039 | 0:2385683c867a | 133 | debug("%02x ", buf[i]); |
va009039 | 0:2385683c867a | 134 | } |
va009039 | 0:2385683c867a | 135 | debug("\n"); |
va009039 | 0:2385683c867a | 136 | } |
va009039 | 0:2385683c867a | 137 | |
va009039 | 0:2385683c867a | 138 | void debug_dap_response(uint8_t* buf, int len) |
va009039 | 0:2385683c867a | 139 | { |
va009039 | 0:2385683c867a | 140 | printf("uint8_t res[] = "); |
va009039 | 0:2385683c867a | 141 | for(int i = 0; i < len; i++) { |
va009039 | 0:2385683c867a | 142 | printf("%c0x%02x", i == 0 ? '{' : ',', buf[i]); |
va009039 | 0:2385683c867a | 143 | } |
va009039 | 0:2385683c867a | 144 | printf("};\n"); |
va009039 | 0:2385683c867a | 145 | } |
va009039 | 0:2385683c867a | 146 | |
va009039 | 0:2385683c867a | 147 | void debug_swd_transfer(uint8_t request, uint32_t wdata, uint32_t rdata, uint8_t ack) |
va009039 | 0:2385683c867a | 148 | { |
va009039 | 0:2385683c867a | 149 | debug("SWD: "); |
va009039 | 0:2385683c867a | 150 | if (ack != 0x01) { |
va009039 | 0:2385683c867a | 151 | debug("ERR req=%02x wdata=%08x rdata=%08x ack=%02x\n", request, wdata, rdata, ack); |
va009039 | 0:2385683c867a | 152 | return; |
va009039 | 0:2385683c867a | 153 | } |
va009039 | 0:2385683c867a | 154 | switch(request) { |
va009039 | 0:2385683c867a | 155 | case 0x00: debug("DP_ABORT %08x", wdata); break; |
va009039 | 0:2385683c867a | 156 | case 0x01: debug("AP_CSW W %08x", wdata); break; |
va009039 | 0:2385683c867a | 157 | case 0x02: debug("DP_IDCODE %08x", rdata); break; |
va009039 | 0:2385683c867a | 158 | case 0x03: debug("AP_CSW R %08x", rdata); break; |
va009039 | 0:2385683c867a | 159 | case 0x04: debug("DP_CTRL_STAT W %08x", wdata); break; |
va009039 | 0:2385683c867a | 160 | case 0x05: debug("AP_TAR W %08x", wdata); break; |
va009039 | 0:2385683c867a | 161 | case 0x06: debug("DP_CTRL_STAT R %08x", rdata); break; |
va009039 | 0:2385683c867a | 162 | case 0x07: debug("AP_TAR R %08x", rdata); break; |
va009039 | 0:2385683c867a | 163 | case 0x08: debug("DP_SELECT %08x", wdata); break; |
va009039 | 0:2385683c867a | 164 | case 0x0a: debug("DP_RESEND %08x", rdata); break; |
va009039 | 0:2385683c867a | 165 | //case 0x0b: debug("DP_RDBUFF W %08x", wdata); break; |
va009039 | 0:2385683c867a | 166 | case 0x0d: debug("AP_DRW W %08x", wdata); break; |
va009039 | 0:2385683c867a | 167 | case 0x0e: debug("DP_RDBUFF %08x", rdata); break; |
va009039 | 0:2385683c867a | 168 | case 0x0f: debug("AP_DRW R %08x", rdata); break; |
va009039 | 0:2385683c867a | 169 | default: |
va009039 | 0:2385683c867a | 170 | debug("request=%02x wdata=%08x rdata=%08x ack=%02x", request, wdata, rdata, ack); |
va009039 | 0:2385683c867a | 171 | break; |
va009039 | 0:2385683c867a | 172 | } |
va009039 | 0:2385683c867a | 173 | debug(" request=%02x(%s %s %x) wdata=%08x rdata=%08x ack=%02x", request, |
va009039 | 0:2385683c867a | 174 | request&1?"AP":"DP", request&2?"R":"nW", |
va009039 | 0:2385683c867a | 175 | request&0xfc, |
va009039 | 0:2385683c867a | 176 | wdata, rdata, ack); |
va009039 | 0:2385683c867a | 177 | debug("\n"); |
va009039 | 0:2385683c867a | 178 | } |
va009039 | 0:2385683c867a | 179 | |
va009039 | 0:2385683c867a | 180 | #endif |