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 Sep 08 14:13:15 2013 +0000
Revision:
3:d7a7cde0bfb8
Child:
4:5e4107edcbdb
add softwarereset(),flash.init()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 3:d7a7cde0bfb8 1 // DAP.cpp 2013/9/7
va009039 3:d7a7cde0bfb8 2 #include "DAP.h"
va009039 3:d7a7cde0bfb8 3
va009039 3:d7a7cde0bfb8 4 #define DAP_OK 0
va009039 3:d7a7cde0bfb8 5 #define DAP_ERROR 0xFF
va009039 3:d7a7cde0bfb8 6
va009039 3:d7a7cde0bfb8 7 #define DAP_TRANSFER_MATCH_VALUE (1<<4)
va009039 3:d7a7cde0bfb8 8 #define DAP_TRANSFER_MATCH_MASK (1<<5)
va009039 3:d7a7cde0bfb8 9
va009039 3:d7a7cde0bfb8 10 // DAP Port
va009039 3:d7a7cde0bfb8 11 #define DAP_PORT_AUTODETECT 0 // Autodetect Port
va009039 3:d7a7cde0bfb8 12 #define DAP_PORT_DISABLED 0 // Port Disabled (I/O pins in High-Z)
va009039 3:d7a7cde0bfb8 13 #define DAP_PORT_SWD 1 // SWD Port (SWCLK, SWDIO) + nRESET
va009039 3:d7a7cde0bfb8 14
va009039 3:d7a7cde0bfb8 15 DAP::DAP(SWD* swd) : _swd(swd)
va009039 3:d7a7cde0bfb8 16 {
va009039 3:d7a7cde0bfb8 17 }
va009039 3:d7a7cde0bfb8 18
va009039 3:d7a7cde0bfb8 19 int DAP::Command(uint8_t* request, uint8_t* response)
va009039 3:d7a7cde0bfb8 20 {
va009039 3:d7a7cde0bfb8 21 switch(*request) {
va009039 3:d7a7cde0bfb8 22 case 0x00: return Info(request, response);
va009039 3:d7a7cde0bfb8 23 case 0x01: return LED(request, response);
va009039 3:d7a7cde0bfb8 24 case 0x02: return Connect(request, response);
va009039 3:d7a7cde0bfb8 25 case 0x03: return Disconnect(request, response);
va009039 3:d7a7cde0bfb8 26 case 0x04: return TransferConfigure(request, response);
va009039 3:d7a7cde0bfb8 27 case 0x05: return Transfer(request, response);
va009039 3:d7a7cde0bfb8 28 case 0x06: return TransferBlock(request, response);
va009039 3:d7a7cde0bfb8 29
va009039 3:d7a7cde0bfb8 30 case 0x08: return WriteABORT(request, response);
va009039 3:d7a7cde0bfb8 31
va009039 3:d7a7cde0bfb8 32 case 0x10: return SWJ_Pins(request, response);
va009039 3:d7a7cde0bfb8 33 case 0x11: return SWJ_Clock(request, response);
va009039 3:d7a7cde0bfb8 34 case 0x12: return SWJ_Sequence(request, response);
va009039 3:d7a7cde0bfb8 35 case 0x13: return SWD_Configure(request, response);
va009039 3:d7a7cde0bfb8 36
va009039 3:d7a7cde0bfb8 37 };
va009039 3:d7a7cde0bfb8 38 *response = 0xff; // invalid
va009039 3:d7a7cde0bfb8 39 return 1;
va009039 3:d7a7cde0bfb8 40 }
va009039 3:d7a7cde0bfb8 41
va009039 3:d7a7cde0bfb8 42 int DAP::Info(uint8_t* request, uint8_t* response) // 0x00
va009039 3:d7a7cde0bfb8 43 {
va009039 3:d7a7cde0bfb8 44 const char* info_str[] = {
va009039 3:d7a7cde0bfb8 45 NULL, // 1 VENDOR
va009039 3:d7a7cde0bfb8 46 NULL, // 2 PRODUCT
va009039 3:d7a7cde0bfb8 47 NULL, // 3 SER_NUM
va009039 3:d7a7cde0bfb8 48 "1.0", // 4 FW_VER
va009039 3:d7a7cde0bfb8 49 NULL, // 5 DEVICE_VENDOR
va009039 3:d7a7cde0bfb8 50 NULL, // 6 DEVICE_NAME
va009039 3:d7a7cde0bfb8 51 };
va009039 3:d7a7cde0bfb8 52 const char* s;
va009039 3:d7a7cde0bfb8 53 int slen;
va009039 3:d7a7cde0bfb8 54 response[0] = 0x00; // Info
va009039 3:d7a7cde0bfb8 55 int length = 2;
va009039 3:d7a7cde0bfb8 56 int id = request[1];
va009039 3:d7a7cde0bfb8 57 switch(id) {
va009039 3:d7a7cde0bfb8 58 case 1 ... 6: // VENDOR PRODUCT SER_NUM FW_VER DEVICE_VENDOR DEVICE_NAME
va009039 3:d7a7cde0bfb8 59 slen = 0;
va009039 3:d7a7cde0bfb8 60 s = info_str[id-1];
va009039 3:d7a7cde0bfb8 61 if (s) {
va009039 3:d7a7cde0bfb8 62 slen = strlen(s) + 1;
va009039 3:d7a7cde0bfb8 63 memcpy(response+2, s, slen);
va009039 3:d7a7cde0bfb8 64 }
va009039 3:d7a7cde0bfb8 65 response[1] = slen;
va009039 3:d7a7cde0bfb8 66 length += slen;
va009039 3:d7a7cde0bfb8 67 break;
va009039 3:d7a7cde0bfb8 68 case 0xf0: // CAPABILITIES
va009039 3:d7a7cde0bfb8 69 response[1] = sizeof(uint8_t);
va009039 3:d7a7cde0bfb8 70 response[2] = 0x01; // SWD
va009039 3:d7a7cde0bfb8 71 length += sizeof(uint8_t);
va009039 3:d7a7cde0bfb8 72 break;
va009039 3:d7a7cde0bfb8 73 case 0xfe: // PACKET_COUNT
va009039 3:d7a7cde0bfb8 74 response[1] = sizeof(uint8_t);
va009039 3:d7a7cde0bfb8 75 response[2] = 1;
va009039 3:d7a7cde0bfb8 76 length += sizeof(uint8_t);
va009039 3:d7a7cde0bfb8 77 break;
va009039 3:d7a7cde0bfb8 78 case 0xff: // PACKET_SIZE
va009039 3:d7a7cde0bfb8 79 response[1] = sizeof(uint16_t);
va009039 3:d7a7cde0bfb8 80 *reinterpret_cast<uint16_t*>(response+2) = 64;
va009039 3:d7a7cde0bfb8 81 length += sizeof(uint16_t);
va009039 3:d7a7cde0bfb8 82 break;
va009039 3:d7a7cde0bfb8 83 default:
va009039 3:d7a7cde0bfb8 84 response[1] = DAP_ERROR;
va009039 3:d7a7cde0bfb8 85 break;
va009039 3:d7a7cde0bfb8 86 }
va009039 3:d7a7cde0bfb8 87 return length;
va009039 3:d7a7cde0bfb8 88 }
va009039 3:d7a7cde0bfb8 89
va009039 3:d7a7cde0bfb8 90 int DAP::LED(uint8_t* request, uint8_t* response) // 0x01
va009039 3:d7a7cde0bfb8 91 {
va009039 3:d7a7cde0bfb8 92 response[0] = 0x01; // LED
va009039 3:d7a7cde0bfb8 93 response[1] = DAP_OK;
va009039 3:d7a7cde0bfb8 94 return 2;
va009039 3:d7a7cde0bfb8 95 }
va009039 3:d7a7cde0bfb8 96
va009039 3:d7a7cde0bfb8 97 int DAP::Connect(uint8_t* request, uint8_t* response) // 0x02
va009039 3:d7a7cde0bfb8 98 {
va009039 3:d7a7cde0bfb8 99 response[0] = 0x02; // Connect
va009039 3:d7a7cde0bfb8 100 response[1] = DAP_PORT_DISABLED;
va009039 3:d7a7cde0bfb8 101 if (request[1] == DAP_PORT_AUTODETECT || request[1] == DAP_PORT_SWD) {
va009039 3:d7a7cde0bfb8 102 response[1] = DAP_PORT_SWD;
va009039 3:d7a7cde0bfb8 103 _swd->Setup();
va009039 3:d7a7cde0bfb8 104 }
va009039 3:d7a7cde0bfb8 105 return 2;
va009039 3:d7a7cde0bfb8 106 }
va009039 3:d7a7cde0bfb8 107
va009039 3:d7a7cde0bfb8 108 int DAP::Disconnect(uint8_t* request, uint8_t* response) // 0x03
va009039 3:d7a7cde0bfb8 109 {
va009039 3:d7a7cde0bfb8 110 response[0] = 0x03; // disconnect
va009039 3:d7a7cde0bfb8 111 response[1] = DAP_OK;
va009039 3:d7a7cde0bfb8 112 return 2;
va009039 3:d7a7cde0bfb8 113 }
va009039 3:d7a7cde0bfb8 114
va009039 3:d7a7cde0bfb8 115 int DAP::TransferConfigure(uint8_t* request, uint8_t* response) // 0x04
va009039 3:d7a7cde0bfb8 116 {
va009039 3:d7a7cde0bfb8 117 uint8_t idle_cycles = request[1];
va009039 3:d7a7cde0bfb8 118 uint16_t retry_count = *reinterpret_cast<uint16_t*>(request+2);
va009039 3:d7a7cde0bfb8 119 transfer.match_retry = *reinterpret_cast<uint16_t*>(request+4);
va009039 3:d7a7cde0bfb8 120 _swd->TransferConfigure(idle_cycles, retry_count);
va009039 3:d7a7cde0bfb8 121 response[0] = 0x04; //tansfer configure
va009039 3:d7a7cde0bfb8 122 response[1] = DAP_OK;
va009039 3:d7a7cde0bfb8 123 return 2;
va009039 3:d7a7cde0bfb8 124 }
va009039 3:d7a7cde0bfb8 125
va009039 3:d7a7cde0bfb8 126 int DAP::Transfer(uint8_t* request, uint8_t* response) // 0x05
va009039 3:d7a7cde0bfb8 127 {
va009039 3:d7a7cde0bfb8 128 bool post_read = false;
va009039 3:d7a7cde0bfb8 129 bool check_write = false;
va009039 3:d7a7cde0bfb8 130 uint8_t swd_request;
va009039 3:d7a7cde0bfb8 131 uint8_t ack = 0;
va009039 3:d7a7cde0bfb8 132 int reqpos = 2;
va009039 3:d7a7cde0bfb8 133 int respos = 3;
va009039 3:d7a7cde0bfb8 134 int response_count = 0;
va009039 3:d7a7cde0bfb8 135 for(int request_count = request[reqpos++]; request_count > 0; request_count--, response_count++) {
va009039 3:d7a7cde0bfb8 136 swd_request = request[reqpos++];
va009039 3:d7a7cde0bfb8 137 if (swd_request & SWD_RnW) { // read register
va009039 3:d7a7cde0bfb8 138 if (post_read) {
va009039 3:d7a7cde0bfb8 139 if ((swd_request & SWD_APnDP) && !(swd_request & DAP_TRANSFER_MATCH_VALUE)) {
va009039 3:d7a7cde0bfb8 140 ack = _swd->Transfer(swd_request, reinterpret_cast<uint32_t*>(response+respos));
va009039 3:d7a7cde0bfb8 141 } else {
va009039 3:d7a7cde0bfb8 142 ack = _swd->Transfer(DP_RDBUFF, reinterpret_cast<uint32_t*>(response+respos));
va009039 3:d7a7cde0bfb8 143 post_read = false;
va009039 3:d7a7cde0bfb8 144 }
va009039 3:d7a7cde0bfb8 145 if (ack != SWD_OK) {
va009039 3:d7a7cde0bfb8 146 break;
va009039 3:d7a7cde0bfb8 147 }
va009039 3:d7a7cde0bfb8 148 respos += sizeof(uint32_t);
va009039 3:d7a7cde0bfb8 149 }
va009039 3:d7a7cde0bfb8 150 if (swd_request & DAP_TRANSFER_MATCH_VALUE) {
va009039 3:d7a7cde0bfb8 151 uint32_t match_value = *reinterpret_cast<uint32_t*>(request+reqpos);
va009039 3:d7a7cde0bfb8 152 reqpos += sizeof(uint32_t);
va009039 3:d7a7cde0bfb8 153 if (swd_request & SWD_APnDP) {
va009039 3:d7a7cde0bfb8 154 ack = _swd->Transfer(swd_request, NULL);
va009039 3:d7a7cde0bfb8 155 if (ack != SWD_OK) {
va009039 3:d7a7cde0bfb8 156 break;
va009039 3:d7a7cde0bfb8 157 }
va009039 3:d7a7cde0bfb8 158 }
va009039 3:d7a7cde0bfb8 159 bool match = false;
va009039 3:d7a7cde0bfb8 160 for(int retry = transfer.match_retry; retry >= 0 && !match; retry--) {
va009039 3:d7a7cde0bfb8 161 uint32_t data;
va009039 3:d7a7cde0bfb8 162 ack = _swd->Transfer(swd_request, &data);
va009039 3:d7a7cde0bfb8 163 if (ack == SWD_OK && (data&transfer.match_mask) == match_value) {
va009039 3:d7a7cde0bfb8 164 match = true;
va009039 3:d7a7cde0bfb8 165 }
va009039 3:d7a7cde0bfb8 166 }
va009039 3:d7a7cde0bfb8 167 if (!match) {
va009039 3:d7a7cde0bfb8 168 break;
va009039 3:d7a7cde0bfb8 169 }
va009039 3:d7a7cde0bfb8 170 } else {
va009039 3:d7a7cde0bfb8 171 if (swd_request & SWD_APnDP) {
va009039 3:d7a7cde0bfb8 172 if (post_read) {
va009039 3:d7a7cde0bfb8 173 ack = _swd->Transfer(swd_request, NULL);
va009039 3:d7a7cde0bfb8 174 if (ack != SWD_OK) {
va009039 3:d7a7cde0bfb8 175 break;
va009039 3:d7a7cde0bfb8 176 }
va009039 3:d7a7cde0bfb8 177 post_read = true;
va009039 3:d7a7cde0bfb8 178 }
va009039 3:d7a7cde0bfb8 179 } else {
va009039 3:d7a7cde0bfb8 180 ack = _swd->Transfer(swd_request, reinterpret_cast<uint32_t*>(response+respos));
va009039 3:d7a7cde0bfb8 181 if (ack != SWD_OK) {
va009039 3:d7a7cde0bfb8 182 break;
va009039 3:d7a7cde0bfb8 183 }
va009039 3:d7a7cde0bfb8 184 respos += sizeof(uint32_t);
va009039 3:d7a7cde0bfb8 185 }
va009039 3:d7a7cde0bfb8 186 }
va009039 3:d7a7cde0bfb8 187 check_write = false;
va009039 3:d7a7cde0bfb8 188 } else { // write register
va009039 3:d7a7cde0bfb8 189 if (post_read) { // read previous data
va009039 3:d7a7cde0bfb8 190 ack = _swd->Transfer(DP_RDBUFF, reinterpret_cast<uint32_t*>(response+respos));
va009039 3:d7a7cde0bfb8 191 if (ack != SWD_OK) {
va009039 3:d7a7cde0bfb8 192 break;
va009039 3:d7a7cde0bfb8 193 }
va009039 3:d7a7cde0bfb8 194 respos += sizeof(uint32_t);
va009039 3:d7a7cde0bfb8 195 post_read = false;
va009039 3:d7a7cde0bfb8 196 }
va009039 3:d7a7cde0bfb8 197 uint32_t data = *reinterpret_cast<uint32_t*>(request+reqpos);
va009039 3:d7a7cde0bfb8 198 reqpos += sizeof(uint32_t);
va009039 3:d7a7cde0bfb8 199 if (swd_request & DAP_TRANSFER_MATCH_MASK) {
va009039 3:d7a7cde0bfb8 200 transfer.match_mask = data;
va009039 3:d7a7cde0bfb8 201 ack = SWD_OK;
va009039 3:d7a7cde0bfb8 202 } else {
va009039 3:d7a7cde0bfb8 203 ack = _swd->Transfer(swd_request, &data);
va009039 3:d7a7cde0bfb8 204 if (ack != SWD_OK) {
va009039 3:d7a7cde0bfb8 205 break;
va009039 3:d7a7cde0bfb8 206 }
va009039 3:d7a7cde0bfb8 207 check_write = true;
va009039 3:d7a7cde0bfb8 208 }
va009039 3:d7a7cde0bfb8 209 }
va009039 3:d7a7cde0bfb8 210 }
va009039 3:d7a7cde0bfb8 211 if (ack == SWD_OK) {
va009039 3:d7a7cde0bfb8 212 if (post_read) { // read previous data
va009039 3:d7a7cde0bfb8 213 ack = _swd->Transfer(DP_RDBUFF, reinterpret_cast<uint32_t*>(response+respos));
va009039 3:d7a7cde0bfb8 214 if (ack == SWD_OK) {
va009039 3:d7a7cde0bfb8 215 respos += sizeof(uint32_t);
va009039 3:d7a7cde0bfb8 216 }
va009039 3:d7a7cde0bfb8 217 } else if (check_write) { // check last write
va009039 3:d7a7cde0bfb8 218 ack = _swd->Transfer(DP_RDBUFF, NULL);
va009039 3:d7a7cde0bfb8 219 }
va009039 3:d7a7cde0bfb8 220 }
va009039 3:d7a7cde0bfb8 221 response[0] = 0x05; // transfer
va009039 3:d7a7cde0bfb8 222 response[1] = response_count;
va009039 3:d7a7cde0bfb8 223 response[2] = ack;
va009039 3:d7a7cde0bfb8 224 return respos;
va009039 3:d7a7cde0bfb8 225 }
va009039 3:d7a7cde0bfb8 226
va009039 3:d7a7cde0bfb8 227 int DAP::TransferBlock(uint8_t* request, uint8_t* response) // 0x06
va009039 3:d7a7cde0bfb8 228 {
va009039 3:d7a7cde0bfb8 229 uint8_t swd_request;
va009039 3:d7a7cde0bfb8 230 uint8_t ack = 0;
va009039 3:d7a7cde0bfb8 231 int reqpos = 2;
va009039 3:d7a7cde0bfb8 232 int respos = 4;
va009039 3:d7a7cde0bfb8 233 int response_count = 0;
va009039 3:d7a7cde0bfb8 234 int request_count = *reinterpret_cast<uint16_t*>(request+reqpos);
va009039 3:d7a7cde0bfb8 235 reqpos += sizeof(uint16_t);
va009039 3:d7a7cde0bfb8 236 if (request_count == 0) {
va009039 3:d7a7cde0bfb8 237 goto end;
va009039 3:d7a7cde0bfb8 238 }
va009039 3:d7a7cde0bfb8 239 swd_request = request[reqpos++];
va009039 3:d7a7cde0bfb8 240 if (swd_request & SWD_RnW) { // read register block
va009039 3:d7a7cde0bfb8 241 if (swd_request & SWD_APnDP) { // post AP read
va009039 3:d7a7cde0bfb8 242 ack = _swd->Transfer(swd_request, NULL);
va009039 3:d7a7cde0bfb8 243 if (ack != SWD_OK) {
va009039 3:d7a7cde0bfb8 244 goto end;
va009039 3:d7a7cde0bfb8 245 }
va009039 3:d7a7cde0bfb8 246 }
va009039 3:d7a7cde0bfb8 247 while(request_count--) { // read DP/AP register
va009039 3:d7a7cde0bfb8 248 if (request_count == 0 && (swd_request & SWD_APnDP)) { // last AP read
va009039 3:d7a7cde0bfb8 249 swd_request = DP_RDBUFF;
va009039 3:d7a7cde0bfb8 250 }
va009039 3:d7a7cde0bfb8 251 ack = _swd->Transfer(swd_request, reinterpret_cast<uint32_t*>(response+respos));
va009039 3:d7a7cde0bfb8 252 if (ack != SWD_OK) {
va009039 3:d7a7cde0bfb8 253 goto end;
va009039 3:d7a7cde0bfb8 254 }
va009039 3:d7a7cde0bfb8 255 respos += sizeof(uint32_t);
va009039 3:d7a7cde0bfb8 256 response_count++;
va009039 3:d7a7cde0bfb8 257 }
va009039 3:d7a7cde0bfb8 258 } else { // write register block
va009039 3:d7a7cde0bfb8 259 while(request_count--) {
va009039 3:d7a7cde0bfb8 260 ack = _swd->Transfer(swd_request, reinterpret_cast<uint32_t*>(request+reqpos));
va009039 3:d7a7cde0bfb8 261 if (ack != SWD_OK) {
va009039 3:d7a7cde0bfb8 262 goto end;
va009039 3:d7a7cde0bfb8 263 }
va009039 3:d7a7cde0bfb8 264 response_count++;
va009039 3:d7a7cde0bfb8 265 }
va009039 3:d7a7cde0bfb8 266 ack = _swd->Transfer(DP_RDBUFF, NULL);
va009039 3:d7a7cde0bfb8 267 }
va009039 3:d7a7cde0bfb8 268 end:
va009039 3:d7a7cde0bfb8 269 response[0] = 0x06; // transfer block
va009039 3:d7a7cde0bfb8 270 *reinterpret_cast<uint16_t*>(response+1) = response_count;
va009039 3:d7a7cde0bfb8 271 response[3] = ack;
va009039 3:d7a7cde0bfb8 272 return respos;
va009039 3:d7a7cde0bfb8 273 }
va009039 3:d7a7cde0bfb8 274
va009039 3:d7a7cde0bfb8 275 int DAP::WriteABORT(uint8_t* request, uint8_t* response) // 0x08
va009039 3:d7a7cde0bfb8 276 {
va009039 3:d7a7cde0bfb8 277 uint32_t data = *reinterpret_cast<uint32_t*>(request+2);
va009039 3:d7a7cde0bfb8 278 uint8_t ack = _swd->Transfer(DP_ABORT, &data);
va009039 3:d7a7cde0bfb8 279 response[0] = 0x08; // write abort
va009039 3:d7a7cde0bfb8 280 response[1] = ack == SWD_OK ? DAP_OK : DAP_ERROR;
va009039 3:d7a7cde0bfb8 281 return 2;
va009039 3:d7a7cde0bfb8 282 }
va009039 3:d7a7cde0bfb8 283
va009039 3:d7a7cde0bfb8 284 int DAP::Delay(uint8_t* request, uint8_t* response) // 0x09
va009039 3:d7a7cde0bfb8 285 {
va009039 3:d7a7cde0bfb8 286 int waittime_ms = *reinterpret_cast<uint16_t*>(request+1);
va009039 3:d7a7cde0bfb8 287 wait_ms(waittime_ms);
va009039 3:d7a7cde0bfb8 288 response[0] = 0x09;
va009039 3:d7a7cde0bfb8 289 response[1] = DAP_OK;
va009039 3:d7a7cde0bfb8 290 return 2;
va009039 3:d7a7cde0bfb8 291 }
va009039 3:d7a7cde0bfb8 292
va009039 3:d7a7cde0bfb8 293 int DAP::ResetTarget(uint8_t* request, uint8_t* response) // 0x0A
va009039 3:d7a7cde0bfb8 294 {
va009039 3:d7a7cde0bfb8 295 response[0] = 0x0a;
va009039 3:d7a7cde0bfb8 296 response[1] = 0;
va009039 3:d7a7cde0bfb8 297 response[2] = DAP_OK;
va009039 3:d7a7cde0bfb8 298 return 3;
va009039 3:d7a7cde0bfb8 299 }
va009039 3:d7a7cde0bfb8 300
va009039 3:d7a7cde0bfb8 301 int DAP::SWJ_Pins(uint8_t* request, uint8_t* response) // 0x10
va009039 3:d7a7cde0bfb8 302 {
va009039 3:d7a7cde0bfb8 303 uint32_t value = request[1];
va009039 3:d7a7cde0bfb8 304 uint32_t select = request[2];
va009039 3:d7a7cde0bfb8 305 uint32_t waittime_us = *reinterpret_cast<uint32_t*>(request+3);
va009039 3:d7a7cde0bfb8 306 response[0] = 0x10; // swj pins
va009039 3:d7a7cde0bfb8 307 response[1] = _swd->SWJPins(value, select, waittime_us);
va009039 3:d7a7cde0bfb8 308 return 2;
va009039 3:d7a7cde0bfb8 309 }
va009039 3:d7a7cde0bfb8 310
va009039 3:d7a7cde0bfb8 311 int DAP::SWJ_Clock(uint8_t* request, uint8_t* response) // 0x11
va009039 3:d7a7cde0bfb8 312 {
va009039 3:d7a7cde0bfb8 313 uint32_t clock = *reinterpret_cast<uint32_t*>(request+1);
va009039 3:d7a7cde0bfb8 314 _swd->SWJClock(clock);
va009039 3:d7a7cde0bfb8 315 response[0] = 0x11; // swj clock
va009039 3:d7a7cde0bfb8 316 response[1] = DAP_OK;
va009039 3:d7a7cde0bfb8 317 return 2;
va009039 3:d7a7cde0bfb8 318 }
va009039 3:d7a7cde0bfb8 319
va009039 3:d7a7cde0bfb8 320 int DAP::SWJ_Sequence(uint8_t* request, uint8_t* response) // 0x12
va009039 3:d7a7cde0bfb8 321 {
va009039 3:d7a7cde0bfb8 322 int count = request[1];
va009039 3:d7a7cde0bfb8 323 if (count == 0) {
va009039 3:d7a7cde0bfb8 324 count = 256;
va009039 3:d7a7cde0bfb8 325 }
va009039 3:d7a7cde0bfb8 326 _swd->SWJSequence(count, request+2);
va009039 3:d7a7cde0bfb8 327 response[0] = 0x12; // swj sequence
va009039 3:d7a7cde0bfb8 328 response[1] = DAP_OK;
va009039 3:d7a7cde0bfb8 329 return 2;
va009039 3:d7a7cde0bfb8 330 }
va009039 3:d7a7cde0bfb8 331
va009039 3:d7a7cde0bfb8 332 int DAP::SWD_Configure(uint8_t* request, uint8_t* response) // 0x13
va009039 3:d7a7cde0bfb8 333 {
va009039 3:d7a7cde0bfb8 334 uint8_t cfg = request[1];
va009039 3:d7a7cde0bfb8 335 _swd->Configure((cfg&0x03)+1, cfg&0x04 ? 1: 0);
va009039 3:d7a7cde0bfb8 336 response[0] = 0x13; // swd configure
va009039 3:d7a7cde0bfb8 337 response[1] = DAP_OK;
va009039 3:d7a7cde0bfb8 338 return 2;
va009039 3:d7a7cde0bfb8 339 }
va009039 3:d7a7cde0bfb8 340