mirror of
https://github.com/linux-msm/openocd.git
synced 2026-02-25 13:15:07 -08:00
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
This commit is contained in:
@@ -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;
|
||||
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 (traceclkin_freq % *trace_freq > 0)
|
||||
presc++;
|
||||
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user