From 6485830a73fc805d33d06c00346e31bb9b996ebc Mon Sep 17 00:00:00 2001 From: Keith Au Date: Mon, 20 Jan 2020 16:14:09 +0800 Subject: [PATCH] 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