swdptap: Cleaned up swdptap_turnaround

This commit is contained in:
dragonmux 2022-07-16 02:24:42 +01:00 committed by Piotr Esden-Tempski
parent 10d30821e5
commit 92c7a11cd2
1 changed files with 14 additions and 13 deletions

View File

@ -24,37 +24,38 @@
#include "timing.h" #include "timing.h"
#include "adiv5.h" #include "adiv5.h"
enum { typedef enum swdio_status_e {
SWDIO_STATUS_FLOAT = 0, SWDIO_STATUS_FLOAT = 0,
SWDIO_STATUS_DRIVE SWDIO_STATUS_DRIVE
}; } swdio_status_t;
static void swdptap_turnaround(int dir) __attribute__((optimize(3))); static void swdptap_turnaround(swdio_status_t dir) __attribute__((optimize(3)));
static uint32_t swdptap_seq_in(size_t clock_cycles) __attribute__((optimize(3))); static uint32_t swdptap_seq_in(size_t clock_cycles) __attribute__((optimize(3)));
static bool swdptap_seq_in_parity(uint32_t *ret, size_t clock_cycles) __attribute__((optimize(3))); static bool swdptap_seq_in_parity(uint32_t *ret, size_t clock_cycles) __attribute__((optimize(3)));
static void swdptap_seq_out(uint32_t tms_states, size_t clock_cycles) __attribute__((optimize(3))); static void swdptap_seq_out(uint32_t tms_states, size_t clock_cycles) __attribute__((optimize(3)));
static void swdptap_seq_out_parity(uint32_t tms_states, size_t clock_cycles) __attribute__((optimize(3))); static void swdptap_seq_out_parity(uint32_t tms_states, size_t clock_cycles) __attribute__((optimize(3)));
static void swdptap_turnaround(int dir) static void swdptap_turnaround(const swdio_status_t dir)
{ {
static int olddir = SWDIO_STATUS_FLOAT; static swdio_status_t olddir = SWDIO_STATUS_FLOAT;
register volatile int32_t cnt;
/* Don't turnaround if direction not changing */ /* Don't turnaround if direction not changing */
if(dir == olddir) return; if (dir == olddir)
return;
olddir = dir; olddir = dir;
#ifdef DEBUG_SWD_BITS #ifdef DEBUG_SWD_BITS
DEBUG("%s", dir ? "\n-> ":"\n<- "); DEBUG("%s", dir ? "\n-> " : "\n<- ");
#endif #endif
if(dir == SWDIO_STATUS_FLOAT) if (dir == SWDIO_STATUS_FLOAT)
SWDIO_MODE_FLOAT(); SWDIO_MODE_FLOAT();
gpio_set(SWCLK_PORT, SWCLK_PIN); gpio_set(SWCLK_PORT, SWCLK_PIN);
for(cnt = swd_delay_cnt; --cnt > 0;); for (volatile int32_t cnt = swd_delay_cnt; --cnt > 0;)
continue;
gpio_clear(SWCLK_PORT, SWCLK_PIN); gpio_clear(SWCLK_PORT, SWCLK_PIN);
for(cnt = swd_delay_cnt; --cnt > 0;); for (volatile int32_t cnt = swd_delay_cnt; --cnt > 0;)
if(dir == SWDIO_STATUS_DRIVE) continue;
if (dir == SWDIO_STATUS_DRIVE)
SWDIO_MODE_DRIVE(); SWDIO_MODE_DRIVE();
} }