Skip to content

Commit 3e8f9fb

Browse files
jfischer-noaescolar
authored andcommitted
drivers: swdp_bitbang: add SW output sequence
Add API to read count bits from SWDIO into data LSB first. Signed-off-by: Maximilian Deubel <[email protected]> Signed-off-by: Johann Fischer <[email protected]>
1 parent 3ef2c66 commit 3e8f9fb

File tree

3 files changed

+45
-8
lines changed

3 files changed

+45
-8
lines changed

drivers/dp/swdp_bitbang.c

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,8 @@ static ALWAYS_INLINE void pin_swdio_out_disable(const struct device *dev)
252252
pin_delay_asm(delay); \
253253
} while (0)
254254

255-
static int sw_sequence(const struct device *dev, uint32_t count,
256-
const uint8_t *data)
255+
static int sw_output_sequence(const struct device *dev, uint32_t count,
256+
const uint8_t *data)
257257
{
258258
struct sw_cfg_data *sw_data = dev->data;
259259
unsigned int key;
@@ -285,6 +285,37 @@ static int sw_sequence(const struct device *dev, uint32_t count,
285285
return 0;
286286
}
287287

288+
static int sw_input_sequence(const struct device *dev, uint32_t count,
289+
uint8_t *data)
290+
{
291+
struct sw_cfg_data *sw_data = dev->data;
292+
unsigned int key;
293+
uint32_t val = 0U; /* current byte */
294+
uint32_t n = 8U; /* bit counter */
295+
uint32_t bit;
296+
297+
LOG_DBG("reading %u bits", count);
298+
key = irq_lock();
299+
300+
pin_swdio_out_disable(dev);
301+
while (count--) {
302+
if (n == 0U) {
303+
*data++ = val;
304+
val = 0;
305+
n = 8U;
306+
}
307+
SW_READ_BIT(dev, bit, sw_data->clock_delay);
308+
LOG_DBG("Read bit: %d", bit);
309+
val = (val << 1 | bit);
310+
n--;
311+
}
312+
313+
*data = val; /* write last byte */
314+
irq_unlock(key);
315+
316+
return 0;
317+
}
318+
288319
static ALWAYS_INLINE void sw_cycle_turnaround(const struct device *dev)
289320
{
290321
struct sw_cfg_data *sw_data = dev->data;
@@ -653,7 +684,8 @@ static int sw_gpio_init(const struct device *dev)
653684
}
654685

655686
static struct swdp_api swdp_bitbang_api = {
656-
.swdp_sequence = sw_sequence,
687+
.swdp_output_sequence = sw_output_sequence,
688+
.swdp_input_sequence = sw_input_sequence,
657689
.swdp_transfer = sw_transfer,
658690
.swdp_set_pins = sw_set_pins,
659691
.swdp_get_pins = sw_get_pins,
@@ -669,7 +701,7 @@ static struct swdp_api swdp_bitbang_api = {
669701
(NULL))
670702

671703
#define SW_DEVICE_DEFINE(n) \
672-
BUILD_ASSERT((DT_INST_NODE_HAS_PROP(n, dout_gpios)) == \
704+
BUILD_ASSERT((DT_INST_NODE_HAS_PROP(n, dout_gpios)) == \
673705
(DT_INST_NODE_HAS_PROP(n, dnoe_gpios)), \
674706
"Either the dout-gpios or dnoe-gpios property is missing."); \
675707
\

include/zephyr/drivers/swdp.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,14 @@ extern "C" {
4343
*/
4444
struct swdp_api {
4545
/* Generate SWJ Sequence according to sequence bit count and bit data */
46-
int (*swdp_sequence)(const struct device *dev,
47-
uint32_t count,
48-
const uint8_t *data);
46+
int (*swdp_output_sequence)(const struct device *dev,
47+
uint32_t count,
48+
const uint8_t *data);
49+
50+
/* Read count bits from SWDIO into data LSB first */
51+
int (*swdp_input_sequence)(const struct device *dev,
52+
uint32_t count,
53+
uint8_t *data);
4954

5055
/*
5156
* Perform SWDP transfer based on host request value and store

subsys/dap/cmsis_dap.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ static uint16_t dap_swj_sequence(struct dap_context *const ctx,
297297
return 1U;
298298
}
299299

300-
api->swdp_sequence(ctx->swdp_dev, count, &request[1]);
300+
api->swdp_output_sequence(ctx->swdp_dev, count, &request[1]);
301301
response[0] = DAP_OK;
302302

303303
return 1U;

0 commit comments

Comments
 (0)