drivers: xds110: Add support TCK changes in firmware update 93/5493/2
authorEdward Fewell <efewell@ti.com>
Wed, 4 Mar 2020 19:07:13 +0000 (13:07 -0600)
committerAntonio Borneo <borneo.antonio@gmail.com>
Tue, 24 Mar 2020 17:17:02 +0000 (17:17 +0000)
Starting with XDS110 firmware version 3.0.0.0, the peak TCK
frequency became 14,000 kHz. So the delay count calculation
in the current driver has been updated to use the new
formula for setting the TCK speed depending on which version
of the firmware is detected. And because of the changes, the
default TCK settings for the XDS110 based Launchpads can be
adjusted to take advantage of the higher TCK performance.
Note that the values used have been determined through
testing in the automated test labs to be the highest TCK
frequency with the XDS110 that are still reliable.
Different boards have a different peak TCK setting that
should be safe.

Change-Id: I4d66e90d8fac8272641ba4db4a3a510e3b444d86
Signed-off-by: Edward Fewell <efewell@ti.com>
Reviewed-on: http://openocd.zylin.com/5493
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
src/jtag/drivers/xds110.c
tcl/board/ti_cc13x0_launchpad.cfg
tcl/board/ti_cc13x2_launchpad.cfg
tcl/board/ti_cc26x0_launchpad.cfg
tcl/board/ti_cc26x2_launchpad.cfg
tcl/board/ti_cc3220sf_launchpad.cfg
tcl/board/ti_cc32xx_launchpad.cfg
tcl/board/ti_msp432_launchpad.cfg

index 69d989520537018f20b0d6018d32e1d2583ebd53..085d85f4c3c76807dfce92be28b258fca8de7fc2 100644 (file)
 #define OCD_FIRMWARE_UPGRADE \
        "XDS110: upgrade to version 2.3.0.11+ for improved support"
 
+/* Firmware version that introduced improved TCK performance */
+#define FAST_TCK_FIRMWARE_VERSION 0x03000000
+
+/* Firmware version that introduced 10 MHz and 12 MHz TCK support */
+#define FAST_TCK_PLUS_FIRMWARE_VERSION 0x03000003
+
 /***************************************************************************
  *   USB Connection Buffer Definitions                                     *
  ***************************************************************************/
 
 /* TCK frequency limits */
 #define XDS110_MIN_TCK_SPEED  100 /* kHz */
-#define XDS110_MAX_TCK_SPEED 2500 /* kHz */
-#define XDS110_TCK_PULSE_INCREMENT 66.0
+#define XDS110_MAX_SLOW_TCK_SPEED 2500 /* kHz */
+#define XDS110_MAX_FAST_TCK_SPEED 14000 /* kHz */
+#define XDS110_DEFAULT_TCK_SPEED 2500 /* kHz */
+
+/* Fixed TCK delay values for "Fast" TCK frequencies */
+#define FAST_TCK_DELAY_14000_KHZ 0
+#define FAST_TCK_DELAY_10000_KHZ 0xfffffffd
+#define FAST_TCK_DELAY_12000_KHZ 0xfffffffe
+#define FAST_TCK_DELAY_8500_KHZ 1
+#define FAST_TCK_DELAY_5500_KHZ 2
+/* For TCK frequencies below 5500 kHz, use calculated delay */
 
 /* Scan mode on connect */
 #define MODE_JTAG 1
@@ -249,7 +264,7 @@ static struct xds110_info xds110 = {
        .is_cmapi_acquired = false,
        .is_swd_mode = false,
        .is_ap_dirty = false,
-       .speed = XDS110_MAX_TCK_SPEED,
+       .speed = XDS110_DEFAULT_TCK_SPEED,
        .delay_count = 0,
        .serial = {0},
        .voltage = 0,
@@ -1846,6 +1861,8 @@ static int xds110_execute_queue(void)
 
 static int xds110_speed(int speed)
 {
+       double freq_to_use;
+       uint32_t delay_count;
        bool success;
 
        if (speed == 0) {
@@ -1853,61 +1870,110 @@ static int xds110_speed(int speed)
                return ERROR_JTAG_NOT_IMPLEMENTED;
        }
 
-       if (speed > XDS110_MAX_TCK_SPEED) {
-               LOG_INFO("XDS110: reduce speed request: %dkHz to %dkHz maximum",
-                       speed, XDS110_MAX_TCK_SPEED);
-               speed = XDS110_MAX_TCK_SPEED;
-       }
-
        if (speed < XDS110_MIN_TCK_SPEED) {
-               LOG_INFO("XDS110: increase speed request: %dkHz to %dkHz minimum",
+               LOG_INFO("XDS110: increase speed request: %d kHz to %d kHz minimum",
                        speed, XDS110_MIN_TCK_SPEED);
                speed = XDS110_MIN_TCK_SPEED;
        }
 
-       /* The default is the maximum frequency the XDS110 can support */
-       uint32_t freq_to_use = XDS110_MAX_TCK_SPEED * 1000; /* Hz */
-       uint32_t delay_count = 0;
+       /* Older XDS110 firmware had inefficient scan routines and could only */
+       /* achieve a peak TCK frequency of about 2500 kHz */
+       if (xds110.firmware < FAST_TCK_FIRMWARE_VERSION) {
 
-       if (XDS110_MAX_TCK_SPEED != speed) {
-               freq_to_use = speed * 1000; /* Hz */
+               /* Check for request for top speed or higher */
+               if (speed >= XDS110_MAX_SLOW_TCK_SPEED) {
 
-               /* Calculate the delay count value */
-               double one_giga = 1000000000;
-               /* Get the pulse duration for the maximum frequency supported in ns */
-               double max_freq_pulse_duration = one_giga /
-                       (XDS110_MAX_TCK_SPEED * 1000);
+                       /* Inform user that speed was adjusted down to max possible */
+                       if (speed > XDS110_MAX_SLOW_TCK_SPEED) {
+                               LOG_INFO(
+                                       "XDS110: reduce speed request: %d kHz to %d kHz maximum",
+                                       speed, XDS110_MAX_SLOW_TCK_SPEED);
+                               speed = XDS110_MAX_SLOW_TCK_SPEED;
+                       }
+                       delay_count = 0;
 
-               /* Convert frequency to pulse duration */
-               double freq_to_pulse_width_in_ns = one_giga / freq_to_use;
+               } else {
 
-               /*
-                * Start with the pulse duration for the maximum frequency. Keep
-                * decrementing the time added by each count value till the requested
-                * frequency pulse is less than the calculated value.
-                */
-               double current_value = max_freq_pulse_duration;
+                       const double XDS110_TCK_PULSE_INCREMENT = 66.0;
+                       freq_to_use = speed * 1000; /* Hz */
+                       delay_count = 0;
+
+                       /* Calculate the delay count value */
+                       double one_giga = 1000000000;
+                       /* Get the pulse duration for the max frequency supported in ns */
+                       double max_freq_pulse_duration = one_giga /
+                               (XDS110_MAX_SLOW_TCK_SPEED * 1000);
+
+                       /* Convert frequency to pulse duration */
+                       double freq_to_pulse_width_in_ns = one_giga / freq_to_use;
 
-               while (current_value < freq_to_pulse_width_in_ns) {
-                       current_value += XDS110_TCK_PULSE_INCREMENT;
-                       ++delay_count;
+                       /*
+                       * Start with the pulse duration for the maximum frequency. Keep
+                       * decrementing time added by each count value till the requested
+                       * frequency pulse is less than the calculated value.
+                       */
+                       double current_value = max_freq_pulse_duration;
+
+                       while (current_value < freq_to_pulse_width_in_ns) {
+                               current_value += XDS110_TCK_PULSE_INCREMENT;
+                               ++delay_count;
+                       }
+
+                       /*
+                       * Determine which delay count yields the best match.
+                       * The one obtained above or one less.
+                       */
+                       if (delay_count) {
+                               double diff_freq_1 = freq_to_use -
+                                       (one_giga / (max_freq_pulse_duration +
+                                       (XDS110_TCK_PULSE_INCREMENT * delay_count)));
+                               double diff_freq_2 = (one_giga / (max_freq_pulse_duration +
+                                       (XDS110_TCK_PULSE_INCREMENT * (delay_count - 1)))) -
+                                       freq_to_use;
+
+                               /* One less count value yields a better match */
+                               if (diff_freq_1 > diff_freq_2)
+                                       --delay_count;
+                       }
                }
 
-               /*
-                * Determine which delay count yields the best match.
-                * The one obtained above or one less.
-                */
-               if (delay_count) {
-                       double diff_freq_1 = freq_to_use -
-                               (one_giga / (max_freq_pulse_duration +
-                               (XDS110_TCK_PULSE_INCREMENT * delay_count)));
-                       double diff_freq_2 = (one_giga / (max_freq_pulse_duration +
-                               (XDS110_TCK_PULSE_INCREMENT * (delay_count - 1)))) -
-                               freq_to_use;
-
-                       /* One less count value yields a better match */
-                       if (diff_freq_1 > diff_freq_2)
-                               --delay_count;
+       /* Newer firmware has reworked TCK routines that are much more efficient */
+       /* and can now achieve a peak TCK frequency of 14000 kHz */
+       } else {
+
+               if (speed >= XDS110_MAX_FAST_TCK_SPEED) {
+                       if (speed > XDS110_MAX_FAST_TCK_SPEED) {
+                               LOG_INFO(
+                                       "XDS110: reduce speed request: %d kHz to %d kHz maximum",
+                                       speed, XDS110_MAX_FAST_TCK_SPEED);
+                               speed = XDS110_MAX_FAST_TCK_SPEED;
+                       }
+                       delay_count = 0;
+               } else if (speed >= 12000 && xds110.firmware >=
+                       FAST_TCK_PLUS_FIRMWARE_VERSION) {
+                       delay_count = FAST_TCK_DELAY_12000_KHZ;
+               } else if (speed >= 10000 && xds110.firmware >=
+                       FAST_TCK_PLUS_FIRMWARE_VERSION) {
+                       delay_count = FAST_TCK_DELAY_10000_KHZ;
+               } else if (speed >= 8500) {
+                       delay_count = FAST_TCK_DELAY_8500_KHZ;
+               } else if (speed >= 5500) {
+                       delay_count = FAST_TCK_DELAY_5500_KHZ;
+               } else {
+                       /* Calculate the delay count to set the frequency */
+                       /* Formula determined by measuring the waveform on Saeleae logic */
+                       /* analyzer using known values for delay count */
+                       const double m = 17100000.0; /* slope */
+                       const double b = -1.02;      /* y-intercept */
+
+                       freq_to_use = speed * 1000; /* Hz */
+                       double period = 1.0/freq_to_use;
+                       double delay = m * period + b;
+
+                       if (delay < 1.0)
+                               delay_count = 1;
+                       else
+                               delay_count = (uint32_t)delay;
                }
        }
 
index d2d0c68fe3bac10ee49a209ac9a984b5d2a9b9b4..4fbce4120090ae5fb9501c3abafbac7c8c00c584 100644 (file)
@@ -3,5 +3,5 @@
 #
 source [find interface/xds110.cfg]
 transport select jtag
-adapter speed 2500
+adapter speed 5500
 source [find target/ti_cc13x0.cfg]
index 706bb728a229803fd1ab5f3dc47c136a3389e463..dc0c1823010174d44c1ad22e7222a4599540ae23 100644 (file)
@@ -2,6 +2,6 @@
 # TI CC13x2 LaunchPad Evaluation Kit
 #
 source [find interface/xds110.cfg]
-adapter speed 2500
+adapter speed 5500
 transport select jtag
 source [find target/ti_cc13x2.cfg]
index c16fa4c5688b176e8fc9b96b87b1f35954a2e542..372e57cebd441090b6c7daa9ad6532081924c0c5 100644 (file)
@@ -2,6 +2,6 @@
 # TI CC26x0 LaunchPad Evaluation Kit
 #
 source [find interface/xds110.cfg]
-adapter speed 2500
+adapter speed 5500
 transport select jtag
 source [find target/ti_cc26x0.cfg]
index e7941914cf2b454400788a55f5b7ae7f505dc85b..c8057ad3db3d36e2f088992cb58335be7f54531a 100644 (file)
@@ -2,6 +2,6 @@
 # TI CC26x2 LaunchPad Evaluation Kit
 #
 source [find interface/xds110.cfg]
-adapter speed 2500
+adapter speed 5500
 transport select jtag
 source [find target/ti_cc26x2.cfg]
index 30255c793441bfd403d6e6416dedbe47d368831a..7c8310af0603755e1bb63f65ca14f11fb560752d 100644 (file)
@@ -2,6 +2,6 @@
 # TI CC3220SF-LaunchXL LaunchPad Evaluation Kit
 #
 source [find interface/xds110.cfg]
-adapter speed 2500
+adapter speed 8500
 transport select swd
 source [find target/ti_cc3220sf.cfg]
index 6676e5d6eade3e08bfb1e172b41d1b6f4bc766a2..1df461a93b53989ff282f2a93d02b91b90fafdf8 100644 (file)
@@ -2,6 +2,6 @@
 # TI CC32xx-LaunchXL LaunchPad Evaluation Kit
 #
 source [find interface/xds110.cfg]
-adapter speed 2500
+adapter speed 8500
 transport select swd
 source [find target/ti_cc32xx.cfg]
index f7c96eed1129d052a35d70f26c14c17c5e449153..6d2b15dd4613cc74ce24bbc47dfb3006bcfd4a5f 100644 (file)
@@ -2,6 +2,6 @@
 # TI MSP432 LaunchPad Evaluation Kit
 #
 source [find interface/xds110.cfg]
-adapter speed 2500
+adapter speed 10000
 transport select swd
 source [find target/ti_msp432.cfg]

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)