From e3f89956ad4dc58a9a0f095b2995abfdfd821a35 Mon Sep 17 00:00:00 2001 From: Larry Snizek Date: Mon, 11 Dec 2017 15:53:39 +0000 Subject: [PATCH 01/16] Use a define for USB class of control interface (from sc_usb_audio vf_spk_1.1.2 branch) --- lib_xua/src/core/xua_ep0_descriptors.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_xua/src/core/xua_ep0_descriptors.h b/lib_xua/src/core/xua_ep0_descriptors.h index e6b71645..f619902f 100644 --- a/lib_xua/src/core/xua_ep0_descriptors.h +++ b/lib_xua/src/core/xua_ep0_descriptors.h @@ -1985,7 +1985,7 @@ USB_Config_Descriptor_Audio2_t cfgDesc_Audio2= INTERFACE_NUMBER_DFU, /* 2 bInterfaceNumber : Index of this interface. (field size 1 bytes) */ 0x00, /* 3 bAlternateSetting : Index of this setting. (field size 1 bytes) */ 0x00, /* 4 bNumEndpoints : 0 endpoints. (field size 1 bytes) */ - 0xFE, /* 5 bInterfaceClass : DFU. (field size 1 bytes) */ + 0xFE, /* 5 bInterfaceClass : DFU. (Application Specific) (field size 1 bytes) */ 0x01, /* 6 bInterfaceSubclass : (field size 1 bytes) */ 0x01, /* 7 bInterfaceProtocol : Unused. (field size 1 bytes) */ offsetof(StringDescTable_t, dfuStr)/sizeof(char *), /* 8 iInterface */ @@ -2751,7 +2751,7 @@ unsigned char cfgDesc_Audio1[] = (OUTPUT_INTERFACES_A1 + INPUT_INTERFACES_A1 + NUM_CONTROL_USB_INTERFACES + 1), /* 2 bInterfaceNumber : Index of this interface. (field size 1 bytes) */ 0x00, /* 3 bAlternateSetting : Index of this setting. (field size 1 bytes) */ 0x00, /* 4 bNumEndpoints : 0 endpoints. (field size 1 bytes) */ - 0xFE, /* 5 bInterfaceClass : DFU. (field size 1 bytes) */ + 0xFE, /* 5 bInterfaceClass : DFU. (Application Specific) (field size 1 bytes) */ 0x01, /* 6 bInterfaceSubclass : (field size 1 bytes) */ 0x01, /* 7 bInterfaceProtocol : Unused. (field size 1 bytes) */ offsetof(StringDescTable_t, dfuStr)/sizeof(char *), /* 8 iInterface */ @@ -2775,7 +2775,7 @@ unsigned char cfgDesc_Audio1[] = (OUTPUT_INTERFACES_A1 + INPUT_INTERFACES_A1 + 1), /* 2 bInterfaceNumber */ 0x00, /* 3 bAlternateSetting : Index of this setting. (field size 1 bytes) */ 0x00, /* 4 bNumEndpoints : 0 endpoints. (field size 1 bytes) */ - 0xFF, /* 5 bInterfaceClass : DFU. (field size 1 bytes) */ + USB_CLASS_VENDOR_SPECIFIC, /* 5 bInterfaceClass : Vendor specific. (field size 1 bytes) */ 0xFF, /* 6 bInterfaceSubclass : (field size 1 bytes) */ 0xFF, /* 7 bInterfaceProtocol : Unused. (field size 1 bytes) */ offsetof(StringDescTable_t, ctrlStr)/sizeof(char *), /* 8 iInterface */ From 96f55476b2bcb04e690876601100427321587100 Mon Sep 17 00:00:00 2001 From: Larry Snizek Date: Mon, 11 Dec 2017 15:55:07 +0000 Subject: [PATCH 02/16] Extra comment --- lib_xua/src/core/pdm_mics/pdm_mic.xc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_xua/src/core/pdm_mics/pdm_mic.xc b/lib_xua/src/core/pdm_mics/pdm_mic.xc index 1b55b333..9b7c56c0 100644 --- a/lib_xua/src/core/pdm_mics/pdm_mic.xc +++ b/lib_xua/src/core/pdm_mics/pdm_mic.xc @@ -69,7 +69,7 @@ void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio) mic_array_frame_time_domain * unsafe current; mic_array_decimator_config_t dc[2]; - /* Get initial sample-rate and compute decimation factor */ + /* Get initial sample-rate to run this thread at and compute decimation factor */ c_audio :> samplerate; unsigned decimationfactor = 96000/samplerate; From 2f9a89d7164ec4d28c4395d4c407784b2aff4f36 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 3 Jan 2018 16:09:11 +0000 Subject: [PATCH 03/16] Fixed BCD_DEVICE_N def --- lib_xua/api/xua_conf_default.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index 729ada18..1d5103ca 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -521,21 +521,21 @@ * @brief Device firmware version number in Binary Coded Decimal format: 0xJJMN where JJ: major, M: minor, N: sub-minor version number. */ #ifndef BCD_DEVICE_J -#define BCD_DEVICE_J 1 +#define BCD_DEVICE_J (1) #endif /** * @brief Device firmware version number in Binary Coded Decimal format: 0xJJMN where JJ: major, M: minor, N: sub-minor version number. */ #ifndef BCD_DEVICE_M -#define BCD_DEVICE_M 0 +#define BCD_DEVICE_M (0) #endif /** * @brief Device firmware version number in Binary Coded Decimal format: 0xJJMN where JJ: major, M: minor, N: sub-minor version number. */ #ifndef BCD_DEVICE_N -#define BCD_DEVICE_N +#define BCD_DEVICE_N (0) #endif /** From e322010cf1cfbb5ab5b3c70956d976bfd0a8bda2 Mon Sep 17 00:00:00 2001 From: xross Date: Thu, 4 Jan 2018 09:54:04 +0000 Subject: [PATCH 04/16] SPDIF_TX and XUA_DFU_EN changes for build --- lib_xua/api/xua_audiohub.h | 2 +- lib_xua/api/xua_conf_default.h | 9 ++------ lib_xua/src/core/audiohub/xua_audiohub.xc | 28 +++++++++++------------ lib_xua/src/core/main.xc | 16 ++++++------- 4 files changed, 25 insertions(+), 30 deletions(-) diff --git a/lib_xua/api/xua_audiohub.h b/lib_xua/api/xua_audiohub.h index f3f512ae..cb2c2498 100644 --- a/lib_xua/api/xua_audiohub.h +++ b/lib_xua/api/xua_audiohub.h @@ -22,7 +22,7 @@ * CODEC configuration functions. */ void XUA_AudioHub(chanend ?c_aud -#if defined(SPDIF_TX) && (SPDIF_TX_TILE != AUDIO_IO_TILE) +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) , chanend c_spdif_tx #endif #if(defined(SPDIF_RX) || defined(ADAT_RX)) diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index 1d5103ca..e6745f95 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -299,13 +299,8 @@ /** * @brief Enables SPDIF Tx. Default: 0 (Disabled) */ -#ifndef SPDIF_TX -#define SPDIF_TX (0) -#endif - -/* Tidy up old SPDIF usage */ -#if defined(SPDIF_TX) && (SPDIF_TX == 0) -#undef SPDIF_TX +#ifndef XUA_SPDIF_TX_EN +#define XUA_SPDIF_TX_EN (0) #endif /** diff --git a/lib_xua/src/core/audiohub/xua_audiohub.xc b/lib_xua/src/core/audiohub/xua_audiohub.xc index cd514f15..08922844 100755 --- a/lib_xua/src/core/audiohub/xua_audiohub.xc +++ b/lib_xua/src/core/audiohub/xua_audiohub.xc @@ -1,6 +1,6 @@ /** - * @file audio.xc - * @brief XMOS L1/L2 USB 2,0 Audio Reference Design. Audio Functions. + * @file xua_audiohub.xc + * @brief XMOS USB 2.0 Audio Reference Design. Audio Functions. * @author Ross Owen, XMOS Semiconductor Ltd * * This thread handles I2S and pars an additional SPDIF Tx thread. It forwards samples to the SPDIF Tx thread. @@ -19,7 +19,7 @@ #include "audioports.h" #include "audiohw.h" #include "mic_array_conf.h" -#ifdef SPDIF_TX +#if (XUA_SPDIF_TX_EN) #include "SpdifTransmit.h" #endif #ifdef ADAT_TX @@ -103,7 +103,7 @@ unsigned dsdMode = DSD_MODE_OFF; extern unsafe port p_mclk_in; extern in port p_mclk_in2; -#ifdef SPDIF_TX +#if (XUA_SPDIF_TX_EN) extern buffered out port:32 p_spdif_tx; #endif @@ -816,7 +816,7 @@ unsigned static deliver(chanend ?c_out, chanend ?c_spd_out /* Request digital data (with prefill) */ outuint(c_dig_rx, 0); #endif -#if defined(SPDIF_TX) && (NUM_USB_CHAN_OUT > 0) +#if (XUA_SPDIF_TX_EN) && (NUM_USB_CHAN_OUT > 0) outuint(c_spd_out, samplesOut[SPDIF_TX_INDEX]); /* Forward sample to S/PDIF Tx thread */ unsigned sample = samplesOut[SPDIF_TX_INDEX + 1]; outuint(c_spd_out, sample); /* Forward sample to S/PDIF Tx thread */ @@ -1023,7 +1023,7 @@ unsigned static deliver(chanend ?c_out, chanend ?c_spd_out return 0; } -#if defined(SPDIF_TX) && (SPDIF_TX_TILE != AUDIO_IO_TILE) +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) void SpdifTxWrapper(chanend c_spdif_tx) { unsigned portId; @@ -1102,7 +1102,7 @@ static void dummy_deliver(chanend ?c_out, unsigned &command) } void XUA_AudioHub(chanend ?c_mix_out -#if defined(SPDIF_TX) && (SPDIF_TX_TILE != AUDIO_IO_TILE) +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) chanend c_spdif_out, #endif #if (defined(ADAT_RX) || defined(SPDIF_RX)) @@ -1116,7 +1116,7 @@ chanend c_dig_rx, #endif ) { -#if defined (SPDIF_TX) && (SPDIF_TX_TILE == AUDIO_IO_TILE) +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE == AUDIO_IO_TILE) chan c_spdif_out; #endif #ifdef ADAT_TX @@ -1155,12 +1155,12 @@ chanend c_dig_rx, configure_clock_src(clk_mst_spd, p_mclk_in); configure_out_port_no_ready(p_adat_tx, clk_mst_spd, 0); set_clock_fall_delay(clk_mst_spd, 7); -#ifndef SPDIF_TX +#if (XUA_SPDIF_TX_EN == 0) start_clock(clk_mst_spd); #endif #endif /* Configure ADAT/SPDIF tx ports */ -#if defined(SPDIF_TX) && (SPDIF_TX_TILE == AUDIO_IO_TILE) +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE == AUDIO_IO_TILE) SpdifTransmitPortConfig(p_spdif_tx, clk_mst_spd, p_mclk_in); #endif @@ -1307,7 +1307,7 @@ chanend c_dig_rx, par { -#if defined(SPDIF_TX) && (SPDIF_TX_TILE == AUDIO_IO_TILE) +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE == AUDIO_IO_TILE) { set_thread_fast_mode_on(); SpdifTransmit(p_spdif_tx, c_spdif_out); @@ -1321,7 +1321,7 @@ chanend c_dig_rx, } #endif { -#ifdef SPDIF_TX +#if (XUA_SPDIF_TX_EN) /* Communicate master clock and sample freq to S/PDIF thread */ outuint(c_spdif_out, curSamFreq); outuint(c_spdif_out, mClk); @@ -1346,7 +1346,7 @@ chanend c_dig_rx, outuint(c_adat_out, adatSmuxMode); #endif command = deliver(c_mix_out -#ifdef SPDIF_TX +#if (XUA_SPDIF_TX_EN) , c_spdif_out #else , null @@ -1412,7 +1412,7 @@ chanend c_dig_rx, #endif /* NO_USB */ -#ifdef SPDIF_TX +#if (XUA_SPDIF_TX_EN) /* Notify S/PDIF task of impending new freq... */ outct(c_spdif_out, XS1_CT_END); #endif diff --git a/lib_xua/src/core/main.xc b/lib_xua/src/core/main.xc index a69bc01d..d2e01db6 100755 --- a/lib_xua/src/core/main.xc +++ b/lib_xua/src/core/main.xc @@ -1,5 +1,5 @@ -#include "xua.h" /* Device specific defines */ +#include "xua.h" /* Device specific defines */ #ifndef EXCLUDE_USB_AUDIO_MAIN /** @@ -137,7 +137,7 @@ unsafe on tile[XUD_TILE] : in port p_for_mclk_count = PORT_MCLK_COUNT; #endif -#ifdef SPDIF_TX +#if (XUA_SPDIF_TX_EN == 1) on tile[SPDIF_TX_TILE] : buffered out port:32 p_spdif_tx = PORT_SPDIF_OUT; #endif @@ -423,7 +423,7 @@ VENDOR_REQUESTS_PARAMS_DEC_ #endif /* NO_USB */ void usb_audio_io(chanend ?c_aud_in, chanend ?c_adc, -#if defined(SPDIF_TX) && (SPDIF_TX_TILE != AUDIO_IO_TILE) +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) chanend c_spdif_tx, #endif #ifdef MIXER @@ -433,7 +433,7 @@ void usb_audio_io(chanend ?c_aud_in, chanend ?c_adc, chanend ?c_adat_rx, chanend ?c_clk_ctl, chanend ?c_clk_int -#if (XUD_TILE != 0) && (AUDIO_IO_TILE == 0) +#if (XUD_TILE != 0) && (AUDIO_IO_TILE == 0) && (XUA_DFU_EN == 1) , server interface i_dfu ?dfuInterface #endif #if (NUM_PDM_MICS > 0) @@ -469,7 +469,7 @@ void usb_audio_io(chanend ?c_aud_in, chanend ?c_adc, #define AUDIO_CHANNEL c_aud_in #endif XUA_AudioHub(AUDIO_CHANNEL -#if defined(SPDIF_TX) && (SPDIF_TX_TILE != AUDIO_IO_TILE) +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) c_spdif_tx, #endif #if defined(SPDIF_RX) || defined(ADAT_RX) @@ -545,7 +545,7 @@ int main() #define c_adat_rx null #endif -#if defined(SPDIF_TX) && (SPDIF_TX_TILE != AUDIO_IO_TILE) +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) chan c_spdif_tx; #endif @@ -617,7 +617,7 @@ int main() p_mclk_in = p_mclk_in_; } usb_audio_io(c_mix_out, c_adc -#if defined(SPDIF_TX) && (SPDIF_TX_TILE != AUDIO_IO_TILE) +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) , c_spdif_tx #endif #ifdef MIXER @@ -633,7 +633,7 @@ int main() ); } -#if defined(SPDIF_TX) && (SPDIF_TX_TILE != AUDIO_IO_TILE) +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) on tile[SPDIF_TX_TILE]: { thread_speed(); From 3b24c5ed137230ac11534e6c162e833c38319399 Mon Sep 17 00:00:00 2001 From: xross Date: Thu, 4 Jan 2018 12:38:42 +0000 Subject: [PATCH 05/16] Build fixes relating to SPDIF --- lib_xua/src/core/audiohub/xua_audiohub.xc | 12 +++++++++--- lib_xua/src/core/main.xc | 11 +++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/lib_xua/src/core/audiohub/xua_audiohub.xc b/lib_xua/src/core/audiohub/xua_audiohub.xc index 08922844..0cc8d048 100755 --- a/lib_xua/src/core/audiohub/xua_audiohub.xc +++ b/lib_xua/src/core/audiohub/xua_audiohub.xc @@ -113,9 +113,12 @@ extern buffered out port:32 p_adat_tx; extern clock clk_audio_mclk; extern clock clk_audio_bclk; -extern clock clk_mst_spd; -extern void device_reboot(void); +#if XUA_SPDIF_TX_EN +extern clock clk_mst_spd; +#endif + +//extern void device_reboot(void); #define MAX_DIVIDE_48 (MCLK_48/MIN_FREQ_48/64) #define MAX_DIVIDE_44 (MCLK_44/MIN_FREQ_44/64) @@ -1161,7 +1164,10 @@ chanend c_dig_rx, #endif /* Configure ADAT/SPDIF tx ports */ #if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE == AUDIO_IO_TILE) - SpdifTransmitPortConfig(p_spdif_tx, clk_mst_spd, p_mclk_in); + unsafe + { + SpdifTransmitPortConfig(p_spdif_tx, clk_mst_spd, (port)p_mclk_in); + } #endif /* Perform required CODEC/ADC/DAC initialisation */ diff --git a/lib_xua/src/core/main.xc b/lib_xua/src/core/main.xc index d2e01db6..9746039a 100755 --- a/lib_xua/src/core/main.xc +++ b/lib_xua/src/core/main.xc @@ -177,7 +177,7 @@ clock clk_pdm = on tile[PDM_TILE]: on tile[MIDI_TILE] : clock clk_midi = CLKBLK_MIDI; #endif -#if defined(SPDIF_TX) || defined(ADAT_TX) +#if XUA_SPDIF_TX_EN || defined(ADAT_TX) on tile[SPDIF_TX_TILE] : clock clk_mst_spd = CLKBLK_SPDIF_TX; #endif @@ -370,8 +370,11 @@ VENDOR_REQUESTS_PARAMS_DEC_ asm("setclk res[%0], %1"::"r"(p_for_mclk_count), "r"(x)); #endif //:buffer - XUA_Buffer(c_xud_out[ENDPOINT_NUMBER_OUT_AUDIO], /* Audio Out*/ + XUA_Buffer(c_xud_out[ENDPOINT_NUMBER_OUT_AUDIO],/* Audio Out*/ +#if (NUM_USB_CHAN_IN > 0) + c_xud_in[ENDPOINT_NUMBER_IN_AUDIO], /* Audio In */ +#endif #if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP) c_xud_in[ENDPOINT_NUMBER_IN_FEEDBACK], /* Audio FB */ #endif @@ -470,10 +473,10 @@ void usb_audio_io(chanend ?c_aud_in, chanend ?c_adc, #endif XUA_AudioHub(AUDIO_CHANNEL #if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) - c_spdif_tx, + , c_spdif_tx #endif #if defined(SPDIF_RX) || defined(ADAT_RX) - c_dig_rx, + , c_dig_rx, #endif #if (XUD_TILE != 0) && (AUDIO_IO_TILE == 0) && (XUA_DFU_EN == 1) , dfuInterface From ca3644ca0926d920338c022729fa879aa6746b7a Mon Sep 17 00:00:00 2001 From: xross Date: Thu, 4 Jan 2018 12:40:01 +0000 Subject: [PATCH 06/16] Syntax error in main with digital RX --- lib_xua/src/core/main.xc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_xua/src/core/main.xc b/lib_xua/src/core/main.xc index 9746039a..ed1a0763 100755 --- a/lib_xua/src/core/main.xc +++ b/lib_xua/src/core/main.xc @@ -476,7 +476,7 @@ void usb_audio_io(chanend ?c_aud_in, chanend ?c_adc, , c_spdif_tx #endif #if defined(SPDIF_RX) || defined(ADAT_RX) - , c_dig_rx, + , c_dig_rx #endif #if (XUD_TILE != 0) && (AUDIO_IO_TILE == 0) && (XUA_DFU_EN == 1) , dfuInterface From 94432b4a0369c3646bc7c699d0f2db6ed0e6eea4 Mon Sep 17 00:00:00 2001 From: xross Date: Thu, 4 Jan 2018 16:02:20 +0000 Subject: [PATCH 07/16] ADAT related build fixes --- lib_xua/src/core/audiohub/xua_audiohub.xc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib_xua/src/core/audiohub/xua_audiohub.xc b/lib_xua/src/core/audiohub/xua_audiohub.xc index 0cc8d048..b596d336 100755 --- a/lib_xua/src/core/audiohub/xua_audiohub.xc +++ b/lib_xua/src/core/audiohub/xua_audiohub.xc @@ -114,7 +114,7 @@ extern buffered out port:32 p_adat_tx; extern clock clk_audio_mclk; extern clock clk_audio_bclk; -#if XUA_SPDIF_TX_EN +#if XUA_SPDIF_TX_EN || defined(ADAT_TX) extern clock clk_mst_spd; #endif @@ -1106,16 +1106,16 @@ static void dummy_deliver(chanend ?c_out, unsigned &command) void XUA_AudioHub(chanend ?c_mix_out #if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) -chanend c_spdif_out, + , chanend c_spdif_out #endif #if (defined(ADAT_RX) || defined(SPDIF_RX)) -chanend c_dig_rx, + , chanend c_dig_rx #endif #if (XUD_TILE != 0) && (AUDIO_IO_TILE == 0) && (XUA_DFU_EN == 1) -, server interface i_dfu ?dfuInterface + , server interface i_dfu ?dfuInterface #endif #if (NUM_PDM_MICS > 0) -, chanend c_pdm_in + , chanend c_pdm_in #endif ) { @@ -1155,7 +1155,10 @@ chanend c_dig_rx, #endif #ifdef ADAT_TX /* Share SPDIF clk blk */ - configure_clock_src(clk_mst_spd, p_mclk_in); + unsafe + { + configure_clock_src(clk_mst_spd, (port)p_mclk_in); + } configure_out_port_no_ready(p_adat_tx, clk_mst_spd, 0); set_clock_fall_delay(clk_mst_spd, 7); #if (XUA_SPDIF_TX_EN == 0) From 90b8fe26cc0225f527dc1e4f9cbcd37656200e4d Mon Sep 17 00:00:00 2001 From: xross Date: Mon, 8 Jan 2018 11:37:02 +0000 Subject: [PATCH 08/16] Added XUA_ENDPOINT_COUNT_CUSTOM_IN/OUT define --- lib_xua/api/xua_conf_default.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index 52a26abd..a4273ce5 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -1193,7 +1193,7 @@ enum USBEndpointNumber_In ENDPOINT_NUMBER_IN_IAP_EA_NATIVE_TRANS, #endif #endif - ENDPOINT_COUNT_IN /* End marker */ + XUA_ENDPOINT_COUNT_IN /* End marker */ }; enum USBEndpointNumber_Out @@ -1209,9 +1209,21 @@ enum USBEndpointNumber_Out ENDPOINT_NUMBER_OUT_IAP_EA_NATIVE_TRANS, #endif #endif - ENDPOINT_COUNT_OUT /* End marker */ + XUA_ENDPOINT_COUNT_OUT /* End marker */ }; + +#ifndef XUA_ENDPOINT_COUNT_CUSTOM_OUT +#define XUA_ENDPOINT_COUNT_CUSTOM_OUT 0 +#endif + +#ifndef XUA_ENDPOINT_COUNT_CUSTOM_IN +#define XUA_ENDPOINT_COUNT_CUSTOM_IN 0 +#endif + +#define ENDPOINT_COUNT_IN (XUA_ENDPOINT_COUNT_IN + XUA_ENDPOINT_COUNT_CUSTOM_IN) +#define ENDPOINT_COUNT_OUT (XUA_ENDPOINT_COUNT_OUT + XUA_ENDPOINT_COUNT_CUSTOM_OUT) + #endif /*** Internal defines below here. NOT FOR MODIFICATION ***/ From 727de0ac11b7e20f26da56eb5393cf5640241ea7 Mon Sep 17 00:00:00 2001 From: xross Date: Mon, 8 Jan 2018 11:38:26 +0000 Subject: [PATCH 09/16] Added basic PDM mic delay (based on MIC_BUFFER_DEPTH). Default, 1 sample. --- lib_xua/src/core/pdm_mics/pdm_mic.xc | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/lib_xua/src/core/pdm_mics/pdm_mic.xc b/lib_xua/src/core/pdm_mics/pdm_mic.xc index 1b55b333..9ebd40b3 100644 --- a/lib_xua/src/core/pdm_mics/pdm_mic.xc +++ b/lib_xua/src/core/pdm_mics/pdm_mic.xc @@ -34,6 +34,10 @@ extern unsafe port p_mclk_in; /* Delcared in main.xc */ extern clock clk_pdm; +#ifndef MIC_BUFFER_DEPTH +#define MIC_BUFFER_DEPTH 1 +#endif + int mic_decimator_fir_data[8][THIRD_STAGE_COEFS_PER_STAGE * MAX_DECIMATION_FACTOR] = {{0}}; mic_array_frame_time_domain mic_audio[2]; @@ -50,7 +54,7 @@ void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio) { unsigned buffer; unsigned samplerate; - int output[NUM_PDM_MICS]; + int output[MIC_BUFFER_DEPTH][NUM_PDM_MICS]; #ifdef MIC_PROCESSING_USE_INTERFACE i_mic_process.init(); @@ -64,6 +68,9 @@ void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio) unsigned decimatorCount = 1; #endif + unsigned micBufferWrite = (MIC_BUFFER_DEPTH -1); + unsigned micBufferRead = 0; + mic_array_decimator_conf_common_t dcc; const int * unsafe fir_coefs[7]; mic_array_frame_time_domain * unsafe current; @@ -154,8 +161,11 @@ void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio) #pragma loop unroll for(int i = 0; i < NUM_PDM_MICS; i++) { - c_audio <: output[i]; + c_audio <: output[micBufferRead][i]; } + micBufferRead++; + if(micBufferRead == MIC_BUFFER_DEPTH) + micBufferRead = 0; } /* Get a new frame of mic data */ @@ -171,8 +181,11 @@ void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio) #pragma loop unroll for(int i = 0; i < NUM_PDM_MICS; i++) { - output[i] = current->data[i][0]; + output[micBufferWrite][i] = current->data[i][0]; } + micBufferWrite++; + if(micBufferWrite == MIC_BUFFER_DEPTH) + micBufferWrite = 0; } else unsafe{ @@ -199,8 +212,11 @@ void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio) #pragma loop unroll for(int i = 0; i < NUM_PDM_MICS; i++) { - output[i] = current->data[i][0]; + output[micBufferWrite][i] = current->data[i][0]; } + micBufferWrite++; + if(micBufferWrite == MIC_BUFFER_DEPTH) + micBufferWrite = 0; } break; } /* select */ From 378ad353b1ab6f38f4cfb815d1735c7b92b0f4fa Mon Sep 17 00:00:00 2001 From: xross Date: Mon, 8 Jan 2018 11:40:49 +0000 Subject: [PATCH 10/16] CHANGELOG tidy --- CHANGELOG.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index cd8b59ea..87743b0e 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,19 +7,19 @@ lib_xua Change Log - ADDED: Linux Makefile for xmosdfu host application - ADDED: Raspberry Pi Makefile for xmosdfu host application - ADDED: Documentation of PID argument to xmosdfu + - ADDED: Optional build time microphone delay line (MIC_BUFFER_DEPTH) - CHANGE: Removal of audManage_if, users should define their own interfaces as required + - CHANGE: Vendor specific control interface in UAC1 descriptor now has a string descriptor + so it shows up with a descriptive name in Windows Device Manager + - CHANGE: DFU_BCD_DEVICE removed (now uses BCD_DEVICE) + - CHANGE: Renaming in descriptors.h to avoid clashes with application - RESOLVED: FIR gain compensation for PDM mics set incorrectly for divide of 8 - RESOLVED: Incorrect xmosdfu DYLD path in test script code - RESOLVED: xmosdfu cannot find XMOS device on modern MacBook Pro (#17897) - RESOLVED: Issue when feedback is initially incorrect when two SOF's are not yet received - RESOLVED: AUDIO_TILE and PDM_TILE may now share the same value/tile - RESOLVED: Cope with out of order interface numbers in xmosdfu - - CHANGE: Renaming in descriptors.h to avoid clashes with application - - CHANGE: Vendor specific control interface in UAC1 descriptor now has a string descriptor - so it shows up with a descriptive name in Windows Device Manager - - CHANGE: DFU_BCD_DEVICE removed (used BCD_DEVICE) - - CHANGE: Fork from sc_usb_audio to lib_xua - + Legacy release history ---------------------- From 1324d33fdf1bf2596b397172bb3539d58cdaa285 Mon Sep 17 00:00:00 2001 From: xross Date: Mon, 8 Jan 2018 11:58:19 +0000 Subject: [PATCH 11/16] Manually applied XS2 DSD fix - could not easily cherry pick due to conflicts --- lib_xua/src/core/audiohub/xua_audiohub.xc | 33 ++++++++++++----------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/lib_xua/src/core/audiohub/xua_audiohub.xc b/lib_xua/src/core/audiohub/xua_audiohub.xc index b596d336..2c3f8aa2 100755 --- a/lib_xua/src/core/audiohub/xua_audiohub.xc +++ b/lib_xua/src/core/audiohub/xua_audiohub.xc @@ -588,12 +588,13 @@ unsigned static deliver(chanend ?c_out, chanend ?c_spd_out dsdSample_r = bitrev(byterev(dsdSample_r)); dsdSample_l = bitrev(byterev(dsdSample_l)); - /* Output DSD data to ports then 32 clocks */ + /* Output DSD data to ports (then 32 clocks if we don't have the HW clock divider of X200 */ + asm volatile("out res[%0], %1"::"r"(p_dsd_dac[0]),"r"(dsdSample_l)); + asm volatile("out res[%0], %1"::"r"(p_dsd_dac[1]),"r"(dsdSample_r)); +#ifndef __XS2A__ switch (divide) { case 4: - asm volatile("out res[%0], %1"::"r"(p_dsd_dac[0]),"r"(dsdSample_l)); - asm volatile("out res[%0], %1"::"r"(p_dsd_dac[1]),"r"(dsdSample_r)); p_dsd_clk <: 0xCCCCCCCC; p_dsd_clk <: 0xCCCCCCCC; p_dsd_clk <: 0xCCCCCCCC; @@ -601,16 +602,13 @@ unsigned static deliver(chanend ?c_out, chanend ?c_spd_out break; case 2: - asm volatile("out res[%0], %1"::"r"(p_dsd_dac[0]),"r"(dsdSample_l)); - asm volatile("out res[%0], %1"::"r"(p_dsd_dac[1]),"r"(dsdSample_r)); p_dsd_clk <: 0xAAAAAAAA; p_dsd_clk <: 0xAAAAAAAA; break; default: /* Do some clocks anyway - this will stop us interrupting decouple too much */ - asm volatile("out res[%0], %1"::"r"(p_dsd_dac[0]),"r"(dsdSample_l)); - asm volatile("out res[%0], %1"::"r"(p_dsd_dac[1]),"r"(dsdSample_r)); + /* (And stop the data outputs above pausing forever) */ p_dsd_clk <: 0xF0F0F0F0; p_dsd_clk <: 0xF0F0F0F0; p_dsd_clk <: 0xF0F0F0F0; @@ -621,7 +619,7 @@ unsigned static deliver(chanend ?c_out, chanend ?c_spd_out p_dsd_clk <: 0xF0F0F0F0; break; } - +#endif /* __XS2A__ */ } else if(dsdMode == DSD_MODE_DOP) { @@ -632,24 +630,26 @@ unsigned static deliver(chanend ?c_out, chanend ?c_spd_out everyOther = 1; +#ifndef __XS2A__ switch (divide) { case 8: - p_dsd_clk <: 0xF0F0F0F0; - p_dsd_clk <: 0xF0F0F0F0; - p_dsd_clk <: 0xF0F0F0F0; - p_dsd_clk <: 0xF0F0F0F0; + p_dsd_clk <: 0xF0F0F0F0; + p_dsd_clk <: 0xF0F0F0F0; + p_dsd_clk <: 0xF0F0F0F0; + p_dsd_clk <: 0xF0F0F0F0; break; case 4: - p_dsd_clk <: 0xCCCCCCCC; - p_dsd_clk <: 0xCCCCCCCC; + p_dsd_clk <: 0xCCCCCCCC; + p_dsd_clk <: 0xCCCCCCCC; break; case 2: - p_dsd_clk <: 0xAAAAAAAA; + p_dsd_clk <: 0xAAAAAAAA; break; } +#endif } else // everyOther { @@ -662,6 +662,8 @@ unsigned static deliver(chanend ?c_out, chanend ?c_spd_out //p_dsd_dac[1] <: bitrev(dsdSample_r); asm volatile("out res[%0], %1"::"r"(p_dsd_dac[0]),"r"(bitrev(dsdSample_l))); asm volatile("out res[%0], %1"::"r"(p_dsd_dac[1]),"r"(bitrev(dsdSample_r))); + +#ifndef __XS2A__ switch (divide) { case 8: @@ -679,6 +681,7 @@ unsigned static deliver(chanend ?c_out, chanend ?c_spd_out case 2: p_dsd_clk <: 0xAAAAAAAA; break; +#endif } } From 9da859afe363f5f7149532f3d5bd115ed6595422 Mon Sep 17 00:00:00 2001 From: xross Date: Mon, 8 Jan 2018 11:59:31 +0000 Subject: [PATCH 12/16] Chnagelog update --- CHANGELOG.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 87743b0e..b410291f 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -19,6 +19,7 @@ lib_xua Change Log - RESOLVED: Issue when feedback is initially incorrect when two SOF's are not yet received - RESOLVED: AUDIO_TILE and PDM_TILE may now share the same value/tile - RESOLVED: Cope with out of order interface numbers in xmosdfu + - RESOLVED: DSD playback not functional on xCORE-200 (introduced in sc_usb_audio 6.14) Legacy release history ---------------------- From 444645d82f0cfd5925bfb0b1039a4fb016e57d21 Mon Sep 17 00:00:00 2001 From: xross Date: Mon, 8 Jan 2018 12:43:53 +0000 Subject: [PATCH 13/16] Resolved build issue related to XS2 DSD fix --- lib_xua/src/core/audiohub/xua_audiohub.xc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_xua/src/core/audiohub/xua_audiohub.xc b/lib_xua/src/core/audiohub/xua_audiohub.xc index 2c3f8aa2..e18d3c02 100755 --- a/lib_xua/src/core/audiohub/xua_audiohub.xc +++ b/lib_xua/src/core/audiohub/xua_audiohub.xc @@ -681,9 +681,8 @@ unsigned static deliver(chanend ?c_out, chanend ?c_spd_out case 2: p_dsd_clk <: 0xAAAAAAAA; break; -#endif } - +#endif } } else From a0db0f899ff6d9ed077f8c20fe993c3ef4aafdd0 Mon Sep 17 00:00:00 2001 From: xross Date: Mon, 8 Jan 2018 13:24:45 +0000 Subject: [PATCH 14/16] Buffer file arrangement tidy --- lib_xua/src/core/{usb_buffer => buffer/decouple}/decouple.xc | 0 .../core/{usb_buffer => buffer/decouple}/decouple_interrupt.c | 2 +- .../src/core/{usb_buffer => buffer/decouple}/get_adc_counts.c | 0 lib_xua/src/core/{usb_buffer => buffer/decouple}/interrupt.h | 0 .../core/{usb_buffer/usb_buffer.xc => buffer/ep/ep_buffer.xc} | 0 lib_xua/src/core/{usb_buffer => buffer/ep}/testct_byref.h | 0 lib_xua/src/core/{usb_buffer => buffer/ep}/testct_byref.xc | 0 lib_xua/src/core/{usb_buffer => }/xc_ptr.h | 0 lib_xua/src/core/{usb_buffer => }/xc_ptr.xc | 0 9 files changed, 1 insertion(+), 1 deletion(-) rename lib_xua/src/core/{usb_buffer => buffer/decouple}/decouple.xc (100%) rename lib_xua/src/core/{usb_buffer => buffer/decouple}/decouple_interrupt.c (77%) rename lib_xua/src/core/{usb_buffer => buffer/decouple}/get_adc_counts.c (100%) rename lib_xua/src/core/{usb_buffer => buffer/decouple}/interrupt.h (100%) rename lib_xua/src/core/{usb_buffer/usb_buffer.xc => buffer/ep/ep_buffer.xc} (100%) rename lib_xua/src/core/{usb_buffer => buffer/ep}/testct_byref.h (100%) rename lib_xua/src/core/{usb_buffer => buffer/ep}/testct_byref.xc (100%) rename lib_xua/src/core/{usb_buffer => }/xc_ptr.h (100%) rename lib_xua/src/core/{usb_buffer => }/xc_ptr.xc (100%) diff --git a/lib_xua/src/core/usb_buffer/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc similarity index 100% rename from lib_xua/src/core/usb_buffer/decouple.xc rename to lib_xua/src/core/buffer/decouple/decouple.xc diff --git a/lib_xua/src/core/usb_buffer/decouple_interrupt.c b/lib_xua/src/core/buffer/decouple/decouple_interrupt.c similarity index 77% rename from lib_xua/src/core/usb_buffer/decouple_interrupt.c rename to lib_xua/src/core/buffer/decouple/decouple_interrupt.c index 79bfeefe..eb75fc13 100644 --- a/lib_xua/src/core/usb_buffer/decouple_interrupt.c +++ b/lib_xua/src/core/buffer/decouple/decouple_interrupt.c @@ -1,5 +1,5 @@ #ifndef NO_USB -#include +#include "interrupt.h" register_interrupt_handler(handle_audio_request, 1, 200) #endif diff --git a/lib_xua/src/core/usb_buffer/get_adc_counts.c b/lib_xua/src/core/buffer/decouple/get_adc_counts.c similarity index 100% rename from lib_xua/src/core/usb_buffer/get_adc_counts.c rename to lib_xua/src/core/buffer/decouple/get_adc_counts.c diff --git a/lib_xua/src/core/usb_buffer/interrupt.h b/lib_xua/src/core/buffer/decouple/interrupt.h similarity index 100% rename from lib_xua/src/core/usb_buffer/interrupt.h rename to lib_xua/src/core/buffer/decouple/interrupt.h diff --git a/lib_xua/src/core/usb_buffer/usb_buffer.xc b/lib_xua/src/core/buffer/ep/ep_buffer.xc similarity index 100% rename from lib_xua/src/core/usb_buffer/usb_buffer.xc rename to lib_xua/src/core/buffer/ep/ep_buffer.xc diff --git a/lib_xua/src/core/usb_buffer/testct_byref.h b/lib_xua/src/core/buffer/ep/testct_byref.h similarity index 100% rename from lib_xua/src/core/usb_buffer/testct_byref.h rename to lib_xua/src/core/buffer/ep/testct_byref.h diff --git a/lib_xua/src/core/usb_buffer/testct_byref.xc b/lib_xua/src/core/buffer/ep/testct_byref.xc similarity index 100% rename from lib_xua/src/core/usb_buffer/testct_byref.xc rename to lib_xua/src/core/buffer/ep/testct_byref.xc diff --git a/lib_xua/src/core/usb_buffer/xc_ptr.h b/lib_xua/src/core/xc_ptr.h similarity index 100% rename from lib_xua/src/core/usb_buffer/xc_ptr.h rename to lib_xua/src/core/xc_ptr.h diff --git a/lib_xua/src/core/usb_buffer/xc_ptr.xc b/lib_xua/src/core/xc_ptr.xc similarity index 100% rename from lib_xua/src/core/usb_buffer/xc_ptr.xc rename to lib_xua/src/core/xc_ptr.xc From f263cb04ce650e8db6a29db5efac6b1e1690a787 Mon Sep 17 00:00:00 2001 From: xross Date: Mon, 8 Jan 2018 14:39:06 +0000 Subject: [PATCH 15/16] Patches up #11 --- lib_xua/src/core/buffer/decouple/decouple.xc | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib_xua/src/core/buffer/decouple/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc index f787ec4a..78e9d1b9 100644 --- a/lib_xua/src/core/buffer/decouple/decouple.xc +++ b/lib_xua/src/core/buffer/decouple/decouple.xc @@ -62,7 +62,11 @@ static xc_ptr p_multIn; /* Number of channels to/from the USB bus - initialised to HS Audio 2.0 */ unsigned g_numUsbChan_Out = NUM_USB_CHAN_OUT; +#if (AUDIO_CLASS == 1) +unsigned g_numUsbChan_In = NUM_USB_CHAN_IN_FS; +#else unsigned g_numUsbChan_In = NUM_USB_CHAN_IN; +#endif /* Circular audio buffers */ unsigned outAudioBuff[(BUFF_SIZE_OUT >> 2)+ (MAX_DEVICE_AUD_PACKET_SIZE_OUT >> 2)]; @@ -588,6 +592,15 @@ static inline void SetupZerosSendBuffer(XUD_ep aud_to_host_usb_ep, unsigned samp asm volatile("stw %0, %1[0]"::"r"(mid),"r"(g_aud_to_host_zeros)); +#if XUA_DEBUG_BUFFER + printstr("slotSize: "); + printintln(slotSize); + printstr("g_numUsbChan_In: "); + printintln(g_numUsbChan_In); + printstr("mid: "); + printintln(mid); +#endif + /* Mark EP ready with the zero buffer. Note this will simply update the packet size * if it is already ready */ @@ -693,7 +706,7 @@ void XUA_Buffer_Decouple(chanend c_mix_out /* NOTE: For UAC2 IN EP not marked ready at this point - Initial size of zero buffer not known * since we don't know the USB bus-speed yet. * The host will send a SetAltInterface before streaming which will lead to this core - * getting a SET_CHANNEL_COUNT_IN. This will setup the EP for the first packet */ + * getting a SET_STREAM_FORMAT_IN. This will setup the EP for the first packet */ #if (AUDIO_CLASS == 1) /* For UAC1 we know we only run at FS */ /* Set buffer back to zeros buffer */ From d1d00522b36590b6ba1da3e229e66214d4fc7854 Mon Sep 17 00:00:00 2001 From: xross Date: Mon, 8 Jan 2018 15:29:31 +0000 Subject: [PATCH 16/16] Fixes #12 --- lib_xua/src/core/buffer/decouple/decouple.xc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_xua/src/core/buffer/decouple/decouple.xc b/lib_xua/src/core/buffer/decouple/decouple.xc index 78e9d1b9..6ddf718f 100644 --- a/lib_xua/src/core/buffer/decouple/decouple.xc +++ b/lib_xua/src/core/buffer/decouple/decouple.xc @@ -61,11 +61,12 @@ static xc_ptr p_multIn; #endif /* Number of channels to/from the USB bus - initialised to HS Audio 2.0 */ -unsigned g_numUsbChan_Out = NUM_USB_CHAN_OUT; #if (AUDIO_CLASS == 1) unsigned g_numUsbChan_In = NUM_USB_CHAN_IN_FS; +unsigned g_numUsbChan_Out = NUM_USB_CHAN_OUT_FS; #else unsigned g_numUsbChan_In = NUM_USB_CHAN_IN; +unsigned g_numUsbChan_Out = NUM_USB_CHAN_OUT; #endif /* Circular audio buffers */