aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-05-05 20:23:10 +0200
committerHarald Welte <laforge@gnumonks.org>2017-05-05 23:17:27 +0200
commit6d1128e9d138e2077eb113e26ee73c23108f8ad7 (patch)
tree0d79718a1ff854be5bcfbf5bbc364fec630911fd
parent7e4390f181b6cf90ac4a2089d0d2ac6f2c832cc1 (diff)
QMOD: Add code to determine SIM Card presence
-rw-r--r--firmware/libboard/qmod/include/board.h11
-rw-r--r--firmware/libboard/qmod/include/card_pres.h4
-rw-r--r--firmware/libboard/qmod/source/board_qmod.c3
-rw-r--r--firmware/libboard/qmod/source/card_pres.c58
-rw-r--r--firmware/libcommon/source/mode_cardemu.c8
5 files changed, 79 insertions, 5 deletions
diff --git a/firmware/libboard/qmod/include/board.h b/firmware/libboard/qmod/include/board.h
index 0f6343e..082d254 100644
--- a/firmware/libboard/qmod/include/board.h
+++ b/firmware/libboard/qmod/include/board.h
@@ -28,19 +28,20 @@
#define PIN_USIM1_CLK_TC {PIO_PA29, PIOA, ID_PIOA, PIO_PERIPH_B, PIO_DEFAULT}
#define PINS_TC_USIM1 PIN_USIM1_IO_TC, PIN_USIM1_CLK_TC
-#define PIN_SET_USIM1_PRES {PIO_PA12, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT}
#define PIN_USIM1_nRST {PIO_PA24, PIOA, ID_PIOA, PIO_INPUT, PIO_DEFAULT}
#define PIN_USIM1_VCC {PIO_PB3, PIOB, ID_PIOB, PIO_INPUT, PIO_DEFAULT}
-#define PIN_SET_USIM2_PRES {PIO_PA14, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT}
#define PIN_USIM2_nRST {PIO_PA7, PIOA, ID_PIOA, PIO_INPUT, PIO_DEFAULT}
#define PIN_USIM2_VCC {PIO_PB2, PIOB, ID_PIOB, PIO_INPUT, PIO_DEFAULT}
-#define PINS_USIM1 PINS_TC_USIM1, PINS_ISO7816_USIM1, PIN_USIM1_nRST, PIN_SET_USIM1_PRES
-#define PINS_USIM2 PINS_TC_USIM2, PINS_ISO7816_USIM2, PIN_USIM2_nRST, PIN_SET_USIM2_PRES
+#define PINS_USIM1 PINS_TC_USIM1, PINS_ISO7816_USIM1, PIN_USIM1_nRST
+#define PINS_USIM2 PINS_TC_USIM2, PINS_ISO7816_USIM2, PIN_USIM2_nRST
-#define PINS_CARDSIM { PIN_SET_USIM1_PRES, PIN_SET_USIM2_PRES }
+/* from v3 and onwards only (!) */
+#define PIN_DET_USIM1_PRES {PIO_PA12, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEGLITCH | PIO_IT_EDGE}
+#define PIN_DET_USIM2_PRES {PIO_PA8, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEGLITCH | PIO_IT_EDGE}
+/* only in v2 and lower (!) */
#define PIN_PRTPWR_OVERRIDE {PIO_PA8, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT}
/* inputs reading the WWAN LED level */
diff --git a/firmware/libboard/qmod/include/card_pres.h b/firmware/libboard/qmod/include/card_pres.h
new file mode 100644
index 0000000..fd7f065
--- /dev/null
+++ b/firmware/libboard/qmod/include/card_pres.h
@@ -0,0 +1,4 @@
+#pragma once
+
+int is_card_present(int port);
+int card_present_init(void);
diff --git a/firmware/libboard/qmod/source/board_qmod.c b/firmware/libboard/qmod/source/board_qmod.c
index 0d30ede..9f25a4b 100644
--- a/firmware/libboard/qmod/source/board_qmod.c
+++ b/firmware/libboard/qmod/source/board_qmod.c
@@ -8,6 +8,7 @@
#include "wwan_led.h"
#include "wwan_perst.h"
#include "boardver_adc.h"
+#include "card_pres.h"
#include "osmocom/core/timer.h"
static const Pin pin_hubpwr_override = PIN_PRTPWR_OVERRIDE;
@@ -257,4 +258,6 @@ void board_main_top(void)
/* Obtain the circuit board version (currently just prints voltage */
get_board_version_adc();
+ /* Initialize checking for card insert/remove events */
+ card_present_init();
}
diff --git a/firmware/libboard/qmod/source/card_pres.c b/firmware/libboard/qmod/source/card_pres.c
new file mode 100644
index 0000000..344ab09
--- /dev/null
+++ b/firmware/libboard/qmod/source/card_pres.c
@@ -0,0 +1,58 @@
+#include <osmocom/core/timer.h>
+#include "board.h"
+#include "utils.h"
+#include "card_pres.h"
+
+#define NUM_CARDPRES 2
+
+#define TIMER_INTERVAL_MS 500
+
+static const Pin pin_cardpres[NUM_CARDPRES] = { PIN_DET_USIM1_PRES, PIN_DET_USIM2_PRES };
+static int last_state[NUM_CARDPRES] = { -1, -1 };
+static struct osmo_timer_list cardpres_timer;
+
+/* Determine if a SIM card is present in the given slot */
+int is_card_present(int port)
+{
+ const Pin *pin;
+ int present;
+
+ if (port < 1 || port > NUM_CARDPRES)
+ return -1;
+ pin = &pin_cardpres[port-1];
+
+ /* Card present signals are low-active, as we have a switch
+ * against GND and an internal-pull-up in the SAM3 */
+ present = PIO_Get(pin) ? 0 : 1;
+
+ return present;
+}
+
+static void cardpres_tmr_cb(void *data)
+{
+ unsigned int i;
+
+ for (i = 1; i <= ARRAY_SIZE(pin_cardpres); i++) {
+ int state = is_card_present(i);
+ if (state != last_state[i-1]) {
+ TRACE_INFO("Card Detect %d Status %d -> %d\r\n", i, last_state[i], state);
+ /* FIXME: report to USB host */
+ last_state[i-1] = state;
+ }
+ }
+
+ osmo_timer_schedule(&cardpres_timer, 0, TIMER_INTERVAL_MS*1000);
+}
+
+int card_present_init(void)
+{
+ unsigned int i;
+
+ PIO_Configure(pin_cardpres, ARRAY_SIZE(pin_cardpres));
+
+ /* start timer */
+ cardpres_timer.cb = cardpres_tmr_cb;
+ osmo_timer_schedule(&cardpres_timer, 0, TIMER_INTERVAL_MS*1000);
+
+ return 2;
+}
diff --git a/firmware/libcommon/source/mode_cardemu.c b/firmware/libcommon/source/mode_cardemu.c
index 20d3356..13a5b73 100644
--- a/firmware/libcommon/source/mode_cardemu.c
+++ b/firmware/libcommon/source/mode_cardemu.c
@@ -13,7 +13,9 @@
#define TRACE_ENTRY() TRACE_DEBUG("%s entering\r\n", __func__)
+#ifdef PINS_CARDSIM
static const Pin pins_cardsim[] = PINS_CARDSIM;
+#endif
/* UART pins */
static const Pin pins_usim1[] = {PINS_USIM1};
@@ -52,7 +54,9 @@ static struct cardem_inst cardem_inst[] = {
.ep_out = PHONE_DATAOUT,
.ep_in = PHONE_DATAIN,
.ep_int = PHONE_INT,
+#ifdef PIN_SET_USIM1_PRES
.pin_insert = PIN_SET_USIM1_PRES,
+#endif
},
#ifdef CARDEMU_SECOND_UART
{
@@ -65,7 +69,9 @@ static struct cardem_inst cardem_inst[] = {
.ep_out = CARDEM_USIM2_DATAOUT,
.ep_in = CARDEM_USIM2_DATAIN,
.ep_int = CARDEM_USIM2_INT,
+#ifdef PIN_SET_USIM2_PRES
.pin_insert = PIN_SET_USIM2_PRES,
+#endif
},
#endif
};
@@ -371,7 +377,9 @@ void mode_cardemu_init(void)
TRACE_ENTRY();
+#ifdef PINS_CARDSIM
PIO_Configure(pins_cardsim, PIO_LISTSIZE(pins_cardsim));
+#endif
#ifdef DETECT_VCC_BY_ADC
card_vcc_adc_init();
#endif /* DETECT_VCC_BY_ADC */