<p>Kévin Redon has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13055">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add debug tracing using SWO<br><br>the UART_TX debug pin is connected to PB30, allowing to output<br>printf debug information using SWO and save SERCOM7 for SIM7.<br><br>SWO is configured as UART output at 921600 bps, with blocking<br>write.<br>The DEBUG flag must be set to enable output.<br>WARNING: SWO output is also only enabled if a SWD debugger is<br>attached. I did not find in the datasheets how to always have it<br>enabled.<br><br>Change-Id: I4c6d66e7089971294d7c006fbb600e8085e58595<br>---<br>M sysmoOCTSIM/atmel_start_config.atstart<br>M sysmoOCTSIM/atmel_start_pins.h<br>M sysmoOCTSIM/driver_init.c<br>M sysmoOCTSIM/gcc/Makefile<br>M sysmoOCTSIM/main.c<br>A sysmoOCTSIM/trace.c<br>A sysmoOCTSIM/trace.h<br>7 files changed, 179 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/55/13055/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/sysmoOCTSIM/atmel_start_config.atstart b/sysmoOCTSIM/atmel_start_config.atstart</span><br><span>index 29ec468..a5b73bd 100644</span><br><span>--- a/sysmoOCTSIM/atmel_start_config.atstart</span><br><span>+++ b/sysmoOCTSIM/atmel_start_config.atstart</span><br><span>@@ -1583,4 +1583,14 @@</span><br><span>     mode: Digital output</span><br><span>     user_label: SDA2</span><br><span>     configuration: null</span><br><span style="color: hsl(120, 100%, 40%);">+  UART_TX:</span><br><span style="color: hsl(120, 100%, 40%);">+    name: PB30</span><br><span style="color: hsl(120, 100%, 40%);">+    definition: Atmel:SAME54_Drivers:0.0.1::SAME54N19A-AF::pad::PB30</span><br><span style="color: hsl(120, 100%, 40%);">+    mode: Advanced</span><br><span style="color: hsl(120, 100%, 40%);">+    user_label: UART_TX</span><br><span style="color: hsl(120, 100%, 40%);">+    configuration:</span><br><span style="color: hsl(120, 100%, 40%);">+      pad_direction: Out</span><br><span style="color: hsl(120, 100%, 40%);">+      pad_function: H</span><br><span style="color: hsl(120, 100%, 40%);">+      pad_initial_level: Low</span><br><span style="color: hsl(120, 100%, 40%);">+      pad_pull_config: 'Off'</span><br><span> toolchain_options: []</span><br><span>diff --git a/sysmoOCTSIM/atmel_start_pins.h b/sysmoOCTSIM/atmel_start_pins.h</span><br><span>index 18a55fa..a2a4206 100644</span><br><span>--- a/sysmoOCTSIM/atmel_start_pins.h</span><br><span>+++ b/sysmoOCTSIM/atmel_start_pins.h</span><br><span>@@ -52,6 +52,7 @@</span><br><span> #define SIM5_IO GPIO(GPIO_PORTB, 16)</span><br><span> #define SIM3_IO GPIO(GPIO_PORTB, 20)</span><br><span> #define SIM7_IO GPIO(GPIO_PORTB, 21)</span><br><span style="color: hsl(120, 100%, 40%);">+#define UART_TX GPIO(GPIO_PORTB, 30)</span><br><span> #define SIM0_INT GPIO(GPIO_PORTC, 0)</span><br><span> #define SIM1_INT GPIO(GPIO_PORTC, 1)</span><br><span> #define SIM2_INT GPIO(GPIO_PORTC, 2)</span><br><span>diff --git a/sysmoOCTSIM/driver_init.c b/sysmoOCTSIM/driver_init.c</span><br><span>index ef9c56b..f442359 100644</span><br><span>--- a/sysmoOCTSIM/driver_init.c</span><br><span>+++ b/sysmoOCTSIM/driver_init.c</span><br><span>@@ -758,6 +758,53 @@</span><br><span> </span><br><span>        gpio_set_pin_function(SDA1, GPIO_PIN_FUNCTION_OFF);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       // GPIO on PB30</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     gpio_set_pin_direction(UART_TX,</span><br><span style="color: hsl(120, 100%, 40%);">+                              // <y> Pin direction</span><br><span style="color: hsl(120, 100%, 40%);">+                            // <id> pad_direction</span><br><span style="color: hsl(120, 100%, 40%);">+                           // <GPIO_DIRECTION_OFF"> Off</span><br><span style="color: hsl(120, 100%, 40%);">+                               // <GPIO_DIRECTION_IN"> In</span><br><span style="color: hsl(120, 100%, 40%);">+                         // <GPIO_DIRECTION_OUT"> Out</span><br><span style="color: hsl(120, 100%, 40%);">+                               GPIO_DIRECTION_OUT);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ gpio_set_pin_pull_mode(UART_TX,</span><br><span style="color: hsl(120, 100%, 40%);">+                              // <y> Pull configuration</span><br><span style="color: hsl(120, 100%, 40%);">+                               // <id> pad_pull_config</span><br><span style="color: hsl(120, 100%, 40%);">+                         // <GPIO_PULL_OFF"> Off</span><br><span style="color: hsl(120, 100%, 40%);">+                            // <GPIO_PULL_UP"> Pull-up</span><br><span style="color: hsl(120, 100%, 40%);">+                         // <GPIO_PULL_DOWN"> Pull-down</span><br><span style="color: hsl(120, 100%, 40%);">+                             GPIO_PULL_OFF);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      gpio_set_pin_level(UART_TX,</span><br><span style="color: hsl(120, 100%, 40%);">+                      // <y> Initial level</span><br><span style="color: hsl(120, 100%, 40%);">+                    // <id> pad_initial_level</span><br><span style="color: hsl(120, 100%, 40%);">+                       // <false"> Low</span><br><span style="color: hsl(120, 100%, 40%);">+                    // <true"> High</span><br><span style="color: hsl(120, 100%, 40%);">+                    false);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  gpio_set_pin_function(UART_TX,</span><br><span style="color: hsl(120, 100%, 40%);">+                              // <y> Pin function</span><br><span style="color: hsl(120, 100%, 40%);">+                             // <id> pad_function</span><br><span style="color: hsl(120, 100%, 40%);">+                            // <i> Auto : use driver pinmux if signal is imported by driver, else turn off function</span><br><span style="color: hsl(120, 100%, 40%);">+                         // <GPIO_PIN_FUNCTION_OFF"> Auto</span><br><span style="color: hsl(120, 100%, 40%);">+                           // <GPIO_PIN_FUNCTION_OFF"> Off</span><br><span style="color: hsl(120, 100%, 40%);">+                            // <GPIO_PIN_FUNCTION_A"> A</span><br><span style="color: hsl(120, 100%, 40%);">+                        // <GPIO_PIN_FUNCTION_B"> B</span><br><span style="color: hsl(120, 100%, 40%);">+                        // <GPIO_PIN_FUNCTION_C"> C</span><br><span style="color: hsl(120, 100%, 40%);">+                        // <GPIO_PIN_FUNCTION_D"> D</span><br><span style="color: hsl(120, 100%, 40%);">+                        // <GPIO_PIN_FUNCTION_E"> E</span><br><span style="color: hsl(120, 100%, 40%);">+                        // <GPIO_PIN_FUNCTION_F"> F</span><br><span style="color: hsl(120, 100%, 40%);">+                        // <GPIO_PIN_FUNCTION_G"> G</span><br><span style="color: hsl(120, 100%, 40%);">+                        // <GPIO_PIN_FUNCTION_H"> H</span><br><span style="color: hsl(120, 100%, 40%);">+                        // <GPIO_PIN_FUNCTION_I"> I</span><br><span style="color: hsl(120, 100%, 40%);">+                        // <GPIO_PIN_FUNCTION_J"> J</span><br><span style="color: hsl(120, 100%, 40%);">+                        // <GPIO_PIN_FUNCTION_K"> K</span><br><span style="color: hsl(120, 100%, 40%);">+                        // <GPIO_PIN_FUNCTION_L"> L</span><br><span style="color: hsl(120, 100%, 40%);">+                        // <GPIO_PIN_FUNCTION_M"> M</span><br><span style="color: hsl(120, 100%, 40%);">+                        // <GPIO_PIN_FUNCTION_N"> N</span><br><span style="color: hsl(120, 100%, 40%);">+                        GPIO_PIN_FUNCTION_H);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        // GPIO on PC00</span><br><span> </span><br><span>  // Set pin direction to input</span><br><span>diff --git a/sysmoOCTSIM/gcc/Makefile b/sysmoOCTSIM/gcc/Makefile</span><br><span>index 5e3c38c..e5c7306 100644</span><br><span>--- a/sysmoOCTSIM/gcc/Makefile</span><br><span>+++ b/sysmoOCTSIM/gcc/Makefile</span><br><span>@@ -76,6 +76,7 @@</span><br><span> hpl/osc32kctrl/hpl_osc32kctrl.o \</span><br><span> examples/driver_examples.o \</span><br><span> driver_init.o \</span><br><span style="color: hsl(120, 100%, 40%);">+trace.o \</span><br><span> hal/src/hal_usart_async.o \</span><br><span> hpl/sercom/hpl_sercom.o \</span><br><span> hal/utils/src/utils_ringbuffer.o \</span><br><span>@@ -117,6 +118,7 @@</span><br><span> "hpl/osc32kctrl/hpl_osc32kctrl.o" \</span><br><span> "examples/driver_examples.o" \</span><br><span> "driver_init.o" \</span><br><span style="color: hsl(120, 100%, 40%);">+"trace.o" \</span><br><span> "hal/src/hal_usart_async.o" \</span><br><span> "hpl/sercom/hpl_sercom.o" \</span><br><span> "hal/utils/src/utils_ringbuffer.o" \</span><br><span>@@ -155,6 +157,7 @@</span><br><span> "hal/src/hal_init.d" \</span><br><span> "hpl/mclk/hpl_mclk.d" \</span><br><span> "driver_init.d" \</span><br><span style="color: hsl(120, 100%, 40%);">+"trace.d" \</span><br><span> "hal/src/hal_usart_async.d" \</span><br><span> "hpl/osc32kctrl/hpl_osc32kctrl.d" \</span><br><span> "main.d" \</span><br><span>@@ -256,4 +259,4 @@</span><br><span>    rm -f $(DEPS_AS_ARGS)</span><br><span>        rm -f $(OUTPUT_FILE_NAME).a $(OUTPUT_FILE_NAME).hex $(OUTPUT_FILE_NAME).bin \</span><br><span>         $(OUTPUT_FILE_NAME).lss $(OUTPUT_FILE_NAME).eep $(OUTPUT_FILE_NAME).map \</span><br><span style="color: hsl(0, 100%, 40%);">-        $(OUTPUT_FILE_NAME).srec</span><br><span>\ No newline at end of file</span><br><span style="color: hsl(120, 100%, 40%);">+        $(OUTPUT_FILE_NAME).srec</span><br><span>diff --git a/sysmoOCTSIM/main.c b/sysmoOCTSIM/main.c</span><br><span>index 9500e08..515f546 100644</span><br><span>--- a/sysmoOCTSIM/main.c</span><br><span>+++ b/sysmoOCTSIM/main.c</span><br><span>@@ -22,6 +22,7 @@</span><br><span> </span><br><span> #include "atmel_start.h"</span><br><span> #include "atmel_start_pins.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "trace.h"</span><br><span> </span><br><span> #include "i2c_bitbang.h"</span><br><span> #include "octsim_i2c.h"</span><br><span>@@ -50,5 +51,7 @@</span><br><span> {</span><br><span>       atmel_start_init();</span><br><span>  board_init();</span><br><span style="color: hsl(120, 100%, 40%);">+ trace_swo_init(); // initialize SWO for debug trace output</span><br><span style="color: hsl(120, 100%, 40%);">+    TRACE("\r\n\r\ninitialization complete\r\n");</span><br><span>      usb_start();</span><br><span> }</span><br><span>diff --git a/sysmoOCTSIM/trace.c b/sysmoOCTSIM/trace.c</span><br><span>new file mode 100644</span><br><span>index 0000000..7048dbe</span><br><span>--- /dev/null</span><br><span>+++ b/sysmoOCTSIM/trace.c</span><br><span>@@ -0,0 +1,76 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2019 sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or</span><br><span style="color: hsl(120, 100%, 40%);">+ * modify it under the terms of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * as published by the Free Software Foundation; either version 2</span><br><span style="color: hsl(120, 100%, 40%);">+ * of the License, or (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program; if not, write to the Free Software</span><br><span style="color: hsl(120, 100%, 40%);">+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</span><br><span style="color: hsl(120, 100%, 40%);">+*/</span><br><span style="color: hsl(120, 100%, 40%);">+#include <same54.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <hpl_gclk_base.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <peripheral_clk_config.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include "trace.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int __attribute__((weak)) _read(int file, char *ptr, int len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int __attribute__((weak)) _read(int file, char *ptr, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ (void)file;</span><br><span style="color: hsl(120, 100%, 40%);">+   (void)ptr;</span><br><span style="color: hsl(120, 100%, 40%);">+    (void)len;</span><br><span style="color: hsl(120, 100%, 40%);">+    return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int __attribute__((weak)) _write(int file, char *ptr, int len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/** \warning ITM/SWO outputs only if a debugger is attached</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \warning this call is blocking</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \note since ITM does not generate interrupts upon completion, to implement non-blocking writing a timer would be required (along with a ring buffer)</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int __attribute__((weak)) _write(int file, char *ptr, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef DEBUG</span><br><span style="color: hsl(120, 100%, 40%);">+   if ((file != 1) && (file != 2) && (file != 3)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (int i = 0; i < len; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+            ITM_SendChar(*ptr++);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     return len;</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+    (void)file;</span><br><span style="color: hsl(120, 100%, 40%);">+   (void)ptr;</span><br><span style="color: hsl(120, 100%, 40%);">+    (void)len;</span><br><span style="color: hsl(120, 100%, 40%);">+    return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void trace_swo_init(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ hri_gclk_write_PCHCTRL_reg(GCLK, CM4_TRACE_GCLK_ID, GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN); // enable clock for CM4 TRACE</span><br><span style="color: hsl(120, 100%, 40%);">+        while(!hri_gclk_get_PCHCTRL_reg(GCLK, CM4_TRACE_GCLK_ID, GCLK_PCHCTRL_CHEN)); // wait for clock to be ready</span><br><span style="color: hsl(120, 100%, 40%);">+   CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // enable trace subsystem</span><br><span style="color: hsl(120, 100%, 40%);">+  TPI->SPPR = (2 << TPI_SPPR_TXMODE_Pos) & TPI_SPPR_TXMODE_Msk; // set SWO protocol to UART-like (asynchronous using NRZ encoding)</span><br><span style="color: hsl(120, 100%, 40%);">+ TPI->ACPR = ((CONF_CPU_FREQUENCY / TRACE_SWO_BAUDRATE - 1) << TPI_ACPR_PRESCALER_Pos) & TPI_ACPR_PRESCALER_Msk;  // set prescaler</span><br><span style="color: hsl(120, 100%, 40%);">+        TPI->FFCR &= ~TPI_FFCR_EnFCont_Msk; // disable continuous formatting</span><br><span style="color: hsl(120, 100%, 40%);">+   ITM->LAR = 0xC5ACCE55; // unlock write access to ITM registers</span><br><span style="color: hsl(120, 100%, 40%);">+     ITM->TCR = ITM_TCR_TraceBusID_Msk | ITM_TCR_ITMENA_Msk; // enable multi-source trace, SWO, synchronisation packet, and ITM</span><br><span style="color: hsl(120, 100%, 40%);">+ ITM->TER = 1; // enable stimulus 1</span><br><span style="color: hsl(120, 100%, 40%);">+ ITM->TPR = 0; // permit unprivileged access</span><br><span style="color: hsl(120, 100%, 40%);">+        CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // enable trace subsystem</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#if defined(__GNUC__)</span><br><span style="color: hsl(120, 100%, 40%);">+ setbuf(stdout, NULL); // don't use any buffer</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/sysmoOCTSIM/trace.h b/sysmoOCTSIM/trace.h</span><br><span>new file mode 100644</span><br><span>index 0000000..67afb53</span><br><span>--- /dev/null</span><br><span>+++ b/sysmoOCTSIM/trace.h</span><br><span>@@ -0,0 +1,38 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2019 sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or</span><br><span style="color: hsl(120, 100%, 40%);">+ * modify it under the terms of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * as published by the Free Software Foundation; either version 2</span><br><span style="color: hsl(120, 100%, 40%);">+ * of the License, or (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program; if not, write to the Free Software</span><br><span style="color: hsl(120, 100%, 40%);">+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</span><br><span style="color: hsl(120, 100%, 40%);">+*/</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef TRACE_H</span><br><span style="color: hsl(120, 100%, 40%);">+#define TARCE_H</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/** CM4 Trace clock ID, not defined in ASFv4 but in the datasheet */</span><br><span style="color: hsl(120, 100%, 40%);">+#define CM4_TRACE_GCLK_ID 47</span><br><span style="color: hsl(120, 100%, 40%);">+/** SWO UART-like trace output in bps */</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRACE_SWO_BAUDRATE 921600</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/** Output trace debug information */</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef DEBUG</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRACE(...)      { }</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRACE(...)      { printf(__VA_ARGS__); }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/** Initialise trace output over SWO</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \note SWO pin must be configured separately</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void trace_swo_init(void);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13055">change 13055</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/13055"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ccid-firmware </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I4c6d66e7089971294d7c006fbb600e8085e58595 </div>
<div style="display:none"> Gerrit-Change-Number: 13055 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Kévin Redon <kredon@sysmocom.de> </div>