Generalize SIM switching code and allow local/remote switching via USB
diff --git a/firmware/libcommon/source/mode_cardemu.c b/firmware/libcommon/source/mode_cardemu.c
index 2e50134..4f1c3dd 100644
--- a/firmware/libcommon/source/mode_cardemu.c
+++ b/firmware/libcommon/source/mode_cardemu.c
@@ -12,6 +12,7 @@
 #include "usb_buf.h"
 #include "simtrace_prot.h"
 #include "wwan_perst.h"
+#include "sim_switch.h"
 
 #define TRACE_ENTRY()	TRACE_DEBUG("%s entering\r\n", __func__)
 
@@ -521,6 +522,21 @@
 	return 0;
 }
 
+static int usb_command_sim_select(struct msgb *msg, struct cardem_inst *ci)
+{
+	struct st_modem_sim_select *mss = msg->l2h;
+
+	if (msgb_l2len(msg) < sizeof(*mss))
+		return -1;
+
+	if (mss->remote_sim)
+		sim_switch_use_physical(ci->num, 0);
+	else
+		sim_switch_use_physical(ci->num, 1);
+
+	return 0;
+}
+
 /* handle a single USB command as received from the USB host */
 static void dispatch_usb_command_modem(struct msgb *msg, struct cardem_inst *ci)
 {
@@ -532,6 +548,7 @@
 		usb_command_modem_reset(msg, ci);
 		break;
 	case SIMTRACE_MSGT_DT_MODEM_SIM_SELECT:
+		usb_command_sim_select(msg, ci);
 		break;
 	case SIMTRACE_MSGT_BD_MODEM_STATUS:
 		break;