<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/simtrace2/+/24520">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">octsimtest: most code for support of this new board<br><br>* code for controlling the Card slot + frequencyt divider muxes<br>* put everything in place to build cardem application for it<br><br>Change-Id: I7e03e0c0f2999a1ce2dad966d98e22033fa58465<br>---<br>M firmware/libboard/octsimtest/include/board.h<br>A firmware/libboard/octsimtest/include/mux.h<br>M firmware/libboard/octsimtest/source/board_octsimtest.c<br>A firmware/libboard/octsimtest/source/mux.c<br>A firmware/libboard/octsimtest/source/sim_switch.c<br>5 files changed, 167 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/simtrace2 refs/changes/20/24520/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/firmware/libboard/octsimtest/include/board.h b/firmware/libboard/octsimtest/include/board.h</span><br><span>index a267f0f..6006796 100644</span><br><span>--- a/firmware/libboard/octsimtest/include/board.h</span><br><span>+++ b/firmware/libboard/octsimtest/include/board.h</span><br><span>@@ -57,7 +57,7 @@</span><br><span> /* Phone USIM slot 1 VCC pin (VCC_PHONE in schematic) */</span><br><span> #define PIN_USIM1_VCC          {PIO_PA25, PIOA, ID_PIOA, PIO_INPUT, PIO_DEFAULT}</span><br><span> /* Phone USIM slot 1 RST pin (active low; RST_PHONE in schematic) */</span><br><span style="color: hsl(0, 100%, 40%);">-#define PIN_USIM1_nRST         {PIO_PA24, PIOA, ID_PIOA, PIO_INPUT, PIO_IT_RISE_EDGE | PIO_DEGLITCH }</span><br><span style="color: hsl(120, 100%, 40%);">+#define PIN_USIM1_nRST         {PIO_PA24, PIOA, ID_PIOA, PIO_INPUT, PIO_IT_EDGE | PIO_DEGLITCH }</span><br><span> /* Phone I/O data signal input/output (I/O_PHONE in schematic) */</span><br><span> #define PIN_PHONE_IO           {PIO_PA22A_TXD1, PIOA, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT}</span><br><span> /* Phone CLK clock input (CLK_PHONE in schematic) */</span><br><span>@@ -102,13 +102,15 @@</span><br><span> /* Indicate SIMtrace is bus power in USB attributes */</span><br><span> #define BOARD_USB_BMATTRIBUTES       USBConfigurationDescriptor_BUSPOWERED_NORWAKEUP</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define DETECT_VCC_BY_ADC</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /** Supported modes */</span><br><span> /* SIMtrace board supports sniffer mode */</span><br><span> //#define HAVE_SNIFFER</span><br><span> /* SIMtrace board supports CCID mode */</span><br><span> //#define HAVE_CCID</span><br><span> /* SIMtrace board supports card emulation mode */</span><br><span style="color: hsl(0, 100%, 40%);">-//#define HAVE_CARDEM</span><br><span style="color: hsl(120, 100%, 40%);">+#define HAVE_CARDEM</span><br><span> /* SIMtrace board supports man-in-the-middle mode */</span><br><span> //#define HAVE_MITM</span><br><span> /* octsimtest board supports gpio_test mode */</span><br><span>diff --git a/firmware/libboard/octsimtest/include/mux.h b/firmware/libboard/octsimtest/include/mux.h</span><br><span>new file mode 100644</span><br><span>index 0000000..ba7ae9f</span><br><span>--- /dev/null</span><br><span>+++ b/firmware/libboard/octsimtest/include/mux.h</span><br><span>@@ -0,0 +1,16 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void mux_init(void);</span><br><span style="color: hsl(120, 100%, 40%);">+void mux_set_slot(uint8_t s);</span><br><span style="color: hsl(120, 100%, 40%);">+void mux_set_freq(uint8_t s);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* this reflects the wiring between U5 and U4 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define MUX_FREQ_DIV_2               0</span><br><span style="color: hsl(120, 100%, 40%);">+#define MUX_FREQ_DIV_4               1</span><br><span style="color: hsl(120, 100%, 40%);">+#define MUX_FREQ_DIV_16              2</span><br><span style="color: hsl(120, 100%, 40%);">+#define MUX_FREQ_DIV_32              3</span><br><span style="color: hsl(120, 100%, 40%);">+#define MUX_FREQ_DIV_32              3</span><br><span style="color: hsl(120, 100%, 40%);">+#define MUX_FREQ_DIV_128     4</span><br><span style="color: hsl(120, 100%, 40%);">+#define MUX_FREQ_DIV_512     5</span><br><span style="color: hsl(120, 100%, 40%);">+#define MUX_FREQ_DIV_2048    6</span><br><span style="color: hsl(120, 100%, 40%);">+#define MUX_FREQ_DIV_4096    7</span><br><span>diff --git a/firmware/libboard/octsimtest/source/board_octsimtest.c b/firmware/libboard/octsimtest/source/board_octsimtest.c</span><br><span>index b7d7245..85d8aab 100644</span><br><span>--- a/firmware/libboard/octsimtest/source/board_octsimtest.c</span><br><span>+++ b/firmware/libboard/octsimtest/source/board_octsimtest.c</span><br><span>@@ -25,6 +25,7 @@</span><br><span> #include "usb_buf.h"</span><br><span> #include "i2c.h"</span><br><span> #include "mcp23017.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "mux.h"</span><br><span> </span><br><span> void board_exec_dbg_cmd(int ch)</span><br><span> {</span><br><span>@@ -34,7 +35,16 @@</span><br><span>           printf("\tR\treset SAM3\n\r");</span><br><span>             printf("\tm\trun mcp23017 test\n\r");</span><br><span>              printf("\tR\ttoggle MSB of gpio on mcp23017\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+          printf("\t0-8\tselect physical SIM slot\n\r");</span><br><span>             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case '0': mux_set_slot(0); break;</span><br><span style="color: hsl(120, 100%, 40%);">+     case '1': mux_set_slot(1); break;</span><br><span style="color: hsl(120, 100%, 40%);">+     case '2': mux_set_slot(2); break;</span><br><span style="color: hsl(120, 100%, 40%);">+     case '3': mux_set_slot(3); break;</span><br><span style="color: hsl(120, 100%, 40%);">+     case '4': mux_set_slot(4); break;</span><br><span style="color: hsl(120, 100%, 40%);">+     case '5': mux_set_slot(5); break;</span><br><span style="color: hsl(120, 100%, 40%);">+     case '6': mux_set_slot(6); break;</span><br><span style="color: hsl(120, 100%, 40%);">+     case '7': mux_set_slot(7); break;</span><br><span>    case 'R':</span><br><span>            printf("Asking NVIC to reset us\n\r");</span><br><span>             USBD_Disconnect();</span><br><span>@@ -57,6 +67,7 @@</span><br><span> #ifndef APPLICATION_dfu</span><br><span>    usb_buf_init();</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   mux_init();</span><br><span>  i2c_pin_init();</span><br><span>      if (!mcp23017_init(MCP23017_ADDRESS))</span><br><span>                printf("mcp23017 not found!\n\r");</span><br><span>diff --git a/firmware/libboard/octsimtest/source/mux.c b/firmware/libboard/octsimtest/source/mux.c</span><br><span>new file mode 100644</span><br><span>index 0000000..8d9f625</span><br><span>--- /dev/null</span><br><span>+++ b/firmware/libboard/octsimtest/source/mux.c</span><br><span>@@ -0,0 +1,99 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* sysmoOCTSIMTEST support for multiplexers</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by Harald Welte <laforge@gnumonks.org></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 modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (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., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA</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%);">+#include "board.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "mux.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* 3-bit S0..S2 signal for slot selection */</span><br><span style="color: hsl(120, 100%, 40%);">+static const Pin pin_in_sel[3] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  { PIO_PA1, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT },</span><br><span style="color: hsl(120, 100%, 40%);">+        { PIO_PA2, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT },</span><br><span style="color: hsl(120, 100%, 40%);">+        { PIO_PA3, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT },</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%);">+/* 3-bit S0..S2 signal for frequency divider selection */</span><br><span style="color: hsl(120, 100%, 40%);">+static const Pin pin_freq_sel[3] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { PIO_PA16, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT },</span><br><span style="color: hsl(120, 100%, 40%);">+       { PIO_PA17, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT },</span><br><span style="color: hsl(120, 100%, 40%);">+       { PIO_PA18, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT },</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%);">+/* low-active output enable for all muxes */</span><br><span style="color: hsl(120, 100%, 40%);">+static const Pin pin_oe = { PIO_PA19, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* initialize the external 1:8 multiplexers */</span><br><span style="color: hsl(120, 100%, 40%);">+void mux_init(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      PIO_Configure(&pin_oe, PIO_LISTSIZE(pin_oe));</span><br><span style="color: hsl(120, 100%, 40%);">+     PIO_Configure(pin_in_sel, PIO_LISTSIZE(pin_in_sel));</span><br><span style="color: hsl(120, 100%, 40%);">+  PIO_Configure(pin_freq_sel, PIO_LISTSIZE(pin_freq_sel));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    mux_set_slot(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%);">+/* set the slot selection mux */</span><br><span style="color: hsl(120, 100%, 40%);">+void mux_set_slot(uint8_t s)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("%s(%u)\r\n", __func__, s);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* !OE = H: disconnect input and output of muxes */</span><br><span style="color: hsl(120, 100%, 40%);">+   PIO_Set(&pin_oe);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (s & 1)</span><br><span style="color: hsl(120, 100%, 40%);">+                PIO_Set(&pin_in_sel[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+  else</span><br><span style="color: hsl(120, 100%, 40%);">+          PIO_Clear(&pin_in_sel[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (s & 2)</span><br><span style="color: hsl(120, 100%, 40%);">+                PIO_Set(&pin_in_sel[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+  else</span><br><span style="color: hsl(120, 100%, 40%);">+          PIO_Clear(&pin_in_sel[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (s & 4)</span><br><span style="color: hsl(120, 100%, 40%);">+                PIO_Set(&pin_in_sel[2]);</span><br><span style="color: hsl(120, 100%, 40%);">+  else</span><br><span style="color: hsl(120, 100%, 40%);">+          PIO_Clear(&pin_in_sel[2]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* !OE = L: (re-)enable the output of muxes */</span><br><span style="color: hsl(120, 100%, 40%);">+        PIO_Clear(&pin_oe);</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%);">+/* set the frequency divider mux */</span><br><span style="color: hsl(120, 100%, 40%);">+void mux_set_freq(uint8_t s)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("%s(%u)\r\n", __func__, s);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* no need for 'break before make' here, this would also affect</span><br><span style="color: hsl(120, 100%, 40%);">+        * the SIM card I/O signals which we don't want to disturb */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (s & 1)</span><br><span style="color: hsl(120, 100%, 40%);">+                PIO_Set(&pin_freq_sel[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          PIO_Clear(&pin_freq_sel[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (s & 2)</span><br><span style="color: hsl(120, 100%, 40%);">+                PIO_Set(&pin_freq_sel[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          PIO_Clear(&pin_freq_sel[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (s & 4)</span><br><span style="color: hsl(120, 100%, 40%);">+                PIO_Set(&pin_freq_sel[2]);</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          PIO_Clear(&pin_freq_sel[2]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* !OE = L: ensure enable the output of muxes */</span><br><span style="color: hsl(120, 100%, 40%);">+      PIO_Clear(&pin_oe);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/firmware/libboard/octsimtest/source/sim_switch.c b/firmware/libboard/octsimtest/source/sim_switch.c</span><br><span>new file mode 100644</span><br><span>index 0000000..2b60a30</span><br><span>--- /dev/null</span><br><span>+++ b/firmware/libboard/octsimtest/source/sim_switch.c</span><br><span>@@ -0,0 +1,37 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* Code to switch between local (physical) and remote (emulated) SIM</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by Harald Welte <hwelte@hmw-consulting.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 modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (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., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA</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 "trace.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "sim_switch.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int sim_switch_use_physical(unsigned int nr, int physical)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     if (physical) {</span><br><span style="color: hsl(120, 100%, 40%);">+               TRACE_ERROR("%u: Use local/physical SIM - UNSUPPORTED!\r\n", nr);</span><br><span style="color: hsl(120, 100%, 40%);">+   } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              TRACE_INFO("%u: Use remote/emulated SIM\r\n", nr);</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%);">+   return 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%);">+int sim_switch_init(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  return 1; // SIMtrace hardware has only one switchable interface</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/simtrace2/+/24520">change 24520</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/c/simtrace2/+/24520"/><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-Change-Id: I7e03e0c0f2999a1ce2dad966d98e22033fa58465 </div>
<div style="display:none"> Gerrit-Change-Number: 24520 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>