aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2021-06-03 11:15:21 +0200
committerHarald Welte <laforge@osmocom.org>2021-06-03 14:37:43 +0200
commitd46f6bae2c5c6af9ba5ea80ca6a7a88fc4ddf712 (patch)
tree2989cff742020bb051e26a424ad895b81a148ad8
parent3561fc4c8b05e0976e43b74e013dca3cc8eee276 (diff)
firmware: octsimtest: Make slot mux configurable via USB
-rw-r--r--firmware/libboard/octsimtest/include/board.h2
-rw-r--r--firmware/libboard/octsimtest/include/mux.h3
-rw-r--r--firmware/libboard/octsimtest/source/mux.c16
-rw-r--r--firmware/libcommon/include/simtrace_prot.h2
-rw-r--r--firmware/libcommon/source/card_emu.c15
5 files changed, 36 insertions, 2 deletions
diff --git a/firmware/libboard/octsimtest/include/board.h b/firmware/libboard/octsimtest/include/board.h
index 171b2c1..ad21a1f 100644
--- a/firmware/libboard/octsimtest/include/board.h
+++ b/firmware/libboard/octsimtest/include/board.h
@@ -109,6 +109,8 @@
#define VCC_UV_THRESH_1V8 (1500000*47)/(47+30)
#define VCC_UV_THRESH_3V (2500000*47)/(47+30)
+#define HAVE_SLOT_MUX
+
/** Supported modes */
/* SIMtrace board supports sniffer mode */
//#define HAVE_SNIFFER
diff --git a/firmware/libboard/octsimtest/include/mux.h b/firmware/libboard/octsimtest/include/mux.h
index ba7ae9f..3181478 100644
--- a/firmware/libboard/octsimtest/include/mux.h
+++ b/firmware/libboard/octsimtest/include/mux.h
@@ -1,7 +1,8 @@
#pragma once
void mux_init(void);
-void mux_set_slot(uint8_t s);
+int mux_set_slot(uint8_t s);
+int mux_get_slot(void);
void mux_set_freq(uint8_t s);
/* this reflects the wiring between U5 and U4 */
diff --git a/firmware/libboard/octsimtest/source/mux.c b/firmware/libboard/octsimtest/source/mux.c
index 8d9f625..54c6cb6 100644
--- a/firmware/libboard/octsimtest/source/mux.c
+++ b/firmware/libboard/octsimtest/source/mux.c
@@ -20,6 +20,7 @@
#include "board.h"
#include "mux.h"
#include <stdbool.h>
+#include <errno.h>
/* 3-bit S0..S2 signal for slot selection */
static const Pin pin_in_sel[3] = {
@@ -38,6 +39,8 @@ static const Pin pin_freq_sel[3] = {
/* low-active output enable for all muxes */
static const Pin pin_oe = { PIO_PA19, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT };
+static uint8_t g_mux_slot = 0;
+
/* initialize the external 1:8 multiplexers */
void mux_init(void)
{
@@ -49,10 +52,13 @@ void mux_init(void)
}
/* set the slot selection mux */
-void mux_set_slot(uint8_t s)
+int mux_set_slot(uint8_t s)
{
printf("%s(%u)\r\n", __func__, s);
+ if (s > 7)
+ return -EINVAL;
+
/* !OE = H: disconnect input and output of muxes */
PIO_Set(&pin_oe);
@@ -71,6 +77,14 @@ void mux_set_slot(uint8_t s)
/* !OE = L: (re-)enable the output of muxes */
PIO_Clear(&pin_oe);
+
+ g_mux_slot = s;
+ return s;
+}
+
+int mux_get_slot(void)
+{
+ return g_mux_slot;
}
/* set the frequency divider mux */
diff --git a/firmware/libcommon/include/simtrace_prot.h b/firmware/libcommon/include/simtrace_prot.h
index e550616..5eb4f59 100644
--- a/firmware/libcommon/include/simtrace_prot.h
+++ b/firmware/libcommon/include/simtrace_prot.h
@@ -269,6 +269,8 @@ struct cardemu_usb_msg_error {
struct cardemu_usb_msg_config {
/* bit-mask of CEMU_FEAT_F flags */
uint32_t features;
+ /* the selected slot number (if an external mux is present) */
+ uint8_t slot_mux_nr;
} __attribute__ ((packed));
/***********************************************************************
diff --git a/firmware/libcommon/source/card_emu.c b/firmware/libcommon/source/card_emu.c
index bcd5fd6..4b84039 100644
--- a/firmware/libcommon/source/card_emu.c
+++ b/firmware/libcommon/source/card_emu.c
@@ -33,6 +33,9 @@
#include <osmocom/core/linuxlist.h>
#include <osmocom/core/msgb.h>
+#ifdef HAVE_SLOT_MUX
+#include "mux.h"
+#endif
#define NUM_SLOTS 2
@@ -1079,6 +1082,12 @@ static void card_emu_report_config(struct card_handle *ch)
cfg = (struct cardemu_usb_msg_config *) msgb_put(msg, sizeof(*cfg));
cfg->features = ch->features;
+#ifdef HAVE_SLOT_MUX
+ cfg->slot_mux_nr = mux_get_slot();
+#else
+ cfg->slot_mux_nr = 0;
+#endif
+
usb_buf_upd_len_and_submit(msg);
}
@@ -1241,6 +1250,12 @@ int card_emu_set_config(struct card_handle *ch, const struct cardemu_usb_msg_con
if (scfg_len >= sizeof(uint32_t))
ch->features = (scfg->features & SUPPORTED_FEATURES);
+#ifdef HAVE_SLOT_MUX
+ if (scfg_len >= sizeof(uint32_t)+sizeof(uint8_t)) {
+ mux_set_slot(scfg->slot_mux_nr);
+ }
+#endif
+
/* send back a report of our current configuration */
card_emu_report_config(ch);