<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13084">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add freq_ctr app<br><br>The freq_ctr app is a small application that is implementing a<br>simplistic direct-mode frequency counter using the internal 32.768kHz<br>oscillator and two TC blocks. One of them is used to generate a 1Hz<br>signal, which is then subsequently used by the other TC to trigger<br>a counter read after exactly 1s.<br><br>This is in itself not something useful on a simtrace2 device.  However,<br>it is a separate 'app' and I prefer to have the code here in master<br>over some obscure branch that's easy to forget about.<br><br>Change-Id: I2249bfb8dd6a88d85d406f3b33537377133d0939<br>---<br>A firmware/apps/freq_ctr/Makefile<br>A firmware/apps/freq_ctr/freq_ctr.c<br>A firmware/apps/freq_ctr/main.c<br>A firmware/apps/freq_ctr/usb_strings.txt<br>4 files changed, 122 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/firmware/apps/freq_ctr/Makefile b/firmware/apps/freq_ctr/Makefile</span><br><span>new file mode 100644</span><br><span>index 0000000..1097e9c</span><br><span>--- /dev/null</span><br><span>+++ b/firmware/apps/freq_ctr/Makefile</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+C_FILES += $(C_LIBUSB_RT)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+C_FILES += freq_ctr.c</span><br><span>diff --git a/firmware/apps/freq_ctr/freq_ctr.c b/firmware/apps/freq_ctr/freq_ctr.c</span><br><span>new file mode 100644</span><br><span>index 0000000..ad6497c</span><br><span>--- /dev/null</span><br><span>+++ b/firmware/apps/freq_ctr/freq_ctr.c</span><br><span>@@ -0,0 +1,55 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include "utils.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "tc_etu.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "chip.h"</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%);">+/* pins for Channel 0 of TC-block 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define PIN_TIOA0       {PIO_PA0, PIOA, ID_PIOA, PIO_PERIPH_B, PIO_DEFAULT}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* pins for Channel 1 of TC-block 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define PIN_TIOA1        {PIO_PA15, PIOA, ID_PIOA, PIO_PERIPH_B, PIO_DEFAULT}</span><br><span style="color: hsl(120, 100%, 40%);">+#define PIN_TCLK1 {PIO_PA28, PIOA, ID_PIOA, PIO_PERIPH_B, PIO_DEFAULT}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const Pin pins_tc[] = { PIN_TIOA0, PIN_TIOA1, PIN_TCLK1 };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static TcChannel *tc1 = &TC0->TC_CHANNEL[1];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void TC1_IrqHandler(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t sr = tc1->TC_SR;</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("TC1=%lu; SR=0x%08lx\r\n", tc1->TC_RA, sr);</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 freq_ctr_init(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     TcChannel *tc0 = &TC0->TC_CHANNEL[0];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        PIO_Configure(pins_tc, ARRAY_SIZE(pins_tc));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        PMC_EnablePeripheral(ID_TC0);</span><br><span style="color: hsl(120, 100%, 40%);">+ PMC_EnablePeripheral(ID_TC1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* route TCLK1 to XC1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      TC0->TC_BMR &= ~TC_BMR_TC1XC1S_Msk;</span><br><span style="color: hsl(120, 100%, 40%);">+    TC0->TC_BMR |= TC_BMR_TC1XC1S_TCLK1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* TC0 in wveform mode: Run from SCLK. Raise TIOA on RA; lower TIOA on RC + trigger */</span><br><span style="color: hsl(120, 100%, 40%);">+        tc0->TC_CMR = TC_CMR_TCCLKS_TIMER_CLOCK5 | TC_CMR_BURST_NONE |</span><br><span style="color: hsl(120, 100%, 40%);">+                   TC_CMR_EEVTEDG_NONE | TC_CMR_WAVSEL_UP_RC | TC_CMR_WAVE |</span><br><span style="color: hsl(120, 100%, 40%);">+                     TC_CMR_ACPA_SET | TC_CMR_ACPC_CLEAR;</span><br><span style="color: hsl(120, 100%, 40%);">+    tc0->TC_RA = 16384; /* set high at 16384 */</span><br><span style="color: hsl(120, 100%, 40%);">+        tc0->TC_RC = 32786; /* set low at 32786 */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* TC1 in capture mode: Run from XC1. Trigger on TIOA rising. Load RA on rising */</span><br><span style="color: hsl(120, 100%, 40%);">+    tc1->TC_CMR = TC_CMR_TCCLKS_XC1 | TC_CMR_BURST_NONE |</span><br><span style="color: hsl(120, 100%, 40%);">+                    TC_CMR_ETRGEDG_RISING | TC_CMR_ABETRG | TC_CMR_LDRA_RISING;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Interrupt us if the external trigger happens */</span><br><span style="color: hsl(120, 100%, 40%);">+    tc1->TC_IER = TC_IER_ETRGS;</span><br><span style="color: hsl(120, 100%, 40%);">+        NVIC_EnableIRQ(TC1_IRQn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   TC0->TC_BCR = TC_BCR_SYNC;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       tc0->TC_CCR = TC_CCR_CLKEN|TC_CCR_SWTRG;</span><br><span style="color: hsl(120, 100%, 40%);">+   tc1->TC_CCR = TC_CCR_CLKEN|TC_CCR_SWTRG;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/firmware/apps/freq_ctr/main.c b/firmware/apps/freq_ctr/main.c</span><br><span>new file mode 100644</span><br><span>index 0000000..761bc17</span><br><span>--- /dev/null</span><br><span>+++ b/firmware/apps/freq_ctr/main.c</span><br><span>@@ -0,0 +1,54 @@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "board.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "utils.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "osmocom/core/timer.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern void freq_ctr_init(void);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* returns '1' in case we should break any endless loop */</span><br><span style="color: hsl(120, 100%, 40%);">+static void check_exec_dbg_cmd(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      int ch;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!UART_IsRxReady())</span><br><span style="color: hsl(120, 100%, 40%);">+                return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     ch = UART_GetChar();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        board_exec_dbg_cmd(ch);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern int main(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      led_init();</span><br><span style="color: hsl(120, 100%, 40%);">+   led_blink(LED_RED, BLINK_ALWAYS_ON);</span><br><span style="color: hsl(120, 100%, 40%);">+  led_blink(LED_GREEN, BLINK_ALWAYS_ON);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Enable watchdog for 2000 ms, with no window */</span><br><span style="color: hsl(120, 100%, 40%);">+     WDT_Enable(WDT, WDT_MR_WDRSTEN | WDT_MR_WDDBGHLT | WDT_MR_WDIDLEHLT |</span><br><span style="color: hsl(120, 100%, 40%);">+            (WDT_GetPeriod(2000) << 16) | WDT_GetPeriod(2000));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        PIO_InitializeInterrupts(0);</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%);">+      printf("\n\r\n\r"</span><br><span style="color: hsl(120, 100%, 40%);">+           "=============================================================================\n\r"</span><br><span style="color: hsl(120, 100%, 40%);">+         "Freq Ctr firmware " GIT_VERSION " (C) 2019 by Harald Welte\n\r"</span><br><span style="color: hsl(120, 100%, 40%);">+          "=============================================================================\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     board_main_top();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   TRACE_INFO("starting frequency counter...\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+    freq_ctr_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    TRACE_INFO("entering main loop...\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+    while (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           WDT_Restart(WDT);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           check_exec_dbg_cmd();</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_timers_prepare();</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_timers_update();</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%);">+}</span><br><span>diff --git a/firmware/apps/freq_ctr/usb_strings.txt b/firmware/apps/freq_ctr/usb_strings.txt</span><br><span>new file mode 100644</span><br><span>index 0000000..0e797ac</span><br><span>--- /dev/null</span><br><span>+++ b/firmware/apps/freq_ctr/usb_strings.txt</span><br><span>@@ -0,0 +1,10 @@</span><br><span style="color: hsl(120, 100%, 40%);">+sysmocom - s.f.m.c. GmbH</span><br><span style="color: hsl(120, 100%, 40%);">+SIMtrace 2 compatible device</span><br><span style="color: hsl(120, 100%, 40%);">+SIMtrace Sniffer</span><br><span style="color: hsl(120, 100%, 40%);">+SIMtrace CCID</span><br><span style="color: hsl(120, 100%, 40%);">+SIMtrace Phone</span><br><span style="color: hsl(120, 100%, 40%);">+SIMtrace MITM</span><br><span style="color: hsl(120, 100%, 40%);">+CardEmulator Modem 1</span><br><span style="color: hsl(120, 100%, 40%);">+CardEmulator Modem 2</span><br><span style="color: hsl(120, 100%, 40%);">+CardEmulator Modem 3</span><br><span style="color: hsl(120, 100%, 40%);">+CardEmulator Modem 4</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13084">change 13084</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/13084"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: simtrace2 </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I2249bfb8dd6a88d85d406f3b33537377133d0939 </div>
<div style="display:none"> Gerrit-Change-Number: 13084 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>