diff options
author | Antonio Borneo <borneo.antonio@gmail.com> | 2020-10-31 14:55:10 +0100 |
---|---|---|
committer | Antonio Borneo <borneo.antonio@gmail.com> | 2020-11-07 20:54:08 +0000 |
commit | 475f42051e13d64bc4d1960306ad1d2ea3c7962a (patch) | |
tree | 93ad8afd63ca6a858de9d67de395358049e29a2d | |
parent | 1f6efaada0686f7e9e6164919eb739892855d327 (diff) | |
download | riscv-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
-rw-r--r-- | src/jtag/drivers/stlink_usb.c | 16 |
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; |