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 */