drivers/jlink: fix check for max prescaler
authorAntonio Borneo <borneo.antonio@gmail.com>
Sat, 31 Oct 2020 13:49:23 +0000 (14:49 +0100)
committerAntonio Borneo <borneo.antonio@gmail.com>
Sat, 7 Nov 2020 20:53:53 +0000 (20:53 +0000)
The value stored in TPIU ACPR is the prescaler value decremented
by one. Thus, the test should verify that prescaler does not
exceed the maximum ACPR value plus one. Also, zero value is not
allowed for prescaler.

Change-Id: I1817f04f2a310b2f413bad726f0cb9dd6a4172e2
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/5907
Tested-by: jenkins
Reviewed-by: Adrian M Negreanu <adrian.negreanu@nxp.com>
src/jtag/drivers/jlink.c

index ae8ce49c68e0431ec09a37cc6bd37f66b822bcd1..b915707eca9f301fa7149ce5ff450c140239189b 100644 (file)
@@ -1270,7 +1270,7 @@ static bool calculate_swo_prescaler(unsigned int traceclkin_freq,
                uint32_t trace_freq, uint16_t *prescaler)
 {
        unsigned int presc = (traceclkin_freq + trace_freq / 2) / trace_freq;
-       if (presc > TPIU_ACPR_MAX_SWOSCALER)
+       if (presc == 0 || presc > TPIU_ACPR_MAX_SWOSCALER + 1)
                return false;
 
        /* Probe's UART speed must be within 3% of the TPIU's SWO baud rate. */
@@ -1296,7 +1296,7 @@ static bool detect_swo_freq_and_prescaler(struct jaylink_swo_speed speed,
                *trace_freq = speed.freq / divider;
                presc = ((1.0 - SWO_MAX_FREQ_DEV) * traceclkin_freq) / *trace_freq + 1;
 
-               if (presc > TPIU_ACPR_MAX_SWOSCALER)
+               if (presc > TPIU_ACPR_MAX_SWOSCALER + 1)
                        break;
 
                deviation = fabs(1.0 - ((double)*trace_freq * presc / traceclkin_freq));