From e8bdaf8004dc09576e772c96a87c03aba98600ca Mon Sep 17 00:00:00 2001 From: lucianom Date: Tue, 3 Mar 2020 22:52:36 +0000 Subject: [PATCH 1/9] Add USB string functions --- lib_xua/api/xua_endpoint0.h | 46 ++++++++++ lib_xua/src/core/endpoint0/xua_endpoint0.c | 88 ++++++++++++++++++- .../src/core/endpoint0/xua_ep0_descriptors.h | 7 +- 3 files changed, 139 insertions(+), 2 deletions(-) diff --git a/lib_xua/api/xua_endpoint0.h b/lib_xua/api/xua_endpoint0.h index c741225f..bf279c5c 100644 --- a/lib_xua/api/xua_endpoint0.h +++ b/lib_xua/api/xua_endpoint0.h @@ -40,6 +40,52 @@ void XUA_Endpoint0_setVendorId(unsigned short vid); */ void XUA_Endpoint0_setProductId(unsigned short pid); + +/** Function to set the Vendor ID value + * + * \param vid vendor ID value to set +*/ +#ifdef __XC__ +extern "C" { +#endif + void XUA_Endpoint0_setVendorStr(char* vendor_str); +#ifdef __XC__ +} +#endif + +#ifdef __XC__ +extern "C" { +#endif + void XUA_Endpoint0_setProductStr(char* product_str); +#ifdef __XC__ +} +#endif + +/** Function to set the Vendor ID value + * + * \param vid vendor ID value to set +*/ +#ifdef __XC__ +extern "C" { +#endif +char* XUA_Endpoint0_getVendorStr(); +#ifdef __XC__ +} +#endif + +/** Function to set the Product ID value + * + * \param pid Product ID value to set +*/ +#ifdef __XC__ +extern "C" { +#endif +char* XUA_Endpoint0_getProductStr(); +#ifdef __XC__ +} +#endif + + /** Function to get the Vendor ID value * * \return Vendor ID value diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index 2a183c72..bb296555 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -8,7 +8,7 @@ #include #include #include - +#include #include "xua.h" #if XUA_USB_EN @@ -217,6 +217,92 @@ void XUA_Endpoint0_setVendorId(unsigned short vid) { devDesc_Audio2.idVendor = vid; #endif // AUDIO_CLASS == 1} } +#include "print.h" +void copyCombinedStrings(char* string1, char* string2, char* string_buffer) { + uint32_t string_size = MIN(strlen(string1), MAX_STRING_SIZE); + memset(string_buffer, 0, MAX_STRING_SIZE); + memcpy(string_buffer, string1, string_size); + string_size = MIN(strlen(string1)+1, MAX_STRING_SIZE); + if (string_sizeMAX_STRING_SIZE) { + memcpy(string_buffer+strlen(string1)+1, string2, MAX_STRING_SIZE-strlen(string1)-1); + } else { + memcpy(string_buffer+strlen(string1)+1, string2, strlen(string2)); + } +} + +void XUA_Endpoint0_setVendorStr(char* vendor_str) { + uint32_t string_size = MIN(strlen(vendor_str), MAX_STRING_SIZE); + + memset(g_strTable.vendorStr, 0, MAX_STRING_SIZE); + memcpy(g_strTable.vendorStr, vendor_str, string_size); +#if (AUDIO_CLASS == 2) + copyCombinedStrings(g_strTable.clockSelectorStr, vendor_str, "Clock Selector"); + copyCombinedStrings(g_strTable.internalClockSourceStr, vendor_str, "Internal Clock"); +#endif +#if SPDIF_RX + copyCombinedStrings(g_strTable.spdifClockSourceStr, vendor_str, "S/PDIF Clock"); +#endif +#if ADAT_RX + copyCombinedStrings(g_strTable.adatClockSourceStr, vendor_str, "ADAT Clock"); +#endif +#if (XUA_DFU_EN == 1) + copyCombinedStrings(g_strTable.dfuStr, vendor_str, "DFU"); +#endif +#ifdef USB_CONTROL_DESCS + copyCombinedStrings(g_strTable.ctrlStr, vendor_str, "Control"); +#endif +#ifdef MIDI + copyCombinedStrings(g_strTable.midiOutStr, vendor_str, "MIDI Out"); + copyCombinedStrings(g_strTable.midiInStr, vendor_str, "MIDI In"); +#endif +} + +void XUA_Endpoint0_setProductStr(char* product_str) { + uint32_t string_size = MIN(strlen(product_str), MAX_STRING_SIZE); +#if (AUDIO_CLASS_FALLBACK) || (AUDIO_CLASS == 1) + memset(g_strTable.productStr_Audio1, 0, MAX_STRING_SIZE); + memset(g_strTable.outputInterfaceStr_Audio1, 0, MAX_STRING_SIZE); + memset(g_strTable.inputInterfaceStr_Audio1, 0, MAX_STRING_SIZE); + memset(g_strTable.usbInputTermStr_Audio1, 0, MAX_STRING_SIZE); + memset(g_strTable.usbOutputTermStr_Audio1, 0, MAX_STRING_SIZE); + + memcpy(g_strTable.productStr_Audio1, product_str, string_size); + memcpy(g_strTable.outputInterfaceStr_Audio1, product_str, string_size); + memcpy(g_strTable.inputInterfaceStr_Audio1, product_str, string_size); + memcpy(g_strTable.usbInputTermStr_Audio1, product_str, string_size); + memcpy(g_strTable.usbOutputTermStr_Audio1, product_str, string_size); +#elif (AUDIO_CLASS == 2) + memset(g_strTable.productStr_Audio2, 0, MAX_STRING_SIZE); + memset(g_strTable.outputInterfaceStr_Audio2, 0, MAX_STRING_SIZE); + memset(g_strTable.inputInterfaceStr_Audio2, 0, MAX_STRING_SIZE); + memset(g_strTable.usbInputTermStr_Audio2, 0, MAX_STRING_SIZE); + memset(g_strTable.usbOutputTermStr_Audio2, 0, MAX_STRING_SIZE); + + memcpy(g_strTable.productStr_Audio1, product_str, string_size); + memcpy(g_strTable.outputInterfaceStr_Audio2, product_str, string_size); + memcpy(g_strTable.inputInterfaceStr_Audio2, product_str, string_size); + memcpy(g_strTable.usbInputTermStr_Audio2, product_str, string_size); + memcpy(g_strTable.usbOutputTermStr_Audio2, product_str, string_size); +#endif +} + +char* XUA_Endpoint0_getVendorStr() { + return g_strTable.vendorStr; +} + +char* XUA_Endpoint0_getProductStr() { + #if (AUDIO_CLASS_FALLBACK) || (AUDIO_CLASS == 1) + return g_strTable.productStr_Audio1; + #elif (AUDIO_CLASS == 2) + return g_strTable.productStr_Audio2; + #endif +} void XUA_Endpoint0_setProductId(unsigned short pid) { #if (AUDIO_CLASS == 1) diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index 5e51b3dd..521bdd64 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -20,13 +20,15 @@ #include "iap2.h" /* Defines iAP EA Native Transport protocol name */ #endif +#define MAX_STRING_SIZE (32) + #define APPEND_VENDOR_STR(x) VENDOR_STR" "#x #define APPEND_PRODUCT_STR_A2(x) PRODUCT_STR_A2 " "#x #define APPEND_PRODUCT_STR_A1(x) PRODUCT_STR_A1 " "#x -#define STR_TABLE_ENTRY(name) char *name +#define STR_TABLE_ENTRY(name) char name[MAX_STRING_SIZE] #define ISO_EP_ATTRIBUTES_ASYNCH 0x05 //ISO, ASYNCH, DATA EP #define ISO_EP_ATTRIBUTES_ADAPTIVE 0x09 //ISO, ADAPTIVE, DATA EP @@ -327,6 +329,7 @@ StringDescTable_t g_strTable = .usbOutputTermStr_Audio2 = APPEND_PRODUCT_STR_A2(), #endif #if (AUDIO_CLASS_FALLBACK) || (AUDIO_CLASS == 1) + .productStr_Audio1 = PRODUCT_STR_A1, .outputInterfaceStr_Audio1 = APPEND_PRODUCT_STR_A1(), .inputInterfaceStr_Audio1 = APPEND_PRODUCT_STR_A1(), @@ -2293,6 +2296,8 @@ unsigned char cfgDesc_Null[] = * To work around this we repeat MAX_FREQ_FS multiple times in some cases */ #define MAX(a,b) (((a)>(b))?(a):(b)) +#define MIN(a,b) (((a)<(b))?(a):(b)) + const unsigned num_freqs_a1 = MAX(3, (0 #if(MIN_FREQ <= 8000) && (MAX_FREQ_FS >= 8000) + 1 From d146435d07a9eec3914bcec72dc930796edea1cf Mon Sep 17 00:00:00 2001 From: lucianom Date: Wed, 4 Mar 2020 17:10:36 +0000 Subject: [PATCH 2/9] Add XUA_Endpoint0_setStrTable() function --- lib_xua/api/xua_endpoint0.h | 21 +-- lib_xua/src/core/endpoint0/xua_endpoint0.c | 144 +++++++++--------- .../src/core/endpoint0/xua_ep0_descriptors.h | 61 ++++---- 3 files changed, 119 insertions(+), 107 deletions(-) diff --git a/lib_xua/api/xua_endpoint0.h b/lib_xua/api/xua_endpoint0.h index b33405ca..90dc0d42 100644 --- a/lib_xua/api/xua_endpoint0.h +++ b/lib_xua/api/xua_endpoint0.h @@ -41,9 +41,9 @@ void XUA_Endpoint0_setVendorId(unsigned short vid); void XUA_Endpoint0_setProductId(unsigned short pid); -/** Function to set the Vendor ID value +/** Function to set the Vendor string * - * \param vid vendor ID value to set + * \param vendor_str vendor string to set */ #ifdef __XC__ extern "C" { @@ -53,6 +53,11 @@ extern "C" { } #endif +/** Function to set the Product string + * + * \param product_str product string to set +*/ + #ifdef __XC__ extern "C" { #endif @@ -86,21 +91,17 @@ char* XUA_Endpoint0_getProductStr(); #endif -/** Function to get the Vendor ID value +/** Function to get the Vendor string * - * \return Vendor ID value + * \return Vendor string */ unsigned short XUA_Endpoint0_getVendorId(); -/** Function to get the Product ID value +/** Function to get the Product string * - * \return Product ID value + * \return Product string */ unsigned short XUA_Endpoint0_getProductId(); -unsigned short XUA_Endpoint0_getBcdDevice(); - -void XUA_Endpoint0_setBcdDevice(unsigned short bcdDevice); - #endif #endif diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index 520fb91c..a6c9aae0 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -11,7 +11,7 @@ #include #include "xua.h" -#if XUA_USB_EN +#if XUA_USB_EN #include "xud_device.h" /* Standard descriptor requests */ #include "dfu_types.h" #include "usbaudio20.h" /* Defines from USB Audio 2.0 spec */ @@ -28,6 +28,11 @@ #if DSD_CHANS_DAC > 0 #include "dsd_support.h" #endif +#define DEBUG_UNIT XUA_EP0 +#ifndef DEBUG_PRINT_ENABLE_XUA_EP0 + #define DEBUG_PRINT_ENABLE_XUA_EP0 1 +#endif // DEBUG_PRINT_ENABLE_XUA_EP0 +#include "debug_print.h" #include "xua_usb_params_funcs.h" @@ -217,79 +222,74 @@ void XUA_Endpoint0_setVendorId(unsigned short vid) { devDesc_Audio2.idVendor = vid; #endif // AUDIO_CLASS == 1} } -#include "print.h" -void copyCombinedStrings(char* string1, char* string2, char* string_buffer) { - uint32_t string_size = MIN(strlen(string1), MAX_STRING_SIZE); - memset(string_buffer, 0, MAX_STRING_SIZE); +void concatenateAndCopyStrings(char* string1, char* string2, char* string_buffer) { + uint32_t string_size = MIN(strlen(string1), XUA_MAX_STR_LEN-1); + + memset(string_buffer, 0, XUA_MAX_STR_LEN); memcpy(string_buffer, string1, string_size); - string_size = MIN(strlen(string1)+1, MAX_STRING_SIZE); - if (string_sizeMAX_STRING_SIZE) { - memcpy(string_buffer+strlen(string1)+1, string2, MAX_STRING_SIZE-strlen(string1)-1); + uint32_t total_string_size = MIN(strlen(string1)+strlen(string2), XUA_MAX_STR_LEN-1); + if (total_string_size==XUA_MAX_STR_LEN-1) { + string_size = XUA_MAX_STR_LEN-1-strlen(string1); } else { - memcpy(string_buffer+strlen(string1)+1, string2, strlen(string2)); + string_size = strlen(string1); } + memcpy(string_buffer+strlen(string1), string2, string_size); + string_buffer[total_string_size] = '\0'; +} + +void XUA_Endpoint0_setStrTable() { + // update Vendor string + concatenateAndCopyStrings(g_vendor_str, "", g_strTable.vendorStr); +#if (AUDIO_CLASS == 2) + concatenateAndCopyStrings(g_vendor_str, " Clock Selector", g_strTable.clockSelectorStr); + concatenateAndCopyStrings(g_vendor_str, " Internal Clock", g_strTable.internalClockSourceStr); +#endif +#if SPDIF_RX + concatenateAndCopyStrings(g_vendor_str, " S/PDIF Clock", g_strTable.spdifClockSourceStr); +#endif +#if ADAT_RX + concatenateAndCopyStrings(g_vendor_str, " ADAT Clock", g_strTable.adatClockSourceStr); +#endif +#if (XUA_DFU_EN == 1) + concatenateAndCopyStrings(g_vendor_str, " DFU", g_strTable.dfuStr); +#endif +#ifdef USB_CONTROL_DESCS + concatenateAndCopyStrings(g_vendor_str, " Control", g_strTable.ctrlStr); +#endif +#ifdef MIDI + concatenateAndCopyStrings(g_vendor_str, " MIDI Out", g_strTable.midiOutStr); + concatenateAndCopyStrings(g_vendor_str, " MIDI In", g_strTable.midiInStr); +#endif + // update product string +#if (AUDIO_CLASS_FALLBACK) || (AUDIO_CLASS == 1) + concatenateAndCopyStrings(g_product_str, "", g_strTable.productStr_Audio1); + concatenateAndCopyStrings(g_product_str, "", g_strTable.outputInterfaceStr_Audio1); + concatenateAndCopyStrings(g_product_str, "", g_strTable.inputInterfaceStr_Audio1); + concatenateAndCopyStrings(g_product_str, "", g_strTable.usbInputTermStr_Audio1); + concatenateAndCopyStrings(g_product_str, "", g_strTable.usbOutputTermStr_Audio1); +#elif (AUDIO_CLASS == 2) + concatenateAndCopyStrings(g_product_str, "", g_strTable.productStr_Audio2); + concatenateAndCopyStrings(g_product_str, "", g_strTable.outputInterfaceStr_Audio2); + concatenateAndCopyStrings(g_product_str, "", g_strTable.inputInterfaceStr_Audio2); + concatenateAndCopyStrings(g_product_str, "", g_strTable.usbInputTermStr_Audio2); + concatenateAndCopyStrings(g_product_str, "", g_strTable.usbOutputTermStr_Audio2); +#endif } void XUA_Endpoint0_setVendorStr(char* vendor_str) { - uint32_t string_size = MIN(strlen(vendor_str), MAX_STRING_SIZE); - - memset(g_strTable.vendorStr, 0, MAX_STRING_SIZE); - memcpy(g_strTable.vendorStr, vendor_str, string_size); -#if (AUDIO_CLASS == 2) - copyCombinedStrings(g_strTable.clockSelectorStr, vendor_str, "Clock Selector"); - copyCombinedStrings(g_strTable.internalClockSourceStr, vendor_str, "Internal Clock"); -#endif -#if SPDIF_RX - copyCombinedStrings(g_strTable.spdifClockSourceStr, vendor_str, "S/PDIF Clock"); -#endif -#if ADAT_RX - copyCombinedStrings(g_strTable.adatClockSourceStr, vendor_str, "ADAT Clock"); -#endif -#if (XUA_DFU_EN == 1) - copyCombinedStrings(g_strTable.dfuStr, vendor_str, "DFU"); -#endif -#ifdef USB_CONTROL_DESCS - copyCombinedStrings(g_strTable.ctrlStr, vendor_str, "Control"); -#endif -#ifdef MIDI - copyCombinedStrings(g_strTable.midiOutStr, vendor_str, "MIDI Out"); - copyCombinedStrings(g_strTable.midiInStr, vendor_str, "MIDI In"); -#endif + debug_printf("XUA_Endpoint0_setVendorStr() with string %s", vendor_str); + concatenateAndCopyStrings(vendor_str, "", g_vendor_str); } void XUA_Endpoint0_setProductStr(char* product_str) { - uint32_t string_size = MIN(strlen(product_str), MAX_STRING_SIZE); -#if (AUDIO_CLASS_FALLBACK) || (AUDIO_CLASS == 1) - memset(g_strTable.productStr_Audio1, 0, MAX_STRING_SIZE); - memset(g_strTable.outputInterfaceStr_Audio1, 0, MAX_STRING_SIZE); - memset(g_strTable.inputInterfaceStr_Audio1, 0, MAX_STRING_SIZE); - memset(g_strTable.usbInputTermStr_Audio1, 0, MAX_STRING_SIZE); - memset(g_strTable.usbOutputTermStr_Audio1, 0, MAX_STRING_SIZE); - - memcpy(g_strTable.productStr_Audio1, product_str, string_size); - memcpy(g_strTable.outputInterfaceStr_Audio1, product_str, string_size); - memcpy(g_strTable.inputInterfaceStr_Audio1, product_str, string_size); - memcpy(g_strTable.usbInputTermStr_Audio1, product_str, string_size); - memcpy(g_strTable.usbOutputTermStr_Audio1, product_str, string_size); -#elif (AUDIO_CLASS == 2) - memset(g_strTable.productStr_Audio2, 0, MAX_STRING_SIZE); - memset(g_strTable.outputInterfaceStr_Audio2, 0, MAX_STRING_SIZE); - memset(g_strTable.inputInterfaceStr_Audio2, 0, MAX_STRING_SIZE); - memset(g_strTable.usbInputTermStr_Audio2, 0, MAX_STRING_SIZE); - memset(g_strTable.usbOutputTermStr_Audio2, 0, MAX_STRING_SIZE); - - memcpy(g_strTable.productStr_Audio1, product_str, string_size); - memcpy(g_strTable.outputInterfaceStr_Audio2, product_str, string_size); - memcpy(g_strTable.inputInterfaceStr_Audio2, product_str, string_size); - memcpy(g_strTable.usbInputTermStr_Audio2, product_str, string_size); - memcpy(g_strTable.usbOutputTermStr_Audio2, product_str, string_size); -#endif + debug_printf("XUA_Endpoint0_setProductStr() with string %s", product_str); + concatenateAndCopyStrings(product_str, "", g_product_str); } char* XUA_Endpoint0_getVendorStr() { @@ -300,7 +300,7 @@ char* XUA_Endpoint0_getProductStr() { #if (AUDIO_CLASS_FALLBACK) || (AUDIO_CLASS == 1) return g_strTable.productStr_Audio1; #elif (AUDIO_CLASS == 2) - return g_strTable.productStr_Audio2; + return g_strTable.productStr_Audio2; #endif } @@ -356,6 +356,8 @@ void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioCont ep0_out = XUD_InitEp(c_ep0_out); ep0_in = XUD_InitEp(c_ep0_in); + XUA_Endpoint0_setStrTable(); + #if 0 /* Dont need to init globals.. */ /* Init tables for volumes (+ 1 for master) */ @@ -447,10 +449,10 @@ void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioCont cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = get_device_to_usb_bit_res() >> 3; //sub frame rate = bit rate /8 cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (get_device_to_usb_bit_res() & 0xff); //bit resolution - + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = get_usb_to_device_bit_res() >> 3; //sub frame rate = bit rate /8 cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (get_usb_to_device_bit_res() & 0xff); //bit resolution - + const unsigned num_of_usb_descriptor_freq=3; //This should be =3 according to the comments "using a value of <=2 or > 7 for num_freqs_a1 causes enumeration issues on Windows" in xua_ep0_descriptors.h int i=0; for(i=0;i> 8; cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (get_device_to_usb_rate() & 0xff0000)>> 16; } - + for(i=0;i> 8; cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (get_usb_to_device_rate() & 0xff0000)>> 16; } - + cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((get_device_to_usb_bit_res() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff; //max packet size cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((get_device_to_usb_bit_res() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff00) >> 8; //max packet size - + cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((get_usb_to_device_bit_res() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff; //max packet size cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((get_usb_to_device_bit_res() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff00) >> 8; //max packet size - + #endif } @@ -856,7 +858,7 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0 if(result == XUD_RES_ERR) { -#if (XUA_DFU_EN == 1) +#if (XUA_DFU_EN == 1) if (!DFU_mode_active) { #endif diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index 521bdd64..a6c621b7 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -20,15 +20,18 @@ #include "iap2.h" /* Defines iAP EA Native Transport protocol name */ #endif -#define MAX_STRING_SIZE (32) - #define APPEND_VENDOR_STR(x) VENDOR_STR" "#x #define APPEND_PRODUCT_STR_A2(x) PRODUCT_STR_A2 " "#x #define APPEND_PRODUCT_STR_A1(x) PRODUCT_STR_A1 " "#x -#define STR_TABLE_ENTRY(name) char name[MAX_STRING_SIZE] +#define STR_TABLE_ENTRY(name) char * name + +// XUA_DESCR_EMPTY_STRING is used in the g_strTable to set the maximum size of the table entries +#define XUA_DESCR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +// The value below must match the length of XUA_DESCR_EMPTY_STRING. +#define XUA_MAX_STR_LEN (32) #define ISO_EP_ATTRIBUTES_ASYNCH 0x05 //ISO, ASYNCH, DATA EP #define ISO_EP_ATTRIBUTES_ADAPTIVE 0x09 //ISO, ADAPTIVE, DATA EP @@ -319,42 +322,42 @@ typedef struct StringDescTable_t g_strTable = { .langID = "\x09\x04", /* US English */ - .vendorStr = VENDOR_STR, + .vendorStr = XUA_DESCR_EMPTY_STRING,//VENDOR_STR, .serialStr = "", #if (AUDIO_CLASS == 2) - .productStr_Audio2 = PRODUCT_STR_A2, - .outputInterfaceStr_Audio2 = APPEND_PRODUCT_STR_A2(), - .inputInterfaceStr_Audio2 = APPEND_PRODUCT_STR_A2(), - .usbInputTermStr_Audio2 = APPEND_PRODUCT_STR_A2(), - .usbOutputTermStr_Audio2 = APPEND_PRODUCT_STR_A2(), + .productStr_Audio2 = XUA_DESCR_EMPTY_STRING, + .outputInterfaceStr_Audio2 = XUA_DESCR_EMPTY_STRING, + .inputInterfaceStr_Audio2 = XUA_DESCR_EMPTY_STRING, + .usbInputTermStr_Audio2 = XUA_DESCR_EMPTY_STRING, + .usbOutputTermStr_Audio2 = XUA_DESCR_EMPTY_STRING, #endif #if (AUDIO_CLASS_FALLBACK) || (AUDIO_CLASS == 1) - - .productStr_Audio1 = PRODUCT_STR_A1, - .outputInterfaceStr_Audio1 = APPEND_PRODUCT_STR_A1(), - .inputInterfaceStr_Audio1 = APPEND_PRODUCT_STR_A1(), - .usbInputTermStr_Audio1 = APPEND_PRODUCT_STR_A1(), - .usbOutputTermStr_Audio1 = APPEND_PRODUCT_STR_A1(), + + .productStr_Audio1 = XUA_DESCR_EMPTY_STRING, + .outputInterfaceStr_Audio1 = XUA_DESCR_EMPTY_STRING, + .inputInterfaceStr_Audio1 = XUA_DESCR_EMPTY_STRING, + .usbInputTermStr_Audio1 = XUA_DESCR_EMPTY_STRING, + .usbOutputTermStr_Audio1 = XUA_DESCR_EMPTY_STRING, #endif #if (AUDIO_CLASS == 2) - .clockSelectorStr = APPEND_VENDOR_STR(Clock Selector), - .internalClockSourceStr = APPEND_VENDOR_STR(Internal Clock), + .clockSelectorStr = XUA_DESCR_EMPTY_STRING, + .internalClockSourceStr = XUA_DESCR_EMPTY_STRING, #if SPDIF_RX - .spdifClockSourceStr = APPEND_VENDOR_STR(S/PDIF Clock), + .spdifClockSourceStr = XUA_DESCR_EMPTY_STRING, #endif #if ADAT_RX - .adatClockSourceStr = APPEND_VENDOR_STR(ADAT Clock), + .adatClockSourceStr = XUA_DESCR_EMPTY_STRING, #endif #endif #if (XUA_DFU_EN == 1) - .dfuStr = APPEND_VENDOR_STR(DFU), + .dfuStr = XUA_DESCR_EMPTY_STRING, #endif #ifdef USB_CONTROL_DESCS - .ctrlStr = APPEND_VENDOR_STR(Control), + .ctrlStr = XUA_DESCR_EMPTY_STRING, #endif #ifdef MIDI - .midiOutStr = APPEND_VENDOR_STR(MIDI Out), - .midiInStr = APPEND_VENDOR_STR(MIDI In), + .midiOutStr = XUA_DESCR_EMPTY_STRING, + .midiInStr = XUA_DESCR_EMPTY_STRING, #endif #include "chanstrings.h" @@ -401,6 +404,12 @@ StringDescTable_t g_strTable = .iAP_EANativeTransport_InterfaceStr = IAP2_EA_NATIVE_TRANS_PROTOCOL_NAME, #endif }; +char g_vendor_str[XUA_MAX_STR_LEN] = VENDOR_STR; +#if (AUDIO_CLASS == 2) +char g_product_str[XUA_MAX_STR_LEN] = PRODUCT_STR_A2; +#else +char g_product_str[XUA_MAX_STR_LEN] = PRODUCT_STR_A1; +#endif /***** Device Descriptors *****/ @@ -2378,13 +2387,13 @@ const unsigned num_freqs_a1 = MAX(3, (0 #define AS_FORMAT_TYPE_BYTES (17) #define USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME (18 + AC_TOTAL_LENGTH + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (2*INTERFACE_DESCRIPTOR_BYTES) + (AS_INTERFACE_BYTES) + 5) #define USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME (18 + AC_TOTAL_LENGTH + (2*INTERFACE_DESCRIPTOR_BYTES) + (AS_INTERFACE_BYTES) + 5) - + #define USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ (18 + AC_TOTAL_LENGTH + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (2*INTERFACE_DESCRIPTOR_BYTES) + (AS_INTERFACE_BYTES) + 8) #define USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ (18 + AC_TOTAL_LENGTH + (2*INTERFACE_DESCRIPTOR_BYTES) + (AS_INTERFACE_BYTES) + 8) - + #define USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE (18 + AC_TOTAL_LENGTH + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (2*INTERFACE_DESCRIPTOR_BYTES) + (AS_INTERFACE_BYTES) + (AS_FORMAT_TYPE_BYTES) + 4) #define USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE (18 + AC_TOTAL_LENGTH + (2*INTERFACE_DESCRIPTOR_BYTES) + (AS_INTERFACE_BYTES) + (AS_FORMAT_TYPE_BYTES) + 4) - + #endif #define CHARIFY_SR(x) (x & 0xff),((x & 0xff00)>> 8),((x & 0xff0000)>> 16) From b5d2aae3d62498332a76efefc6821e9743a03f64 Mon Sep 17 00:00:00 2001 From: lucianom Date: Wed, 4 Mar 2020 17:12:13 +0000 Subject: [PATCH 3/9] Update entry --- CHANGELOG.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c2862994..3276eada 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -20,7 +20,7 @@ lib_xua Change Log * CHANGE HID report descriptor to use generic events instead of GPI events, to report Key-phrase detection as AC Search, and to report end-call detection as AC Stop - * ADDED: Ability to read or modify vendor and product IDs + * ADDED: Ability to read or modify vendor and product IDs and strings * ADDED: Ability to read or modify bcdDevice * ADDED: Override USB descriptor with sampling frequency and bit-resolution set at boot time. From 3f2d0eb6f79ce2ed9ab2fbf60749b44947c0cdbd Mon Sep 17 00:00:00 2001 From: lucianom Date: Wed, 4 Mar 2020 17:16:35 +0000 Subject: [PATCH 4/9] Move global variables --- lib_xua/src/core/endpoint0/xua_endpoint0.c | 12 ++++++++++-- lib_xua/src/core/endpoint0/xua_ep0_descriptors.h | 6 ------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index a6c9aae0..63290cb8 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -107,6 +107,13 @@ unsigned g_curStreamAlt_In = 0; /* Global variable for current USB bus speed (i.e. FS/HS) */ XUD_BusSpeed_t g_curUsbSpeed = 0; +/* Global variables for current USB Vendor and Product strings */ +char g_vendor_str[XUA_MAX_STR_LEN] = VENDOR_STR; +#if (AUDIO_CLASS == 2) +char g_product_str[XUA_MAX_STR_LEN] = PRODUCT_STR_A2; +#else +char g_product_str[XUA_MAX_STR_LEN] = PRODUCT_STR_A1; +#endif /* Subslot */ const unsigned g_subSlot_Out_HS[OUTPUT_FORMAT_COUNT] = {HS_STREAM_FORMAT_OUTPUT_1_SUBSLOT_BYTES, @@ -222,6 +229,7 @@ void XUA_Endpoint0_setVendorId(unsigned short vid) { devDesc_Audio2.idVendor = vid; #endif // AUDIO_CLASS == 1} } + void concatenateAndCopyStrings(char* string1, char* string2, char* string_buffer) { uint32_t string_size = MIN(strlen(string1), XUA_MAX_STR_LEN-1); @@ -244,7 +252,7 @@ void concatenateAndCopyStrings(char* string1, char* string2, char* string_buffer } void XUA_Endpoint0_setStrTable() { - // update Vendor string + // update Vendor strings concatenateAndCopyStrings(g_vendor_str, "", g_strTable.vendorStr); #if (AUDIO_CLASS == 2) concatenateAndCopyStrings(g_vendor_str, " Clock Selector", g_strTable.clockSelectorStr); @@ -266,7 +274,7 @@ void XUA_Endpoint0_setStrTable() { concatenateAndCopyStrings(g_vendor_str, " MIDI Out", g_strTable.midiOutStr); concatenateAndCopyStrings(g_vendor_str, " MIDI In", g_strTable.midiInStr); #endif - // update product string + // update product strings #if (AUDIO_CLASS_FALLBACK) || (AUDIO_CLASS == 1) concatenateAndCopyStrings(g_product_str, "", g_strTable.productStr_Audio1); concatenateAndCopyStrings(g_product_str, "", g_strTable.outputInterfaceStr_Audio1); diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index a6c621b7..34ace801 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -404,12 +404,6 @@ StringDescTable_t g_strTable = .iAP_EANativeTransport_InterfaceStr = IAP2_EA_NATIVE_TRANS_PROTOCOL_NAME, #endif }; -char g_vendor_str[XUA_MAX_STR_LEN] = VENDOR_STR; -#if (AUDIO_CLASS == 2) -char g_product_str[XUA_MAX_STR_LEN] = PRODUCT_STR_A2; -#else -char g_product_str[XUA_MAX_STR_LEN] = PRODUCT_STR_A1; -#endif /***** Device Descriptors *****/ From ee1feb6c4817de849fc8c5cdf3ef73c2abeacf91 Mon Sep 17 00:00:00 2001 From: lucianom Date: Wed, 4 Mar 2020 17:51:03 +0000 Subject: [PATCH 5/9] Use unsafe pointers --- lib_xua/api/xua_endpoint0.h | 63 ++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/lib_xua/api/xua_endpoint0.h b/lib_xua/api/xua_endpoint0.h index 90dc0d42..60f68bf3 100644 --- a/lib_xua/api/xua_endpoint0.h +++ b/lib_xua/api/xua_endpoint0.h @@ -43,53 +43,52 @@ void XUA_Endpoint0_setProductId(unsigned short pid); /** Function to set the Vendor string * - * \param vendor_str vendor string to set + * \param vendor_str Vendor string to set */ #ifdef __XC__ -extern "C" { -#endif - void XUA_Endpoint0_setVendorStr(char* vendor_str); -#ifdef __XC__ -} +void XUA_Endpoint0_setVendorStr(char * unsafe vendor_str); +#else +void XUA_Endpoint0_setVendorStr(char * vendor_str); #endif /** Function to set the Product string * - * \param product_str product string to set + * \param product_str Product string to set */ #ifdef __XC__ -extern "C" { -#endif - void XUA_Endpoint0_setProductStr(char* product_str); -#ifdef __XC__ -} +void XUA_Endpoint0_setProductStr(char * unsafe product_str); +#else +void XUA_Endpoint0_setProductStr(char * product_str); #endif -/** Function to set the Vendor ID value +/** Function to set the BCD device * - * \param vid vendor ID value to set -*/ -#ifdef __XC__ -extern "C" { -#endif -char* XUA_Endpoint0_getVendorStr(); -#ifdef __XC__ -} -#endif + * \param bcdDevice BCD device to set -/** Function to set the Product ID value +*/ + +void XUA_Endpoint0_setBcdDevice(unsigned short bcdDevice); + +/** Function to get the Vendor string * - * \param pid Product ID value to set + * \param vid vendor string */ #ifdef __XC__ -extern "C" { -#endif -char* XUA_Endpoint0_getProductStr(); -#ifdef __XC__ -} +char * unsafe XUA_Endpoint0_getVendorStr(); +#else +char * XUA_Endpoint0_getVendorStr(; #endif +/** Function to get the Product string + * + * \param pid Product string +*/ +#ifdef __XC__ +char * unsafe XUA_Endpoint0_getProductStr(); +#else +char * XUA_Endpoint0_getProductStr(; +#endif /** Function to get the Vendor string * @@ -103,5 +102,11 @@ unsigned short XUA_Endpoint0_getVendorId(); */ unsigned short XUA_Endpoint0_getProductId(); +/** Function to get the BCD device + * + * \return BCD device +*/ +unsigned short XUA_Endpoint0_getBcdDevice(); + #endif #endif From 09a81f5c1fadb986aeb6356529c71305c4cc131c Mon Sep 17 00:00:00 2001 From: lucianom Date: Wed, 4 Mar 2020 21:53:49 +0000 Subject: [PATCH 6/9] Use standard functions and different empty strings --- lib_xua/src/core/endpoint0/xua_endpoint0.c | 19 ++----- .../src/core/endpoint0/xua_ep0_descriptors.h | 56 ++++++++++++------- 2 files changed, 40 insertions(+), 35 deletions(-) diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index 63290cb8..ee23714d 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -231,24 +231,15 @@ void XUA_Endpoint0_setVendorId(unsigned short vid) { } void concatenateAndCopyStrings(char* string1, char* string2, char* string_buffer) { - uint32_t string_size = MIN(strlen(string1), XUA_MAX_STR_LEN-1); - - memset(string_buffer, 0, XUA_MAX_STR_LEN); - memcpy(string_buffer, string1, string_size); - - - if (string_size==XUA_MAX_STR_LEN-1) { - string_buffer[XUA_MAX_STR_LEN-1] = '\0'; - return; - } + uint32_t remaining_buffer_size = MIN(strlen(string1), XUA_MAX_STR_LEN-1); + strncpy(string_buffer, string1, remaining_buffer_size); uint32_t total_string_size = MIN(strlen(string1)+strlen(string2), XUA_MAX_STR_LEN-1); if (total_string_size==XUA_MAX_STR_LEN-1) { - string_size = XUA_MAX_STR_LEN-1-strlen(string1); + remaining_buffer_size = XUA_MAX_STR_LEN-1-strlen(string1); } else { - string_size = strlen(string1); + remaining_buffer_size = strlen(string1); } - memcpy(string_buffer+strlen(string1), string2, string_size); - string_buffer[total_string_size] = '\0'; + strncat(string_buffer, string2, remaining_buffer_size); } void XUA_Endpoint0_setStrTable() { diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index 34ace801..9dcbe989 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -28,8 +28,22 @@ #define STR_TABLE_ENTRY(name) char * name -// XUA_DESCR_EMPTY_STRING is used in the g_strTable to set the maximum size of the table entries -#define XUA_DESCR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +// The empty strings below are used in the g_strTable to set the maximum size of the table entries +#define XUA_VENDOR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +#define XUA_PRODUCT_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +#define XUA_OUTPUT_INTERFACE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +#define XUA_INPUT_INTERFACE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +#define XUA_INPUT_TERM_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +#define XUA_OUTPUT_TERM_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +#define XUA_CLOCK_SELECTOR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +#define XUA_INTERNAL_CLOCK_SELECTOR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +#define XUA_SPDIF_CLOCK_SOURCE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +#define XUA_ADAT_CLOCK_SOURCE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +#define XUA_DFU_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +#define XUA_CTRL_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +#define XUA_MIDI_OUT_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +#define XUA_MIDI_IN_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + // The value below must match the length of XUA_DESCR_EMPTY_STRING. #define XUA_MAX_STR_LEN (32) @@ -322,42 +336,42 @@ typedef struct StringDescTable_t g_strTable = { .langID = "\x09\x04", /* US English */ - .vendorStr = XUA_DESCR_EMPTY_STRING,//VENDOR_STR, + .vendorStr = XUA_VENDOR_EMPTY_STRING, .serialStr = "", #if (AUDIO_CLASS == 2) - .productStr_Audio2 = XUA_DESCR_EMPTY_STRING, - .outputInterfaceStr_Audio2 = XUA_DESCR_EMPTY_STRING, - .inputInterfaceStr_Audio2 = XUA_DESCR_EMPTY_STRING, - .usbInputTermStr_Audio2 = XUA_DESCR_EMPTY_STRING, - .usbOutputTermStr_Audio2 = XUA_DESCR_EMPTY_STRING, + .productStr_Audio2 = XUA_PRODUCT_EMPTY_STRING, + .outputInterfaceStr_Audio2 = XUA_OUTPUT_INTERFACE_EMPTY_STRING, + .inputInterfaceStr_Audio2 = XUA_INPUT_INTERFACE_EMPTY_STRING, + .usbInputTermStr_Audio2 = XUA_INPUT_TERM_EMPTY_STRING, + .usbOutputTermStr_Audio2 = XUA_OUTPUT_TERM_EMPTY_STRING, #endif #if (AUDIO_CLASS_FALLBACK) || (AUDIO_CLASS == 1) - .productStr_Audio1 = XUA_DESCR_EMPTY_STRING, - .outputInterfaceStr_Audio1 = XUA_DESCR_EMPTY_STRING, - .inputInterfaceStr_Audio1 = XUA_DESCR_EMPTY_STRING, - .usbInputTermStr_Audio1 = XUA_DESCR_EMPTY_STRING, - .usbOutputTermStr_Audio1 = XUA_DESCR_EMPTY_STRING, + .productStr_Audio1 = XUA_PRODUCT_EMPTY_STRING, + .outputInterfaceStr_Audio1 = XUA_OUTPUT_INTERFACE_EMPTY_STRING, + .inputInterfaceStr_Audio1 = XUA_INPUT_INTERFACE_EMPTY_STRING, + .usbInputTermStr_Audio1 = XUA_INPUT_TERM_EMPTY_STRING, + .usbOutputTermStr_Audio1 = XUA_OUTPUT_TERM_EMPTY_STRING, #endif #if (AUDIO_CLASS == 2) - .clockSelectorStr = XUA_DESCR_EMPTY_STRING, - .internalClockSourceStr = XUA_DESCR_EMPTY_STRING, + .clockSelectorStr = XUA_CLOCK_SELECTOR_EMPTY_STRING, + .internalClockSourceStr = XUA_INTERNAL_CLOCK_SELECTOR_EMPTY_STRING, #if SPDIF_RX - .spdifClockSourceStr = XUA_DESCR_EMPTY_STRING, + .spdifClockSourceStr = XUA_SPDIF_CLOCK_SOURCE_EMPTY_STRING, #endif #if ADAT_RX - .adatClockSourceStr = XUA_DESCR_EMPTY_STRING, + .adatClockSourceStr = XUA_ADAT_CLOCK_SOURCE_EMPTY_STRING, #endif #endif #if (XUA_DFU_EN == 1) - .dfuStr = XUA_DESCR_EMPTY_STRING, + .dfuStr = XUA_DFU_EMPTY_STRING, #endif #ifdef USB_CONTROL_DESCS - .ctrlStr = XUA_DESCR_EMPTY_STRING, + .ctrlStr = XUA_CTRL_EMPTY_STRING, #endif #ifdef MIDI - .midiOutStr = XUA_DESCR_EMPTY_STRING, - .midiInStr = XUA_DESCR_EMPTY_STRING, + .midiOutStr = XUA_MIDI_OUT_EMPTY_STRING, + .midiInStr = XUA_MIDI_IN_EMPTY_STRING, #endif #include "chanstrings.h" From c786b846d0325c4f091752620e356055b39b8a5f Mon Sep 17 00:00:00 2001 From: lucianom Date: Wed, 4 Mar 2020 22:05:36 +0000 Subject: [PATCH 7/9] Define MIN if not defined --- lib_xua/src/core/endpoint0/xua_endpoint0.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index ee23714d..966f6321 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -71,6 +71,9 @@ extern void device_reboot(void); #if( 0 < HID_CONTROLS ) #include "xua_hid.h" #endif +#ifndef MIN +#define MIN(a,b) (((a)<(b))?(a):(b)) +#endif unsigned int DFU_mode_active = 0; // 0 - App active, 1 - DFU active From 5fd34acab5968fe24d448cc4d4d3409eadbe10b0 Mon Sep 17 00:00:00 2001 From: lucianom Date: Thu, 5 Mar 2020 09:14:03 +0000 Subject: [PATCH 8/9] Allocate separate strings and fix descriptions --- lib_xua/src/core/endpoint0/xua_endpoint0.c | 2 +- .../src/core/endpoint0/xua_ep0_descriptors.h | 40 +++++++++---------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index 966f6321..ef03874e 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -30,7 +30,7 @@ #endif #define DEBUG_UNIT XUA_EP0 #ifndef DEBUG_PRINT_ENABLE_XUA_EP0 - #define DEBUG_PRINT_ENABLE_XUA_EP0 1 + #define DEBUG_PRINT_ENABLE_XUA_EP0 0 #endif // DEBUG_PRINT_ENABLE_XUA_EP0 #include "debug_print.h" diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index 9dcbe989..11554960 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -29,20 +29,16 @@ #define STR_TABLE_ENTRY(name) char * name // The empty strings below are used in the g_strTable to set the maximum size of the table entries -#define XUA_VENDOR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" -#define XUA_PRODUCT_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" -#define XUA_OUTPUT_INTERFACE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" -#define XUA_INPUT_INTERFACE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" -#define XUA_INPUT_TERM_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" -#define XUA_OUTPUT_TERM_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" -#define XUA_CLOCK_SELECTOR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" -#define XUA_INTERNAL_CLOCK_SELECTOR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" -#define XUA_SPDIF_CLOCK_SOURCE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" -#define XUA_ADAT_CLOCK_SOURCE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" -#define XUA_DFU_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" -#define XUA_CTRL_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" -#define XUA_MIDI_OUT_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" -#define XUA_MIDI_IN_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +// The last char of the strings are different, so that the compiler allocates separate memory spaces +#define XUA_VENDOR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\01" +#define XUA_PRODUCT_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\02" +#define XUA_INTERNAL_CLOCK_SELECTOR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\03" +#define XUA_SPDIF_CLOCK_SOURCE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\04" +#define XUA_ADAT_CLOCK_SOURCE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\05" +#define XUA_DFU_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\06" +#define XUA_CTRL_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\07" +#define XUA_MIDI_OUT_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08" +#define XUA_MIDI_IN_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\09" // The value below must match the length of XUA_DESCR_EMPTY_STRING. #define XUA_MAX_STR_LEN (32) @@ -340,18 +336,18 @@ StringDescTable_t g_strTable = .serialStr = "", #if (AUDIO_CLASS == 2) .productStr_Audio2 = XUA_PRODUCT_EMPTY_STRING, - .outputInterfaceStr_Audio2 = XUA_OUTPUT_INTERFACE_EMPTY_STRING, - .inputInterfaceStr_Audio2 = XUA_INPUT_INTERFACE_EMPTY_STRING, - .usbInputTermStr_Audio2 = XUA_INPUT_TERM_EMPTY_STRING, - .usbOutputTermStr_Audio2 = XUA_OUTPUT_TERM_EMPTY_STRING, + .outputInterfaceStr_Audio2 = XUA_PRODUCT_EMPTY_STRING, + .inputInterfaceStr_Audio2 = XUA_PRODUCT_EMPTY_STRING, + .usbInputTermStr_Audio2 = XUA_PRODUCT_EMPTY_STRING, + .usbOutputTermStr_Audio2 = XUA_PRODUCT_EMPTY_STRING, #endif #if (AUDIO_CLASS_FALLBACK) || (AUDIO_CLASS == 1) .productStr_Audio1 = XUA_PRODUCT_EMPTY_STRING, - .outputInterfaceStr_Audio1 = XUA_OUTPUT_INTERFACE_EMPTY_STRING, - .inputInterfaceStr_Audio1 = XUA_INPUT_INTERFACE_EMPTY_STRING, - .usbInputTermStr_Audio1 = XUA_INPUT_TERM_EMPTY_STRING, - .usbOutputTermStr_Audio1 = XUA_OUTPUT_TERM_EMPTY_STRING, + .outputInterfaceStr_Audio1 = XUA_PRODUCT_EMPTY_STRING, + .inputInterfaceStr_Audio1 = XUA_PRODUCT_EMPTY_STRING, + .usbInputTermStr_Audio1 = XUA_PRODUCT_EMPTY_STRING, + .usbOutputTermStr_Audio1 = XUA_PRODUCT_EMPTY_STRING, #endif #if (AUDIO_CLASS == 2) .clockSelectorStr = XUA_CLOCK_SELECTOR_EMPTY_STRING, From 4d0de4e01a49fd259bc855003154a752695cc61e Mon Sep 17 00:00:00 2001 From: lucianom Date: Thu, 5 Mar 2020 10:15:35 +0000 Subject: [PATCH 9/9] Add missing string and memset buffers --- lib_xua/src/core/endpoint0/xua_endpoint0.c | 3 +++ lib_xua/src/core/endpoint0/xua_ep0_descriptors.h | 15 ++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index ef03874e..b773a4d3 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -234,6 +234,8 @@ void XUA_Endpoint0_setVendorId(unsigned short vid) { } void concatenateAndCopyStrings(char* string1, char* string2, char* string_buffer) { + memset(string_buffer, '\0', strlen(string_buffer)); + uint32_t remaining_buffer_size = MIN(strlen(string1), XUA_MAX_STR_LEN-1); strncpy(string_buffer, string1, remaining_buffer_size); uint32_t total_string_size = MIN(strlen(string1)+strlen(string2), XUA_MAX_STR_LEN-1); @@ -246,6 +248,7 @@ void concatenateAndCopyStrings(char* string1, char* string2, char* string_buffer } void XUA_Endpoint0_setStrTable() { + // update Vendor strings concatenateAndCopyStrings(g_vendor_str, "", g_strTable.vendorStr); #if (AUDIO_CLASS == 2) diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index 11554960..185575bb 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -32,13 +32,14 @@ // The last char of the strings are different, so that the compiler allocates separate memory spaces #define XUA_VENDOR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\01" #define XUA_PRODUCT_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\02" -#define XUA_INTERNAL_CLOCK_SELECTOR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\03" -#define XUA_SPDIF_CLOCK_SOURCE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\04" -#define XUA_ADAT_CLOCK_SOURCE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\05" -#define XUA_DFU_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\06" -#define XUA_CTRL_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\07" -#define XUA_MIDI_OUT_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08" -#define XUA_MIDI_IN_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\09" +#define XUA_CLOCK_SELECTOR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\03" +#define XUA_INTERNAL_CLOCK_SELECTOR_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\04" +#define XUA_SPDIF_CLOCK_SOURCE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\05" +#define XUA_ADAT_CLOCK_SOURCE_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\06" +#define XUA_DFU_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\07" +#define XUA_CTRL_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08" +#define XUA_MIDI_OUT_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\09" +#define XUA_MIDI_IN_EMPTY_STRING "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0a" // The value below must match the length of XUA_DESCR_EMPTY_STRING. #define XUA_MAX_STR_LEN (32)