blob: 0cd34f077020ca965b912da479d5b01d50b41f42 [file] [log] [blame]
Harald Welte6d1128e2017-05-05 20:23:10 +02001#include <osmocom/core/timer.h>
2#include "board.h"
3#include "utils.h"
4#include "card_pres.h"
5
6#define NUM_CARDPRES 2
7
8#define TIMER_INTERVAL_MS 500
9
10static const Pin pin_cardpres[NUM_CARDPRES] = { PIN_DET_USIM1_PRES, PIN_DET_USIM2_PRES };
11static int last_state[NUM_CARDPRES] = { -1, -1 };
12static struct osmo_timer_list cardpres_timer;
13
14/* Determine if a SIM card is present in the given slot */
15int is_card_present(int port)
16{
17 const Pin *pin;
18 int present;
19
Harald Welteb52b8862017-11-03 20:33:10 +010020 if (port < 0 || port >= NUM_CARDPRES)
Harald Welte6d1128e2017-05-05 20:23:10 +020021 return -1;
Harald Welteb52b8862017-11-03 20:33:10 +010022 pin = &pin_cardpres[port];
Harald Welte6d1128e2017-05-05 20:23:10 +020023
24 /* Card present signals are low-active, as we have a switch
25 * against GND and an internal-pull-up in the SAM3 */
26 present = PIO_Get(pin) ? 0 : 1;
27
28 return present;
29}
30
31static void cardpres_tmr_cb(void *data)
32{
33 unsigned int i;
34
Harald Welteb52b8862017-11-03 20:33:10 +010035 for (i = 0; i < ARRAY_SIZE(pin_cardpres); i++) {
Harald Welte6d1128e2017-05-05 20:23:10 +020036 int state = is_card_present(i);
Harald Welteb52b8862017-11-03 20:33:10 +010037 if (state != last_state[i]) {
Harald Welte4e837d42017-11-03 20:35:55 +010038 TRACE_INFO("%u: Card Detect Status %d -> %d\r\n", i, last_state[i], state);
Harald Welte6d1128e2017-05-05 20:23:10 +020039 /* FIXME: report to USB host */
Harald Welteb52b8862017-11-03 20:33:10 +010040 last_state[i] = state;
Harald Welte6d1128e2017-05-05 20:23:10 +020041 }
42 }
43
44 osmo_timer_schedule(&cardpres_timer, 0, TIMER_INTERVAL_MS*1000);
45}
46
47int card_present_init(void)
48{
49 unsigned int i;
50
51 PIO_Configure(pin_cardpres, ARRAY_SIZE(pin_cardpres));
52
53 /* start timer */
54 cardpres_timer.cb = cardpres_tmr_cb;
55 osmo_timer_schedule(&cardpres_timer, 0, TIMER_INTERVAL_MS*1000);
56
57 return 2;
58}