aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2020-10-31 14:55:10 +0100
committerAntonio Borneo <borneo.antonio@gmail.com>2020-11-07 20:54:08 +0000
commit475f42051e13d64bc4d1960306ad1d2ea3c7962a (patch)
tree93ad8afd63ca6a858de9d67de395358049e29a2d /src
parent1f6efaada0686f7e9e6164919eb739892855d327 (diff)
downloadriscv-openocd-475f42051e13d64bc4d1960306ad1d2ea3c7962a.zip
riscv-openocd-475f42051e13d64bc4d1960306ad1d2ea3c7962a.tar.gz
riscv-openocd-475f42051e13d64bc4d1960306ad1d2ea3c7962a.tar.bz2
stlink: fix computation of trace prescaler
Use integer rounding for the computation of prescaler. Improve the test of prescaler range, knowing its value would be decremented before being written in TPIU ACPR. Change-Id: I041dde1dca41323904e36a6b6975028a6de902b3 Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: http://openocd.zylin.com/5909 Tested-by: jenkins
Diffstat (limited to 'src')
-rw-r--r--src/jtag/drivers/stlink_usb.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/jtag/drivers/stlink_usb.c b/src/jtag/drivers/stlink_usb.c
index 8ab73cd..c54e2cc 100644
--- a/src/jtag/drivers/stlink_usb.c
+++ b/src/jtag/drivers/stlink_usb.c
@@ -2989,7 +2989,6 @@ static int stlink_config_trace(void *handle, bool enabled,
uint16_t *prescaler)
{
struct stlink_usb_handle_s *h = handle;
- uint16_t presc;
if (enabled && (!(h->version.flags & STLINK_F_HAS_TRACE) ||
pin_protocol != TPIU_PIN_PROTOCOL_ASYNC_UART)) {
@@ -3012,12 +3011,17 @@ static int stlink_config_trace(void *handle, bool enabled,
if (!*trace_freq)
*trace_freq = max_trace_freq;
- presc = traceclkin_freq / *trace_freq;
-
- if (traceclkin_freq % *trace_freq > 0)
- presc++;
+ unsigned int presc = (traceclkin_freq + *trace_freq / 2) / *trace_freq;
+ if (presc == 0 || presc > TPIU_ACPR_MAX_SWOSCALER + 1) {
+ LOG_ERROR("SWO frequency is not suitable. Please choose a different "
+ "frequency.");
+ return ERROR_FAIL;
+ }
- if (presc > TPIU_ACPR_MAX_SWOSCALER) {
+ /* Probe's UART speed must be within 3% of the TPIU's SWO baud rate. */
+ unsigned int max_deviation = (traceclkin_freq * 3) / 100;
+ if (presc * *trace_freq < traceclkin_freq - max_deviation ||
+ presc * *trace_freq > traceclkin_freq + max_deviation) {
LOG_ERROR("SWO frequency is not suitable. Please choose a different "
"frequency.");
return ERROR_FAIL;