Keep TMS floating until scanning.

NRF5x shares nRST with SWDIO and otherwise does not run until scan is done.
This commit is contained in:
Uwe Bonnes 2018-03-07 15:57:00 +01:00
parent 97561fc5cc
commit 59e03dea27
7 changed files with 28 additions and 14 deletions

View File

@ -23,6 +23,11 @@
#include "general.h"
#include "swdptap.h"
enum {
SWDIO_STATUS_FLOAT = 0,
SWDIO_STATUS_DRIVE
};
int swdptap_init(void)
{
return 0;
@ -30,7 +35,7 @@ int swdptap_init(void)
static void swdptap_turnaround(int dir)
{
static int olddir = 0;
static int olddir = SWDIO_STATUS_FLOAT;
/* Don't turnaround if direction not changing */
if(dir == olddir) return;
@ -40,12 +45,12 @@ static void swdptap_turnaround(int dir)
DEBUG("%s", dir ? "\n-> ":"\n<- ");
#endif
if(dir)
if(dir == SWDIO_STATUS_FLOAT)
SWDIO_MODE_FLOAT();
gpio_set(SWCLK_PORT, SWCLK_PIN);
gpio_set(SWCLK_PORT, SWCLK_PIN);
gpio_clear(SWCLK_PORT, SWCLK_PIN);
if(!dir)
if(dir == SWDIO_STATUS_DRIVE)
SWDIO_MODE_DRIVE();
}
@ -53,7 +58,7 @@ bool swdptap_bit_in(void)
{
uint16_t ret;
swdptap_turnaround(1);
swdptap_turnaround(SWDIO_STATUS_FLOAT);
ret = gpio_get(SWDIO_PORT, SWDIO_PIN);
gpio_set(SWCLK_PORT, SWCLK_PIN);
@ -74,7 +79,7 @@ swdptap_seq_in(int ticks)
uint32_t ret = 0;
int len = ticks;
swdptap_turnaround(1);
swdptap_turnaround(SWDIO_STATUS_FLOAT);
while (len--) {
int res;
res = gpio_get(SWDIO_PORT, SWDIO_PIN);
@ -101,7 +106,7 @@ swdptap_seq_in_parity(uint32_t *ret, int ticks)
bool bit;
int len = ticks;
swdptap_turnaround(1);
swdptap_turnaround(SWDIO_STATUS_FLOAT);
while (len--) {
bit = gpio_get(SWDIO_PORT, SWDIO_PIN);
gpio_set(SWCLK_PORT, SWCLK_PIN);
@ -131,7 +136,7 @@ void swdptap_bit_out(bool val)
DEBUG("%d", val);
#endif
swdptap_turnaround(0);
swdptap_turnaround(SWDIO_STATUS_DRIVE);
gpio_set_val(SWDIO_PORT, SWDIO_PIN, val);
gpio_clear(SWCLK_PORT, SWCLK_PIN);
@ -147,7 +152,7 @@ swdptap_seq_out(uint32_t MS, int ticks)
for (int i = 0; i < ticks; i++)
DEBUG("%d", (MS & (1 << i)) ? 1 : 0);
#endif
swdptap_turnaround(0);
swdptap_turnaround(SWDIO_STATUS_DRIVE);
while (ticks--) {
gpio_set_val(SWDIO_PORT, SWDIO_PIN, data);
MS >>= 1;
@ -167,7 +172,7 @@ swdptap_seq_out_parity(uint32_t MS, int ticks)
for (int i = 0; i < ticks; i++)
DEBUG("%d", (MS & (1 << i)) ? 1 : 0);
#endif
swdptap_turnaround(0);
swdptap_turnaround(SWDIO_STATUS_DRIVE);
while (ticks--) {
gpio_set_val(SWDIO_PORT, SWDIO_PIN, data);

View File

@ -78,7 +78,9 @@ void platform_init(void)
GPIOC_OSPEEDR |= 0xA20;
gpio_mode_setup(JTAG_PORT, GPIO_MODE_OUTPUT,
GPIO_PUPD_NONE,
TMS_PIN | TCK_PIN | TDI_PIN);
TCK_PIN | TDI_PIN);
gpio_mode_setup(JTAG_PORT, GPIO_MODE_INPUT,
GPIO_PUPD_NONE, TMS_PIN);
gpio_mode_setup(TDO_PORT, GPIO_MODE_INPUT,
GPIO_PUPD_NONE,

View File

@ -63,7 +63,9 @@ void platform_init(void)
GPIOC_OSPEEDR |= 0xA20;
gpio_mode_setup(JTAG_PORT, GPIO_MODE_OUTPUT,
GPIO_PUPD_NONE,
TMS_PIN | TCK_PIN | TDI_PIN);
TCK_PIN | TDI_PIN);
gpio_mode_setup(JTAG_PORT, GPIO_MODE_INPUT,
GPIO_PUPD_NONE, TMS_PIN);
gpio_mode_setup(TDO_PORT, GPIO_MODE_INPUT,
GPIO_PUPD_NONE,

View File

@ -62,7 +62,7 @@ platform_init(void)
gpio_enable_ahb_aperture();
gpio_mode_setup(TMS_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, TMS_PIN);
gpio_mode_setup(TMS_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, TMS_PIN);
gpio_mode_setup(TCK_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, TCK_PIN);
gpio_mode_setup(TDI_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, TDI_PIN);
gpio_mode_setup(TDO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, TDO_PIN);

View File

@ -113,6 +113,11 @@ void platform_init(void)
gpio_set_mode(JTAG_PORT, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL,
TMS_DIR_PIN | TMS_PIN | TCK_PIN | TDI_PIN);
gpio_set_mode(JTAG_PORT, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL,
TMS_DIR_PIN | TCK_PIN | TDI_PIN);
gpio_set_mode(JTAG_PORT, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_INPUT_FLOAT, TMS_PIN);
/* This needs some fixing... */
/* Toggle required to sort out line drivers... */
gpio_port_write(GPIOA, 0x8102);

View File

@ -63,7 +63,7 @@ void platform_init(void)
}
/* Setup GPIO ports */
gpio_set_mode(TMS_PORT, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, TMS_PIN);
GPIO_CNF_INPUT_FLOAT, TMS_PIN);
gpio_set_mode(TCK_PORT, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, TCK_PIN);
gpio_set_mode(TDI_PORT, GPIO_MODE_OUTPUT_50_MHZ,

View File

@ -58,7 +58,7 @@ void platform_init(void)
AFIO_MAPR = data;
/* Setup JTAG GPIO ports */
gpio_set_mode(TMS_PORT, GPIO_MODE_OUTPUT_10_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, TMS_PIN);
GPIO_CNF_INPUT_FLOAT, TMS_PIN);
gpio_set_mode(TCK_PORT, GPIO_MODE_OUTPUT_10_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, TCK_PIN);
gpio_set_mode(TDI_PORT, GPIO_MODE_OUTPUT_10_MHZ,