swim: fix adapter speed handling

SWIM transport only supports two adapter speeds:
- "low speed"  equal to 363 kHz (8 MHz / 22)
- "high speed" equal to 800 kHz (8 MHz / 10)

Replace the previous convention that use "0" or "1" for "low" or
"high" speed with the effective speed in kHz.
Rework the implementation of stlink_speed_swim().
Set low speed in the stm8 config files, because only low speed is
permitted at debug connection; the previous code ignores the
initial value.

Change-Id: I2484c9419a2c554c59eb6b9216339393ab0b54f3
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/5529
Tested-by: jenkins
This commit is contained in:
Antonio Borneo 2020-02-04 11:07:01 +01:00
parent ac18e960ce
commit ac05f929ed
5 changed files with 18 additions and 11 deletions

View File

@ -36,6 +36,7 @@
#include <jtag/hla/hla_layout.h> #include <jtag/hla/hla_layout.h>
#include <jtag/hla/hla_transport.h> #include <jtag/hla/hla_transport.h>
#include <jtag/hla/hla_interface.h> #include <jtag/hla/hla_interface.h>
#include <jtag/swim.h>
#include <target/target.h> #include <target/target.h>
#include <transport/transport.h> #include <transport/transport.h>
@ -2478,17 +2479,20 @@ static int stlink_usb_override_target(const char *targetname)
static int stlink_speed_swim(void *handle, int khz, bool query) static int stlink_speed_swim(void *handle, int khz, bool query)
{ {
int retval;
/* /*
we dont care what the khz rate is
we only have low and high speed... we only have low and high speed...
before changing speed the SWIM_CSR HS bit before changing speed the SWIM_CSR HS bit
must be updated must be updated
*/ */
if (khz == 0) if (!query) {
stlink_swim_speed(handle, 0); retval = stlink_swim_speed(handle, (khz < SWIM_FREQ_HIGH) ? 0 : 1);
else if (retval != ERROR_OK)
stlink_swim_speed(handle, 1); LOG_ERROR("Unable to set adapter speed");
return khz; }
return (khz < SWIM_FREQ_HIGH) ? SWIM_FREQ_LOW : SWIM_FREQ_HIGH;
} }
static int stlink_match_speed_map(const struct speed_map *map, unsigned int map_size, int khz, bool query) static int stlink_match_speed_map(const struct speed_map *map, unsigned int map_size, int khz, bool query)

View File

@ -13,6 +13,9 @@
#ifndef OPENOCD_JTAG_SWIM_H #ifndef OPENOCD_JTAG_SWIM_H
#define OPENOCD_JTAG_SWIM_H #define OPENOCD_JTAG_SWIM_H
#define SWIM_FREQ_LOW 363
#define SWIM_FREQ_HIGH 800
struct swim_driver { struct swim_driver {
/** /**
* Send SRST (system reset) command to target. * Send SRST (system reset) command to target.

View File

@ -1670,7 +1670,7 @@ static int stm8_examine(struct target *target)
retval = stm8_write_u8(target, SWIM_CSR, SAFE_MASK + SWIM_DM + HS); retval = stm8_write_u8(target, SWIM_CSR, SAFE_MASK + SWIM_DM + HS);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
jtag_config_khz(1); jtag_config_khz(SWIM_FREQ_HIGH);
stm8->swim_configured = true; stm8->swim_configured = true;
/* /*
Now is the time to deassert reset if connect_under_reset. Now is the time to deassert reset if connect_under_reset.

View File

@ -78,8 +78,8 @@ $_TARGETNAME configure -optionstart $_OPTIONSTART -optionend $_OPTIONEND -blocks
# Set stm8l type # Set stm8l type
$_TARGETNAME configure -enable_stm8l $_TARGETNAME configure -enable_stm8l
# The khz rate does not apply here, only slow <0> and fast <1> # Set low speed at debug entry
adapter speed 1 adapter speed 363
reset_config srst_only reset_config srst_only

View File

@ -75,8 +75,8 @@ $_TARGETNAME configure -optionstart $_OPTIONSTART -optionend $_OPTIONEND -blocks
# Uncomment this line to enable interrupts while instruction step # Uncomment this line to enable interrupts while instruction step
#$_TARGETNAME configure -enable_step_irq #$_TARGETNAME configure -enable_step_irq
# The khz rate does not apply here, only slow <0> and fast <1> # Set low speed at debug entry
adapter speed 1 adapter speed 363
reset_config srst_only reset_config srst_only