Generate USB Strings from apps/*/usb_strings.txt files at compile time

This way we can skip the manually-crafted USB string definitions in the
dfu_desc.c and usb.c files.
diff --git a/.gitignore b/.gitignore
index 4ed3fa3..f3f0bf5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,4 @@
 *.p
 host/simtrace2-remsim
 host/simtrace2-remsim-usb2udp
+usb_strings_generated.h
diff --git a/firmware/Makefile b/firmware/Makefile
index 09cc5d8..b9f267b 100644
--- a/firmware/Makefile
+++ b/firmware/Makefile
@@ -139,6 +139,7 @@
 INCLUDES += -Ilibcommon/include
 INCLUDES += -Ilibosmocore/include
 INCLUDES += -Isrc_simtrace -Iinclude
+INCLUDES += -Iapps/$(APP)
 
 CFLAGS += -Wall -Wchar-subscripts -Wcomment -Wimplicit-int #-Wformat=2
 CFLAGS += -Werror-implicit-function-declaration -Wmain -Wparentheses
@@ -179,11 +180,17 @@
 #		Rules
 #-------------------------------------------------------------------------------
 
-all: $(BIN) $(OBJ) $(MEMORIES)
+all: apps/$(APP)/usb_strings_generated.h $(BIN) $(OBJ) $(MEMORIES)
 
 $(BIN) $(OBJ):
 	mkdir $@
 
+usbstring/usbstring: usbstring/usbstring.c
+	gcc $^ -o $@
+
+apps/$(APP)/usb_strings_generated.h: apps/$(APP)/usb_strings.txt usbstring/usbstring
+	cat $< | usbstring/usbstring > $@
+
 define RULES
 C_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(C_OBJECTS))
 ASM_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(ASM_OBJECTS))
diff --git a/firmware/apps/cardem/usb_strings.txt b/firmware/apps/cardem/usb_strings.txt
new file mode 100644
index 0000000..a9c3a8e
--- /dev/null
+++ b/firmware/apps/cardem/usb_strings.txt
@@ -0,0 +1,8 @@
+sysmocom - s.f.m.c. GmbH
+SIMtrace 2 compatible device
+SIMtrace Sniffer
+SIMtrace CCID
+SIMtrace Phone
+SIMtrace MITM
+CardEmulator USIM1
+CardEmulator USIM2
diff --git a/firmware/apps/dfu/usb_strings.txt b/firmware/apps/dfu/usb_strings.txt
new file mode 100644
index 0000000..bdf2048
--- /dev/null
+++ b/firmware/apps/dfu/usb_strings.txt
@@ -0,0 +1,5 @@
+sysmocom - s.f.m.c. GmbH
+SIMtrace 2 compatible device
+DFU (Device Firmare Upgrade)
+RAM
+Flash (Application Partition)
diff --git a/firmware/atmel_softpack_libraries/usb/device/dfu/dfu_desc.c b/firmware/atmel_softpack_libraries/usb/device/dfu/dfu_desc.c
index cfd2665..10a95ed 100644
--- a/firmware/atmel_softpack_libraries/usb/device/dfu/dfu_desc.c
+++ b/firmware/atmel_softpack_libraries/usb/device/dfu/dfu_desc.c
@@ -85,114 +85,13 @@
 	.func_dfu = DFU_FUNC_DESC
 };
 
+#include "usb_strings_generated.h"
+
 #if 0
-#include "usb_strings.h"
-
-
-static const unsigned char *usb_strings[] = {
-	USB_STRINGS_GENERATED
-#ifdef BOARD_USB_SERIAL
-	NULL
-#endif
-};
-
 void set_usb_serial_str(const uint8_t *serial_usbstr)
 {
 	usb_strings[STR_SERIAL] = serial_usbstr;
 }
-#else
-static const unsigned char langDesc[] = {
-	USBStringDescriptor_LENGTH(1),
-	USBGenericDescriptor_STRING,
-	USBStringDescriptor_ENGLISH_US
-};
-
-static const unsigned char manufStringDescriptor[] = {
-	USBStringDescriptor_LENGTH(24),
-	USBGenericDescriptor_STRING,
-	USBStringDescriptor_UNICODE('s'),
-	USBStringDescriptor_UNICODE('y'),
-	USBStringDescriptor_UNICODE('s'),
-	USBStringDescriptor_UNICODE('m'),
-	USBStringDescriptor_UNICODE('o'),
-	USBStringDescriptor_UNICODE('c'),
-	USBStringDescriptor_UNICODE('o'),
-	USBStringDescriptor_UNICODE('m'),
-	USBStringDescriptor_UNICODE(' '),
-	USBStringDescriptor_UNICODE('-'),
-	USBStringDescriptor_UNICODE(' '),
-	USBStringDescriptor_UNICODE('s'),
-	USBStringDescriptor_UNICODE('.'),
-	USBStringDescriptor_UNICODE('f'),
-	USBStringDescriptor_UNICODE('.'),
-	USBStringDescriptor_UNICODE('m'),
-	USBStringDescriptor_UNICODE('.'),
-	USBStringDescriptor_UNICODE('c'),
-	USBStringDescriptor_UNICODE('.'),
-	USBStringDescriptor_UNICODE(' '),
-	USBStringDescriptor_UNICODE('G'),
-	USBStringDescriptor_UNICODE('m'),
-	USBStringDescriptor_UNICODE('b'),
-	USBStringDescriptor_UNICODE('H'),
-};
-
-static const unsigned char productStringDescriptor[] = {
-	USBStringDescriptor_LENGTH(10),
-	USBGenericDescriptor_STRING,
-	USBStringDescriptor_UNICODE('S'),
-	USBStringDescriptor_UNICODE('I'),
-	USBStringDescriptor_UNICODE('M'),
-	USBStringDescriptor_UNICODE('t'),
-	USBStringDescriptor_UNICODE('r'),
-	USBStringDescriptor_UNICODE('a'),
-	USBStringDescriptor_UNICODE('c'),
-	USBStringDescriptor_UNICODE('e'),
-	USBStringDescriptor_UNICODE(' '),
-	USBStringDescriptor_UNICODE('2'),
-};
-
-
-static const unsigned char configStringDescriptor[] = {
-	USBStringDescriptor_LENGTH(3),
-	USBGenericDescriptor_STRING,
-	USBStringDescriptor_UNICODE('D'),
-	USBStringDescriptor_UNICODE('F'),
-	USBStringDescriptor_UNICODE('U'),
-};
-
-static const unsigned char altRamStringDescriptor[] = {
-	USBStringDescriptor_LENGTH(3),
-	USBGenericDescriptor_STRING,
-	USBStringDescriptor_UNICODE('R'),
-	USBStringDescriptor_UNICODE('A'),
-	USBStringDescriptor_UNICODE('M'),
-};
-
-static const unsigned char altAppStringDescriptor[] = {
-	USBStringDescriptor_LENGTH(11),
-	USBGenericDescriptor_STRING,
-	USBStringDescriptor_UNICODE('F'),
-	USBStringDescriptor_UNICODE('l'),
-	USBStringDescriptor_UNICODE('a'),
-	USBStringDescriptor_UNICODE('s'),
-	USBStringDescriptor_UNICODE('h'),
-	USBStringDescriptor_UNICODE(' '),
-	USBStringDescriptor_UNICODE('('),
-	USBStringDescriptor_UNICODE('A'),
-	USBStringDescriptor_UNICODE('p'),
-	USBStringDescriptor_UNICODE('p'),
-	USBStringDescriptor_UNICODE(')'),
-};
-
-/** List of string descriptors used by the device */
-static const unsigned char *usb_strings[] = {
-	langDesc,
-	[STR_MANUF] = manufStringDescriptor,
-	[STR_PROD] = productStringDescriptor,
-	[STR_CONFIG] = configStringDescriptor,
-	[_STR_FIRST_ALT] = altRamStringDescriptor,
-	[_STR_FIRST_ALT+1] = altAppStringDescriptor,
-};
 #endif
 
 static const USBConfigurationDescriptor *conf_desc_arr[] = {
diff --git a/firmware/libcommon/source/usb.c b/firmware/libcommon/source/usb.c
index c1fc111..c1effec 100644
--- a/firmware/libcommon/source/usb.c
+++ b/firmware/libcommon/source/usb.c
@@ -42,188 +42,7 @@
 /*------------------------------------------------------------------------------
  *       USB String descriptors 
  *------------------------------------------------------------------------------*/
-
-static const unsigned char langDesc[] = {
-
-	USBStringDescriptor_LENGTH(1),
-	USBGenericDescriptor_STRING,
-	USBStringDescriptor_ENGLISH_US
-};
-
-const unsigned char manufStringDescriptor[] = {
-
-	USBStringDescriptor_LENGTH(24),
-	USBGenericDescriptor_STRING,
-	USBStringDescriptor_UNICODE('s'),
-	USBStringDescriptor_UNICODE('y'),
-	USBStringDescriptor_UNICODE('s'),
-	USBStringDescriptor_UNICODE('m'),
-	USBStringDescriptor_UNICODE('o'),
-	USBStringDescriptor_UNICODE('c'),
-	USBStringDescriptor_UNICODE('o'),
-	USBStringDescriptor_UNICODE('m'),
-	USBStringDescriptor_UNICODE(' '),
-	USBStringDescriptor_UNICODE('-'),
-	USBStringDescriptor_UNICODE(' '),
-	USBStringDescriptor_UNICODE('s'),
-	USBStringDescriptor_UNICODE('.'),
-	USBStringDescriptor_UNICODE('f'),
-	USBStringDescriptor_UNICODE('.'),
-	USBStringDescriptor_UNICODE('m'),
-	USBStringDescriptor_UNICODE('.'),
-	USBStringDescriptor_UNICODE('c'),
-	USBStringDescriptor_UNICODE('.'),
-	USBStringDescriptor_UNICODE(' '),
-	USBStringDescriptor_UNICODE('G'),
-	USBStringDescriptor_UNICODE('m'),
-	USBStringDescriptor_UNICODE('b'),
-	USBStringDescriptor_UNICODE('H'),
-};
-
-const unsigned char productStringDescriptor[] = {
-
-	USBStringDescriptor_LENGTH(10),
-	USBGenericDescriptor_STRING,
-	USBStringDescriptor_UNICODE('S'),
-	USBStringDescriptor_UNICODE('I'),
-	USBStringDescriptor_UNICODE('M'),
-	USBStringDescriptor_UNICODE('t'),
-	USBStringDescriptor_UNICODE('r'),
-	USBStringDescriptor_UNICODE('a'),
-	USBStringDescriptor_UNICODE('c'),
-	USBStringDescriptor_UNICODE('e'),
-	USBStringDescriptor_UNICODE(' '),
-	USBStringDescriptor_UNICODE('2'),
-};
-
-const unsigned char snifferConfigStringDescriptor[] = {
-
-	USBStringDescriptor_LENGTH(16),
-	USBGenericDescriptor_STRING,
-	USBStringDescriptor_UNICODE('S'),
-	USBStringDescriptor_UNICODE('I'),
-	USBStringDescriptor_UNICODE('M'),
-	USBStringDescriptor_UNICODE('t'),
-	USBStringDescriptor_UNICODE('r'),
-	USBStringDescriptor_UNICODE('a'),
-	USBStringDescriptor_UNICODE('c'),
-	USBStringDescriptor_UNICODE('e'),
-	USBStringDescriptor_UNICODE(' '),
-	USBStringDescriptor_UNICODE('S'),
-	USBStringDescriptor_UNICODE('n'),
-	USBStringDescriptor_UNICODE('i'),
-	USBStringDescriptor_UNICODE('f'),
-	USBStringDescriptor_UNICODE('f'),
-	USBStringDescriptor_UNICODE('e'),
-	USBStringDescriptor_UNICODE('r'),
-};
-
-const unsigned char CCIDConfigStringDescriptor[] = {
-
-	USBStringDescriptor_LENGTH(13),
-	USBGenericDescriptor_STRING,
-	USBStringDescriptor_UNICODE('S'),
-	USBStringDescriptor_UNICODE('I'),
-	USBStringDescriptor_UNICODE('M'),
-	USBStringDescriptor_UNICODE('t'),
-	USBStringDescriptor_UNICODE('r'),
-	USBStringDescriptor_UNICODE('a'),
-	USBStringDescriptor_UNICODE('c'),
-	USBStringDescriptor_UNICODE('e'),
-	USBStringDescriptor_UNICODE(' '),
-	USBStringDescriptor_UNICODE('C'),
-	USBStringDescriptor_UNICODE('C'),
-	USBStringDescriptor_UNICODE('I'),
-	USBStringDescriptor_UNICODE('D'),
-};
-
-const unsigned char phoneConfigStringDescriptor[] = {
-
-	USBStringDescriptor_LENGTH(14),
-	USBGenericDescriptor_STRING,
-	USBStringDescriptor_UNICODE('S'),
-	USBStringDescriptor_UNICODE('I'),
-	USBStringDescriptor_UNICODE('M'),
-	USBStringDescriptor_UNICODE('t'),
-	USBStringDescriptor_UNICODE('r'),
-	USBStringDescriptor_UNICODE('a'),
-	USBStringDescriptor_UNICODE('c'),
-	USBStringDescriptor_UNICODE('e'),
-	USBStringDescriptor_UNICODE(' '),
-	USBStringDescriptor_UNICODE('P'),
-	USBStringDescriptor_UNICODE('h'),
-	USBStringDescriptor_UNICODE('o'),
-	USBStringDescriptor_UNICODE('n'),
-	USBStringDescriptor_UNICODE('e'),
-};
-
-const unsigned char MITMConfigStringDescriptor[] = {
-
-	USBStringDescriptor_LENGTH(13),
-	USBGenericDescriptor_STRING,
-	USBStringDescriptor_UNICODE('S'),
-	USBStringDescriptor_UNICODE('I'),
-	USBStringDescriptor_UNICODE('M'),
-	USBStringDescriptor_UNICODE('t'),
-	USBStringDescriptor_UNICODE('r'),
-	USBStringDescriptor_UNICODE('a'),
-	USBStringDescriptor_UNICODE('c'),
-	USBStringDescriptor_UNICODE('e'),
-	USBStringDescriptor_UNICODE(' '),
-	USBStringDescriptor_UNICODE('M'),
-	USBStringDescriptor_UNICODE('I'),
-	USBStringDescriptor_UNICODE('T'),
-	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'),
-};
-
+#include "usb_strings_generated.h"
 enum strDescNum {
 	PRODUCT_STRING = 1,
 	MANUF_STR,
@@ -236,19 +55,6 @@
 	STRING_DESC_CNT
 };
 
-/** List of string descriptors used by the device */
-static const unsigned char *stringDescriptors[] = {
-	langDesc,
-	[PRODUCT_STRING] = productStringDescriptor,
-	[MANUF_STR] = manufStringDescriptor,
-	[SNIFFER_CONF_STR] = snifferConfigStringDescriptor,
-	[CCID_CONF_STR] = CCIDConfigStringDescriptor,
-	[PHONE_CONF_STR] = phoneConfigStringDescriptor,
-	[MITM_CONF_STR] = MITMConfigStringDescriptor,
-	[CARDEM_USIM1_INTF_STR] = cardem_usim1_intf_str,
-	[CARDEM_USIM2_INTF_STR] = cardem_usim2_intf_str,
-};
-
 /*------------------------------------------------------------------------------
  *       USB Device descriptors 
  *------------------------------------------------------------------------------*/
@@ -776,8 +582,8 @@
 	0,			/* No high-speed configuration descriptor */
 	0,			/* No high-speed device qualifier descriptor */
 	0,			/* No high-speed other speed configuration descriptor */
-	stringDescriptors,
-	STRING_DESC_CNT		/* cnt string descriptors in list */
+	usb_strings,
+	ARRAY_SIZE(usb_strings),/* cnt string descriptors in list */
 };
 
 /*----------------------------------------------------------------------------