From 3b80f63cb99c5b0bd7c51133598f2f15c24b4388 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Tue, 31 Dec 2019 10:34:32 +0800 Subject: [PATCH 01/38] modified audio output frequency as a variable --- lib_xua/api/xua_conf_default.h | 7 +++++ lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h | 3 ++ lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 29 ++++++++++--------- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index 9bfa7bbd..b22046f0 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -226,6 +226,13 @@ #define DEFAULT_FREQ (MIN_FREQ) #endif +/** + * @brief Default Audio output sampling frequency + */ +#ifndef DEFAULT_AUDOUT_FREQ +#define DEFAULT_AUDOUT_FREQ (48000) +#endif + /* Audio Class Defines */ /** diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h index ab4c613d..dae6863a 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h @@ -17,4 +17,7 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, REFERENCE_PARAM(USB_S void VendorAudioRequestsInit(chanend c_audioControl, NULLABLE_RESOURCE(chanend, c_mix_ctl), NULLABLE_RESOURCE(chanend, c_clk_ctl)); +extern unsigned int g_curAudOut_SamFreq; + + #endif diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 2fdd434c..7ae5040b 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -17,6 +17,7 @@ #ifdef MIXER #include "mixer.h" #endif +#include "xua_conf.h" #define CS_XU_MIXSEL (0x06) @@ -46,7 +47,7 @@ extern unsigned char mixSel[MAX_MIX_COUNT][MIX_INPUTS]; #endif /* Global var for current frequency, set to default freq */ -unsigned int g_curSamFreq = DEFAULT_FREQ; +unsigned int g_curAudOut_SamFreq = DEFAULT_AUDOUT_FREQ; #if 0 unsigned int g_curSamFreq48000Family = DEFAULT_FREQ % 48000 == 0; @@ -320,14 +321,14 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c int newSampleRate = buffer[0]; /* Instruct audio thread to change sample freq (if change required) */ - if(newSampleRate != g_curSamFreq) + if(newSampleRate != g_curAudOut_SamFreq) { int newMasterClock; - g_curSamFreq = newSampleRate; + g_curAudOut_SamFreq = newSampleRate; #if 0 /* Original feedback implementation */ - g_curSamFreq48000Family = ((MCLK_48 % g_curSamFreq) == 0); + g_curSamFreq48000Family = ((MCLK_48 % g_curAudOut_SamFreq) == 0); if(g_curSamFreq48000Family) { @@ -338,17 +339,17 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c newMasterClock = MCLK_441; } - setG_curSamFreqMultiplier(g_curSamFreq/(newMasterClock/512)); + setG_curSamFreqMultiplier(g_curAudOut_SamFreq/(newMasterClock/512)); #endif #if ADAT_RX /* Configure ADAT SMUX based on sample rate */ outuint(c_clk_ctl, SET_SMUX); - if(g_curSamFreq < 88200) + if(g_curAudOut_SamFreq < 88200) { /* No SMUX */ outuint(c_clk_ctl, 0); } - else if(g_curSamFreq < 176400) + else if(g_curAudOut_SamFreq < 176400) { /* SMUX */ outuint(c_clk_ctl, 1); @@ -361,7 +362,7 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c outct(c_clk_ctl, XS1_CT_END); #endif outuint(c_audioControl, SET_SAMPLE_FREQ); - outuint(c_audioControl, g_curSamFreq); + outuint(c_audioControl, g_curAudOut_SamFreq); /* Wait for handshake back - i.e. PLL locked and clocks okay */ chkct(c_audioControl, XS1_CT_END); @@ -395,7 +396,7 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c } else { - buffer[0] = g_curSamFreq; + buffer[0] = g_curAudOut_SamFreq; return XUD_DoGetRequest(ep0_out, ep0_in, (buffer, unsigned char[]), 4, sp.wLength ); } @@ -403,7 +404,7 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c #endif case ID_CLKSRC_INT: /* Always report our current operating frequency */ - buffer[0] = g_curSamFreq; + buffer[0] = g_curAudOut_SamFreq; return XUD_DoGetRequest(ep0_out, ep0_in, (buffer, unsigned char[]), 4, sp.wLength ); break; @@ -1107,7 +1108,7 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp /* Recontruct sample-freq */ int newSampleRate = (buffer, unsigned char[])[0] | ((buffer, unsigned char[])[1] << 8) | ((buffer, unsigned char[])[2] << 16); - if(newSampleRate != g_curSamFreq) + if(newSampleRate != g_curAudOut_SamFreq) { int curSamFreq44100Family; int curSamFreq48000Family; @@ -1119,11 +1120,11 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp if(curSamFreq48000Family || curSamFreq44100Family) { - g_curSamFreq = newSampleRate; + g_curAudOut_SamFreq = newSampleRate; /* Instruct audio thread to change sample freq */ outuint(c_audioControl, SET_SAMPLE_FREQ); - outuint(c_audioControl, g_curSamFreq); + outuint(c_audioControl, g_curAudOut_SamFreq); /* Wait for handshake back - i.e. pll locked and clocks okay */ chkct(c_audioControl, XS1_CT_END); @@ -1147,7 +1148,7 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp switch(sp.bRequest) { case UAC_B_REQ_GET_CUR: - buffer[0] = g_curSamFreq; + buffer[0] = g_curAudOut_SamFreq; return XUD_DoGetRequest(ep0_out, ep0_in, (buffer, unsigned char[]), 3, sp.wLength); break; } From 6b1da7610fd0ba59c316c543fdc3e1bdd423abb9 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Tue, 7 Jan 2020 15:01:54 +0800 Subject: [PATCH 02/38] revert xua_ep0_uacreqs.xc so that frequency global variable is not affected by USB command. Now frequency can be varied by changing the default value. --- lib_xua/api/xua_conf_default.h | 7 +++++ lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h | 3 -- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 29 +++++++++---------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index b22046f0..828e9682 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -231,6 +231,13 @@ */ #ifndef DEFAULT_AUDOUT_FREQ #define DEFAULT_AUDOUT_FREQ (48000) + +#define USB_IN_DESCRIPTOR_FREQ_OVERRIDE //used if USB in frequency is not conifigurable by USB endpoint command +#ifdef USB_IN_DESCRIPTOR_FREQ_OVERRIDE + #define USB_IN_FREQ_DESCIPTOR_OFFSET 161 //161- (3 * 3) are the position of descriptor that needed to be modified for USB in frequency + #define CHARIFY_SR(x) (x & 0xff),((x & 0xff00)>> 8),((x & 0xff0000)>> 16) +#endif + #endif /* Audio Class Defines */ diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h index dae6863a..ab4c613d 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h @@ -17,7 +17,4 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, REFERENCE_PARAM(USB_S void VendorAudioRequestsInit(chanend c_audioControl, NULLABLE_RESOURCE(chanend, c_mix_ctl), NULLABLE_RESOURCE(chanend, c_clk_ctl)); -extern unsigned int g_curAudOut_SamFreq; - - #endif diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 7ae5040b..2fdd434c 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -17,7 +17,6 @@ #ifdef MIXER #include "mixer.h" #endif -#include "xua_conf.h" #define CS_XU_MIXSEL (0x06) @@ -47,7 +46,7 @@ extern unsigned char mixSel[MAX_MIX_COUNT][MIX_INPUTS]; #endif /* Global var for current frequency, set to default freq */ -unsigned int g_curAudOut_SamFreq = DEFAULT_AUDOUT_FREQ; +unsigned int g_curSamFreq = DEFAULT_FREQ; #if 0 unsigned int g_curSamFreq48000Family = DEFAULT_FREQ % 48000 == 0; @@ -321,14 +320,14 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c int newSampleRate = buffer[0]; /* Instruct audio thread to change sample freq (if change required) */ - if(newSampleRate != g_curAudOut_SamFreq) + if(newSampleRate != g_curSamFreq) { int newMasterClock; - g_curAudOut_SamFreq = newSampleRate; + g_curSamFreq = newSampleRate; #if 0 /* Original feedback implementation */ - g_curSamFreq48000Family = ((MCLK_48 % g_curAudOut_SamFreq) == 0); + g_curSamFreq48000Family = ((MCLK_48 % g_curSamFreq) == 0); if(g_curSamFreq48000Family) { @@ -339,17 +338,17 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c newMasterClock = MCLK_441; } - setG_curSamFreqMultiplier(g_curAudOut_SamFreq/(newMasterClock/512)); + setG_curSamFreqMultiplier(g_curSamFreq/(newMasterClock/512)); #endif #if ADAT_RX /* Configure ADAT SMUX based on sample rate */ outuint(c_clk_ctl, SET_SMUX); - if(g_curAudOut_SamFreq < 88200) + if(g_curSamFreq < 88200) { /* No SMUX */ outuint(c_clk_ctl, 0); } - else if(g_curAudOut_SamFreq < 176400) + else if(g_curSamFreq < 176400) { /* SMUX */ outuint(c_clk_ctl, 1); @@ -362,7 +361,7 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c outct(c_clk_ctl, XS1_CT_END); #endif outuint(c_audioControl, SET_SAMPLE_FREQ); - outuint(c_audioControl, g_curAudOut_SamFreq); + outuint(c_audioControl, g_curSamFreq); /* Wait for handshake back - i.e. PLL locked and clocks okay */ chkct(c_audioControl, XS1_CT_END); @@ -396,7 +395,7 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c } else { - buffer[0] = g_curAudOut_SamFreq; + buffer[0] = g_curSamFreq; return XUD_DoGetRequest(ep0_out, ep0_in, (buffer, unsigned char[]), 4, sp.wLength ); } @@ -404,7 +403,7 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c #endif case ID_CLKSRC_INT: /* Always report our current operating frequency */ - buffer[0] = g_curAudOut_SamFreq; + buffer[0] = g_curSamFreq; return XUD_DoGetRequest(ep0_out, ep0_in, (buffer, unsigned char[]), 4, sp.wLength ); break; @@ -1108,7 +1107,7 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp /* Recontruct sample-freq */ int newSampleRate = (buffer, unsigned char[])[0] | ((buffer, unsigned char[])[1] << 8) | ((buffer, unsigned char[])[2] << 16); - if(newSampleRate != g_curAudOut_SamFreq) + if(newSampleRate != g_curSamFreq) { int curSamFreq44100Family; int curSamFreq48000Family; @@ -1120,11 +1119,11 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp if(curSamFreq48000Family || curSamFreq44100Family) { - g_curAudOut_SamFreq = newSampleRate; + g_curSamFreq = newSampleRate; /* Instruct audio thread to change sample freq */ outuint(c_audioControl, SET_SAMPLE_FREQ); - outuint(c_audioControl, g_curAudOut_SamFreq); + outuint(c_audioControl, g_curSamFreq); /* Wait for handshake back - i.e. pll locked and clocks okay */ chkct(c_audioControl, XS1_CT_END); @@ -1148,7 +1147,7 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp switch(sp.bRequest) { case UAC_B_REQ_GET_CUR: - buffer[0] = g_curAudOut_SamFreq; + buffer[0] = g_curSamFreq; return XUD_DoGetRequest(ep0_out, ep0_in, (buffer, unsigned char[]), 3, sp.wLength); break; } From 5361ef88667d907a346d6cda763bf9e506d20b65 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Tue, 7 Jan 2020 17:58:20 +0800 Subject: [PATCH 03/38] added option USB_CMD_CFG_SAMP_FREQ that allows host to conifgure sampling rate by endpoint command --- lib_xua/api/xua_conf_default.h | 27 +++++++++++++++---- .../src/core/endpoint0/xua_ep0_descriptors.h | 10 +++++++ lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 23 +++++++++++++++- 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index 828e9682..2b2a722a 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -231,13 +231,30 @@ */ #ifndef DEFAULT_AUDOUT_FREQ #define DEFAULT_AUDOUT_FREQ (48000) - -#define USB_IN_DESCRIPTOR_FREQ_OVERRIDE //used if USB in frequency is not conifigurable by USB endpoint command -#ifdef USB_IN_DESCRIPTOR_FREQ_OVERRIDE - #define USB_IN_FREQ_DESCIPTOR_OFFSET 161 //161- (3 * 3) are the position of descriptor that needed to be modified for USB in frequency - #define CHARIFY_SR(x) (x & 0xff),((x & 0xff00)>> 8),((x & 0xff0000)>> 16) #endif +#define USB_CMD_CFG_SAMP_FREQ +// Not ready yet +// #define USB_IN_CONFIGURABLE_BIT_RES +// #ifdef USB_IN_CONFIGURABLE_BIT_RES + // #define USB_IN_BIT_RES_0 STREAM_FORMAT_INPUT_1_RESOLUTION_BITS + // #define USB_IN_BIT_RES_1 STREAM_FORMAT_INPUT_1_RESOLUTION_BITS//24 +// #endif + +#ifdef USB_CMD_CFG_SAMP_FREQ + #define USB_IN_SAMP_FREQ_NUM 3 + #define USB_IN_SAMP_FREQ_0 DEFAULT_AUDOUT_FREQ + #define USB_IN_SAMP_FREQ_1 16000 + #define USB_IN_SAMP_FREQ_2 16000 + + #if (USB_IN_SAMP_FREQ_NUM < 3) + #error "USB_IN_SAMP_FREQ_NUM must be >=3" + #endif +#else + #define USB_IN_DESCRIPTOR_FREQ_OVERRIDE //used if USB in frequency is not conifigurable by USB endpoint command + #ifdef USB_IN_DESCRIPTOR_FREQ_OVERRIDE + #define USB_IN_FREQ_DESCIPTOR_OFFSET 161 //161- (3 * 3) are the position of descriptor that needed to be modified for USB in frequency + #endif #endif /* Audio Class Defines */ diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index fcc1e45b..bcb2178e 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -20,6 +20,8 @@ #include "iap2.h" /* Defines iAP EA Native Transport protocol name */ #endif +#include "xua_conf_default.h" + #define APPEND_VENDOR_STR(x) VENDOR_STR" "#x #define APPEND_PRODUCT_STR_A2(x) PRODUCT_STR_A2 " "#x @@ -2738,6 +2740,13 @@ unsigned char cfgDesc_Audio1[] = NUM_USB_CHAN_IN_FS, /* bNrChannels - Typically 2 */ FS_STREAM_FORMAT_INPUT_1_SUBSLOT_BYTES, /* subFrameSize - Typically 4 bytes per slot */ FS_STREAM_FORMAT_INPUT_1_RESOLUTION_BITS, /* bitResolution - Typically 24bit */ + +#ifdef USB_CMD_CFG_SAMP_FREQ + USB_IN_SAMP_FREQ_NUM, + CHARIFY_SR(USB_IN_SAMP_FREQ_0), + CHARIFY_SR(USB_IN_SAMP_FREQ_1), + CHARIFY_SR(USB_IN_SAMP_FREQ_2), +#else num_freqs_a1, /* SamFreqType - sample freq count */ /* Windows enum issue with <= two sample rates work around */ @@ -2790,6 +2799,7 @@ unsigned char cfgDesc_Audio1[] = #if (MIN_FREQ <= 96000) && (MAX_FREQ_FS >= 96000) 0x00, 0x77, 0x01, /* sampleFreq - 96KHz */ #endif +#endif //USB_CMD_CFG_SAMP_FREQ /* Standard Endpoint Descriptor */ 0x09, diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 2fdd434c..d07ffe59 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -17,6 +17,12 @@ #ifdef MIXER #include "mixer.h" #endif +#include "xua_conf_default.h" + + +#define DEBUG_UNIT XUA_EP0_UACREQS +#define DEBUG_PRINT_ENABLE_XUA_EP0_UACREQS 0 +#include "debug_print.h" #define CS_XU_MIXSEL (0x06) @@ -45,8 +51,17 @@ extern unsigned char channelMapUsb[NUM_USB_CHAN_IN]; extern unsigned char mixSel[MAX_MIX_COUNT][MIX_INPUTS]; #endif + +#ifdef USB_CMD_CFG_SAMP_FREQ +extern unsigned int g_curAudOut_SamFreq; +#endif + /* Global var for current frequency, set to default freq */ +#ifdef DEFAULT_AUDOUT_FREQ +unsigned int g_curSamFreq = DEFAULT_AUDOUT_FREQ; +#else unsigned int g_curSamFreq = DEFAULT_FREQ; +#endif #if 0 unsigned int g_curSamFreq48000Family = DEFAULT_FREQ % 48000 == 0; @@ -325,6 +340,9 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c int newMasterClock; g_curSamFreq = newSampleRate; + #ifdef USB_CMD_CFG_SAMP_FREQ + g_curAudOut_SamFreq = newSampleRate; + #endif #if 0 /* Original feedback implementation */ g_curSamFreq48000Family = ((MCLK_48 % g_curSamFreq) == 0); @@ -1098,7 +1116,7 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp { return result; } -#if (MAX_FREQ != MIN_FREQ) +#if ((MAX_FREQ != MIN_FREQ) || (defined USB_CMD_CFG_SAMP_FREQ) if(controlSelector == SAMPLING_FREQ_CONTROL) { /* Expect length 3 for sample rate */ @@ -1120,6 +1138,9 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp if(curSamFreq48000Family || curSamFreq44100Family) { g_curSamFreq = newSampleRate; + #ifdef USB_CMD_CFG_SAMP_FREQ + g_curAudOut_SamFreq = newSampleRate; + #endif /* Instruct audio thread to change sample freq */ outuint(c_audioControl, SET_SAMPLE_FREQ); From eae62a9e3c7498e276bd9c8f9582c5f1b21e576e Mon Sep 17 00:00:00 2001 From: Keith Au Date: Wed, 8 Jan 2020 13:49:54 +0800 Subject: [PATCH 04/38] moved defined to xua_conf.h. Fixed bug that causes compile error --- lib_xua/api/xua_conf_default.h | 24 ------------------- .../src/core/endpoint0/xua_ep0_descriptors.h | 2 +- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 2 +- 3 files changed, 2 insertions(+), 26 deletions(-) diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index 2b2a722a..b22046f0 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -233,30 +233,6 @@ #define DEFAULT_AUDOUT_FREQ (48000) #endif -#define USB_CMD_CFG_SAMP_FREQ -// Not ready yet -// #define USB_IN_CONFIGURABLE_BIT_RES -// #ifdef USB_IN_CONFIGURABLE_BIT_RES - // #define USB_IN_BIT_RES_0 STREAM_FORMAT_INPUT_1_RESOLUTION_BITS - // #define USB_IN_BIT_RES_1 STREAM_FORMAT_INPUT_1_RESOLUTION_BITS//24 -// #endif - -#ifdef USB_CMD_CFG_SAMP_FREQ - #define USB_IN_SAMP_FREQ_NUM 3 - #define USB_IN_SAMP_FREQ_0 DEFAULT_AUDOUT_FREQ - #define USB_IN_SAMP_FREQ_1 16000 - #define USB_IN_SAMP_FREQ_2 16000 - - #if (USB_IN_SAMP_FREQ_NUM < 3) - #error "USB_IN_SAMP_FREQ_NUM must be >=3" - #endif -#else - #define USB_IN_DESCRIPTOR_FREQ_OVERRIDE //used if USB in frequency is not conifigurable by USB endpoint command - #ifdef USB_IN_DESCRIPTOR_FREQ_OVERRIDE - #define USB_IN_FREQ_DESCIPTOR_OFFSET 161 //161- (3 * 3) are the position of descriptor that needed to be modified for USB in frequency - #endif -#endif - /* Audio Class Defines */ /** diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index bcb2178e..05c8a906 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -20,7 +20,7 @@ #include "iap2.h" /* Defines iAP EA Native Transport protocol name */ #endif -#include "xua_conf_default.h" +#include "xua_conf.h" #define APPEND_VENDOR_STR(x) VENDOR_STR" "#x diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index d07ffe59..d096c9c9 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -1116,7 +1116,7 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp { return result; } -#if ((MAX_FREQ != MIN_FREQ) || (defined USB_CMD_CFG_SAMP_FREQ) +#if ((MAX_FREQ != MIN_FREQ) || (defined USB_CMD_CFG_SAMP_FREQ)) if(controlSelector == SAMPLING_FREQ_CONTROL) { /* Expect length 3 for sample rate */ From f6d0ede13373af99f19ccb2e154103ab39622944 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Thu, 9 Jan 2020 16:50:17 +0800 Subject: [PATCH 05/38] added USB IN alternate setting descriptor --- .../src/core/endpoint0/xua_ep0_descriptors.h | 128 ++++++++++++++++++ lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 5 +- 2 files changed, 131 insertions(+), 2 deletions(-) diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index 05c8a906..350c9107 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -2360,7 +2360,11 @@ const unsigned num_freqs_a1 = MAX(3, (0 #if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP) #define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (58 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES + HID_INTERFACE_BYTES) #else + #ifdef USB_CMD_CFG_SAMP_FREQ + #define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3) + (40 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES + HID_INTERFACE_BYTES) + #else #define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES + HID_INTERFACE_BYTES) + #endif //USB_CMD_CFG_SAMP_FREQ #endif #define CHARIFY_SR(x) (x & 0xff),((x & 0xff00)>> 8),((x & 0xff0000)>> 16) @@ -2832,6 +2836,130 @@ unsigned char cfgDesc_Audio1[] = 0x00, /* Undefined */ 0x00, 0x00, /* Not used */ #endif // XUA_ADAPTIVE + +#ifdef USB_CMD_CFG_SAMP_FREQ + /* Standard Interface Descriptor - Audio streaming IN */ + 0x09, + 0x04, /* INTERFACE */ + (OUTPUT_INTERFACES_A1 + 1), /* bInterfaceNumber */ + 0x02, /* AlternateSetting */ + 0x01, /* bNumEndpoints */ + 0x01, /* Interface class - AUDIO */ + 0x02, /* Subclass - AUDIO_STREAMING */ + 0x00, /* Unused */ + offsetof(StringDescTable_t, inputInterfaceStr_Audio1)/sizeof(char *), + + /* CS_Interface AC interface header descriptor */ + 0x07, + UAC_CS_DESCTYPE_INTERFACE, + 0x01, /* subtype - GENERAL */ + 0x07, /* TerminalLink - linked to Streaming OUT terminal */ + 0x01, /* Interface delay */ + 0x01,0x00, /* Format - PCM */ + + /* CS_Interface Terminal Descriptor */ + (8 + (num_freqs_a1 * 3)), + UAC_CS_DESCTYPE_INTERFACE, + 0x02, /* Subtype - FORMAT_TYPE */ + 0x01, /* Format type - FORMAT_TYPE_1 */ + NUM_USB_CHAN_IN_FS, /* bNrChannels - Typically 2 */ + FS_STREAM_FORMAT_INPUT_1_SUBSLOT_BYTES, /* subFrameSize - Typically 4 bytes per slot */ + FS_STREAM_FORMAT_INPUT_1_RESOLUTION_BITS, /* bitResolution - Typically 24bit */ + +#ifdef USB_CMD_CFG_SAMP_FREQ + USB_IN_SAMP_FREQ_NUM, + CHARIFY_SR(USB_IN_SAMP_FREQ_0), + CHARIFY_SR(USB_IN_SAMP_FREQ_1), + CHARIFY_SR(USB_IN_SAMP_FREQ_2), +#else + num_freqs_a1, /* SamFreqType - sample freq count */ + +/* Windows enum issue with <= two sample rates work around */ +#if ((MIN_FREQ == 8000) && (MAX_FREQ_FS == 11025)) \ + || (MIN_FREQ == 11025) && (MAX_FREQ_FS == 12000) \ + || (MIN_FREQ == 12000) && (MAX_FREQ_FS == 16000) \ + || (MIN_FREQ == 16000) && (MAX_FREQ_FS == 32000) \ + || (MIN_FREQ == 44100) && (MAX_FREQ_FS == 48000) \ + || (MIN_FREQ == 48000) && (MAX_FREQ_FS == 88200) \ + || (MIN_FREQ == 88200) && (MAX_FREQ_FS == 96000) + CHARIFY_SR(MAX_FREQ_FS), +#endif +#if (MIN_FREQ == MAX_FREQ_FS) + CHARIFY_SR(MAX_FREQ_FS), + CHARIFY_SR(MAX_FREQ_FS), +#endif + +#if(MIN_FREQ <= 8000) && (MAX_FREQ_FS >= 8000) + 0x40, 0x1F, 0x00, /* sampleFreq - 8000KHz */ +#endif + +#if(MIN_FREQ <= 11025) && (MAX_FREQ_FS >= 11025) + 0x11, 0x2B, 0x00, /* sampleFreq - 11025KHz */ +#endif + +#if(MIN_FREQ <= 12000) && (MAX_FREQ_FS >= 12000) + 0xE0, 0x2E, 0x00, /* sampleFreq - 12000KHz */ +#endif + +#if(MIN_FREQ <= 16000) && (MAX_FREQ_FS >= 16000) + CHARIFY_SR(16000), /* sampleFreq - 32KHz */ +#endif + +#if(MIN_FREQ <= 32000) && (MAX_FREQ_FS >= 32000) + CHARIFY_SR(32000), /* sampleFreq - 32KHz */ +#endif + +#if (MIN_FREQ <= 44100) && (MAX_FREQ_FS >= 44100) + 0x44, 0xAC, 0x00, /* sampleFreq - 44.1Khz */ +#endif + +#if (MIN_FREQ <= 48000) && (MAX_FREQ_FS >= 48000) + 0x80, 0xBB, 0x00, /* sampleFreq - 48KHz */ +#endif + +#if (MIN_FREQ <= 88200) && (MAX_FREQ_FS >= 88200) + 0x88, 0x58, 0x01, /* sampleFreq - 88.2KHz */ +#endif + +#if (MIN_FREQ <= 96000) && (MAX_FREQ_FS >= 96000) + 0x00, 0x77, 0x01, /* sampleFreq - 96KHz */ +#endif +#endif //USB_CMD_CFG_SAMP_FREQ + + /* Standard Endpoint Descriptor */ + 0x09, + 0x05, /* ENDPOINT */ + ENDPOINT_ADDRESS_IN_AUDIO, /* EndpointAddress */ +#ifdef XUA_ADAPTIVE + ISO_EP_ATTRIBUTES_ADAPTIVE, +#else + #if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP) + ISO_EP_ATTRIBUTES_ASYNCH, /* Iso, async, data endpoint */ + #else + ISO_EP_IMPL_ATTRIBUTES_ASYNCH, /* Feedback data endpoint */ + #endif +#endif + FS_STREAM_FORMAT_INPUT_1_MAXPACKETSIZE&0xff, /* 4 wMaxPacketSize (Typically 294 bytes)*/ + (FS_STREAM_FORMAT_INPUT_1_MAXPACKETSIZE&0xff00)>>8, /* 5 wMaxPacketSize */ + 0x01, /* bInterval */ + 0x00, /* bRefresh */ + 0x00, /* bSynchAddress */ + + /* CS_Endpoint Descriptor */ + 0x07, + 0x25, /* CS_ENDPOINT */ + 0x01, /* Subtype - GENERAL */ + 0x01, /* Attributes. D[0]: sample freq ctrl. */ +#ifdef XUA_ADAPTIVE + 0x02, /* Lock Delay units PCM samples*/ + 0x08, 0x00, /* No lock delay */ +#else + 0x00, /* Undefined */ + 0x00, 0x00, /* Not used */ +#endif // XUA_ADAPTIVE +#endif//USB_CMD_CFG_SAMP_FREQ + + #endif #if (XUA_DFU_EN == 1) && (FORCE_UAC1_DFU == 1) diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index d096c9c9..22bfc43f 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -57,8 +57,9 @@ extern unsigned int g_curAudOut_SamFreq; #endif /* Global var for current frequency, set to default freq */ -#ifdef DEFAULT_AUDOUT_FREQ -unsigned int g_curSamFreq = DEFAULT_AUDOUT_FREQ; +#ifdef USB_CMD_CFG_SAMP_FREQ +#define g_curSamFreq g_curAudOut_SamFreq +//unsigned int g_curSamFreq = DEFAULT_AUDOUT_FREQ; #else unsigned int g_curSamFreq = DEFAULT_FREQ; #endif From 1ef566a570d017752cceed4768b4a44726583a7e Mon Sep 17 00:00:00 2001 From: Keith Au Date: Mon, 13 Jan 2020 10:15:10 +0800 Subject: [PATCH 06/38] modified AudioEndpointRequests_1 to distinguish between ep0 request for USB in and out --- .../src/core/endpoint0/xua_ep0_descriptors.h | 2 +- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 39 +++++++++++-------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index 350c9107..3a567417 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -2656,7 +2656,7 @@ unsigned char cfgDesc_Audio1[] = /* Standard AS Isochronous Audio Data Endpoint Descriptor 4.6.1.1 */ 0x09, 0x05, /* ENDPOINT */ - 0x01, /* endpointAddress - D7, direction (0 OUT, 1 IN). D6..4 reserved (0). D3..0 endpoint no. */ + ENDPOINT_ADDRESS_OUT_AUDIO, /* endpointAddress - D7, direction (0 OUT, 1 IN). D6..4 reserved (0). D3..0 endpoint no. */ #ifdef XUA_ADAPTIVE ISO_EP_ATTRIBUTES_ADAPTIVE, #else diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 22bfc43f..446b9213 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -18,6 +18,7 @@ #include "mixer.h" #endif #include "xua_conf_default.h" +#include "descriptor_defs.h" #define DEBUG_UNIT XUA_EP0_UACREQS @@ -58,10 +59,13 @@ extern unsigned int g_curAudOut_SamFreq; /* Global var for current frequency, set to default freq */ #ifdef USB_CMD_CFG_SAMP_FREQ -#define g_curSamFreq g_curAudOut_SamFreq -//unsigned int g_curSamFreq = DEFAULT_AUDOUT_FREQ; +#define g_curUSBin_SamFreq g_curAudOut_SamFreq +unsigned int g_curUSBout_SamFreq = DEFAULT_FREQ; +unsigned int g_curSamFreq = DEFAULT_FREQ; // should no longer be used #else -unsigned int g_curSamFreq = DEFAULT_FREQ; +unsigned int g_curUSBin_SamFreq = DEFAULT_FREQ; +unsigned int g_curUSBout_SamFreq = DEFAULT_FREQ; +unsigned int g_curSamFreq = DEFAULT_FREQ; // should no longer be used #endif #if 0 unsigned int g_curSamFreq48000Family = DEFAULT_FREQ % 48000 == 0; @@ -341,9 +345,6 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c int newMasterClock; g_curSamFreq = newSampleRate; - #ifdef USB_CMD_CFG_SAMP_FREQ - g_curAudOut_SamFreq = newSampleRate; - #endif #if 0 /* Original feedback implementation */ g_curSamFreq48000Family = ((MCLK_48 % g_curSamFreq) == 0); @@ -1096,6 +1097,7 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp * bmRequestType.Recipient = Endpoint * bmRequestType.Type = Class * endpoint (wIndex & 0xff) is 0x01 or 0x82 + * wIndex is endpoint address for distinguishing input and output */ XUD_Result_t result; @@ -1126,7 +1128,8 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp /* Recontruct sample-freq */ int newSampleRate = (buffer, unsigned char[])[0] | ((buffer, unsigned char[])[1] << 8) | ((buffer, unsigned char[])[2] << 16); - if(newSampleRate != g_curSamFreq) + if(((sp.wIndex == ENDPOINT_ADDRESS_IN_AUDIO) && (newSampleRate != g_curUSBin_SamFreq)) || \ + ((sp.wIndex == ENDPOINT_ADDRESS_OUT_AUDIO) && (newSampleRate != g_curUSBout_SamFreq))) { int curSamFreq44100Family; int curSamFreq48000Family; @@ -1138,21 +1141,25 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp if(curSamFreq48000Family || curSamFreq44100Family) { - g_curSamFreq = newSampleRate; - #ifdef USB_CMD_CFG_SAMP_FREQ - g_curAudOut_SamFreq = newSampleRate; - #endif - - /* Instruct audio thread to change sample freq */ - outuint(c_audioControl, SET_SAMPLE_FREQ); - outuint(c_audioControl, g_curSamFreq); + if(sp.wIndex == ENDPOINT_ADDRESS_IN_AUDIO){ + g_curUSBin_SamFreq = newSampleRate; + /* Instruct audio thread to change sample freq */ + outuint(c_audioControl, SET_SAMPLE_FREQ); + outuint(c_audioControl, g_curUSBin_SamFreq); + } + else{ //if sp.wIndex == ENDPOINT_ADDRESS_OUT_AUDIO + g_curUSBout_SamFreq = newSampleRate; + /* Instruct audio thread to change sample freq */ + //outuint(c_audioControl, SET_SAMPLE_FREQ); + //outuint(c_audioControl, g_curUSBout_SamFreq); // FIXME: not implemented yet + } /* Wait for handshake back - i.e. pll locked and clocks okay */ chkct(c_audioControl, XS1_CT_END); /* Allow time for the change - feedback to stabilise */ FeedbackStabilityDelay(); - } + } } return XUD_SetBuffer(ep0_in, (buffer, unsigned char[]), 0); } From 2f4da7f2621cad20fa1967e01a801c92b99ed6a9 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Thu, 16 Jan 2020 15:05:41 +0800 Subject: [PATCH 07/38] adding variable reference freqency support. Currently only 48kHz work --- lib_xua/api/xua_conf_default.h | 7 +++++++ lib_xua/src/core/endpoint0/xua_ep0_descriptors.h | 8 ++++++++ lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 4 +++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index b22046f0..2810a7d5 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -233,6 +233,13 @@ #define DEFAULT_AUDOUT_FREQ (48000) #endif +/** + * @brief Default Reference input sampling frequency + */ +#ifndef DEFAULT_AUDIN_FREQ +#define DEFAULT_AUDIN_FREQ (48000) +#endif + /* Audio Class Defines */ /** diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index 3a567417..cfe8a664 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -2599,6 +2599,13 @@ unsigned char cfgDesc_Audio1[] = NUM_USB_CHAN_OUT_FS, /* nrChannels */ FS_STREAM_FORMAT_OUTPUT_1_SUBSLOT_BYTES, /* subFrameSize */ FS_STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS, /* bitResolution */ + + #ifdef USB_CMD_CFG_SAMP_FREQ + USB_OUT_SAMP_FREQ_NUM, + CHARIFY_SR(USB_OUT_SAMP_FREQ_0), + CHARIFY_SR(USB_OUT_SAMP_FREQ_1), + CHARIFY_SR(USB_OUT_SAMP_FREQ_2), + #else num_freqs_a1, /* SamFreqType - sample freq count */ @@ -2652,6 +2659,7 @@ unsigned char cfgDesc_Audio1[] = #if (MIN_FREQ <= 96000) && (MAX_FREQ_FS >= 96000) 0x00, 0x77, 0x01, /* sampleFreq - 96KHz */ #endif + #endif //USB_CMD_CFG_SAMP_FREQ /* Standard AS Isochronous Audio Data Endpoint Descriptor 4.6.1.1 */ 0x09, diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 446b9213..eabe3b56 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -55,12 +55,14 @@ extern unsigned char mixSel[MAX_MIX_COUNT][MIX_INPUTS]; #ifdef USB_CMD_CFG_SAMP_FREQ extern unsigned int g_curAudOut_SamFreq; +extern unsigned int g_curAudIn_SamFreq; #endif /* Global var for current frequency, set to default freq */ #ifdef USB_CMD_CFG_SAMP_FREQ #define g_curUSBin_SamFreq g_curAudOut_SamFreq -unsigned int g_curUSBout_SamFreq = DEFAULT_FREQ; +#define g_curUSBout_SamFreq g_curAudIn_SamFreq + unsigned int g_curSamFreq = DEFAULT_FREQ; // should no longer be used #else unsigned int g_curUSBin_SamFreq = DEFAULT_FREQ; From 6485830a73fc805d33d06c00346e31bb9b996ebc Mon Sep 17 00:00:00 2001 From: Keith Au Date: Mon, 20 Jan 2020 16:14:09 +0800 Subject: [PATCH 08/38] implemented descriptor handler flow for USB_DESCRIPTOR_OVERRIDE_RATE_RES --- lib_xua/src/core/endpoint0/xua_endpoint0.c | 27 +++++++++++++++++++ .../src/core/endpoint0/xua_ep0_descriptors.h | 9 ++++++- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 2 +- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index 91576287..5c402473 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -88,6 +88,12 @@ int min(int x, int y); /* Global current device config var*/ extern unsigned char g_currentConfig; + +#if((defined USB_CMD_CFG_SAMP_FREQ) || (defined USB_DESCRIPTOR_OVERRIDE_RATE_RES)) +extern unsigned int g_curAudOut_SamFreq; +extern unsigned int g_curAudIn_SamFreq; +#endif + /* Global endpoint status arrays - declared in usb_device.xc */ extern unsigned char g_interfaceAlt[]; @@ -777,6 +783,27 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0 #endif #elif (AUDIO_CLASS == 1) /* Return Audio 1.0 Descriptors in FS, should never be in HS! */ + + + #ifdef USB_DESCRIPTOR_OVERRIDE_RATE_RES //change USB descriptor frequencies and bit resolution values here + int i=0; + for(i=0;i<3;i++) + { + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i] = g_curAudOut_SamFreq & 0xff; + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 1] = (g_curAudOut_SamFreq & 0xff00)>> 8; + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (g_curAudOut_SamFreq & 0xff0000)>> 16; + } + + for(i=0;i<3;i++) + { + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i] = g_curAudIn_SamFreq & 0xff; + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 1] = (g_curAudIn_SamFreq & 0xff00)>> 8; + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (g_curAudIn_SamFreq & 0xff0000)>> 16; + } + #endif + + + result = USB_StandardRequests(ep0_out, ep0_in, null, 0, null, 0, diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index cfe8a664..a97e476c 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -2357,7 +2357,7 @@ const unsigned num_freqs_a1 = MAX(3, (0 /* Note, this is different that INTERFACE_COUNT since we dont support items such as MIDI, iAP etc in UAC1 mode */ #define NUM_INTERFACES_A1 (1 + INPUT_INTERFACES_A1 + OUTPUT_INTERFACES_A1 + NUM_CONTROL_USB_INTERFACES + DFU_INTERFACES_A1 + HID_INTERFACES_A1) -#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP) +#if ((NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)) #define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (58 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES + HID_INTERFACE_BYTES) #else #ifdef USB_CMD_CFG_SAMP_FREQ @@ -2367,6 +2367,13 @@ const unsigned num_freqs_a1 = MAX(3, (0 #endif //USB_CMD_CFG_SAMP_FREQ #endif +#ifdef USB_DESCRIPTOR_OVERRIDE_RATE_RES + #define AS_INTERFACE_BYTES (7) + #define INTERFACE_DESCRIPTOR_BYTES (9) + #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) +#endif + #define CHARIFY_SR(x) (x & 0xff),((x & 0xff00)>> 8),((x & 0xff0000)>> 16) #if (MIN_FREQ_FS < 12000) && (MAX_FREQ_FS > 48000) diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index eabe3b56..a2fbdffd 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -53,7 +53,7 @@ extern unsigned char mixSel[MAX_MIX_COUNT][MIX_INPUTS]; #endif -#ifdef USB_CMD_CFG_SAMP_FREQ +#if((defined USB_CMD_CFG_SAMP_FREQ) || (defined USB_DESCRIPTOR_OVERRIDE_RATE_RES)) extern unsigned int g_curAudOut_SamFreq; extern unsigned int g_curAudIn_SamFreq; #endif From ad7ce6369e7d6fe8fc818de5034cc34becb5bd9e Mon Sep 17 00:00:00 2001 From: Kevin Yeung Date: Wed, 22 Jan 2020 11:39:55 +0800 Subject: [PATCH 09/38] modified to change bit resolution --- lib_xua/src/core/buffer/decouple/decouple.xc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib_xua/src/core/buffer/decouple/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc index 297dff8d..01bb7bb4 100644 --- a/lib_xua/src/core/buffer/decouple/decouple.xc +++ b/lib_xua/src/core/buffer/decouple/decouple.xc @@ -136,6 +136,8 @@ unsigned unpackData = 0; unsigned packState = 0; unsigned packData = 0; +extern unsigned int g_BitResolution; + /* Default to something sensible but the following are setup at stream start (unless UAC1 only..) */ #if (AUDIO_CLASS == 2) unsigned g_curSubSlot_Out = HS_STREAM_FORMAT_OUTPUT_1_SUBSLOT_BYTES; @@ -145,7 +147,6 @@ unsigned g_curSubSlot_Out = FS_STREAM_FORMAT_OUTPUT_1_SUBSLOT_BYTES; unsigned g_curSubSlot_In = FS_STREAM_FORMAT_INPUT_1_SUBSLOT_BYTES; #endif - /* IN packet size. Init to something sensible, but expect to be re-set before stream start */ #if (AUDIO_CLASS==2) int g_maxPacketSize = MAX_DEVICE_AUD_PACKET_SIZE_IN_HS; @@ -158,6 +159,10 @@ int g_maxPacketSize = MAX_DEVICE_AUD_PACKET_SIZE_IN_FS; void handle_audio_request(chanend c_mix_out) { int space_left; + if (AUDIO_CLASS == 1){ + g_curSubSlot_Out = g_BitResolution/8; + g_curSubSlot_In = g_BitResolution/8; + } /* Input word that triggered interrupt and handshake back */ unsigned underflowSample = inuint(c_mix_out); From f6d5bffad50e6103d4754e96eef08533a347e5a3 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Fri, 31 Jan 2020 16:44:52 +0800 Subject: [PATCH 10/38] modified codes to change USB descriptor according to bit resolution variable values --- lib_xua/src/core/endpoint0/xua_endpoint0.c | 16 ++++++++++++++++ lib_xua/src/core/endpoint0/xua_ep0_descriptors.h | 8 ++++++++ 2 files changed, 24 insertions(+) diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index 5c402473..cf62f7b2 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -92,6 +92,8 @@ extern unsigned char g_currentConfig; #if((defined USB_CMD_CFG_SAMP_FREQ) || (defined USB_DESCRIPTOR_OVERRIDE_RATE_RES)) extern unsigned int g_curAudOut_SamFreq; extern unsigned int g_curAudIn_SamFreq; +extern unsigned int g_BitResolution_In; +extern unsigned int g_BitResolution_Out; #endif /* Global endpoint status arrays - declared in usb_device.xc */ @@ -786,6 +788,13 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0 #ifdef USB_DESCRIPTOR_OVERRIDE_RATE_RES //change USB descriptor frequencies and bit resolution values here + + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = g_BitResolution_In >> 3; //sub frame rate = bit rate /8 + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (g_BitResolution_In & 0xff); //bit resolution + + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = g_BitResolution_Out >> 3; //sub frame rate = bit rate /8 + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (g_BitResolution_Out & 0xff); //bit resolution + int i=0; for(i=0;i<3;i++) { @@ -800,6 +809,13 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0 cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 1] = (g_curAudIn_SamFreq & 0xff00)>> 8; cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (g_curAudIn_SamFreq & 0xff0000)>> 16; } + + cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((g_BitResolution_In >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff; //max packet size + cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((g_BitResolution_In >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff00) >> 8; //max packet size + + cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((g_BitResolution_Out >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff; //max packet size + cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((g_BitResolution_Out >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff00) >> 8; //max packet size + #endif diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index a97e476c..42f26651 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -2370,8 +2370,16 @@ const unsigned num_freqs_a1 = MAX(3, (0 #ifdef USB_DESCRIPTOR_OVERRIDE_RATE_RES #define AS_INTERFACE_BYTES (7) #define INTERFACE_DESCRIPTOR_BYTES (9) + #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 a46c8b134ab18247fd006861724490ab0af772b5 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Fri, 31 Jan 2020 17:06:04 +0800 Subject: [PATCH 11/38] added default values for bit resolutions --- lib_xua/api/xua_conf_default.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index 2810a7d5..a1d700f3 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -240,6 +240,20 @@ #define DEFAULT_AUDIN_FREQ (48000) #endif +/** + * @brief Default USB input (Audio output) bit resolution + */ +#ifndef DEFAULT_BIT_RES_IN +#define DEFAULT_BIT_RES_IN (16) +#endif + +/** + * @brief Default USB output (Reference input) bit resolution + */ +#ifndef DEFAULT_BIT_RES_OUT +#define DEFAULT_BIT_RES_OUT (32) +#endif + /* Audio Class Defines */ /** From 03b5dd63194438fb3b2ef34136056f304d4c4756 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Tue, 4 Feb 2020 15:04:38 +0800 Subject: [PATCH 12/38] changed global variables to be accessed by APIs --- lib_xua/src/core/endpoint0/xua_endpoint0.c | 42 +++++++++---------- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 4 +- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index cf62f7b2..f8cf499a 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -64,6 +64,13 @@ extern void device_reboot(void); #include "xua_hid.h" #endif +#if((defined USB_CMD_CFG_SAMP_FREQ) || (defined USB_DESCRIPTOR_OVERRIDE_RATE_RES)) +unsigned int xua_lite_curAudOutFreq(void); +unsigned int xua_lite_curAudInFreq(void); +unsigned int xua_lite_curUSB_Res_In(void); +unsigned int xua_lite_curUSB_Res_Out(void); +#endif + unsigned int DFU_mode_active = 0; // 0 - App active, 1 - DFU active /* Global volume and mute tables */ @@ -89,13 +96,6 @@ int min(int x, int y); extern unsigned char g_currentConfig; -#if((defined USB_CMD_CFG_SAMP_FREQ) || (defined USB_DESCRIPTOR_OVERRIDE_RATE_RES)) -extern unsigned int g_curAudOut_SamFreq; -extern unsigned int g_curAudIn_SamFreq; -extern unsigned int g_BitResolution_In; -extern unsigned int g_BitResolution_Out; -#endif - /* Global endpoint status arrays - declared in usb_device.xc */ extern unsigned char g_interfaceAlt[]; @@ -789,32 +789,32 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0 #ifdef USB_DESCRIPTOR_OVERRIDE_RATE_RES //change USB descriptor frequencies and bit resolution values here - cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = g_BitResolution_In >> 3; //sub frame rate = bit rate /8 - cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (g_BitResolution_In & 0xff); //bit resolution + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = xua_lite_curUSB_Res_In() >> 3; //sub frame rate = bit rate /8 + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (xua_lite_curUSB_Res_In() & 0xff); //bit resolution - cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = g_BitResolution_Out >> 3; //sub frame rate = bit rate /8 - cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (g_BitResolution_Out & 0xff); //bit resolution + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = xua_lite_curUSB_Res_Out() >> 3; //sub frame rate = bit rate /8 + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (xua_lite_curUSB_Res_Out() & 0xff); //bit resolution int i=0; for(i=0;i<3;i++) { - cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i] = g_curAudOut_SamFreq & 0xff; - cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 1] = (g_curAudOut_SamFreq & 0xff00)>> 8; - cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (g_curAudOut_SamFreq & 0xff0000)>> 16; + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i] = xua_lite_curAudOutFreq() & 0xff; + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 1] = (xua_lite_curAudOutFreq() & 0xff00)>> 8; + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (xua_lite_curAudOutFreq() & 0xff0000)>> 16; } for(i=0;i<3;i++) { - cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i] = g_curAudIn_SamFreq & 0xff; - cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 1] = (g_curAudIn_SamFreq & 0xff00)>> 8; - cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (g_curAudIn_SamFreq & 0xff0000)>> 16; + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i] = xua_lite_curAudInFreq() & 0xff; + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 1] = (xua_lite_curAudInFreq() & 0xff00)>> 8; + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (xua_lite_curAudInFreq() & 0xff0000)>> 16; } - cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((g_BitResolution_In >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff; //max packet size - cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((g_BitResolution_In >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff00) >> 8; //max packet size + cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((xua_lite_curUSB_Res_In() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff; //max packet size + cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((xua_lite_curUSB_Res_In() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff00) >> 8; //max packet size - cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((g_BitResolution_Out >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff; //max packet size - cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((g_BitResolution_Out >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff00) >> 8; //max packet size + cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((xua_lite_curUSB_Res_Out() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff; //max packet size + cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((xua_lite_curUSB_Res_Out() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff00) >> 8; //max packet size #endif diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index a2fbdffd..6e46ae30 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -60,8 +60,8 @@ extern unsigned int g_curAudIn_SamFreq; /* Global var for current frequency, set to default freq */ #ifdef USB_CMD_CFG_SAMP_FREQ -#define g_curUSBin_SamFreq g_curAudOut_SamFreq -#define g_curUSBout_SamFreq g_curAudIn_SamFreq +#define g_curUSBin_SamFreq xua_lite_curAudOutFreq() +#define g_curUSBout_SamFreq xua_lite_curAudInFreq() unsigned int g_curSamFreq = DEFAULT_FREQ; // should no longer be used #else From e99d1cc4860fa1f87e9c25736e6fbf5d42c952e7 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Tue, 4 Feb 2020 16:16:05 +0800 Subject: [PATCH 13/38] remove extern reference to freq/bitres global variable --- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 6e46ae30..95b37197 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -53,11 +53,6 @@ extern unsigned char mixSel[MAX_MIX_COUNT][MIX_INPUTS]; #endif -#if((defined USB_CMD_CFG_SAMP_FREQ) || (defined USB_DESCRIPTOR_OVERRIDE_RATE_RES)) -extern unsigned int g_curAudOut_SamFreq; -extern unsigned int g_curAudIn_SamFreq; -#endif - /* Global var for current frequency, set to default freq */ #ifdef USB_CMD_CFG_SAMP_FREQ #define g_curUSBin_SamFreq xua_lite_curAudOutFreq() From 2c44f2c3235e16a0fe985c0dc66943d54f5d4d9c Mon Sep 17 00:00:00 2001 From: Keith Au Date: Thu, 6 Feb 2020 15:09:34 +0800 Subject: [PATCH 14/38] replace old g_BitResolution variable with latest API --- lib_xua/src/core/buffer/decouple/decouple.xc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib_xua/src/core/buffer/decouple/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc index 01bb7bb4..438abe80 100644 --- a/lib_xua/src/core/buffer/decouple/decouple.xc +++ b/lib_xua/src/core/buffer/decouple/decouple.xc @@ -17,6 +17,13 @@ #endif #define MAX(x,y) ((x)>(y) ? (x) : (y)) +#if((defined USB_CMD_CFG_SAMP_FREQ) || (defined USB_DESCRIPTOR_OVERRIDE_RATE_RES)) +unsigned int xua_lite_curAudOutFreq(void); +unsigned int xua_lite_curAudInFreq(void); +unsigned int xua_lite_curUSB_Res_In(void); +unsigned int xua_lite_curUSB_Res_Out(void); +#endif + /* TODO use SLOTSIZE to potentially save memory */ /* Note we could improve on this, for one subslot is set to 4 */ /* The *4 is conversion to bytes, note we're assuming a slotsize of 4 here whic is potentially as waste */ @@ -136,7 +143,6 @@ unsigned unpackData = 0; unsigned packState = 0; unsigned packData = 0; -extern unsigned int g_BitResolution; /* Default to something sensible but the following are setup at stream start (unless UAC1 only..) */ #if (AUDIO_CLASS == 2) @@ -160,8 +166,8 @@ void handle_audio_request(chanend c_mix_out) { int space_left; if (AUDIO_CLASS == 1){ - g_curSubSlot_Out = g_BitResolution/8; - g_curSubSlot_In = g_BitResolution/8; + g_curSubSlot_Out = xua_lite_curUSB_Res_Out() >> 3; + g_curSubSlot_In = xua_lite_curUSB_Res_In() >> 3; } /* Input word that triggered interrupt and handshake back */ From 86c8bc9128ab21c6f688a9a08352aac725d912c8 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Tue, 11 Feb 2020 12:07:27 +0800 Subject: [PATCH 15/38] commit after updating to latest develop branch on 10 Feb 2020 --- lib_xua/api/xua_conf_default.h | 2 +- lib_xua/src/core/endpoint0/xua_ep0_descriptors.h | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index 6255221e..65894a8c 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -244,7 +244,7 @@ * @brief Default USB input (Audio output) bit resolution */ #ifndef DEFAULT_BIT_RES_IN -#define DEFAULT_BIT_RES_IN (16) +#define DEFAULT_BIT_RES_IN (32) #endif /** diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index dd284b0a..9faca34a 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -20,8 +20,6 @@ #include "iap2.h" /* Defines iAP EA Native Transport protocol name */ #endif -#include "xua_conf.h" - #define APPEND_VENDOR_STR(x) VENDOR_STR" "#x #define APPEND_PRODUCT_STR_A2(x) PRODUCT_STR_A2 " "#x From 40a2ac6d73b29de4d78a2149b833ea1885fe1026 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Thu, 13 Feb 2020 14:17:46 +0800 Subject: [PATCH 16/38] moved the flow of changing USB descriptor values to XUA_Endpoint0_init() --- lib_xua/src/core/endpoint0/xua_endpoint0.c | 68 ++++++++++------------ 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index f8cf499a..887a451f 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -95,7 +95,6 @@ int min(int x, int y); /* Global current device config var*/ extern unsigned char g_currentConfig; - /* Global endpoint status arrays - declared in usb_device.xc */ extern unsigned char g_interfaceAlt[]; @@ -308,6 +307,38 @@ void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioCont } #endif +#ifdef USB_DESCRIPTOR_OVERRIDE_RATE_RES //change USB descriptor frequencies and bit resolution values here + + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = xua_lite_curUSB_Res_In() >> 3; //sub frame rate = bit rate /8 + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (xua_lite_curUSB_Res_In() & 0xff); //bit resolution + + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = xua_lite_curUSB_Res_Out() >> 3; //sub frame rate = bit rate /8 + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (xua_lite_curUSB_Res_Out() & 0xff); //bit resolution + + const unsigned num_of_usb_descriptor_freq=3; //This should be =3 according to the comments "sing 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] = (xua_lite_curAudOutFreq() & 0xff0000)>> 16; + } + + for(i=0;i> 8; + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (xua_lite_curAudInFreq() & 0xff0000)>> 16; + } + + cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((xua_lite_curUSB_Res_In() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff; //max packet size + cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((xua_lite_curUSB_Res_In() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff00) >> 8; //max packet size + + cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((xua_lite_curUSB_Res_Out() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff; //max packet size + cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((xua_lite_curUSB_Res_Out() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff00) >> 8; //max packet size + +#endif + } void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, @@ -785,41 +816,6 @@ void XUA_Endpoint0_loop(XUD_Result_t result, USB_SetupPacket_t sp, chanend c_ep0 #endif #elif (AUDIO_CLASS == 1) /* Return Audio 1.0 Descriptors in FS, should never be in HS! */ - - - #ifdef USB_DESCRIPTOR_OVERRIDE_RATE_RES //change USB descriptor frequencies and bit resolution values here - - cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = xua_lite_curUSB_Res_In() >> 3; //sub frame rate = bit rate /8 - cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (xua_lite_curUSB_Res_In() & 0xff); //bit resolution - - cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = xua_lite_curUSB_Res_Out() >> 3; //sub frame rate = bit rate /8 - cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (xua_lite_curUSB_Res_Out() & 0xff); //bit resolution - - int i=0; - for(i=0;i<3;i++) - { - cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i] = xua_lite_curAudOutFreq() & 0xff; - cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 1] = (xua_lite_curAudOutFreq() & 0xff00)>> 8; - cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (xua_lite_curAudOutFreq() & 0xff0000)>> 16; - } - - for(i=0;i<3;i++) - { - cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i] = xua_lite_curAudInFreq() & 0xff; - cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 1] = (xua_lite_curAudInFreq() & 0xff00)>> 8; - cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (xua_lite_curAudInFreq() & 0xff0000)>> 16; - } - - cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((xua_lite_curUSB_Res_In() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff; //max packet size - cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((xua_lite_curUSB_Res_In() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff00) >> 8; //max packet size - - cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((xua_lite_curUSB_Res_Out() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff; //max packet size - cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((xua_lite_curUSB_Res_Out() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff00) >> 8; //max packet size - - #endif - - - result = USB_StandardRequests(ep0_out, ep0_in, null, 0, null, 0, From ed6ad4ce9f420c6161c8a34900b9c06c872cb3ce Mon Sep 17 00:00:00 2001 From: Keith Au Date: Thu, 13 Feb 2020 15:05:45 +0800 Subject: [PATCH 17/38] remove unused USB descriptor lines under USB_CMD_CFG_SAMP_FREQ in xua_ep0_descriptor.h --- .../src/core/endpoint0/xua_ep0_descriptors.h | 58 +------------------ 1 file changed, 2 insertions(+), 56 deletions(-) diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index 9faca34a..d0d44795 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -2864,7 +2864,7 @@ unsigned char cfgDesc_Audio1[] = 0x00, 0x00, /* Not used */ #endif // XUA_ADAPTIVE -#ifdef USB_CMD_CFG_SAMP_FREQ +#ifdef USB_CMD_CFG_SAMP_FREQ //add extra Interface Descriptor in case mulitple bit resolution is needed to be offered to host /* Standard Interface Descriptor - Audio streaming IN */ 0x09, 0x04, /* INTERFACE */ @@ -2892,66 +2892,12 @@ unsigned char cfgDesc_Audio1[] = NUM_USB_CHAN_IN_FS, /* bNrChannels - Typically 2 */ FS_STREAM_FORMAT_INPUT_1_SUBSLOT_BYTES, /* subFrameSize - Typically 4 bytes per slot */ FS_STREAM_FORMAT_INPUT_1_RESOLUTION_BITS, /* bitResolution - Typically 24bit */ - -#ifdef USB_CMD_CFG_SAMP_FREQ + USB_IN_SAMP_FREQ_NUM, CHARIFY_SR(USB_IN_SAMP_FREQ_0), CHARIFY_SR(USB_IN_SAMP_FREQ_1), CHARIFY_SR(USB_IN_SAMP_FREQ_2), -#else - num_freqs_a1, /* SamFreqType - sample freq count */ -/* Windows enum issue with <= two sample rates work around */ -#if ((MIN_FREQ == 8000) && (MAX_FREQ_FS == 11025)) \ - || (MIN_FREQ == 11025) && (MAX_FREQ_FS == 12000) \ - || (MIN_FREQ == 12000) && (MAX_FREQ_FS == 16000) \ - || (MIN_FREQ == 16000) && (MAX_FREQ_FS == 32000) \ - || (MIN_FREQ == 44100) && (MAX_FREQ_FS == 48000) \ - || (MIN_FREQ == 48000) && (MAX_FREQ_FS == 88200) \ - || (MIN_FREQ == 88200) && (MAX_FREQ_FS == 96000) - CHARIFY_SR(MAX_FREQ_FS), -#endif -#if (MIN_FREQ == MAX_FREQ_FS) - CHARIFY_SR(MAX_FREQ_FS), - CHARIFY_SR(MAX_FREQ_FS), -#endif - -#if(MIN_FREQ <= 8000) && (MAX_FREQ_FS >= 8000) - 0x40, 0x1F, 0x00, /* sampleFreq - 8000KHz */ -#endif - -#if(MIN_FREQ <= 11025) && (MAX_FREQ_FS >= 11025) - 0x11, 0x2B, 0x00, /* sampleFreq - 11025KHz */ -#endif - -#if(MIN_FREQ <= 12000) && (MAX_FREQ_FS >= 12000) - 0xE0, 0x2E, 0x00, /* sampleFreq - 12000KHz */ -#endif - -#if(MIN_FREQ <= 16000) && (MAX_FREQ_FS >= 16000) - CHARIFY_SR(16000), /* sampleFreq - 32KHz */ -#endif - -#if(MIN_FREQ <= 32000) && (MAX_FREQ_FS >= 32000) - CHARIFY_SR(32000), /* sampleFreq - 32KHz */ -#endif - -#if (MIN_FREQ <= 44100) && (MAX_FREQ_FS >= 44100) - 0x44, 0xAC, 0x00, /* sampleFreq - 44.1Khz */ -#endif - -#if (MIN_FREQ <= 48000) && (MAX_FREQ_FS >= 48000) - 0x80, 0xBB, 0x00, /* sampleFreq - 48KHz */ -#endif - -#if (MIN_FREQ <= 88200) && (MAX_FREQ_FS >= 88200) - 0x88, 0x58, 0x01, /* sampleFreq - 88.2KHz */ -#endif - -#if (MIN_FREQ <= 96000) && (MAX_FREQ_FS >= 96000) - 0x00, 0x77, 0x01, /* sampleFreq - 96KHz */ -#endif -#endif //USB_CMD_CFG_SAMP_FREQ /* Standard Endpoint Descriptor */ 0x09, From 23cf086b8456fd7f53a56d95ce5ef32d641fd507 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Thu, 13 Feb 2020 15:33:43 +0800 Subject: [PATCH 18/38] replace all tab by 4 spaces --- lib_xua/src/core/endpoint0/xua_endpoint0.c | 56 +++++++++---------- .../src/core/endpoint0/xua_ep0_descriptors.h | 26 ++++----- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 28 +++++----- 3 files changed, 55 insertions(+), 55 deletions(-) diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index 887a451f..8c39d1b9 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -309,34 +309,34 @@ void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioCont #ifdef USB_DESCRIPTOR_OVERRIDE_RATE_RES //change USB descriptor frequencies and bit resolution values here - cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = xua_lite_curUSB_Res_In() >> 3; //sub frame rate = bit rate /8 - cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (xua_lite_curUSB_Res_In() & 0xff); //bit resolution - - cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = xua_lite_curUSB_Res_Out() >> 3; //sub frame rate = bit rate /8 - cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (xua_lite_curUSB_Res_Out() & 0xff); //bit resolution - - const unsigned num_of_usb_descriptor_freq=3; //This should be =3 according to the comments "sing 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] = (xua_lite_curAudOutFreq() & 0xff0000)>> 16; - } - - for(i=0;i> 8; - cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (xua_lite_curAudInFreq() & 0xff0000)>> 16; - } - - cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((xua_lite_curUSB_Res_In() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff; //max packet size - cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((xua_lite_curUSB_Res_In() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff00) >> 8; //max packet size - - cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((xua_lite_curUSB_Res_Out() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff; //max packet size - cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((xua_lite_curUSB_Res_Out() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff00) >> 8; //max packet size - + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = xua_lite_curUSB_Res_In() >> 3; //sub frame rate = bit rate /8 + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (xua_lite_curUSB_Res_In() & 0xff); //bit resolution + + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = xua_lite_curUSB_Res_Out() >> 3; //sub frame rate = bit rate /8 + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (xua_lite_curUSB_Res_Out() & 0xff); //bit resolution + + const unsigned num_of_usb_descriptor_freq=3; //This should be =3 according to the comments "sing 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] = (xua_lite_curAudOutFreq() & 0xff0000)>> 16; + } + + for(i=0;i> 8; + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (xua_lite_curAudInFreq() & 0xff0000)>> 16; + } + + cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((xua_lite_curUSB_Res_In() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff; //max packet size + cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((xua_lite_curUSB_Res_In() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff00) >> 8; //max packet size + + cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((xua_lite_curUSB_Res_Out() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff; //max packet size + cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((xua_lite_curUSB_Res_Out() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff00) >> 8; //max packet size + #endif } diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index d0d44795..cee0f709 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -2618,13 +2618,13 @@ unsigned char cfgDesc_Audio1[] = NUM_USB_CHAN_OUT_FS, /* nrChannels */ FS_STREAM_FORMAT_OUTPUT_1_SUBSLOT_BYTES, /* subFrameSize */ FS_STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS, /* bitResolution */ - - #ifdef USB_CMD_CFG_SAMP_FREQ - USB_OUT_SAMP_FREQ_NUM, - CHARIFY_SR(USB_OUT_SAMP_FREQ_0), - CHARIFY_SR(USB_OUT_SAMP_FREQ_1), - CHARIFY_SR(USB_OUT_SAMP_FREQ_2), - #else + + #ifdef USB_CMD_CFG_SAMP_FREQ + USB_OUT_SAMP_FREQ_NUM, + CHARIFY_SR(USB_OUT_SAMP_FREQ_0), + CHARIFY_SR(USB_OUT_SAMP_FREQ_1), + CHARIFY_SR(USB_OUT_SAMP_FREQ_2), + #else num_freqs_a1, /* SamFreqType - sample freq count */ @@ -2678,7 +2678,7 @@ unsigned char cfgDesc_Audio1[] = #if (MIN_FREQ <= 96000) && (MAX_FREQ_FS >= 96000) 0x00, 0x77, 0x01, /* sampleFreq - 96KHz */ #endif - #endif //USB_CMD_CFG_SAMP_FREQ + #endif //USB_CMD_CFG_SAMP_FREQ /* Standard AS Isochronous Audio Data Endpoint Descriptor 4.6.1.1 */ 0x09, @@ -2771,12 +2771,12 @@ unsigned char cfgDesc_Audio1[] = NUM_USB_CHAN_IN_FS, /* bNrChannels - Typically 2 */ FS_STREAM_FORMAT_INPUT_1_SUBSLOT_BYTES, /* subFrameSize - Typically 4 bytes per slot */ FS_STREAM_FORMAT_INPUT_1_RESOLUTION_BITS, /* bitResolution - Typically 24bit */ - + #ifdef USB_CMD_CFG_SAMP_FREQ - USB_IN_SAMP_FREQ_NUM, - CHARIFY_SR(USB_IN_SAMP_FREQ_0), - CHARIFY_SR(USB_IN_SAMP_FREQ_1), - CHARIFY_SR(USB_IN_SAMP_FREQ_2), + USB_IN_SAMP_FREQ_NUM, + CHARIFY_SR(USB_IN_SAMP_FREQ_0), + CHARIFY_SR(USB_IN_SAMP_FREQ_1), + CHARIFY_SR(USB_IN_SAMP_FREQ_2), #else num_freqs_a1, /* SamFreqType - sample freq count */ diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 95b37197..0346809b 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -1094,7 +1094,7 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp * bmRequestType.Recipient = Endpoint * bmRequestType.Type = Class * endpoint (wIndex & 0xff) is 0x01 or 0x82 - * wIndex is endpoint address for distinguishing input and output + * wIndex is endpoint address for distinguishing input and output */ XUD_Result_t result; @@ -1126,7 +1126,7 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp int newSampleRate = (buffer, unsigned char[])[0] | ((buffer, unsigned char[])[1] << 8) | ((buffer, unsigned char[])[2] << 16); if(((sp.wIndex == ENDPOINT_ADDRESS_IN_AUDIO) && (newSampleRate != g_curUSBin_SamFreq)) || \ - ((sp.wIndex == ENDPOINT_ADDRESS_OUT_AUDIO) && (newSampleRate != g_curUSBout_SamFreq))) + ((sp.wIndex == ENDPOINT_ADDRESS_OUT_AUDIO) && (newSampleRate != g_curUSBout_SamFreq))) { int curSamFreq44100Family; int curSamFreq48000Family; @@ -1138,18 +1138,18 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp if(curSamFreq48000Family || curSamFreq44100Family) { - if(sp.wIndex == ENDPOINT_ADDRESS_IN_AUDIO){ - g_curUSBin_SamFreq = newSampleRate; - /* Instruct audio thread to change sample freq */ - outuint(c_audioControl, SET_SAMPLE_FREQ); - outuint(c_audioControl, g_curUSBin_SamFreq); - } - else{ //if sp.wIndex == ENDPOINT_ADDRESS_OUT_AUDIO - g_curUSBout_SamFreq = newSampleRate; - /* Instruct audio thread to change sample freq */ - //outuint(c_audioControl, SET_SAMPLE_FREQ); - //outuint(c_audioControl, g_curUSBout_SamFreq); // FIXME: not implemented yet - } + if(sp.wIndex == ENDPOINT_ADDRESS_IN_AUDIO){ + g_curUSBin_SamFreq = newSampleRate; + /* Instruct audio thread to change sample freq */ + outuint(c_audioControl, SET_SAMPLE_FREQ); + outuint(c_audioControl, g_curUSBin_SamFreq); + } + else{ //if sp.wIndex == ENDPOINT_ADDRESS_OUT_AUDIO + g_curUSBout_SamFreq = newSampleRate; + /* Instruct audio thread to change sample freq */ + //outuint(c_audioControl, SET_SAMPLE_FREQ); + //outuint(c_audioControl, g_curUSBout_SamFreq); // FIXME: not implemented yet + } /* Wait for handshake back - i.e. pll locked and clocks okay */ chkct(c_audioControl, XS1_CT_END); From 18cef82b06ffcdad49b2e7a9b2954f7456a19640 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Thu, 13 Feb 2020 15:48:46 +0800 Subject: [PATCH 19/38] modified to have USB out frequency be informed to c_audioControl after getting EP0 request --- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 0346809b..7226f4ec 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -1147,8 +1147,8 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp else{ //if sp.wIndex == ENDPOINT_ADDRESS_OUT_AUDIO g_curUSBout_SamFreq = newSampleRate; /* Instruct audio thread to change sample freq */ - //outuint(c_audioControl, SET_SAMPLE_FREQ); - //outuint(c_audioControl, g_curUSBout_SamFreq); // FIXME: not implemented yet + outuint(c_audioControl, SET_SAMPLE_FREQ); + outuint(c_audioControl, g_curUSBout_SamFreq); } /* Wait for handshake back - i.e. pll locked and clocks okay */ From 27c99623ac90b48b83bdbe63a15408c92f3fbbc2 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Thu, 13 Feb 2020 15:54:46 +0800 Subject: [PATCH 20/38] update Changelog --- CHANGELOG.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index f2aa6a1e..397eefd5 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -20,6 +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: Support of variable USB sampling frequency 0.2.1 ----- From cb842df4920673191c69a4e79aa92f2f007eedbd Mon Sep 17 00:00:00 2001 From: Keith Au Date: Thu, 13 Feb 2020 16:10:57 +0800 Subject: [PATCH 21/38] remove unnecessary AUDIO_CLASS checking --- lib_xua/src/core/buffer/decouple/decouple.xc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib_xua/src/core/buffer/decouple/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc index 438abe80..4920c2da 100644 --- a/lib_xua/src/core/buffer/decouple/decouple.xc +++ b/lib_xua/src/core/buffer/decouple/decouple.xc @@ -165,10 +165,8 @@ int g_maxPacketSize = MAX_DEVICE_AUD_PACKET_SIZE_IN_FS; void handle_audio_request(chanend c_mix_out) { int space_left; - if (AUDIO_CLASS == 1){ - g_curSubSlot_Out = xua_lite_curUSB_Res_Out() >> 3; - g_curSubSlot_In = xua_lite_curUSB_Res_In() >> 3; - } + g_curSubSlot_Out = xua_lite_curUSB_Res_Out() >> 3; + g_curSubSlot_In = xua_lite_curUSB_Res_In() >> 3; /* Input word that triggered interrupt and handshake back */ unsigned underflowSample = inuint(c_mix_out); From 76f12ccad6c18dcd2c3375c33ce629b8649cb05b Mon Sep 17 00:00:00 2001 From: Keith Au Date: Thu, 13 Feb 2020 16:35:21 +0800 Subject: [PATCH 22/38] rename default frequency naming --- lib_xua/api/xua_conf_default.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index 65894a8c..e4e85c7b 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -229,15 +229,15 @@ /** * @brief Default Audio output sampling frequency */ -#ifndef DEFAULT_AUDOUT_FREQ -#define DEFAULT_AUDOUT_FREQ (48000) +#ifndef DEFAULT_AUD_TO_USB_FREQ +#define DEFAULT_AUD_TO_USB_FREQ (48000) #endif /** * @brief Default Reference input sampling frequency */ -#ifndef DEFAULT_AUDIN_FREQ -#define DEFAULT_AUDIN_FREQ (48000) +#ifndef DEFAULT_USB_TO_AUD_FREQ +#define DEFAULT_USB_TO_AUD_FREQ (48000) #endif /** From 07b829cd7e5eaa9b4589e83cc8d8a0ec10bdbcc3 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Thu, 13 Feb 2020 17:11:58 +0800 Subject: [PATCH 23/38] further renamed global variables and APIs --- lib_xua/src/core/buffer/decouple/decouple.xc | 4 ++-- lib_xua/src/core/endpoint0/xua_endpoint0.c | 16 ++++++++-------- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib_xua/src/core/buffer/decouple/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc index 4920c2da..c8d7ed8b 100644 --- a/lib_xua/src/core/buffer/decouple/decouple.xc +++ b/lib_xua/src/core/buffer/decouple/decouple.xc @@ -18,8 +18,8 @@ #define MAX(x,y) ((x)>(y) ? (x) : (y)) #if((defined USB_CMD_CFG_SAMP_FREQ) || (defined USB_DESCRIPTOR_OVERRIDE_RATE_RES)) -unsigned int xua_lite_curAudOutFreq(void); -unsigned int xua_lite_curAudInFreq(void); +unsigned int xua_lite_curAudToUsbFreq(void); +unsigned int xua_lite_curUsbToAudFreq(void); unsigned int xua_lite_curUSB_Res_In(void); unsigned int xua_lite_curUSB_Res_Out(void); #endif diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index 8c39d1b9..96126702 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -65,8 +65,8 @@ extern void device_reboot(void); #endif #if((defined USB_CMD_CFG_SAMP_FREQ) || (defined USB_DESCRIPTOR_OVERRIDE_RATE_RES)) -unsigned int xua_lite_curAudOutFreq(void); -unsigned int xua_lite_curAudInFreq(void); +unsigned int xua_lite_curAudToUsbFreq(void); +unsigned int xua_lite_curUsbToAudFreq(void); unsigned int xua_lite_curUSB_Res_In(void); unsigned int xua_lite_curUSB_Res_Out(void); #endif @@ -319,16 +319,16 @@ void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioCont int i=0; for(i=0;i> 8; - cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (xua_lite_curAudOutFreq() & 0xff0000)>> 16; + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i] = xua_lite_curAudToUsbFreq() & 0xff; + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 1] = (xua_lite_curAudToUsbFreq() & 0xff00)>> 8; + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (xua_lite_curAudToUsbFreq() & 0xff0000)>> 16; } for(i=0;i> 8; - cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (xua_lite_curAudInFreq() & 0xff0000)>> 16; + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i] = xua_lite_curUsbToAudFreq() & 0xff; + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 1] = (xua_lite_curUsbToAudFreq() & 0xff00)>> 8; + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 2] = (xua_lite_curUsbToAudFreq() & 0xff0000)>> 16; } cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE] = ((xua_lite_curUSB_Res_In() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff; //max packet size diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 7226f4ec..28979a3f 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -55,8 +55,8 @@ extern unsigned char mixSel[MAX_MIX_COUNT][MIX_INPUTS]; /* Global var for current frequency, set to default freq */ #ifdef USB_CMD_CFG_SAMP_FREQ -#define g_curUSBin_SamFreq xua_lite_curAudOutFreq() -#define g_curUSBout_SamFreq xua_lite_curAudInFreq() +#define g_curUSBin_SamFreq xua_lite_curAudToUsbFreq() +#define g_curUSBout_SamFreq xua_lite_curUsbToAudFreq() unsigned int g_curSamFreq = DEFAULT_FREQ; // should no longer be used #else From dac808e9fab7f97f424db632ecd9a46ccd2a59f8 Mon Sep 17 00:00:00 2001 From: shuchitak Date: Mon, 17 Feb 2020 12:09:54 +0000 Subject: [PATCH 24/38] get usb_adaptive to compile --- lib_xua/src/core/buffer/decouple/decouple.xc | 12 +++--- lib_xua/src/core/endpoint0/xua_endpoint0.c | 37 ++++++++++--------- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 11 ++++-- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/lib_xua/src/core/buffer/decouple/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc index c8d7ed8b..ef5ebdf0 100644 --- a/lib_xua/src/core/buffer/decouple/decouple.xc +++ b/lib_xua/src/core/buffer/decouple/decouple.xc @@ -18,10 +18,10 @@ #define MAX(x,y) ((x)>(y) ? (x) : (y)) #if((defined USB_CMD_CFG_SAMP_FREQ) || (defined USB_DESCRIPTOR_OVERRIDE_RATE_RES)) -unsigned int xua_lite_curAudToUsbFreq(void); -unsigned int xua_lite_curUsbToAudFreq(void); -unsigned int xua_lite_curUSB_Res_In(void); -unsigned int xua_lite_curUSB_Res_Out(void); +extern uint32_t get_usb_to_device_rate(); +extern uint32_t get_device_to_usb_rate(); +extern uint32_t get_usb_to_device_bit_res(); +extern uint32_t get_device_to_usb_bit_res(); #endif /* TODO use SLOTSIZE to potentially save memory */ @@ -165,8 +165,8 @@ int g_maxPacketSize = MAX_DEVICE_AUD_PACKET_SIZE_IN_FS; void handle_audio_request(chanend c_mix_out) { int space_left; - g_curSubSlot_Out = xua_lite_curUSB_Res_Out() >> 3; - g_curSubSlot_In = xua_lite_curUSB_Res_In() >> 3; + g_curSubSlot_Out = get_usb_to_device_bit_res() >> 3; + g_curSubSlot_In = get_device_to_usb_bit_res() >> 3; /* Input word that triggered interrupt and handshake back */ unsigned underflowSample = inuint(c_mix_out); diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index f0df91bd..bb48571b 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "xua.h" @@ -65,10 +66,10 @@ extern void device_reboot(void); #endif #if((defined USB_CMD_CFG_SAMP_FREQ) || (defined USB_DESCRIPTOR_OVERRIDE_RATE_RES)) -unsigned int xua_lite_curAudToUsbFreq(void); -unsigned int xua_lite_curUsbToAudFreq(void); -unsigned int xua_lite_curUSB_Res_In(void); -unsigned int xua_lite_curUSB_Res_Out(void); +extern uint32_t get_usb_to_device_rate(); +extern uint32_t get_device_to_usb_rate(); +extern uint32_t get_usb_to_device_bit_res(); +extern uint32_t get_device_to_usb_bit_res(); #endif unsigned int DFU_mode_active = 0; // 0 - App active, 1 - DFU active @@ -345,33 +346,33 @@ void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioCont #ifdef USB_DESCRIPTOR_OVERRIDE_RATE_RES //change USB descriptor frequencies and bit resolution values here - cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME] = xua_lite_curUSB_Res_In() >> 3; //sub frame rate = bit rate /8 - cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (xua_lite_curUSB_Res_In() & 0xff); //bit resolution + 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] = xua_lite_curUSB_Res_Out() >> 3; //sub frame rate = bit rate /8 - cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_SUB_FRAME + 1] = (xua_lite_curUSB_Res_Out() & 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 "sing 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] = (xua_lite_curAudToUsbFreq() & 0xff0000)>> 16; + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i] = get_device_to_usb_rate() & 0xff; + cfgDesc_Audio1[USB_AS_IN_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 1] = (get_device_to_usb_rate() & 0xff00)>> 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] = (xua_lite_curUsbToAudFreq() & 0xff0000)>> 16; + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i] = get_usb_to_device_rate() & 0xff; + cfgDesc_Audio1[USB_AS_OUT_INTERFACE_DESCRIPTOR_OFFSET_FREQ + 3*i + 1] = (get_usb_to_device_rate() & 0xff00)>> 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] = ((xua_lite_curUSB_Res_In() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff; //max packet size - cfgDesc_Audio1[USB_AS_IN_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((xua_lite_curUSB_Res_In() >> 3) * MAX_PACKET_SIZE_MULT_IN_FS) & 0xff00) >> 8; //max packet size + 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] = ((xua_lite_curUSB_Res_Out() >> 3) * MAX_PACKET_SIZE_MULT_OUT_FS) & 0xff; //max packet size - cfgDesc_Audio1[USB_AS_OUT_EP_DESCRIPTOR_OFFSET_MAXPACKETSIZE + 1] = (((xua_lite_curUSB_Res_Out() >> 3) * MAX_PACKET_SIZE_MULT_OUT_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 diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 28979a3f..cfe349f3 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -53,10 +53,15 @@ extern unsigned char mixSel[MAX_MIX_COUNT][MIX_INPUTS]; #endif + /* Global var for current frequency, set to default freq */ -#ifdef USB_CMD_CFG_SAMP_FREQ -#define g_curUSBin_SamFreq xua_lite_curAudToUsbFreq() -#define g_curUSBout_SamFreq xua_lite_curUsbToAudFreq() +#if((defined USB_CMD_CFG_SAMP_FREQ) || (defined USB_DESCRIPTOR_OVERRIDE_RATE_RES)) +extern uint32_t get_usb_to_device_rate(); +extern uint32_t get_device_to_usb_rate(); +extern uint32_t get_usb_to_device_bit_res(); +extern uint32_t get_device_to_usb_bit_res(); +#define g_curUSBin_SamFreq get_device_to_usb_rate() +#define g_curUSBout_SamFreq get_usb_to_device_rate() unsigned int g_curSamFreq = DEFAULT_FREQ; // should no longer be used #else From 1efe7c88225c660b12e20b82830554384d15346c Mon Sep 17 00:00:00 2001 From: Keith Au Date: Tue, 18 Feb 2020 15:40:53 +0800 Subject: [PATCH 25/38] removed USB_CMD_CFG_SAMP_FREQ related codes --- lib_xua/src/core/buffer/decouple/decouple.xc | 2 +- lib_xua/src/core/endpoint0/xua_endpoint0.c | 2 +- .../src/core/endpoint0/xua_ep0_descriptors.h | 91 ------------------- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 4 +- 4 files changed, 4 insertions(+), 95 deletions(-) diff --git a/lib_xua/src/core/buffer/decouple/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc index ef5ebdf0..6fc1b5c9 100644 --- a/lib_xua/src/core/buffer/decouple/decouple.xc +++ b/lib_xua/src/core/buffer/decouple/decouple.xc @@ -17,7 +17,7 @@ #endif #define MAX(x,y) ((x)>(y) ? (x) : (y)) -#if((defined USB_CMD_CFG_SAMP_FREQ) || (defined USB_DESCRIPTOR_OVERRIDE_RATE_RES)) +#if(defined USB_DESCRIPTOR_OVERRIDE_RATE_RES) extern uint32_t get_usb_to_device_rate(); extern uint32_t get_device_to_usb_rate(); extern uint32_t get_usb_to_device_bit_res(); diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index bb48571b..18ae1ee6 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -65,7 +65,7 @@ extern void device_reboot(void); #include "xua_hid.h" #endif -#if((defined USB_CMD_CFG_SAMP_FREQ) || (defined USB_DESCRIPTOR_OVERRIDE_RATE_RES)) +#if(defined USB_DESCRIPTOR_OVERRIDE_RATE_RES) extern uint32_t get_usb_to_device_rate(); extern uint32_t get_device_to_usb_rate(); extern uint32_t get_usb_to_device_bit_res(); diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index cee0f709..c66c6dba 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -2364,11 +2364,7 @@ const unsigned num_freqs_a1 = MAX(3, (0 #if ((NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)) #define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (58 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES + HID_INTERFACE_BYTES) #else - #ifdef USB_CMD_CFG_SAMP_FREQ - #define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3) + (40 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES + HID_INTERFACE_BYTES) - #else #define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES + HID_INTERFACE_BYTES) - #endif //USB_CMD_CFG_SAMP_FREQ #endif #ifdef USB_DESCRIPTOR_OVERRIDE_RATE_RES @@ -2618,14 +2614,6 @@ unsigned char cfgDesc_Audio1[] = NUM_USB_CHAN_OUT_FS, /* nrChannels */ FS_STREAM_FORMAT_OUTPUT_1_SUBSLOT_BYTES, /* subFrameSize */ FS_STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS, /* bitResolution */ - - #ifdef USB_CMD_CFG_SAMP_FREQ - USB_OUT_SAMP_FREQ_NUM, - CHARIFY_SR(USB_OUT_SAMP_FREQ_0), - CHARIFY_SR(USB_OUT_SAMP_FREQ_1), - CHARIFY_SR(USB_OUT_SAMP_FREQ_2), - #else - num_freqs_a1, /* SamFreqType - sample freq count */ /* Windows enum issue with <= two sample rates work around */ @@ -2678,7 +2666,6 @@ unsigned char cfgDesc_Audio1[] = #if (MIN_FREQ <= 96000) && (MAX_FREQ_FS >= 96000) 0x00, 0x77, 0x01, /* sampleFreq - 96KHz */ #endif - #endif //USB_CMD_CFG_SAMP_FREQ /* Standard AS Isochronous Audio Data Endpoint Descriptor 4.6.1.1 */ 0x09, @@ -2771,13 +2758,6 @@ unsigned char cfgDesc_Audio1[] = NUM_USB_CHAN_IN_FS, /* bNrChannels - Typically 2 */ FS_STREAM_FORMAT_INPUT_1_SUBSLOT_BYTES, /* subFrameSize - Typically 4 bytes per slot */ FS_STREAM_FORMAT_INPUT_1_RESOLUTION_BITS, /* bitResolution - Typically 24bit */ - -#ifdef USB_CMD_CFG_SAMP_FREQ - USB_IN_SAMP_FREQ_NUM, - CHARIFY_SR(USB_IN_SAMP_FREQ_0), - CHARIFY_SR(USB_IN_SAMP_FREQ_1), - CHARIFY_SR(USB_IN_SAMP_FREQ_2), -#else num_freqs_a1, /* SamFreqType - sample freq count */ /* Windows enum issue with <= two sample rates work around */ @@ -2830,7 +2810,6 @@ unsigned char cfgDesc_Audio1[] = #if (MIN_FREQ <= 96000) && (MAX_FREQ_FS >= 96000) 0x00, 0x77, 0x01, /* sampleFreq - 96KHz */ #endif -#endif //USB_CMD_CFG_SAMP_FREQ /* Standard Endpoint Descriptor */ 0x09, @@ -2863,76 +2842,6 @@ unsigned char cfgDesc_Audio1[] = 0x00, /* Undefined */ 0x00, 0x00, /* Not used */ #endif // XUA_ADAPTIVE - -#ifdef USB_CMD_CFG_SAMP_FREQ //add extra Interface Descriptor in case mulitple bit resolution is needed to be offered to host - /* Standard Interface Descriptor - Audio streaming IN */ - 0x09, - 0x04, /* INTERFACE */ - (OUTPUT_INTERFACES_A1 + 1), /* bInterfaceNumber */ - 0x02, /* AlternateSetting */ - 0x01, /* bNumEndpoints */ - 0x01, /* Interface class - AUDIO */ - 0x02, /* Subclass - AUDIO_STREAMING */ - 0x00, /* Unused */ - offsetof(StringDescTable_t, inputInterfaceStr_Audio1)/sizeof(char *), - - /* CS_Interface AC interface header descriptor */ - 0x07, - UAC_CS_DESCTYPE_INTERFACE, - 0x01, /* subtype - GENERAL */ - 0x07, /* TerminalLink - linked to Streaming OUT terminal */ - 0x01, /* Interface delay */ - 0x01,0x00, /* Format - PCM */ - - /* CS_Interface Terminal Descriptor */ - (8 + (num_freqs_a1 * 3)), - UAC_CS_DESCTYPE_INTERFACE, - 0x02, /* Subtype - FORMAT_TYPE */ - 0x01, /* Format type - FORMAT_TYPE_1 */ - NUM_USB_CHAN_IN_FS, /* bNrChannels - Typically 2 */ - FS_STREAM_FORMAT_INPUT_1_SUBSLOT_BYTES, /* subFrameSize - Typically 4 bytes per slot */ - FS_STREAM_FORMAT_INPUT_1_RESOLUTION_BITS, /* bitResolution - Typically 24bit */ - - USB_IN_SAMP_FREQ_NUM, - CHARIFY_SR(USB_IN_SAMP_FREQ_0), - CHARIFY_SR(USB_IN_SAMP_FREQ_1), - CHARIFY_SR(USB_IN_SAMP_FREQ_2), - - - /* Standard Endpoint Descriptor */ - 0x09, - 0x05, /* ENDPOINT */ - ENDPOINT_ADDRESS_IN_AUDIO, /* EndpointAddress */ -#ifdef XUA_ADAPTIVE - ISO_EP_ATTRIBUTES_ADAPTIVE, -#else - #if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP) - ISO_EP_ATTRIBUTES_ASYNCH, /* Iso, async, data endpoint */ - #else - ISO_EP_IMPL_ATTRIBUTES_ASYNCH, /* Feedback data endpoint */ - #endif -#endif - FS_STREAM_FORMAT_INPUT_1_MAXPACKETSIZE&0xff, /* 4 wMaxPacketSize (Typically 294 bytes)*/ - (FS_STREAM_FORMAT_INPUT_1_MAXPACKETSIZE&0xff00)>>8, /* 5 wMaxPacketSize */ - 0x01, /* bInterval */ - 0x00, /* bRefresh */ - 0x00, /* bSynchAddress */ - - /* CS_Endpoint Descriptor */ - 0x07, - 0x25, /* CS_ENDPOINT */ - 0x01, /* Subtype - GENERAL */ - 0x01, /* Attributes. D[0]: sample freq ctrl. */ -#ifdef XUA_ADAPTIVE - 0x02, /* Lock Delay units PCM samples*/ - 0x08, 0x00, /* No lock delay */ -#else - 0x00, /* Undefined */ - 0x00, 0x00, /* Not used */ -#endif // XUA_ADAPTIVE -#endif//USB_CMD_CFG_SAMP_FREQ - - #endif #if (XUA_DFU_EN == 1) && (FORCE_UAC1_DFU == 1) diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index cfe349f3..d08555b6 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -55,7 +55,7 @@ extern unsigned char mixSel[MAX_MIX_COUNT][MIX_INPUTS]; /* Global var for current frequency, set to default freq */ -#if((defined USB_CMD_CFG_SAMP_FREQ) || (defined USB_DESCRIPTOR_OVERRIDE_RATE_RES)) +#if(defined USB_DESCRIPTOR_OVERRIDE_RATE_RES) extern uint32_t get_usb_to_device_rate(); extern uint32_t get_device_to_usb_rate(); extern uint32_t get_usb_to_device_bit_res(); @@ -1121,7 +1121,7 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp { return result; } -#if ((MAX_FREQ != MIN_FREQ) || (defined USB_CMD_CFG_SAMP_FREQ)) +#if (MAX_FREQ != MIN_FREQ) if(controlSelector == SAMPLING_FREQ_CONTROL) { /* Expect length 3 for sample rate */ From 050d7757bcbd8c8f6dd767213305de9053ab713b Mon Sep 17 00:00:00 2001 From: shuchitak Date: Tue, 18 Feb 2020 09:04:57 +0000 Subject: [PATCH 26/38] removed unused defines --- lib_xua/api/xua_conf_default.h | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index e4e85c7b..79aa061b 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -226,34 +226,6 @@ #define DEFAULT_FREQ (MIN_FREQ) #endif -/** - * @brief Default Audio output sampling frequency - */ -#ifndef DEFAULT_AUD_TO_USB_FREQ -#define DEFAULT_AUD_TO_USB_FREQ (48000) -#endif - -/** - * @brief Default Reference input sampling frequency - */ -#ifndef DEFAULT_USB_TO_AUD_FREQ -#define DEFAULT_USB_TO_AUD_FREQ (48000) -#endif - -/** - * @brief Default USB input (Audio output) bit resolution - */ -#ifndef DEFAULT_BIT_RES_IN -#define DEFAULT_BIT_RES_IN (32) -#endif - -/** - * @brief Default USB output (Reference input) bit resolution - */ -#ifndef DEFAULT_BIT_RES_OUT -#define DEFAULT_BIT_RES_OUT (32) -#endif - /* Audio Class Defines */ /** From c63df2e961277404fa6017aef6a90e96602d67d9 Mon Sep 17 00:00:00 2001 From: shuchitak Date: Tue, 18 Feb 2020 10:20:25 +0000 Subject: [PATCH 27/38] update g_curSubSlot_Out and g_curSubSlot_In under #if USB_DESCRIPTOR_OVERRIDE_RATE_RES --- lib_xua/src/core/buffer/decouple/decouple.xc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_xua/src/core/buffer/decouple/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc index 6fc1b5c9..d7634195 100644 --- a/lib_xua/src/core/buffer/decouple/decouple.xc +++ b/lib_xua/src/core/buffer/decouple/decouple.xc @@ -165,8 +165,10 @@ int g_maxPacketSize = MAX_DEVICE_AUD_PACKET_SIZE_IN_FS; void handle_audio_request(chanend c_mix_out) { int space_left; +#if(defined USB_DESCRIPTOR_OVERRIDE_RATE_RES) g_curSubSlot_Out = get_usb_to_device_bit_res() >> 3; g_curSubSlot_In = get_device_to_usb_bit_res() >> 3; +#endif /* Input word that triggered interrupt and handshake back */ unsigned underflowSample = inuint(c_mix_out); From 0b5ddbd85e5413d0cf10fd69fdab21a678bea5e0 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Wed, 19 Feb 2020 16:52:52 +0800 Subject: [PATCH 28/38] fixed typo of comments --- lib_xua/src/core/endpoint0/xua_endpoint0.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index 18ae1ee6..cce5a9c9 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -352,7 +352,7 @@ void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioCont 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 "sing a value of <=2 or > 7 for num_freqs_a1 causes enumeration issues on Windows" in xua_ep0_descriptors.h + 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 Date: Wed, 19 Feb 2020 15:45:58 +0000 Subject: [PATCH 29/38] undo changes in xua_ep0_uacreqs --- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 47 ++++--------------- 1 file changed, 8 insertions(+), 39 deletions(-) diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index d08555b6..2fdd434c 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -17,13 +17,6 @@ #ifdef MIXER #include "mixer.h" #endif -#include "xua_conf_default.h" -#include "descriptor_defs.h" - - -#define DEBUG_UNIT XUA_EP0_UACREQS -#define DEBUG_PRINT_ENABLE_XUA_EP0_UACREQS 0 -#include "debug_print.h" #define CS_XU_MIXSEL (0x06) @@ -52,23 +45,8 @@ extern unsigned char channelMapUsb[NUM_USB_CHAN_IN]; extern unsigned char mixSel[MAX_MIX_COUNT][MIX_INPUTS]; #endif - - /* Global var for current frequency, set to default freq */ -#if(defined USB_DESCRIPTOR_OVERRIDE_RATE_RES) -extern uint32_t get_usb_to_device_rate(); -extern uint32_t get_device_to_usb_rate(); -extern uint32_t get_usb_to_device_bit_res(); -extern uint32_t get_device_to_usb_bit_res(); -#define g_curUSBin_SamFreq get_device_to_usb_rate() -#define g_curUSBout_SamFreq get_usb_to_device_rate() - -unsigned int g_curSamFreq = DEFAULT_FREQ; // should no longer be used -#else -unsigned int g_curUSBin_SamFreq = DEFAULT_FREQ; -unsigned int g_curUSBout_SamFreq = DEFAULT_FREQ; -unsigned int g_curSamFreq = DEFAULT_FREQ; // should no longer be used -#endif +unsigned int g_curSamFreq = DEFAULT_FREQ; #if 0 unsigned int g_curSamFreq48000Family = DEFAULT_FREQ % 48000 == 0; @@ -1099,7 +1077,6 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp * bmRequestType.Recipient = Endpoint * bmRequestType.Type = Class * endpoint (wIndex & 0xff) is 0x01 or 0x82 - * wIndex is endpoint address for distinguishing input and output */ XUD_Result_t result; @@ -1130,8 +1107,7 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp /* Recontruct sample-freq */ int newSampleRate = (buffer, unsigned char[])[0] | ((buffer, unsigned char[])[1] << 8) | ((buffer, unsigned char[])[2] << 16); - if(((sp.wIndex == ENDPOINT_ADDRESS_IN_AUDIO) && (newSampleRate != g_curUSBin_SamFreq)) || \ - ((sp.wIndex == ENDPOINT_ADDRESS_OUT_AUDIO) && (newSampleRate != g_curUSBout_SamFreq))) + if(newSampleRate != g_curSamFreq) { int curSamFreq44100Family; int curSamFreq48000Family; @@ -1143,25 +1119,18 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp if(curSamFreq48000Family || curSamFreq44100Family) { - if(sp.wIndex == ENDPOINT_ADDRESS_IN_AUDIO){ - g_curUSBin_SamFreq = newSampleRate; - /* Instruct audio thread to change sample freq */ - outuint(c_audioControl, SET_SAMPLE_FREQ); - outuint(c_audioControl, g_curUSBin_SamFreq); - } - else{ //if sp.wIndex == ENDPOINT_ADDRESS_OUT_AUDIO - g_curUSBout_SamFreq = newSampleRate; - /* Instruct audio thread to change sample freq */ - outuint(c_audioControl, SET_SAMPLE_FREQ); - outuint(c_audioControl, g_curUSBout_SamFreq); - } + g_curSamFreq = newSampleRate; + + /* Instruct audio thread to change sample freq */ + outuint(c_audioControl, SET_SAMPLE_FREQ); + outuint(c_audioControl, g_curSamFreq); /* Wait for handshake back - i.e. pll locked and clocks okay */ chkct(c_audioControl, XS1_CT_END); /* Allow time for the change - feedback to stabilise */ FeedbackStabilityDelay(); - } + } } return XUD_SetBuffer(ep0_in, (buffer, unsigned char[]), 0); } From 4ae9956a139baeff95eb0ae17f0648d1ee020f05 Mon Sep 17 00:00:00 2001 From: shuchitak Date: Thu, 20 Feb 2020 09:20:24 +0000 Subject: [PATCH 30/38] changelog + source check --- CHANGELOG.rst | 2 +- lib_xua/src/core/buffer/decouple/decouple.xc | 2 +- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h | 2 +- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index a01c8c9d..115011b7 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -21,7 +21,7 @@ lib_xua Change Log 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: Support of variable USB sampling frequency + * ADDED: Override USB descriptor with sampling frequency and bit-resolution set at boot time. 0.2.1 ----- diff --git a/lib_xua/src/core/buffer/decouple/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc index d7634195..b6dffe51 100644 --- a/lib_xua/src/core/buffer/decouple/decouple.xc +++ b/lib_xua/src/core/buffer/decouple/decouple.xc @@ -1,4 +1,4 @@ -// Copyright (c) 2011-2019, XMOS Ltd, All rights reserved +// Copyright (c) 2011-2020, XMOS Ltd, All rights reserved #include "xua.h" #if XUA_USB_EN diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h index ab4c613d..f8c7cc33 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2018, XMOS Ltd, All rights reserved +// Copyright (c) 2014-2020, XMOS Ltd, All rights reserved #ifndef _AUDIOREQUESTS_H_ #define _AUDIOREQUESTS_H_ diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 2fdd434c..2ce05108 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -1,4 +1,4 @@ -// Copyright (c) 2011-2018, XMOS Ltd, All rights reserved +// Copyright (c) 2011-2020, XMOS Ltd, All rights reserved /** * @brief Implements relevant requests from the USB Audio 2.0 Specification * @author Ross Owen, XMOS Semiconductor From b31028a3d65ebb2d7c7c50736f7b5ab95d95fa79 Mon Sep 17 00:00:00 2001 From: shuchitak Date: Thu, 20 Feb 2020 09:28:16 +0000 Subject: [PATCH 31/38] undo copyright change --- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h | 2 +- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h index f8c7cc33..ab4c613d 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2020, XMOS Ltd, All rights reserved +// Copyright (c) 2014-2018, XMOS Ltd, All rights reserved #ifndef _AUDIOREQUESTS_H_ #define _AUDIOREQUESTS_H_ diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 2ce05108..2fdd434c 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -1,4 +1,4 @@ -// Copyright (c) 2011-2020, XMOS Ltd, All rights reserved +// Copyright (c) 2011-2018, XMOS Ltd, All rights reserved /** * @brief Implements relevant requests from the USB Audio 2.0 Specification * @author Ross Owen, XMOS Semiconductor From abbafba3a714db5b4a4996e0f42e8a81246d3dbf Mon Sep 17 00:00:00 2001 From: shuchitak Date: Thu, 20 Feb 2020 09:59:52 +0000 Subject: [PATCH 32/38] changelog and source --- CHANGELOG.rst | 3 ++- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h | 2 +- lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 115011b7..863e2c29 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -21,7 +21,8 @@ lib_xua Change Log 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: Override USB descriptor with sampling frequency and bit-resolution set at boot time. + * ADDED: Override USB descriptor with sampling frequency and + bit-resolution set at boot time. 0.2.1 ----- diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h index ab4c613d..f8c7cc33 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.h @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2018, XMOS Ltd, All rights reserved +// Copyright (c) 2014-2020, XMOS Ltd, All rights reserved #ifndef _AUDIOREQUESTS_H_ #define _AUDIOREQUESTS_H_ diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 2fdd434c..2ce05108 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -1,4 +1,4 @@ -// Copyright (c) 2011-2018, XMOS Ltd, All rights reserved +// Copyright (c) 2011-2020, XMOS Ltd, All rights reserved /** * @brief Implements relevant requests from the USB Audio 2.0 Specification * @author Ross Owen, XMOS Semiconductor From d125860552be450e402f530e9ecfbb69f40862c2 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Fri, 28 Feb 2020 10:48:46 +0800 Subject: [PATCH 33/38] changed define name USB_DESCRIPTOR_OVERRIDE_RATE_RES to XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES --- lib_xua/src/core/buffer/decouple/decouple.xc | 4 ++-- lib_xua/src/core/endpoint0/xua_endpoint0.c | 4 ++-- lib_xua/src/core/endpoint0/xua_ep0_descriptors.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_xua/src/core/buffer/decouple/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc index b6dffe51..d501ad9f 100644 --- a/lib_xua/src/core/buffer/decouple/decouple.xc +++ b/lib_xua/src/core/buffer/decouple/decouple.xc @@ -17,7 +17,7 @@ #endif #define MAX(x,y) ((x)>(y) ? (x) : (y)) -#if(defined USB_DESCRIPTOR_OVERRIDE_RATE_RES) +#if(defined XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES) extern uint32_t get_usb_to_device_rate(); extern uint32_t get_device_to_usb_rate(); extern uint32_t get_usb_to_device_bit_res(); @@ -165,7 +165,7 @@ int g_maxPacketSize = MAX_DEVICE_AUD_PACKET_SIZE_IN_FS; void handle_audio_request(chanend c_mix_out) { int space_left; -#if(defined USB_DESCRIPTOR_OVERRIDE_RATE_RES) +#if(defined XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES) g_curSubSlot_Out = get_usb_to_device_bit_res() >> 3; g_curSubSlot_In = get_device_to_usb_bit_res() >> 3; #endif diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index cce5a9c9..972f4a61 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -65,7 +65,7 @@ extern void device_reboot(void); #include "xua_hid.h" #endif -#if(defined USB_DESCRIPTOR_OVERRIDE_RATE_RES) +#if(defined XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES) extern uint32_t get_usb_to_device_rate(); extern uint32_t get_device_to_usb_rate(); extern uint32_t get_usb_to_device_bit_res(); @@ -344,7 +344,7 @@ void XUA_Endpoint0_init(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioCont } #endif -#ifdef USB_DESCRIPTOR_OVERRIDE_RATE_RES //change USB descriptor frequencies and bit resolution values here +#ifdef XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES //change USB descriptor frequencies and bit resolution values here 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 diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index c66c6dba..5e51b3dd 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -2367,7 +2367,7 @@ const unsigned num_freqs_a1 = MAX(3, (0 #define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES + HID_INTERFACE_BYTES) #endif -#ifdef USB_DESCRIPTOR_OVERRIDE_RATE_RES +#ifdef XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES #define AS_INTERFACE_BYTES (7) #define INTERFACE_DESCRIPTOR_BYTES (9) #define AS_FORMAT_TYPE_BYTES (17) From d3f2220be48d1a4a7b2b90316dd78237b3f2a6c6 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Fri, 28 Feb 2020 15:53:27 +0800 Subject: [PATCH 34/38] added xua_api.h for extern declaration of get/set_usb_to/from_device_rate/res APIs and removed from c/xc files --- lib_xua/api/xua_api.h | 18 ++++++++++++++++++ lib_xua/src/core/buffer/decouple/decouple.xc | 7 +------ lib_xua/src/core/endpoint0/xua_endpoint0.c | 9 ++------- 3 files changed, 21 insertions(+), 13 deletions(-) create mode 100644 lib_xua/api/xua_api.h diff --git a/lib_xua/api/xua_api.h b/lib_xua/api/xua_api.h new file mode 100644 index 00000000..f3d3c735 --- /dev/null +++ b/lib_xua/api/xua_api.h @@ -0,0 +1,18 @@ +// Copyright (c) 2017-2020, XMOS Ltd, All rights reserved + +#ifndef __XUA_API_H__ +#define __XUA_API_H__ + +#if __XC__ +extern void set_usb_to_device_rate(uint32_t rate); +extern void set_device_to_usb_rate(uint32_t rate); +extern void set_usb_to_device_bit_res(uint32_t rate); +extern void set_device_to_usb_bit_res(uint32_t rate); +#endif + +extern uint32_t get_usb_to_device_rate(); +extern uint32_t get_device_to_usb_rate(); +extern uint32_t get_usb_to_device_bit_res(); +extern uint32_t get_device_to_usb_bit_res(); + +#endif //__XUA_API_H__ diff --git a/lib_xua/src/core/buffer/decouple/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc index d501ad9f..ae6d8ed5 100644 --- a/lib_xua/src/core/buffer/decouple/decouple.xc +++ b/lib_xua/src/core/buffer/decouple/decouple.xc @@ -7,6 +7,7 @@ #include "interrupt.h" #include "xua_commands.h" #include "xud.h" +#include "xua_api.h" #ifdef NATIVE_DSD #include "usbaudio20.h" /* Defines from the USB Audio 2.0 Specifications */ @@ -17,12 +18,6 @@ #endif #define MAX(x,y) ((x)>(y) ? (x) : (y)) -#if(defined XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES) -extern uint32_t get_usb_to_device_rate(); -extern uint32_t get_device_to_usb_rate(); -extern uint32_t get_usb_to_device_bit_res(); -extern uint32_t get_device_to_usb_bit_res(); -#endif /* TODO use SLOTSIZE to potentially save memory */ /* Note we could improve on this, for one subslot is set to 4 */ diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index 972f4a61..0a5dbcac 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -29,6 +29,8 @@ #include "dsd_support.h" #endif +#include "xua_api.h" + #ifndef __XC__ /* Support for xCORE channels in C */ #define null 0 @@ -65,13 +67,6 @@ extern void device_reboot(void); #include "xua_hid.h" #endif -#if(defined XUA_USB_DESCRIPTOR_OVERWRITE_RATE_RES) -extern uint32_t get_usb_to_device_rate(); -extern uint32_t get_device_to_usb_rate(); -extern uint32_t get_usb_to_device_bit_res(); -extern uint32_t get_device_to_usb_bit_res(); -#endif - unsigned int DFU_mode_active = 0; // 0 - App active, 1 - DFU active /* Global volume and mute tables */ From dbaf66fdb286e8d35a49fb9ae6d604ed3bae61e3 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Fri, 28 Feb 2020 17:08:58 +0800 Subject: [PATCH 35/38] removed #if XC check --- lib_xua/api/xua_api.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib_xua/api/xua_api.h b/lib_xua/api/xua_api.h index f3d3c735..460c4008 100644 --- a/lib_xua/api/xua_api.h +++ b/lib_xua/api/xua_api.h @@ -3,12 +3,10 @@ #ifndef __XUA_API_H__ #define __XUA_API_H__ -#if __XC__ extern void set_usb_to_device_rate(uint32_t rate); extern void set_device_to_usb_rate(uint32_t rate); extern void set_usb_to_device_bit_res(uint32_t rate); extern void set_device_to_usb_bit_res(uint32_t rate); -#endif extern uint32_t get_usb_to_device_rate(); extern uint32_t get_device_to_usb_rate(); From cd8e46308f802befe78261938beae3d25bf64b31 Mon Sep 17 00:00:00 2001 From: Keith Au Date: Fri, 28 Feb 2020 17:14:47 +0800 Subject: [PATCH 36/38] renamed xua_api.h to xua_usb_params_funcs.h --- lib_xua/api/{xua_api.h => xua_usb_params_funcs.h} | 0 lib_xua/src/core/buffer/decouple/decouple.xc | 2 +- lib_xua/src/core/endpoint0/xua_endpoint0.c | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename lib_xua/api/{xua_api.h => xua_usb_params_funcs.h} (100%) diff --git a/lib_xua/api/xua_api.h b/lib_xua/api/xua_usb_params_funcs.h similarity index 100% rename from lib_xua/api/xua_api.h rename to lib_xua/api/xua_usb_params_funcs.h diff --git a/lib_xua/src/core/buffer/decouple/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc index ae6d8ed5..f217b0e4 100644 --- a/lib_xua/src/core/buffer/decouple/decouple.xc +++ b/lib_xua/src/core/buffer/decouple/decouple.xc @@ -7,7 +7,7 @@ #include "interrupt.h" #include "xua_commands.h" #include "xud.h" -#include "xua_api.h" +#include "xua_usb_params_funcs.h" #ifdef NATIVE_DSD #include "usbaudio20.h" /* Defines from the USB Audio 2.0 Specifications */ diff --git a/lib_xua/src/core/endpoint0/xua_endpoint0.c b/lib_xua/src/core/endpoint0/xua_endpoint0.c index 0a5dbcac..2a183c72 100755 --- a/lib_xua/src/core/endpoint0/xua_endpoint0.c +++ b/lib_xua/src/core/endpoint0/xua_endpoint0.c @@ -29,7 +29,7 @@ #include "dsd_support.h" #endif -#include "xua_api.h" +#include "xua_usb_params_funcs.h" #ifndef __XC__ /* Support for xCORE channels in C */ From 8b52c83b4c14f8505f0551fb5f49d10cf15f132a Mon Sep 17 00:00:00 2001 From: shuchitak Date: Fri, 28 Feb 2020 10:38:54 +0000 Subject: [PATCH 37/38] include stdint.h --- lib_xua/api/xua_usb_params_funcs.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_xua/api/xua_usb_params_funcs.h b/lib_xua/api/xua_usb_params_funcs.h index 460c4008..2c815943 100644 --- a/lib_xua/api/xua_usb_params_funcs.h +++ b/lib_xua/api/xua_usb_params_funcs.h @@ -3,6 +3,8 @@ #ifndef __XUA_API_H__ #define __XUA_API_H__ +#include + extern void set_usb_to_device_rate(uint32_t rate); extern void set_device_to_usb_rate(uint32_t rate); extern void set_usb_to_device_bit_res(uint32_t rate); From 73015bc44f42e19db6c52d794354ad99c2bf6877 Mon Sep 17 00:00:00 2001 From: shuchitak Date: Fri, 28 Feb 2020 11:22:26 +0000 Subject: [PATCH 38/38] remove extern from function declaration --- lib_xua/api/xua_usb_params_funcs.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib_xua/api/xua_usb_params_funcs.h b/lib_xua/api/xua_usb_params_funcs.h index 2c815943..0a427046 100644 --- a/lib_xua/api/xua_usb_params_funcs.h +++ b/lib_xua/api/xua_usb_params_funcs.h @@ -5,14 +5,14 @@ #include -extern void set_usb_to_device_rate(uint32_t rate); -extern void set_device_to_usb_rate(uint32_t rate); -extern void set_usb_to_device_bit_res(uint32_t rate); -extern void set_device_to_usb_bit_res(uint32_t rate); +void set_usb_to_device_rate(uint32_t rate); +void set_device_to_usb_rate(uint32_t rate); +void set_usb_to_device_bit_res(uint32_t rate); +void set_device_to_usb_bit_res(uint32_t rate); -extern uint32_t get_usb_to_device_rate(); -extern uint32_t get_device_to_usb_rate(); -extern uint32_t get_usb_to_device_bit_res(); -extern uint32_t get_device_to_usb_bit_res(); +uint32_t get_usb_to_device_rate(); +uint32_t get_device_to_usb_rate(); +uint32_t get_usb_to_device_bit_res(); +uint32_t get_device_to_usb_bit_res(); #endif //__XUA_API_H__