Add Card-Emulation for second UART/USIM to USB descriptors
diff --git a/firmware/src_simtrace/usb.c b/firmware/src_simtrace/usb.c
index f6174c3..6b57b1b 100644
--- a/firmware/src_simtrace/usb.c
+++ b/firmware/src_simtrace/usb.c
@@ -175,8 +175,57 @@
     USBStringDescriptor_UNICODE('M'),
 };
 
+const unsigned char cardem_usim1_intf_str[] = {
+
+    USBStringDescriptor_LENGTH(18),
+    USBGenericDescriptor_STRING,
+    USBStringDescriptor_UNICODE('C'),
+    USBStringDescriptor_UNICODE('a'),
+    USBStringDescriptor_UNICODE('r'),
+    USBStringDescriptor_UNICODE('d'),
+    USBStringDescriptor_UNICODE('E'),
+    USBStringDescriptor_UNICODE('m'),
+    USBStringDescriptor_UNICODE('u'),
+    USBStringDescriptor_UNICODE('l'),
+    USBStringDescriptor_UNICODE('a'),
+    USBStringDescriptor_UNICODE('t'),
+    USBStringDescriptor_UNICODE('o'),
+    USBStringDescriptor_UNICODE('r'),
+    USBStringDescriptor_UNICODE(' '),
+    USBStringDescriptor_UNICODE('U'),
+    USBStringDescriptor_UNICODE('S'),
+    USBStringDescriptor_UNICODE('I'),
+    USBStringDescriptor_UNICODE('M'),
+    USBStringDescriptor_UNICODE('1'),
+};
+
+const unsigned char cardem_usim2_intf_str[] = {
+
+    USBStringDescriptor_LENGTH(18),
+    USBGenericDescriptor_STRING,
+    USBStringDescriptor_UNICODE('C'),
+    USBStringDescriptor_UNICODE('a'),
+    USBStringDescriptor_UNICODE('r'),
+    USBStringDescriptor_UNICODE('d'),
+    USBStringDescriptor_UNICODE('E'),
+    USBStringDescriptor_UNICODE('m'),
+    USBStringDescriptor_UNICODE('u'),
+    USBStringDescriptor_UNICODE('l'),
+    USBStringDescriptor_UNICODE('a'),
+    USBStringDescriptor_UNICODE('t'),
+    USBStringDescriptor_UNICODE('o'),
+    USBStringDescriptor_UNICODE('r'),
+    USBStringDescriptor_UNICODE(' '),
+    USBStringDescriptor_UNICODE('U'),
+    USBStringDescriptor_UNICODE('S'),
+    USBStringDescriptor_UNICODE('I'),
+    USBStringDescriptor_UNICODE('M'),
+    USBStringDescriptor_UNICODE('2'),
+};
+
 enum strDescNum {
-    PRODUCT_STRING = 1, MANUF_STR, SNIFFER_CONF_STR, CCID_CONF_STR, PHONE_CONF_STR, MITM_CONF_STR, STRING_DESC_CNT
+    PRODUCT_STRING = 1, MANUF_STR, SNIFFER_CONF_STR, CCID_CONF_STR, PHONE_CONF_STR, MITM_CONF_STR,
+    CARDEM_USIM1_INTF_STR, CARDEM_USIM2_INTF_STR, STRING_DESC_CNT
 };
 
 /** List of string descriptors used by the device */
@@ -187,7 +236,9 @@
     [SNIFFER_CONF_STR] 	= snifferConfigStringDescriptor,
     [CCID_CONF_STR] 	= CCIDConfigStringDescriptor,
     [PHONE_CONF_STR]	= phoneConfigStringDescriptor,
-    [MITM_CONF_STR]	= MITMConfigStringDescriptor
+    [MITM_CONF_STR]	= MITMConfigStringDescriptor,
+    [CARDEM_USIM1_INTF_STR] = cardem_usim1_intf_str,
+    [CARDEM_USIM2_INTF_STR] = cardem_usim2_intf_str,
 };
 
 /*------------------------------------------------------------------------------
@@ -385,6 +436,12 @@
     USBEndpointDescriptor       phone_dataOut;
     USBEndpointDescriptor       phone_dataIn;
     USBEndpointDescriptor       phone_interruptIn;
+#ifdef CARDEMU_SECOND_UART
+    USBInterfaceDescriptor      usim2;
+    USBEndpointDescriptor       usim2_dataOut;
+    USBEndpointDescriptor       usim2_dataIn;
+    USBEndpointDescriptor       usim2_interruptIn;
+#endif
 } __attribute__ ((packed)) SIMTraceDriverConfigurationDescriptorPhone;
 
 static const SIMTraceDriverConfigurationDescriptorPhone configurationDescriptorPhone = {
@@ -393,7 +450,11 @@
         sizeof(USBConfigurationDescriptor),
         USBGenericDescriptor_CONFIGURATION,
         sizeof(SIMTraceDriverConfigurationDescriptorPhone),
+#ifdef CARDEMU_SECOND_UART
+	2,
+#else
         1, /* There is one interface in this configuration */
+#endif
         CFG_NUM_PHONE, /* configuration number */
         PHONE_CONF_STR, /* string descriptor for this configuration */
         USBD_BMATTRIBUTES,
@@ -409,7 +470,7 @@
         0xff, /* Descriptor Class: Vendor specific */
         0, /* No subclass */
         0, /* No l */
-        PHONE_CONF_STR  /* Third in string descriptor for this interface */
+        CARDEM_USIM1_INTF_STR
     },
     /* Bulk-OUT endpoint standard descriptor */
     {
@@ -442,7 +503,53 @@
         MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(PHONE_INT),
             USBEndpointDescriptor_MAXINTERRUPTSIZE_FS),
         0x10
+    },
+#ifdef CARDEMU_SECOND_UART
+    /* Communication class interface standard descriptor */
+    {
+        sizeof(USBInterfaceDescriptor),
+        USBGenericDescriptor_INTERFACE,
+        1, /* This is interface #0 */
+        0, /* This is alternate setting #0 for this interface */
+        3, /* Number of endpoints */
+        0xff, /* Descriptor Class: Vendor specific */
+        0, /* No subclass */
+        0, /* No l */
+        CARDEM_USIM2_INTF_STR
+    },
+    /* Bulk-OUT endpoint standard descriptor */
+    {
+        sizeof(USBEndpointDescriptor),
+        USBGenericDescriptor_ENDPOINT,
+        USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_OUT,
+                                      CARDEM_USIM2_DATAOUT),
+        USBEndpointDescriptor_BULK,
+        MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CARDEM_USIM2_DATAOUT),
+            USBEndpointDescriptor_MAXBULKSIZE_FS),
+        0 /* Must be 0 for full-speed bulk endpoints */
+    },
+    /* Bulk-IN endpoint descriptor */
+    {
+        sizeof(USBEndpointDescriptor),
+        USBGenericDescriptor_ENDPOINT,
+        USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN,
+                                      CARDEM_USIM2_DATAIN),
+        USBEndpointDescriptor_BULK,
+        MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CARDEM_USIM2_DATAIN),
+            USBEndpointDescriptor_MAXBULKSIZE_FS),
+        0 /* Must be 0 for full-speed bulk endpoints */
+    },
+    /* Notification endpoint descriptor */
+    {
+        sizeof(USBEndpointDescriptor),
+        USBGenericDescriptor_ENDPOINT,
+        USBEndpointDescriptor_ADDRESS( USBEndpointDescriptor_IN, CARDEM_USIM2_INT ),
+        USBEndpointDescriptor_INTERRUPT,
+        MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CARDEM_USIM2_INT),
+            USBEndpointDescriptor_MAXINTERRUPTSIZE_FS),
+        0x10
     }
+#endif
 };
 #endif /* HAVE_CARDEM */