Skip to content

Commit ef29481

Browse files
committed
Support SWD_Sequence command
Many fixes to improve compatibility
1 parent 52e2f82 commit ef29481

3 files changed

Lines changed: 116 additions & 53 deletions

File tree

examples/ez-dap/DAP.c

Lines changed: 51 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ uint8_t data[4];
4343
uint16_t dap_execute_command(uint16_t idxidx, uint8_t len) {
4444
(void)len;
4545
uint8_t idx = idxidx & 0xFF;
46-
uint8_t *ptr = &EP2FIFOBUF[idxidx >> 8];
46+
__xdata uint8_t *ptr = &EP2FIFOBUF[idxidx >> 8];
4747
uint8_t cmd = *ptr++;
4848
scratch[idx++] = cmd;
4949
if (cmd == ID_DAP_ExecuteCommands) {
@@ -102,7 +102,7 @@ uint16_t dap_execute_command(uint16_t idxidx, uint8_t len) {
102102
scratch[idx++] = 1;
103103
scratch[idx++] = 1;
104104
} else {
105-
idx--;
105+
scratch[idx++] = 0;
106106
}
107107
} else if (cmd == ID_DAP_HostStatus) {
108108
if (*ptr == 0) {
@@ -130,53 +130,76 @@ uint16_t dap_execute_command(uint16_t idxidx, uint8_t len) {
130130
} else if (cmd == ID_DAP_SWD_Configure) {
131131
ptr += 1;
132132
// Configure pins
133-
// PIN_SWDIO = 1; // set SWDIO to high
134-
// PIN_SWCLK = 1; // set SWCLK to high
135-
// PIN_SWDIO_OE |= PIN_SWDIO_MASK;
136-
// PIN_SWCLK_OE |= PIN_SWCLK_MASK;
137133
SWD_Init();
138134
scratch[idx++] = DAP_OK;
139135
} else if (cmd == ID_DAP_SWJ_Sequence) {
140136
idxidx = (uint16_t)idx | (uint16_t)((uint16_t)ptr & 0xFF) << 8;
141-
return dap_execute_sequence(idxidx, len);
137+
return dap_execute_swj_sequence(idxidx, len);
138+
} else if (cmd == ID_DAP_SWD_Sequence) {
139+
idxidx = (uint16_t)idx | (uint16_t)((uint16_t)ptr & 0xFF) << 8;
140+
return dap_execute_swd_sequence(idxidx, len);
142141
} else {
143142
scratch[idx++] = DAP_ERROR;
144143
}
145144
idxidx = (uint16_t)idx | (uint16_t)((uint16_t)ptr & 0xFF) << 8;
146145
return idxidx;
147146
}
148147

149-
uint16_t dap_execute_sequence(uint16_t idxidx, uint8_t len) {
148+
uint16_t dap_execute_swj_sequence(uint16_t idxidx, uint8_t len) {
150149
(void)len;
151150
uint8_t idx = idxidx & 0xFF;
152-
uint8_t *ptr = &EP2FIFOBUF[idxidx >> 8];
151+
__xdata uint8_t *ptr = &EP2FIFOBUF[idxidx >> 8];
153152

154-
led_blink();
153+
// led_blink();
155154

156155
uint8_t num = *ptr++;
157156
// num == 0 indicates 256bits
158-
if ((num & 7) != 0) {
159-
num = (num ^ 7) + 9;
160-
}
161-
do {
162-
uint8_t bits = *ptr++;
163-
num -= 8;
164-
uint8_t n = ((num & 0xF8) != 0) ? 8 : 8 - num;
165-
for (uint8_t i=0; i < n; i++) {
166-
SWJ_Cycle(bits);
167-
bits >>= 1;
168-
}
169-
} while((num & 0xF8) != 0);
157+
SWD_WriteSequence(num, ptr);
158+
ptr += (uint8_t)(((uint8_t)(num - 1) >> 3) + 1);
170159
scratch[idx++] = DAP_OK;
171160
idxidx = (uint16_t)idx | (uint16_t)((uint16_t)ptr & 0xFF) << 8;
172161
return idxidx;
173162
}
174163

164+
uint16_t dap_execute_swd_sequence(uint16_t idxidx, uint8_t len) {
165+
(void)len;
166+
uint8_t idx = idxidx & 0xFF;
167+
__xdata uint8_t *ptr = &EP2FIFOBUF[idxidx >> 8];
168+
169+
// led_blink();
170+
171+
scratch[idx++] = DAP_OK;
172+
uint8_t count = *ptr++;
173+
while (count--) {
174+
uint8_t num = *ptr++;
175+
if ((num & 0x80) == 0) {
176+
num &= 0x3F;
177+
// num == 0 indicates 64bits
178+
if (num == 0) {
179+
num = 64;
180+
}
181+
SWD_WriteSequence(num, ptr);
182+
ptr += ((uint8_t)(num + 7) >> 3);
183+
} else {
184+
num &= 0x3F;
185+
// num == 0 indicates 64bits
186+
if (num == 0) {
187+
num = 64;
188+
}
189+
SWD_ReadSequence(num, &scratch[idx]);
190+
idx += ((uint8_t)(num + 7) >> 3);
191+
}
192+
}
193+
194+
idxidx = (uint16_t)idx | (uint16_t)((uint16_t)ptr & 0xFF) << 8;
195+
return idxidx;
196+
}
197+
175198
uint16_t dap_execute_transfer(uint16_t idxidx, uint8_t len) {
176199
(void)len;
177-
uint8_t *request = &EP2FIFOBUF[idxidx >> 8];
200+
__xdata uint8_t *request = &EP2FIFOBUF[idxidx >> 8];
178201
uint8_t idx = idxidx & 0xFF;
179-
uint8_t *response = &scratch[idx];
202+
__xdata uint8_t *response = &scratch[idx];
180203

181204
// uint8_t dap_port = *ptr++;
182205
// uint8_t cnt = *ptr++;
@@ -186,7 +209,7 @@ uint16_t dap_execute_transfer(uint16_t idxidx, uint8_t len) {
186209
// uint8_t *request_head;
187210
uint8_t request_count;
188211
uint8_t request_value;
189-
uint8_t *response_head;
212+
__xdata uint8_t *response_head;
190213
uint8_t response_count;
191214
uint8_t response_value;
192215
uint8_t post_read;
@@ -443,17 +466,17 @@ uint16_t dap_execute_transfer(uint16_t idxidx, uint8_t len) {
443466

444467
uint16_t dap_execute_transfer_block(uint16_t idxidx, uint8_t len) {
445468
(void)len;
446-
uint8_t *request = &EP2FIFOBUF[idxidx >> 8];
469+
__xdata uint8_t *request = &EP2FIFOBUF[idxidx >> 8];
447470
uint8_t idx = idxidx & 0xFF;
448-
uint8_t *response = &scratch[idx];
471+
__xdata uint8_t *response = &scratch[idx];
449472

450473
// static uint32_t DAP_SWD_TransferBlock(const uint8_t *request, uint8_t *response) {
451474

452475
uint16_t request_count;
453476
uint8_t request_value;
454477
uint16_t response_count;
455478
uint8_t response_value;
456-
uint8_t *response_head;
479+
__xdata uint8_t *response_head;
457480
uint8_t retry;
458481
// uint32_t data;
459482

examples/ez-dap/DAP.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#define ID_DAP_SWJ_Clock 0x11U
4949
#define ID_DAP_SWJ_Sequence 0x12U
5050
#define ID_DAP_SWD_Configure 0x13U
51+
#define ID_DAP_SWD_Sequence 0x1DU
5152

5253
#define ID_DAP_ExecuteCommands 0x7FU
5354

@@ -110,11 +111,13 @@ extern "C"
110111

111112
// Functions
112113
extern void SWD_Init();
113-
extern void SWJ_Cycle(uint8_t bits);
114+
extern void SWD_WriteSequence(uint8_t num, __xdata const uint8_t *ptr);
115+
extern void SWD_ReadSequence(uint8_t num, __xdata uint8_t *ptr);
114116
extern uint8_t SWD_Transfer(uint8_t request /* , uint32_t *data */);
115117

116118
extern uint16_t dap_execute_command(uint16_t idxidx, uint8_t len);
117-
extern uint16_t dap_execute_sequence(uint16_t idxidx, uint8_t len);
119+
extern uint16_t dap_execute_swj_sequence(uint16_t idxidx, uint8_t len);
120+
extern uint16_t dap_execute_swd_sequence(uint16_t idxidx, uint8_t len);
118121
extern uint16_t dap_execute_transfer(uint16_t idxidx, uint8_t len);
119122
extern uint16_t dap_execute_transfer_block(uint16_t idxidx, uint8_t len);
120123

examples/ez-dap/SW_DP.c

Lines changed: 60 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,47 @@ void SWD_Init() {
8484
PIN_SWCLK_OE |= PIN_SWCLK_MASK;
8585
}
8686

87-
void SWJ_Cycle(uint8_t bits) {
88-
PIN_SWDIO = bits & 1; // set SWDIO to data bit
89-
PIN_SWCLK = 0; // set SWCLK to low
90-
PIN_SWCLK = 1; // set SWCLK to high
87+
void SWD_WriteSequence(uint8_t num, __xdata const uint8_t *ptr) {
88+
PIN_SWDIO_OUT(*ptr);
89+
PIN_SWDIO_OUT_ENABLE();
90+
// num == 0 indicates 256bits
91+
if ((num & 7) != 0) {
92+
num = (num ^ 7) + 9;
93+
}
94+
do {
95+
uint8_t bits = *ptr++;
96+
num -= 8;
97+
uint8_t n = ((num & 0xF8) != 0) ? 8 : 8 - num;
98+
for (uint8_t i=0; i < n; i++) {
99+
SW_WRITE_BIT(bits);
100+
bits >>= 1;
101+
}
102+
} while((num & 0xF8) != 0);
103+
}
104+
105+
void SWD_ReadSequence(uint8_t num, __xdata uint8_t *ptr) {
106+
if (num == 0)
107+
return;
108+
109+
PIN_SWDIO_OUT_DISABLE();
110+
do {
111+
uint8_t bits = 0;
112+
uint8_t bit = 1;
113+
uint8_t n = ((num < 8) ? num : 8);
114+
for (uint8_t i=0; i < n; i++) {
115+
PIN_SWCLK = 0; // set SWCLK to low
116+
if (PIN_SWDIO) {
117+
bits |= bit;
118+
}
119+
PIN_SWCLK = 1; // set SWCLK to high
120+
bit += bit;
121+
}
122+
*ptr++ = bits;
123+
num -= n;
124+
} while(num != 0);
91125
}
92126

127+
93128
// SWD Transfer I/O
94129
// request: A[3:2] RnW APnDP
95130
// data: DATA[31:0]
@@ -103,8 +138,10 @@ uint8_t SWD_Transfer (uint8_t request /* , uint32_t *data */) {
103138
uint8_t n;
104139

105140
/* Packet Request */
106-
parity = 0U;
107-
SW_WRITE_BIT(1U); /* Start Bit */
141+
PIN_SWDIO_OUT(1);
142+
PIN_SWDIO_OUT_ENABLE();
143+
SW_CLOCK_CYCLE(); /* Start Bit */
144+
parity = 0;
108145
bit = request >> 0;
109146
SW_WRITE_BIT(bit); /* APnDP Bit */
110147
parity += bit;
@@ -118,8 +155,8 @@ uint8_t SWD_Transfer (uint8_t request /* , uint32_t *data */) {
118155
SW_WRITE_BIT(bit); /* A3 Bit */
119156
parity += bit;
120157
SW_WRITE_BIT(parity); /* Parity Bit */
121-
SW_WRITE_BIT(0U); /* Stop Bit */
122-
SW_WRITE_BIT(1U); /* Park Bit */
158+
SW_WRITE_BIT(0); /* Stop Bit */
159+
SW_WRITE_BIT(1); /* Park Bit */
123160

124161
/* Turnaround */
125162
PIN_SWDIO_OUT_DISABLE();
@@ -139,8 +176,8 @@ uint8_t SWD_Transfer (uint8_t request /* , uint32_t *data */) {
139176
/* Data transfer */
140177
if (request & DAP_TRANSFER_RnW) {
141178
/* Read data */
142-
val = 0U;
143-
parity = 0U;
179+
val = 0;
180+
parity = 0;
144181
for (n = 0; n < 32; n++) {
145182
SW_READ_BIT(bit); /* Read RDATA[0:31] */
146183
parity += bit;
@@ -150,7 +187,7 @@ uint8_t SWD_Transfer (uint8_t request /* , uint32_t *data */) {
150187
data[n >> 3] = val;
151188
}
152189
SW_READ_BIT(bit); /* Read Parity */
153-
if ((parity ^ bit) & 1U) {
190+
if ((parity ^ bit) & 1) {
154191
ack = DAP_TRANSFER_ERROR;
155192
}
156193
// if (data) { *data = val; }
@@ -167,8 +204,8 @@ uint8_t SWD_Transfer (uint8_t request /* , uint32_t *data */) {
167204
PIN_SWDIO_OUT_ENABLE();
168205
/* Write data */
169206
// val = *data;
170-
parity = 0U;
171-
val = 0U;
207+
parity = 0;
208+
val = 0;
172209
for (n = 0; n < 32; n++) {
173210
if ((n & 7) == 0)
174211
val = data[n >> 3];
@@ -187,19 +224,19 @@ uint8_t SWD_Transfer (uint8_t request /* , uint32_t *data */) {
187224
/* Idle cycles */
188225
n = DAP_Data.transfer.idle_cycles;
189226
if (n) {
190-
PIN_SWDIO_OUT(0U);
227+
PIN_SWDIO_OUT(0);
191228
for (; n; n--) {
192229
SW_CLOCK_CYCLE();
193230
}
194231
}
195-
PIN_SWDIO_OUT(1U);
232+
PIN_SWDIO_OUT(1);
196233
return ((uint8_t)ack);
197234
}
198235

199236
if ((ack == DAP_TRANSFER_WAIT) || (ack == DAP_TRANSFER_FAULT)) {
200237
/* WAIT or FAULT response */
201-
if (DAP_Data.swd_conf.data_phase && ((request & DAP_TRANSFER_RnW) != 0U)) {
202-
for (n = 32U+1U; n; n--) {
238+
if (DAP_Data.swd_conf.data_phase && ((request & DAP_TRANSFER_RnW) != 0)) {
239+
for (n = 32 + 1; n; n--) {
203240
SW_CLOCK_CYCLE(); /* Dummy Read RDATA[0:31] + Parity */
204241
}
205242
}
@@ -208,21 +245,21 @@ uint8_t SWD_Transfer (uint8_t request /* , uint32_t *data */) {
208245
SW_CLOCK_CYCLE();
209246
}
210247
PIN_SWDIO_OUT_ENABLE();
211-
if (DAP_Data.swd_conf.data_phase && ((request & DAP_TRANSFER_RnW) == 0U)) {
212-
PIN_SWDIO_OUT(0U);
213-
for (n = 32U+1U; n; n--) {
248+
if (DAP_Data.swd_conf.data_phase && ((request & DAP_TRANSFER_RnW) == 0)) {
249+
PIN_SWDIO_OUT(0);
250+
for (n = 32 + 1; n; n--) {
214251
SW_CLOCK_CYCLE(); /* Dummy Write WDATA[0:31] + Parity */
215252
}
216253
}
217-
PIN_SWDIO_OUT(1U);
254+
PIN_SWDIO_OUT(1);
218255
return ((uint8_t)ack);
219256
}
220257

221258
/* Protocol error */
222-
for (n = DAP_Data.swd_conf.turnaround + 32U + 1U; n; n--) {
259+
for (n = DAP_Data.swd_conf.turnaround + 32 + 1; n; n--) {
223260
SW_CLOCK_CYCLE(); /* Back off data phase */
224261
}
225262
PIN_SWDIO_OUT_ENABLE();
226-
PIN_SWDIO_OUT(1U);
263+
PIN_SWDIO_OUT(1);
227264
return ((uint8_t)ack);
228265
}

0 commit comments

Comments
 (0)