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:
parent
3ef2c66a8a
commit
3e8f9fb7df
3 changed files with 45 additions and 8 deletions
|
|
@ -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."); \
|
||||
\
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue