diff options
author | Kévin Redon <kredon@sysmocom.de> | 2019-05-14 23:39:36 +0200 |
---|---|---|
committer | laforge <laforge@osmocom.org> | 2021-04-08 21:28:37 +0000 |
commit | 6b7f8d142fd58d491e982f5b0234cf4f8b4f21d8 (patch) | |
tree | 66cd4b97a3277c95715b77cfc99ce83ec3734fc5 /firmware | |
parent | 9c95162d5c5df4235b05e59874e118f3edcce83e (diff) |
make sim switch board specific
the simtrace board uses a bus switch not used on qmod and owhw to
switch the SIM between physical and virtual
Change-Id: Ieaf2ed4761fc3e04f33f9aac5c04a768c9a6f71e
Related: OS#1704
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/libboard/common/include/sim_switch.h | 8 | ||||
-rw-r--r-- | firmware/libboard/owhw/source/sim_switch.c (renamed from firmware/libboard/common/source/sim_switch.c) | 0 | ||||
-rw-r--r-- | firmware/libboard/qmod/source/sim_switch.c | 90 | ||||
-rw-r--r-- | firmware/libboard/simtrace/source/sim_switch.c | 54 |
4 files changed, 152 insertions, 0 deletions
diff --git a/firmware/libboard/common/include/sim_switch.h b/firmware/libboard/common/include/sim_switch.h index 3d131f2..4439fa5 100644 --- a/firmware/libboard/common/include/sim_switch.h +++ b/firmware/libboard/common/include/sim_switch.h @@ -14,5 +14,13 @@ */ #pragma once +/** switch card lines to use physical or emulated card + * @param[in] nr card interface number (i.e. slot) + * @param[in] physical which physical interface to switch to (e.g. 0: physical, 1: virtual) + * @return 0 on success, negative else + */ int sim_switch_use_physical(unsigned int nr, int physical); +/** initialise card switching capabilities + * @return number of switchable card interfaces + */ int sim_switch_init(void); diff --git a/firmware/libboard/common/source/sim_switch.c b/firmware/libboard/owhw/source/sim_switch.c index 59513ad..59513ad 100644 --- a/firmware/libboard/common/source/sim_switch.c +++ b/firmware/libboard/owhw/source/sim_switch.c diff --git a/firmware/libboard/qmod/source/sim_switch.c b/firmware/libboard/qmod/source/sim_switch.c new file mode 100644 index 0000000..59513ad --- /dev/null +++ b/firmware/libboard/qmod/source/sim_switch.c @@ -0,0 +1,90 @@ +/* Code to switch between local (physical) and remote (emulated) SIM + * + * (C) 2015-2017 by Harald Welte <hwelte@hmw-consulting.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA + */ +#include "board.h" +#include "trace.h" +#include "led.h" +#include "sim_switch.h" + +#ifdef PIN_SIM_SWITCH1 +static const Pin pin_conn_usim1 = {PIO_PA20, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT}; +#endif +#ifdef PIN_SIM_SWITCH2 +static const Pin pin_conn_usim2 = {PIO_PA28, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT}; +#endif + +static int initialized = 0; + +int sim_switch_use_physical(unsigned int nr, int physical) +{ + const Pin *pin; + enum led led; + + if (!initialized) { + TRACE_ERROR("Somebody forgot to call sim_switch_init()\r\n"); + sim_switch_init(); + } + + TRACE_INFO("Modem %d: %s SIM\n\r", nr, + physical ? "physical" : "virtual"); + + switch (nr) { +#ifdef PIN_SIM_SWITCH1 + case 0: + pin = &pin_conn_usim1; + led = LED_USIM1; + break; +#endif +#ifdef PIN_SIM_SWITCH2 + case 1: + pin = &pin_conn_usim2; + led = LED_USIM2; + break; +#endif + default: + TRACE_ERROR("Invalid SIM%u\n\r", nr); + return -1; + } + + if (physical) { + TRACE_INFO("%u: Use local/physical SIM\r\n", nr); + PIO_Clear(pin); + led_blink(led, BLINK_ALWAYS_ON); + } else { + TRACE_INFO("%u: Use remote/emulated SIM\r\n", nr); + PIO_Set(pin); + led_blink(led, BLINK_ALWAYS_OFF); + } + + return 0; +} + +int sim_switch_init(void) +{ + int num_switch = 0; +#ifdef PIN_SIM_SWITCH1 + PIO_Configure(&pin_conn_usim1, 1); + num_switch++; +#endif +#ifdef PIN_SIM_SWITCH2 + PIO_Configure(&pin_conn_usim2, 1); + num_switch++; +#endif + initialized = 1; + return num_switch; +} diff --git a/firmware/libboard/simtrace/source/sim_switch.c b/firmware/libboard/simtrace/source/sim_switch.c new file mode 100644 index 0000000..c5c54f0 --- /dev/null +++ b/firmware/libboard/simtrace/source/sim_switch.c @@ -0,0 +1,54 @@ +/* Code to switch between local (physical) and remote (emulated) SIM + * + * (C) 2015-2017 by Harald Welte <hwelte@hmw-consulting.de> + * (C) 2018, sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA + */ +#include "board.h" +#include "trace.h" +#include "led.h" +#include "sim_switch.h" + +int sim_switch_use_physical(unsigned int nr, int physical) +{ + const Pin pin_sc = PIN_SC_SW_DEFAULT; // pin to control bus switch for VCC/RST/CLK signals + const Pin pin_io = PIN_IO_SW_DEFAULT; // pin to control bus switch for I/O signal + + if (nr > 0) { + TRACE_ERROR("SIM interface for Modem %d can't be switched\r\n", nr); + return -1; + } + + TRACE_INFO("Modem %u: %s SIM\n\r", nr, physical ? "physical" : "virtual"); + + if (physical) { + TRACE_INFO("%u: Use local/physical SIM\r\n", nr); + PIO_Set(&pin_sc); + PIO_Set(&pin_io); + } else { + TRACE_INFO("%u: Use remote/emulated SIM\r\n", nr); + PIO_Clear(&pin_sc); + PIO_Clear(&pin_io); + } + + return 0; +} + +int sim_switch_init(void) +{ + // the bus switch is already initialised + return 1; // SIMtrace hardware has only one switchable interface +} |