diff options
author | Andreas Fritiofson <andreas.fritiofson@gmail.com> | 2015-11-13 23:48:46 +0100 |
---|---|---|
committer | Andreas Fritiofson <andreas.fritiofson@gmail.com> | 2015-12-29 20:26:45 +0000 |
commit | a6c4eb03455f6e97fc25183aae249d6ccdcbfb0f (patch) | |
tree | a994a27efca2f7b081747ff7ee82d78b2c98b534 /src/jtag/drivers/bitbang.c | |
parent | bf4cf766310768198cfa766467d47bdb180f9b27 (diff) |
swd: Remove DAP from parameter list
Making the SWD driver aware of the DAP that controls it is a layering
violation.
The only usage for the DAP pointer is to store the number of idle cycles
the AP may need to avoid WAITs. Replace the DAP pointer with a cycle
count hint instead to avoid future misuse.
Change-Id: I3e64e11a43ba2396bd646a4cf8f9bc331805d802
Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Reviewed-on: http://openocd.zylin.com/3141
Tested-by: jenkins
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
Diffstat (limited to 'src/jtag/drivers/bitbang.c')
-rw-r--r-- | src/jtag/drivers/bitbang.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/src/jtag/drivers/bitbang.c b/src/jtag/drivers/bitbang.c index 65028f21..1a0fa1c9 100644 --- a/src/jtag/drivers/bitbang.c +++ b/src/jtag/drivers/bitbang.c @@ -45,6 +45,8 @@ extern struct jtag_interface *jtag_interface; */ static void bitbang_stableclocks(int num_cycles); +static void bitbang_swd_write_reg(uint8_t cmd, uint32_t value, uint32_t ap_delay_clk); + struct bitbang_interface *bitbang_interface; /* DANGER!!!! clock absolutely *MUST* be 0 in idle or reset won't work! @@ -378,7 +380,7 @@ static void bitbang_exchange(bool rnw, uint8_t buf[], unsigned int offset, unsig } } -int bitbang_swd_switch_seq(struct adiv5_dap *dap, enum swd_special_seq seq) +int bitbang_swd_switch_seq(enum swd_special_seq seq) { LOG_DEBUG("bitbang_swd_switch_seq"); @@ -409,16 +411,13 @@ void bitbang_switch_to_swd(void) bitbang_exchange(false, (uint8_t *)swd_seq_jtag_to_swd, 0, swd_seq_jtag_to_swd_len); } -static void swd_clear_sticky_errors(struct adiv5_dap *dap) +static void swd_clear_sticky_errors(void) { - const struct swd_driver *swd = jtag_interface->swd; - assert(swd); - - swd->write_reg(dap, swd_cmd(false, false, DP_ABORT), - STKCMPCLR | STKERRCLR | WDERRCLR | ORUNERRCLR); + bitbang_swd_write_reg(swd_cmd(false, false, DP_ABORT), + STKCMPCLR | STKERRCLR | WDERRCLR | ORUNERRCLR, 0); } -static void bitbang_swd_read_reg(struct adiv5_dap *dap, uint8_t cmd, uint32_t *value) +static void bitbang_swd_read_reg(uint8_t cmd, uint32_t *value, uint32_t ap_delay_clk) { LOG_DEBUG("bitbang_swd_read_reg"); assert(cmd & SWD_CMD_RnW); @@ -459,11 +458,11 @@ static void bitbang_swd_read_reg(struct adiv5_dap *dap, uint8_t cmd, uint32_t *v if (value) *value = data; if (cmd & SWD_CMD_APnDP) - bitbang_exchange(true, NULL, 0, dap->ap[dap_ap_get_select(dap)].memaccess_tck); + bitbang_exchange(true, NULL, 0, ap_delay_clk); return; case SWD_ACK_WAIT: LOG_DEBUG("SWD_ACK_WAIT"); - swd_clear_sticky_errors(dap); + swd_clear_sticky_errors(); break; case SWD_ACK_FAULT: LOG_DEBUG("SWD_ACK_FAULT"); @@ -477,7 +476,7 @@ static void bitbang_swd_read_reg(struct adiv5_dap *dap, uint8_t cmd, uint32_t *v } } -static void bitbang_swd_write_reg(struct adiv5_dap *dap, uint8_t cmd, uint32_t value) +static void bitbang_swd_write_reg(uint8_t cmd, uint32_t value, uint32_t ap_delay_clk) { LOG_DEBUG("bitbang_swd_write_reg"); assert(!(cmd & SWD_CMD_RnW)); @@ -511,11 +510,11 @@ static void bitbang_swd_write_reg(struct adiv5_dap *dap, uint8_t cmd, uint32_t v switch (ack) { case SWD_ACK_OK: if (cmd & SWD_CMD_APnDP) - bitbang_exchange(true, NULL, 0, dap->ap[dap_ap_get_select(dap)].memaccess_tck); + bitbang_exchange(true, NULL, 0, ap_delay_clk); return; case SWD_ACK_WAIT: LOG_DEBUG("SWD_ACK_WAIT"); - swd_clear_sticky_errors(dap); + swd_clear_sticky_errors(); break; case SWD_ACK_FAULT: LOG_DEBUG("SWD_ACK_FAULT"); @@ -529,7 +528,7 @@ static void bitbang_swd_write_reg(struct adiv5_dap *dap, uint8_t cmd, uint32_t v } } -static int bitbang_swd_run_queue(struct adiv5_dap *dap) +static int bitbang_swd_run_queue(void) { LOG_DEBUG("bitbang_swd_run_queue"); /* A transaction must be followed by another transaction or at least 8 idle cycles to |