[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openocd-development
Subject:    [OpenOCD-devel] [PATCH]: 8ceb99f stlink: fix computation of trace prescaler
From:       gerrit () openocd ! org (gerrit)
Date:       2020-10-31 14:12:36
Message-ID: 20201031141236.37BFD4A03B5 () mail ! openocd ! org
[Download RAW message or body]

This is an automated email from Gerrit.

Antonio Borneo (borneo.antonio@gmail.com) just uploaded a new patch set to Gerrit, \
which you can find at http://openocd.zylin.com/5909

-- gerrit

commit 8ceb99f5aad2793f21667505be99cf853809c7d2
Author: Antonio Borneo <borneo.antonio@gmail.com>
Date:   Sat Oct 31 14:55:10 2020 +0100

    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>

diff --git a/src/jtag/drivers/stlink_usb.c b/src/jtag/drivers/stlink_usb.c
index e8a7ae0..94f917f 100644
--- a/src/jtag/drivers/stlink_usb.c
+++ b/src/jtag/drivers/stlink_usb.c
@@ -2989,7 +2989,6 @@ 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 @@ 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;

-- 


_______________________________________________
OpenOCD-devel mailing list
OpenOCD-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openocd-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic