blob: bad7291360fbc2507f2dec0159581b73619bd4ed [file] [log] [blame]
Harald Welte5c583d32017-05-09 06:46:47 +02001/* Code to switch between local (physical) and remote (emulated) SIM */
2
3#include "board.h"
4#include "trace.h"
Harald Weltec47fc5f2017-05-11 16:51:57 +02005#include "led.h"
Harald Welte5c583d32017-05-09 06:46:47 +02006#include "sim_switch.h"
7
8#ifdef PIN_SIM_SWITCH1
9static const Pin pin_conn_usim1 = {PIO_PA20, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT};
10#endif
11#ifdef PIN_SIM_SWITCH2
12static const Pin pin_conn_usim2 = {PIO_PA28, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT};
13#endif
14
15static int initialized = 0;
16
17int sim_switch_use_physical(unsigned int nr, int physical)
18{
19 const Pin *pin;
Harald Weltec47fc5f2017-05-11 16:51:57 +020020 enum led led;
Harald Welte5c583d32017-05-09 06:46:47 +020021
22 if (!initialized) {
23 TRACE_ERROR("Somebody forgot to call sim_switch_init()\r\n");
24 sim_switch_init();
25 }
26
27 TRACE_INFO("Modem %d: %s SIM\n\r", nr,
28 physical ? "physical" : "virtual");
29
30 switch (nr) {
31#ifdef PIN_SIM_SWITCH1
Harald Welte44622df2017-05-11 00:04:50 +020032 case 0:
Harald Welte5c583d32017-05-09 06:46:47 +020033 pin = &pin_conn_usim1;
Harald Weltec47fc5f2017-05-11 16:51:57 +020034 led = LED_USIM1;
Harald Welte5c583d32017-05-09 06:46:47 +020035 break;
36#endif
37#ifdef PIN_SIM_SWITCH2
Harald Welte44622df2017-05-11 00:04:50 +020038 case 1:
Harald Welte5c583d32017-05-09 06:46:47 +020039 pin = &pin_conn_usim2;
Harald Weltec47fc5f2017-05-11 16:51:57 +020040 led = LED_USIM2;
Harald Welte5c583d32017-05-09 06:46:47 +020041 break;
42#endif
43 default:
44 TRACE_ERROR("Invalid SIM%u\n\r", nr);
45 return -1;
46 }
47
Harald Welte0709d2d2017-05-11 00:06:00 +020048 if (physical) {
49 TRACE_INFO("%u: Use local/physical SIM\r\n", nr);
Harald Welte5c583d32017-05-09 06:46:47 +020050 PIO_Clear(pin);
Harald Weltec47fc5f2017-05-11 16:51:57 +020051 led_blink(led, BLINK_ALWAYS_ON);
Harald Welte0709d2d2017-05-11 00:06:00 +020052 } else {
53 TRACE_INFO("%u: Use remote/emulated SIM\r\n", nr);
Harald Welte5c583d32017-05-09 06:46:47 +020054 PIO_Set(pin);
Harald Weltec47fc5f2017-05-11 16:51:57 +020055 led_blink(led, BLINK_ALWAYS_OFF);
Harald Welte0709d2d2017-05-11 00:06:00 +020056 }
Harald Welte5c583d32017-05-09 06:46:47 +020057
58 return 0;
59}
60
61int sim_switch_init(void)
62{
63 int num_switch = 0;
64#ifdef PIN_SIM_SWITCH1
65 PIO_Configure(&pin_conn_usim1, 1);
66 num_switch++;
67#endif
68#ifdef PIN_SIM_SWITCH2
69 PIO_Configure(&pin_conn_usim2, 1);
70 num_switch++;
71#endif
Harald Welteeb50c9f2017-11-03 20:50:47 +010072 initialized = 1;
Harald Welte5c583d32017-05-09 06:46:47 +020073 return num_switch;
74}