drivers: swdp_bitbang: add SW output sequence

Add API to read count bits from SWDIO into data LSB first.

Signed-off-by: Maximilian Deubel <maximilian.deubel@nordicsemi.no>
Signed-off-by: Johann Fischer <johann.fischer@nordicsemi.no>
This commit is contained in:
Johann Fischer 2023-08-31 17:10:00 +02:00 committed by Alberto Escolar
parent 3ef2c66a8a
commit 3e8f9fb7df
3 changed files with 45 additions and 8 deletions

View file

@ -252,8 +252,8 @@ static ALWAYS_INLINE void pin_swdio_out_disable(const struct device *dev)
pin_delay_asm(delay); \
} while (0)
static int sw_sequence(const struct device *dev, uint32_t count,
const uint8_t *data)
static int sw_output_sequence(const struct device *dev, uint32_t count,
const uint8_t *data)
{
struct sw_cfg_data *sw_data = dev->data;
unsigned int key;
@ -285,6 +285,37 @@ static int sw_sequence(const struct device *dev, uint32_t count,
return 0;
}
static int sw_input_sequence(const struct device *dev, uint32_t count,
uint8_t *data)
{
struct sw_cfg_data *sw_data = dev->data;
unsigned int key;
uint32_t val = 0U; /* current byte */
uint32_t n = 8U; /* bit counter */
uint32_t bit;
LOG_DBG("reading %u bits", count);
key = irq_lock();
pin_swdio_out_disable(dev);
while (count--) {
if (n == 0U) {
*data++ = val;
val = 0;
n = 8U;
}
SW_READ_BIT(dev, bit, sw_data->clock_delay);
LOG_DBG("Read bit: %d", bit);
val = (val << 1 | bit);
n--;
}
*data = val; /* write last byte */
irq_unlock(key);
return 0;
}
static ALWAYS_INLINE void sw_cycle_turnaround(const struct device *dev)
{
struct sw_cfg_data *sw_data = dev->data;
@ -653,7 +684,8 @@ static int sw_gpio_init(const struct device *dev)
}
static struct swdp_api swdp_bitbang_api = {
.swdp_sequence = sw_sequence,
.swdp_output_sequence = sw_output_sequence,
.swdp_input_sequence = sw_input_sequence,
.swdp_transfer = sw_transfer,
.swdp_set_pins = sw_set_pins,
.swdp_get_pins = sw_get_pins,
@ -669,7 +701,7 @@ static struct swdp_api swdp_bitbang_api = {
(NULL))
#define SW_DEVICE_DEFINE(n) \
BUILD_ASSERT((DT_INST_NODE_HAS_PROP(n, dout_gpios)) == \
BUILD_ASSERT((DT_INST_NODE_HAS_PROP(n, dout_gpios)) == \
(DT_INST_NODE_HAS_PROP(n, dnoe_gpios)), \
"Either the dout-gpios or dnoe-gpios property is missing."); \
\

View file

@ -43,9 +43,14 @@ extern "C" {
*/
struct swdp_api {
/* Generate SWJ Sequence according to sequence bit count and bit data */
int (*swdp_sequence)(const struct device *dev,
uint32_t count,
const uint8_t *data);
int (*swdp_output_sequence)(const struct device *dev,
uint32_t count,
const uint8_t *data);
/* Read count bits from SWDIO into data LSB first */
int (*swdp_input_sequence)(const struct device *dev,
uint32_t count,
uint8_t *data);
/*
* Perform SWDP transfer based on host request value and store

View file

@ -297,7 +297,7 @@ static uint16_t dap_swj_sequence(struct dap_context *const ctx,
return 1U;
}
api->swdp_sequence(ctx->swdp_dev, count, &request[1]);
api->swdp_output_sequence(ctx->swdp_dev, count, &request[1]);
response[0] = DAP_OK;
return 1U;