From 26b0d623a806ebae39889e929bb09c7af58abb29 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 13 Apr 2016 18:26:01 +0100 Subject: [PATCH 01/57] User microphone processing now uses an interface (old call back code still available - see MIC_PROCESSING_USE_INTERACE) --- module_usb_audio/pdm_mics/pcm_pdm_mic.h | 27 +++++++++++++++++++ module_usb_audio/pdm_mics/pcm_pdm_mic.xc | 33 +++++++++++++++++++----- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/module_usb_audio/pdm_mics/pcm_pdm_mic.h b/module_usb_audio/pdm_mics/pcm_pdm_mic.h index dccd9ff1..1a21f63b 100644 --- a/module_usb_audio/pdm_mics/pcm_pdm_mic.h +++ b/module_usb_audio/pdm_mics/pcm_pdm_mic.h @@ -1,2 +1,29 @@ +#include "mic_array.h" + void pcm_pdm_mic(chanend c_pcm_out); + +#ifdef MIC_PROCESSING_USE_INTERFACE +/* Interface based user processing */ +typedef interface mic_process_if +{ + //[[guarded]] + //void transfer_buffers(int * unsafe in_mic_buf, int * unsafe in_spk_buf, int * unsafe out_mic_buf, int * unsafe out_spk_buf); + void transfer_buffers(mic_array_frame_time_domain * unsafe audio, int output[]); + + void init(); +} mic_process_if; + +[[distributable]] +unsafe void user_pdm_process(server mic_process_if i_mic_data); + +#else + +/* Simple user hooks/call-backs */ +unsafe void user_pdm_process(mic_array_frame_time_domain * unsafe audio, int output[]); + +void user_pdm_init(); + +#endif + + diff --git a/module_usb_audio/pdm_mics/pcm_pdm_mic.xc b/module_usb_audio/pdm_mics/pcm_pdm_mic.xc index 1e5295e1..2422b12e 100644 --- a/module_usb_audio/pdm_mics/pcm_pdm_mic.xc +++ b/module_usb_audio/pdm_mics/pcm_pdm_mic.xc @@ -14,6 +14,7 @@ #include #include "mic_array.h" +#include "pcm_pdm_mic.h" #define MAX_DECIMATION_FACTOR 12 @@ -23,22 +24,25 @@ in buffered port:32 p_pdm_mics = PORT_PDM_DATA; in port p_mclk = PORT_PDM_MCLK; clock pdmclk = on tile[PDM_TILE]: XS1_CLKBLK_3; -/* User hooks */ -unsafe void user_pdm_process(mic_array_frame_time_domain * unsafe audio, int output[]); -void user_pdm_init(); - int data_0[4*THIRD_STAGE_COEFS_PER_STAGE * MAX_DECIMATION_FACTOR] = {0}; int data_1[4*THIRD_STAGE_COEFS_PER_STAGE * MAX_DECIMATION_FACTOR] = {0}; mic_array_frame_time_domain mic_audio[2]; -void pdm_process(streaming chanend c_ds_output[2], chanend c_audio) +void pdm_process(streaming chanend c_ds_output[2], chanend c_audio +#ifdef MIC_PROCESSING_USE_INTERFACE + , client mic_process_if i_mic_process +#endif +) { unsigned buffer = 1; // Buffer index int output[NUM_PDM_MICS]; +#ifdef MIC_PROCESSING_USE_INTERFACE + i_mic_process.init(); +#else user_pdm_init(); - +#endif while(1) { unsigned samplerate; @@ -64,8 +68,12 @@ void pdm_process(streaming chanend c_ds_output[2], chanend c_audio) unsafe { int req; - user_pdm_process(current, output); +#ifdef MIC_PROCESSING_USE_INTERFACE + i_mic_process.transfer_buffers(current, output); +#else + user_pdm_process(current, output); +#endif c_audio :> req; if(req) @@ -94,6 +102,10 @@ void pcm_pdm_mic(chanend c_pcm_out) streaming chan c_4x_pdm_mic_0, c_4x_pdm_mic_1; streaming chan c_ds_output[2]; +#ifdef MIC_PROCESSING_USE_INTERFACE + interface mic_process_if i_mic_process; +#endif + /* Note, this divide should be based on master clock freq */ configure_clock_src_divide(pdmclk, p_mclk, 2); configure_port_clock_output(p_pdm_clk, pdmclk); @@ -105,7 +117,14 @@ void pcm_pdm_mic(chanend c_pcm_out) mic_array_pdm_rx(p_pdm_mics, c_4x_pdm_mic_0, c_4x_pdm_mic_1); mic_array_decimate_to_pcm_4ch(c_4x_pdm_mic_0, c_ds_output[0]); mic_array_decimate_to_pcm_4ch(c_4x_pdm_mic_1, c_ds_output[1]); +#ifdef MIC_PROCESSING_USE_INTERFACE + pdm_process(c_ds_output, c_pcm_out, i_mic_process); + unsafe{ + user_pdm_process(i_mic_process); + } +#else pdm_process(c_ds_output, c_pcm_out); +#endif } } From e39f95fcd9f0691514faeb36245392cec5c6817b Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 13 Apr 2016 20:56:04 +0100 Subject: [PATCH 02/57] Fixed up pcm_pdm_mic() call with user interface param --- module_usb_audio/main.xc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/module_usb_audio/main.xc b/module_usb_audio/main.xc index ad4a4b06..72e7d6f0 100755 --- a/module_usb_audio/main.xc +++ b/module_usb_audio/main.xc @@ -543,6 +543,9 @@ int main() #if (NUM_PDM_MICS > 0) chan c_pdm_pcm; +#ifdef MIC_PROCESSING_USE_INTERFACE + interface mic_process_if i_mic_process; +#endif #endif USER_MAIN_DECLARATIONS @@ -654,8 +657,13 @@ int main() #endif #if (NUM_PDM_MICS > 0) - on stdcore[PDM_TILE]: pcm_pdm_mic(c_pdm_pcm); + on stdcore[PDM_TILE]: pcm_pdm_mic(c_pdm_pcm +#ifdef MIC_PROCESSING_USE_INTERFACE + , i_mic_process #endif + ); +#endif + USER_MAIN_CORES } From 89e7ed5d4f96015729afce09db7c3f537eddc80b Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 13 Apr 2016 20:56:41 +0100 Subject: [PATCH 03/57] pcm_pdm_mic() no longer unsafe.. seems to break [[distribute]] --- module_usb_audio/pdm_mics/pcm_pdm_mic.h | 9 +++++---- module_usb_audio/pdm_mics/pcm_pdm_mic.xc | 17 +++++++++-------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/module_usb_audio/pdm_mics/pcm_pdm_mic.h b/module_usb_audio/pdm_mics/pcm_pdm_mic.h index 1a21f63b..0a54943f 100644 --- a/module_usb_audio/pdm_mics/pcm_pdm_mic.h +++ b/module_usb_audio/pdm_mics/pcm_pdm_mic.h @@ -1,8 +1,6 @@ #include "mic_array.h" -void pcm_pdm_mic(chanend c_pcm_out); - #ifdef MIC_PROCESSING_USE_INTERFACE /* Interface based user processing */ typedef interface mic_process_if @@ -15,7 +13,9 @@ typedef interface mic_process_if } mic_process_if; [[distributable]] -unsafe void user_pdm_process(server mic_process_if i_mic_data); +void user_pdm_process(server mic_process_if i_mic_data); + +void pcm_pdm_mic(chanend c_pcm_out, client mic_process_if i_mic_process); #else @@ -24,6 +24,7 @@ unsafe void user_pdm_process(mic_array_frame_time_domain * unsafe audio, int out void user_pdm_init(); +void pcm_pdm_mic(chanend c_pcm_out); + #endif - diff --git a/module_usb_audio/pdm_mics/pcm_pdm_mic.xc b/module_usb_audio/pdm_mics/pcm_pdm_mic.xc index 2422b12e..7315a56b 100644 --- a/module_usb_audio/pdm_mics/pcm_pdm_mic.xc +++ b/module_usb_audio/pdm_mics/pcm_pdm_mic.xc @@ -97,15 +97,15 @@ void pdm_process(streaming chanend c_ds_output[2], chanend c_audio #error MAX_FREQ > 48000 NOT CURRENTLY SUPPORTED #endif -void pcm_pdm_mic(chanend c_pcm_out) +void pcm_pdm_mic(chanend c_pcm_out +#ifdef MIC_PROCESSING_USE_INTERFACE + , client mic_process_if i_mic_process +#endif + ) { streaming chan c_4x_pdm_mic_0, c_4x_pdm_mic_1; streaming chan c_ds_output[2]; -#ifdef MIC_PROCESSING_USE_INTERFACE - interface mic_process_if i_mic_process; -#endif - /* Note, this divide should be based on master clock freq */ configure_clock_src_divide(pdmclk, p_mclk, 2); configure_port_clock_output(p_pdm_clk, pdmclk); @@ -119,9 +119,10 @@ void pcm_pdm_mic(chanend c_pcm_out) mic_array_decimate_to_pcm_4ch(c_4x_pdm_mic_1, c_ds_output[1]); #ifdef MIC_PROCESSING_USE_INTERFACE pdm_process(c_ds_output, c_pcm_out, i_mic_process); - unsafe{ - user_pdm_process(i_mic_process); - } + //unsafe{ + //user_pdm_process(i_mic_process); + //} + /* note user pdm process is included in main.xc to allow maximum flexibilty for customisation */ #else pdm_process(c_ds_output, c_pcm_out); #endif From ee10a5cdf76d519d13f606f77b4fabaabe6a00c1 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 19 Apr 2016 11:58:33 +0100 Subject: [PATCH 04/57] Added dsp.h --- module_usb_audio/dsp.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 module_usb_audio/dsp.h diff --git a/module_usb_audio/dsp.h b/module_usb_audio/dsp.h new file mode 100644 index 00000000..9a3e5a66 --- /dev/null +++ b/module_usb_audio/dsp.h @@ -0,0 +1,27 @@ + + +#ifndef _DSP_H_ +#define _DSP_H_ +/* Processing interface and task */ +/* Interface to transfer block of samples to/from DSP task */ +typedef interface dsp_if +{ + [[guarded]] + void transfer_buffers(int * unsafe in_aud_buf, int * unsafe in_usb_buf, + int * unsafe out_usb_buf, int * unsafe out_aud_buf); +} dsp_if; + + +/* Control interface and task */ +typedef interface dsp_ctrl_if +{ + int setControl(unsigned moduleId, unsigned control, unsigned setting); + //TODO add GetConttol +} dsp_ctrl_if; + + +void dsp_process(server dsp_if i_dsp, server dsp_ctrl_if ?i_dsp_ctrl[numDspCtrlInts], unsigned numDspCtrlInts); + + +#endif + From ffd24d2b5e22f2de7c5dfcf3e7281b00e2426c69 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 19 Apr 2016 11:59:00 +0100 Subject: [PATCH 05/57] Removed user_dm_process from pcm_pdm_mic par{}. Now in main. --- module_usb_audio/pdm_mics/pcm_pdm_mic.xc | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/module_usb_audio/pdm_mics/pcm_pdm_mic.xc b/module_usb_audio/pdm_mics/pcm_pdm_mic.xc index 7315a56b..dbece241 100644 --- a/module_usb_audio/pdm_mics/pcm_pdm_mic.xc +++ b/module_usb_audio/pdm_mics/pcm_pdm_mic.xc @@ -119,10 +119,7 @@ void pcm_pdm_mic(chanend c_pcm_out mic_array_decimate_to_pcm_4ch(c_4x_pdm_mic_1, c_ds_output[1]); #ifdef MIC_PROCESSING_USE_INTERFACE pdm_process(c_ds_output, c_pcm_out, i_mic_process); - //unsafe{ - //user_pdm_process(i_mic_process); - //} - /* note user pdm process is included in main.xc to allow maximum flexibilty for customisation */ + /* Note: user_pdm process is included in main.xc to allow maximum flexibilty for customisation/distribution etc */ #else pdm_process(c_ds_output, c_pcm_out); #endif From 08226e6afa4a0c14d5ee9da5f6e7c6b46e9595a0 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 19 Apr 2016 11:59:18 +0100 Subject: [PATCH 06/57] DSP Added to main --- module_usb_audio/main.xc | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/module_usb_audio/main.xc b/module_usb_audio/main.xc index 72e7d6f0..ee2b068d 100755 --- a/module_usb_audio/main.xc +++ b/module_usb_audio/main.xc @@ -47,6 +47,10 @@ #include "pcm_pdm_mic.h" #endif +#ifdef RUN_DSP_TASK +#include "dsp.h" +#endif + [[distributable]] void DFUHandler(server interface i_dfu i, chanend ?c_user_cmd); @@ -414,6 +418,7 @@ void usb_audio_io(chanend c_aud_in, chanend ?c_adc, #if (NUM_PDM_MICS > 0) , chanend c_pdm_pcm #endif + , client dsp_if i_dsp ) { #ifdef MIXER @@ -457,6 +462,7 @@ void usb_audio_io(chanend c_aud_in, chanend ?c_adc, #if (NUM_PDM_MICS > 0) , c_pdm_pcm #endif + , i_dsp ); } @@ -548,8 +554,12 @@ int main() #endif #endif - USER_MAIN_DECLARATIONS +#ifdef RUN_DSP_TASK + interface dsp_if i_dsp; + interface dsp_ctrl_if i_dsp_ctrl[1]; // TODO NUM_DSP_CTRL_INTERFACES +#endif + USER_MAIN_DECLARATIONS par { on tile[XUD_TILE]: @@ -594,7 +604,8 @@ int main() #if (NUM_PDM_MICS > 0) , c_pdm_pcm #endif - + , i_dsp + ); #if defined(SPDIF_TX) && (SPDIF_TX_TILE != AUDIO_IO_TILE) @@ -663,6 +674,10 @@ int main() #endif ); #endif + + // TODO move this to USER_MAIN_CORES or guard with RUN_DSP_TASK + // TODO NUM_DSP_CTRL_INTS + on stdcore[AUDIO_IO_TILE] : dsp_process(i_dsp, i_dsp_ctrl, 1); USER_MAIN_CORES } From 7170ff63c1ee459dd02b46dd79752c7da7cdf655 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 19 Apr 2016 11:59:42 +0100 Subject: [PATCH 07/57] PDM_MIC_INDEX added to devicedefines.h --- module_usb_audio/devicedefines.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/module_usb_audio/devicedefines.h b/module_usb_audio/devicedefines.h index b156725d..21152868 100644 --- a/module_usb_audio/devicedefines.h +++ b/module_usb_audio/devicedefines.h @@ -215,6 +215,16 @@ #define NUM_PDM_MICS (0) #endif +/** + * @brief PDM Microphone first channel index, defines which channels microphones will be input on. + * Note, indexed from 0. + * + * Default: 0 (i.e. channels [0:NUM_PDM_MICS-1]) + * */ +#ifndef PDM_MIC_INDEX +#define PDM_MIC_INDEX (0) +#endif + /** * @brief Enable MIDI functionality including buffering, descriptors etc. Default: DISABLED */ @@ -230,14 +240,14 @@ * @brief MIDI Rx port width (1 or 4bit). Default: 1 */ #ifndef MIDI_RX_PORT_WIDTH -#define MIDI_RX_PORT_WIDTH (1) +#define MIDI_RX_PORT_WIDTH (1) #endif /** * @brief Enables SPDIF Tx. Default: 0 (Disabled) */ #ifndef SPDIF_TX -#define SPDIF_TX (0) +#define SPDIF_TX (0) #endif /* Tidy up old SPDIF usage */ From 03586b8ef863e9742e30487b09c9048ae136a886 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 19 Apr 2016 12:02:17 +0100 Subject: [PATCH 08/57] Removed SU1 ADC code from audio --- module_usb_audio/audio.xc | 38 -------------------------------------- 1 file changed, 38 deletions(-) diff --git a/module_usb_audio/audio.xc b/module_usb_audio/audio.xc index 47a8cdab..722a5fc4 100755 --- a/module_usb_audio/audio.xc +++ b/module_usb_audio/audio.xc @@ -928,11 +928,6 @@ static void dummy_deliver(chanend c_out, unsigned &command) } } } -#define SAMPLE_RATE 200000 -#define NUMBER_CHANNELS 1 -#define NUMBER_SAMPLES 100 -#define NUMBER_WORDS ((NUMBER_SAMPLES * NUMBER_CHANNELS+1)/2) -#define SAMPLES_PER_PRINT 1 void audio(chanend c_mix_out, #if defined(SPDIF_TX) && (SPDIF_TX_TILE != AUDIO_IO_TILE) @@ -967,39 +962,6 @@ chanend ?c_config, chanend ?c unsigned divide; unsigned firstRun = 1; -#ifdef SU1_ADC_ENABLE - /* Setup galaxian ADC */ - unsigned data[1], channel; - int r; - unsigned int vals[NUMBER_WORDS]; - int cnt = 0; - int div; - unsigned val = 0; - int val2 = 0; - int adcOk = 0; - - /* Enable adc on channel */ - enable_xs1_su_adc_input(0, c); - - /* General ADC control (enabled, 1 samples per packet, 32 bits per sample) */ - data[0] = 0x10201; - data[0] = 0x30101; - r = write_periph_32(xs1_su, 2, 0x20, 1, data); - - /* ADC needs a few clocks before it starts pumping out samples */ - for(int i = 0; i< 10; i++) - { - p_lrclk <: val; - val = ~val; - { - timer t; - unsigned time; - t :> time; - t when timerafter(time+1000):> void; - } - } -#endif - /* Clock master clock-block from master-clock port */ configure_clock_src(clk_audio_mclk, p_mclk_in); From 01a4ac4c65bb4c733ed00f3e1a7b2fcbf8cfbe91 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 19 Apr 2016 12:03:45 +0100 Subject: [PATCH 09/57] Added DSP buffering code to audio --- module_usb_audio/audio.xc | 80 ++++++++++++++++++++++++++++++--------- 1 file changed, 63 insertions(+), 17 deletions(-) diff --git a/module_usb_audio/audio.xc b/module_usb_audio/audio.xc index 722a5fc4..558526ec 100755 --- a/module_usb_audio/audio.xc +++ b/module_usb_audio/audio.xc @@ -32,6 +32,11 @@ #include "commands.h" #include "xc_ptr.h" +#ifdef RUN_DSP_TASK +#include "dsp.h" +#endif + + #include "print.h" static unsigned samplesOut[NUM_USB_CHAN_OUT]; @@ -224,10 +229,60 @@ static inline void TransferAdatTxSamples(chanend c_adat_out, const unsigned samp } #endif +//TODO +#define NUM_MIC_INPUTS 2 +#define DSP_BLOCK_SIZE 160 + +/* DSP data double buffered */ +int dspBuffer_in_adc[2][DSP_BLOCK_SIZE * NUM_MIC_INPUTS]; // TODO +int dspBuffer_in_usb[2][DSP_BLOCK_SIZE]; +int dspBuffer_out_usb[2][DSP_BLOCK_SIZE]; +int dspBuffer_out_dac[2][DSP_BLOCK_SIZE]; + + +/* TODO could this be a general channel management call? */ +/* usbSamples: the sample frame the device is going to play to the output audio interfaces */ +/* adcSamples: the sample frame the device is going to send to the host */ +#pragma unsafe arrays +unsigned DspBufferManagement(int dspBuffer_in_adc[], int dspBuffer_in_usb[], + int dspBuffer_out_usb[], int dspBuffer_out_dac[], + unsigned usbSamples[], unsigned adcSamples[], + unsigned sampleCount) +{ + /* Add samples to DSP buffers */ + dspBuffer_in_adc[(sampleCount * NUM_MIC_INPUTS)] = adcSamples[PDM_MIC_INDEX]; + dspBuffer_in_adc[(sampleCount * NUM_MIC_INPUTS) + 1] = adcSamples[PDM_MIC_INDEX+1]; + dspBuffer_in_usb[sampleCount] = 0; // TODO + + /* Read out of DSP buffer */ + adcSamples[0] = dspBuffer_out_usb[sampleCount]; + adcSamples[1] = dspBuffer_out_usb[sampleCount]; + + return sampleCount+1; +} #pragma unsafe arrays -static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, const unsigned underflowWord) +static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, const unsigned underflowWord, client dsp_if i_dsp) { + static unsigned dspSampleCount = 0; + static unsigned dspBufferNo = 0; + +#if 1 + /* Add samples to DSP buffer */ + /* TODO need to use samplesIn_1 and samplesIn_0 using readBuffNo */ + dspSampleCount = DspBufferManagement(dspBuffer_in_adc[dspBufferNo], dspBuffer_in_usb[dspBufferNo], + dspBuffer_out_usb[dspBufferNo], dspBuffer_out_dac[dspBufferNo], + samplesOut, samplesIn_0, dspSampleCount); + + if(dspSampleCount >= DSP_BLOCK_SIZE) + unsafe{ + i_dsp.transfer_buffers((int * unsafe) dspBuffer_in_adc[dspBufferNo], (int * unsafe) dspBuffer_in_usb[dspBufferNo], + (int * unsafe) dspBuffer_out_usb[dspBufferNo], (int * unsafe) dspBuffer_out_dac[dspBufferNo]); + dspSampleCount = 0; + dspBufferNo = 1-dspBufferNo; + } +#endif + outuint(c_out, underflowWord); /* Check for sample freq change (or other command) or new samples from mixer*/ @@ -291,7 +346,6 @@ static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, con } return 0; - } static inline void InitPorts(unsigned divide) @@ -443,8 +497,8 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, #if (NUM_PDM_MICS > 0) chanend c_pdm_pcm, #endif - - chanend ?c_adc) + chanend ?unused, + client dsp_if i_dsp) { /* Since DAC and ADC buffered ports off by one sample we buffer previous ADC frame */ @@ -481,7 +535,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, } #endif - unsigned command = DoSampleTransfer(c_out, readBuffNo, underflowWord); + unsigned command = DoSampleTransfer(c_out, readBuffNo, underflowWord, i_dsp); #ifdef ADAT_TX unsafe{ //TransferAdatTxSamples(c_adat_out, samplesOut, adatSmuxMode, 0); @@ -732,15 +786,6 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, samplesIn_0[((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); // channels 1, 3, 5.. on each line. } - -#ifdef SU1_ADC_ENABLE - { - unsigned x; - x = inuint(c_adc); - inct(c_adc); - asm volatile("stw %0, dp[g_adcVal]"::"r"(x)); - } -#endif #endif #ifndef CODEC_MASTER @@ -828,9 +873,9 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, /* The below looks a bit odd but forces the compiler to inline twice */ unsigned command; if(readBuffNo) - command = DoSampleTransfer(c_out, 1, underflowWord); + command = DoSampleTransfer(c_out, 1, underflowWord, i_dsp); else - command = DoSampleTransfer(c_out, 0, underflowWord); + command = DoSampleTransfer(c_out, 0, underflowWord, i_dsp); if(command) @@ -943,6 +988,7 @@ chanend ?c_config, chanend ?c #if (NUM_PDM_MICS > 0) , chanend c_pdm_in #endif +, client dsp_if i_dsp ) { #if defined (SPDIF_TX) && (SPDIF_TX_TILE == AUDIO_IO_TILE) @@ -1185,7 +1231,7 @@ chanend ?c_config, chanend ?c #if (NUM_PDM_MICS > 0) c_pdm_in, #endif - c); + null, i_dsp); if(command == SET_SAMPLE_FREQ) { From b28ca58c8d03ae6509cb16d6f82cf76e7a814792 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 19 Apr 2016 12:04:04 +0100 Subject: [PATCH 10/57] Added DSP interface to audio() proto --- module_usb_audio/audio.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/module_usb_audio/audio.h b/module_usb_audio/audio.h index 24622ca3..c5c97f87 100644 --- a/module_usb_audio/audio.h +++ b/module_usb_audio/audio.h @@ -3,6 +3,8 @@ #include "devicedefines.h" #include "dfu_interface.h" +#include "dsp.h" + /** The audio driver thread. * * This function drives I2S ports and handles samples to/from other digital @@ -29,6 +31,7 @@ void audio(chanend c_in, #if (NUM_PDM_MICS > 0) , chanend c_pdm_in #endif + , client dsp_if i_dsp ); void SpdifTxWrapper(chanend c_spdif_tx); From 8a26f42a85901c65427d284d58a81c5bcdf7128a Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 19 Apr 2016 14:23:38 +0100 Subject: [PATCH 11/57] Mic loop unrolled once --- module_usb_audio/pdm_mics/pcm_pdm_mic.xc | 48 +++++++++++++++--------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/module_usb_audio/pdm_mics/pcm_pdm_mic.xc b/module_usb_audio/pdm_mics/pcm_pdm_mic.xc index dbece241..29b39c31 100644 --- a/module_usb_audio/pdm_mics/pcm_pdm_mic.xc +++ b/module_usb_audio/pdm_mics/pcm_pdm_mic.xc @@ -51,6 +51,8 @@ void pdm_process(streaming chanend c_ds_output[2], chanend c_audio unsigned decimationfactor = 96000/samplerate; + + /* Note, loops is unrolled once - allows for while(1) select {} and thus combinable */ unsafe { const int * unsafe fir_coefs[7] = {0, g_third_stage_div_2_fir, g_third_stage_div_4_fir, g_third_stage_div_6_fir, g_third_stage_div_8_fir, 0, g_third_stage_div_12_fir}; @@ -59,35 +61,47 @@ void pdm_process(streaming chanend c_ds_output[2], chanend c_audio mic_array_decimator_config_t dc[2] = {{&dcc, data_0, {0, 0, 0, 0}, 4}, {&dcc, data_1, {0, 0, 0, 0}, 4}}; mic_array_decimator_configure(c_ds_output, 2, dc); - mic_array_init_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); + mic_array_init_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); - while(1) - { mic_array_frame_time_domain * unsafe current = mic_array_get_next_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); - unsafe - { - int req; #ifdef MIC_PROCESSING_USE_INTERFACE - i_mic_process.transfer_buffers(current, output); + i_mic_process.transfer_buffers(current, output); #else - user_pdm_process(current, output); + user_pdm_process(current, output); #endif - c_audio :> req; - if(req) + while(1) + { + + unsafe { - for(int i = 0; i < NUM_PDM_MICS; i++) + int req; + + c_audio :> req; + if(req) { - c_audio <: output[i]; + for(int i = 0; i < NUM_PDM_MICS; i++) + { + c_audio <: output[i]; + } } + else + { + break; + } + + mic_array_frame_time_domain * unsafe current = mic_array_get_next_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); + + +#ifdef MIC_PROCESSING_USE_INTERFACE + i_mic_process.transfer_buffers(current, output); +#else + user_pdm_process(current, output); +#endif + } - else - { - break; - } - } } } } From 89c38547070705ac399e24c07b8daa245b71f241 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 19 Apr 2016 15:47:15 +0100 Subject: [PATCH 12/57] mic buffering now uses select --- module_usb_audio/pdm_mics/pcm_pdm_mic.xc | 40 +++++++++++++----------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/module_usb_audio/pdm_mics/pcm_pdm_mic.xc b/module_usb_audio/pdm_mics/pcm_pdm_mic.xc index 29b39c31..c55fff93 100644 --- a/module_usb_audio/pdm_mics/pcm_pdm_mic.xc +++ b/module_usb_audio/pdm_mics/pcm_pdm_mic.xc @@ -71,36 +71,40 @@ void pdm_process(streaming chanend c_ds_output[2], chanend c_audio #else user_pdm_process(current, output); #endif - - while(1) + int loop =1; + while(loop) { - unsafe { int req; - c_audio :> req; - if(req) + select { - for(int i = 0; i < NUM_PDM_MICS; i++) - { - c_audio <: output[i]; - } - } - else - { - break; - } + case c_audio :> req: + if(req) + { + for(int i = 0; i < NUM_PDM_MICS; i++) + { + c_audio <: output[i]; + } - mic_array_frame_time_domain * unsafe current = mic_array_get_next_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); + mic_array_frame_time_domain * unsafe current = mic_array_get_next_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); #ifdef MIC_PROCESSING_USE_INTERFACE - i_mic_process.transfer_buffers(current, output); + i_mic_process.transfer_buffers(current, output); #else - user_pdm_process(current, output); + user_pdm_process(current, output); #endif - + } + else + { + loop = 0; + continue; + break; + } + break; + } } } } From 7e27ef22799671db4f882f832c263b7b439a5a94 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 20 Apr 2016 11:21:44 +0100 Subject: [PATCH 13/57] pdm_process() now in top-level main. This allows use of .core[] and thus can force compiler to combine. --- module_usb_audio/main.xc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/module_usb_audio/main.xc b/module_usb_audio/main.xc index ee2b068d..9f7d1797 100755 --- a/module_usb_audio/main.xc +++ b/module_usb_audio/main.xc @@ -549,6 +549,7 @@ int main() #if (NUM_PDM_MICS > 0) chan c_pdm_pcm; + streaming chan c_ds_output[2]; #ifdef MIC_PROCESSING_USE_INTERFACE interface mic_process_if i_mic_process; #endif @@ -668,12 +669,9 @@ int main() #endif #if (NUM_PDM_MICS > 0) - on stdcore[PDM_TILE]: pcm_pdm_mic(c_pdm_pcm -#ifdef MIC_PROCESSING_USE_INTERFACE - , i_mic_process -#endif - ); + on stdcore[PDM_TILE]: pcm_pdm_mic(c_ds_output); #endif + on stdcore[PDM_TILE].core[0]: pdm_process(c_ds_output, c_pdm_pcm, i_mic_process); // TODO move this to USER_MAIN_CORES or guard with RUN_DSP_TASK // TODO NUM_DSP_CTRL_INTS From 0198a204f9e575b2587170227ced72baf69a5548 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 20 Apr 2016 11:22:13 +0100 Subject: [PATCH 14/57] Prototype changes required to move pdm_process to main --- module_usb_audio/pdm_mics/pcm_pdm_mic.h | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/module_usb_audio/pdm_mics/pcm_pdm_mic.h b/module_usb_audio/pdm_mics/pcm_pdm_mic.h index 0a54943f..499097a0 100644 --- a/module_usb_audio/pdm_mics/pcm_pdm_mic.h +++ b/module_usb_audio/pdm_mics/pcm_pdm_mic.h @@ -12,10 +12,19 @@ typedef interface mic_process_if void init(); } mic_process_if; -[[distributable]] + +[[combinable]] +void pdm_process(streaming chanend c_ds_output[2], chanend c_audio +#ifdef MIC_PROCESSING_USE_INTERFACE + , client mic_process_if i_mic_process +#endif +); + +[[combinable]] void user_pdm_process(server mic_process_if i_mic_data); -void pcm_pdm_mic(chanend c_pcm_out, client mic_process_if i_mic_process); + +void pcm_pdm_mic(streaming chanend c_ds_output[2]); #else @@ -24,7 +33,7 @@ unsafe void user_pdm_process(mic_array_frame_time_domain * unsafe audio, int out void user_pdm_init(); -void pcm_pdm_mic(chanend c_pcm_out); +void pcm_pdm_mic(streaming chanend c_ds_output[2]); #endif From 8a7067a232bade2d0890f8b9d40a4527ee11790d Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 20 Apr 2016 11:22:51 +0100 Subject: [PATCH 15/57] pdm_process() now combinable --- module_usb_audio/pdm_mics/pcm_pdm_mic.xc | 170 ++++++++++++++--------- 1 file changed, 107 insertions(+), 63 deletions(-) diff --git a/module_usb_audio/pdm_mics/pcm_pdm_mic.xc b/module_usb_audio/pdm_mics/pcm_pdm_mic.xc index c55fff93..9dbeca43 100644 --- a/module_usb_audio/pdm_mics/pcm_pdm_mic.xc +++ b/module_usb_audio/pdm_mics/pcm_pdm_mic.xc @@ -29,6 +29,7 @@ int data_1[4*THIRD_STAGE_COEFS_PER_STAGE * MAX_DECIMATION_FACTOR] = {0}; mic_array_frame_time_domain mic_audio[2]; +[[combinable]] void pdm_process(streaming chanend c_ds_output[2], chanend c_audio #ifdef MIC_PROCESSING_USE_INTERFACE , client mic_process_if i_mic_process @@ -43,70 +44,116 @@ void pdm_process(streaming chanend c_ds_output[2], chanend c_audio #else user_pdm_init(); #endif - while(1) + + mic_array_decimator_conf_common_t dcc; + const int * unsafe fir_coefs[7]; + mic_array_frame_time_domain * unsafe current; + mic_array_decimator_config_t dc[2]; + + unsigned samplerate; + + c_audio :> samplerate; + + unsigned decimationfactor = 96000/samplerate; + + + unsafe { - unsigned samplerate; + fir_coefs[0] = 0; + fir_coefs[1] = g_third_stage_div_2_fir; + fir_coefs[2] = g_third_stage_div_4_fir; + fir_coefs[3] = g_third_stage_div_6_fir; + fir_coefs[4] = g_third_stage_div_8_fir; + fir_coefs[5] = 0; + fir_coefs[6] = g_third_stage_div_12_fir; - c_audio :> samplerate; + //dcc = {MIC_ARRAY_MAX_FRAME_SIZE_LOG2, 1, 0, 0, decimationfactor, fir_coefs[decimationfactor/2], 0, 0, DECIMATOR_NO_FRAME_OVERLAP, 2}; + dcc.frame_size_log2 = MIC_ARRAY_MAX_FRAME_SIZE_LOG2; + dcc.apply_dc_offset_removal = 1; + dcc.index_bit_reversal = 0; + dcc.windowing_function = null; + dcc.output_decimation_factor = decimationfactor; + dcc.coefs = fir_coefs[decimationfactor/2]; + dcc.apply_mic_gain_compensation = 0; + dcc.fir_gain_compensation = 0; + dcc.buffering_type = DECIMATOR_NO_FRAME_OVERLAP; + dcc.number_of_frame_buffers = 2; - unsigned decimationfactor = 96000/samplerate; + //dc[2] = {{&dcc, data_0, {0, 0, 0, 0}, 4}, {&dcc, data_1, {0, 0, 0, 0}, 4}}; + dc[0].dcc = &dcc; + dc[0].data = data_0; + dc[0].mic_gain_compensation[0]=0; + dc[0].mic_gain_compensation[1]=0; + dc[0].mic_gain_compensation[2]=0; + dc[0].mic_gain_compensation[3]=0; + dc[0].channel_count = 4; + dc[1].dcc = &dcc; + dc[1].data = data_1; + dc[1].mic_gain_compensation[0]=0; + dc[1].mic_gain_compensation[1]=0; + dc[1].mic_gain_compensation[2]=0; + dc[1].mic_gain_compensation[3]=0; + dc[1].channel_count = 4; + mic_array_decimator_configure(c_ds_output, 2, dc); - /* Note, loops is unrolled once - allows for while(1) select {} and thus combinable */ - unsafe + mic_array_init_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); + + /* Grab a first frame of mic data */ + /* Note, loop is unrolled once - allows for while(1) select {} and thus combinable */ + current = mic_array_get_next_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); + } + + /* Run user code */ +#ifdef MIC_PROCESSING_USE_INTERFACE + i_mic_process.transfer_buffers(current, output); +#else + user_pdm_process(current, output); +#endif + int req; + while(1) { - const int * unsafe fir_coefs[7] = {0, g_third_stage_div_2_fir, g_third_stage_div_4_fir, g_third_stage_div_6_fir, g_third_stage_div_8_fir, 0, g_third_stage_div_12_fir}; - - mic_array_decimator_conf_common_t dcc = {MIC_ARRAY_MAX_FRAME_SIZE_LOG2, 1, 0, 0, decimationfactor, fir_coefs[decimationfactor/2], 0, 0, DECIMATOR_NO_FRAME_OVERLAP, 2}; - mic_array_decimator_config_t dc[2] = {{&dcc, data_0, {0, 0, 0, 0}, 4}, {&dcc, data_1, {0, 0, 0, 0}, 4}}; - mic_array_decimator_configure(c_ds_output, 2, dc); - - mic_array_init_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); - - mic_array_frame_time_domain * unsafe current = mic_array_get_next_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); - - -#ifdef MIC_PROCESSING_USE_INTERFACE - i_mic_process.transfer_buffers(current, output); -#else - user_pdm_process(current, output); -#endif - int loop =1; - while(loop) - { - unsafe + select { - int req; + case c_audio :> req: + + if(req) + unsafe{ + for(int i = 0; i < NUM_PDM_MICS; i++) + { + c_audio <: output[i]; + } - select - { - case c_audio :> req: - if(req) - { - for(int i = 0; i < NUM_PDM_MICS; i++) - { - c_audio <: output[i]; - } - - mic_array_frame_time_domain * unsafe current = mic_array_get_next_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); + + mic_array_frame_time_domain * unsafe current = mic_array_get_next_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); #ifdef MIC_PROCESSING_USE_INTERFACE - i_mic_process.transfer_buffers(current, output); + i_mic_process.transfer_buffers(current, output); #else - user_pdm_process(current, output); + user_pdm_process(current, output); #endif - } - else - { - loop = 0; - continue; - break; - } - break; } - } - } + else + unsafe{ + /* Sample rate change */ + c_audio :> samplerate; + decimationfactor = 96000/samplerate; + dcc.output_decimation_factor = decimationfactor; + dcc.coefs=fir_coefs[decimationfactor/2]; + mic_array_decimator_configure(c_ds_output, 2, dc); + + mic_array_init_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); + + mic_array_frame_time_domain * unsafe current = mic_array_get_next_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); + +#ifdef MIC_PROCESSING_USE_INTERFACE + i_mic_process.transfer_buffers(current, output); +#else + user_pdm_process(current, output); +#endif + } + break; } } } @@ -115,14 +162,9 @@ void pdm_process(streaming chanend c_ds_output[2], chanend c_audio #error MAX_FREQ > 48000 NOT CURRENTLY SUPPORTED #endif -void pcm_pdm_mic(chanend c_pcm_out -#ifdef MIC_PROCESSING_USE_INTERFACE - , client mic_process_if i_mic_process -#endif - ) +void pcm_pdm_mic(streaming chanend c_ds_output[2]) { streaming chan c_4x_pdm_mic_0, c_4x_pdm_mic_1; - streaming chan c_ds_output[2]; /* Note, this divide should be based on master clock freq */ configure_clock_src_divide(pdmclk, p_mclk, 2); @@ -130,18 +172,20 @@ void pcm_pdm_mic(chanend c_pcm_out configure_in_port(p_pdm_mics, pdmclk); start_clock(pdmclk); + unsafe + { par { mic_array_pdm_rx(p_pdm_mics, c_4x_pdm_mic_0, c_4x_pdm_mic_1); mic_array_decimate_to_pcm_4ch(c_4x_pdm_mic_0, c_ds_output[0]); mic_array_decimate_to_pcm_4ch(c_4x_pdm_mic_1, c_ds_output[1]); -#ifdef MIC_PROCESSING_USE_INTERFACE - pdm_process(c_ds_output, c_pcm_out, i_mic_process); - /* Note: user_pdm process is included in main.xc to allow maximum flexibilty for customisation/distribution etc */ -#else - pdm_process(c_ds_output, c_pcm_out); -#endif - } +//#ifdef MIC_PROCESSING_USE_INTERFACE +// pdm_process(c_ds_output, c_pcm_out, i_mic_process); +/// /* Note: user_pdm process is included in main.xc to allow maximum flexibilty for customisation/distribution etc */ +//#else +// pdm_process(c_ds_output, c_pcm_out); +//#endif + }} } #endif From 845ed8f0012eb6399d62ef699a6114a22edb4c64 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Thu, 21 Apr 2016 16:43:25 +0100 Subject: [PATCH 16/57] Initial changes to allow for xvsm demo --- .../{audio.xc => audio_io/audio_io.xc} | 0 .../audio_io/userbuffermanagement.c | 9 +++++ .../{audio.h => audio_io/xua_audio.h} | 0 module_usb_audio/{dsp.h => dsp/xua_dsp.h} | 0 module_usb_audio/main.xc | 20 +++++----- module_usb_audio/pdm_mics/pdm_mic.h | 37 +++++++++++++++++++ .../pdm_mics/{pcm_pdm_mic.xc => pdm_mic.xc} | 0 .../pdm_mics/{pcm_pdm_mic.h => xua_pdm_mic.h} | 0 8 files changed, 56 insertions(+), 10 deletions(-) rename module_usb_audio/{audio.xc => audio_io/audio_io.xc} (100%) create mode 100644 module_usb_audio/audio_io/userbuffermanagement.c rename module_usb_audio/{audio.h => audio_io/xua_audio.h} (100%) rename module_usb_audio/{dsp.h => dsp/xua_dsp.h} (100%) create mode 100644 module_usb_audio/pdm_mics/pdm_mic.h rename module_usb_audio/pdm_mics/{pcm_pdm_mic.xc => pdm_mic.xc} (100%) rename module_usb_audio/pdm_mics/{pcm_pdm_mic.h => xua_pdm_mic.h} (100%) diff --git a/module_usb_audio/audio.xc b/module_usb_audio/audio_io/audio_io.xc similarity index 100% rename from module_usb_audio/audio.xc rename to module_usb_audio/audio_io/audio_io.xc diff --git a/module_usb_audio/audio_io/userbuffermanagement.c b/module_usb_audio/audio_io/userbuffermanagement.c new file mode 100644 index 00000000..7b5f65d8 --- /dev/null +++ b/module_usb_audio/audio_io/userbuffermanagement.c @@ -0,0 +1,9 @@ + +#include "xccompat.h" + +/* Default implentation for UserBufferManagement() */ +void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[], unsigned i_dsp) __attribute__ ((weak)); +void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[], unsigned i_dsp) +{ + /* Do nothing */ +} diff --git a/module_usb_audio/audio.h b/module_usb_audio/audio_io/xua_audio.h similarity index 100% rename from module_usb_audio/audio.h rename to module_usb_audio/audio_io/xua_audio.h diff --git a/module_usb_audio/dsp.h b/module_usb_audio/dsp/xua_dsp.h similarity index 100% rename from module_usb_audio/dsp.h rename to module_usb_audio/dsp/xua_dsp.h diff --git a/module_usb_audio/main.xc b/module_usb_audio/main.xc index 9f7d1797..1ca7cc27 100755 --- a/module_usb_audio/main.xc +++ b/module_usb_audio/main.xc @@ -22,7 +22,8 @@ #ifdef MIDI #include "usb_midi.h" #endif -#include "audio.h" + +#include "xua_audio.h" #ifdef IAP #include "i2c_shared.h" @@ -44,11 +45,11 @@ #include "clocking.h" #if (NUM_PDM_MICS > 0) -#include "pcm_pdm_mic.h" +#include "xua_pdm_mic.h" #endif #ifdef RUN_DSP_TASK -#include "dsp.h" +#include "xua_dsp.h" #endif [[distributable]] @@ -148,18 +149,18 @@ on tile[AUDIO_IO_TILE] : out port p_pll_clk = PORT_PLL_REF; #endif #ifdef MIDI -on tile[MIDI_TILE] : port p_midi_tx = PORT_MIDI_OUT; +on tile[MIDI_TILE] : port p_midi_tx = PORT_MIDI_OUT; #if(MIDI_RX_PORT_WIDTH == 4) -on tile[MIDI_TILE] : buffered in port:4 p_midi_rx = PORT_MIDI_IN; +on tile[MIDI_TILE] : buffered in port:4 p_midi_rx = PORT_MIDI_IN; #elif(MIDI_RX_PORT_WIDTH == 1) -on tile[MIDI_TILE] : buffered in port:1 p_midi_rx = PORT_MIDI_IN; +on tile[MIDI_TILE] : buffered in port:1 p_midi_rx = PORT_MIDI_IN; #endif #endif /* Clock blocks */ #ifdef MIDI -on tile[MIDI_TILE] : clock clk_midi = CLKBLK_MIDI; +on tile[MIDI_TILE] : clock clk_midi = CLKBLK_MIDI; #endif #if defined(SPDIF_TX) || defined(ADAT_TX) @@ -669,10 +670,9 @@ int main() #endif #if (NUM_PDM_MICS > 0) - on stdcore[PDM_TILE]: pcm_pdm_mic(c_ds_output); + on stdcore[PDM_TILE]: pdm_mic(c_ds_output); + on stdcore[PDM_TILE].core[0]: pdm_buffer(c_ds_output, c_pdm_pcm, i_mic_process); #endif - on stdcore[PDM_TILE].core[0]: pdm_process(c_ds_output, c_pdm_pcm, i_mic_process); - // TODO move this to USER_MAIN_CORES or guard with RUN_DSP_TASK // TODO NUM_DSP_CTRL_INTS on stdcore[AUDIO_IO_TILE] : dsp_process(i_dsp, i_dsp_ctrl, 1); diff --git a/module_usb_audio/pdm_mics/pdm_mic.h b/module_usb_audio/pdm_mics/pdm_mic.h new file mode 100644 index 00000000..cf6f0e6d --- /dev/null +++ b/module_usb_audio/pdm_mics/pdm_mic.h @@ -0,0 +1,37 @@ + +#include "mic_array.h" + +#ifdef MIC_PROCESSING_USE_INTERFACE +/* Interface based user processing */ +typedef interface mic_process_if +{ + void transfer_buffers(mic_array_frame_time_domain * unsafe audio, int output[]); + void init(); +} mic_process_if; + + +[[combinable]] +void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio +#ifdef MIC_PROCESSING_USE_INTERFACE + , client mic_process_if i_mic_process +#endif +); + +[[combinable]] +void user_pdm_process(server mic_process_if i_mic_data); + +/* PDM interface and decimation cores */ +void pdm_mic(streaming chanend c_ds_output[2]); + +#else + +/* Simple user hooks/call-backs */ +unsafe void user_pdm_process(mic_array_frame_time_domain * unsafe audio, int output[]); + +void user_pdm_init(); + +/* PDM interface and decimation cores */ +void pdm_mic(streaming chanend c_ds_output[2]); + +#endif + diff --git a/module_usb_audio/pdm_mics/pcm_pdm_mic.xc b/module_usb_audio/pdm_mics/pdm_mic.xc similarity index 100% rename from module_usb_audio/pdm_mics/pcm_pdm_mic.xc rename to module_usb_audio/pdm_mics/pdm_mic.xc diff --git a/module_usb_audio/pdm_mics/pcm_pdm_mic.h b/module_usb_audio/pdm_mics/xua_pdm_mic.h similarity index 100% rename from module_usb_audio/pdm_mics/pcm_pdm_mic.h rename to module_usb_audio/pdm_mics/xua_pdm_mic.h From 8e1b71f70ced5e4f9b2c76d3cb14dda90276fa9a Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Thu, 21 Apr 2016 18:21:08 +0100 Subject: [PATCH 17/57] All input samples now run through the double buffer to allow for the UserBufferManagement function. samplesIn now 2D to make this a bit easier. DSP code now in app space. --- module_usb_audio/audio_io/audio_io.xc | 121 ++++++-------------------- module_usb_audio/audio_io/xua_audio.h | 2 +- 2 files changed, 27 insertions(+), 96 deletions(-) diff --git a/module_usb_audio/audio_io/audio_io.xc b/module_usb_audio/audio_io/audio_io.xc index 558526ec..98afa9bc 100755 --- a/module_usb_audio/audio_io/audio_io.xc +++ b/module_usb_audio/audio_io/audio_io.xc @@ -33,17 +33,13 @@ #include "xc_ptr.h" #ifdef RUN_DSP_TASK -#include "dsp.h" +#include "xua_dsp.h" #endif - -#include "print.h" - static unsigned samplesOut[NUM_USB_CHAN_OUT]; /* Two buffers for ADC data to allow for DAC and ADC ports being offset */ -static unsigned samplesIn_0[NUM_USB_CHAN_IN]; -static unsigned samplesIn_1[I2S_CHANS_ADC]; +static unsigned samplesIn[2][NUM_USB_CHAN_IN]; #if (DSD_CHANS_DAC != 0) extern buffered out port:32 p_dsd_dac[DSD_CHANS_DAC]; @@ -229,60 +225,14 @@ static inline void TransferAdatTxSamples(chanend c_adat_out, const unsigned samp } #endif -//TODO -#define NUM_MIC_INPUTS 2 -#define DSP_BLOCK_SIZE 160 - -/* DSP data double buffered */ -int dspBuffer_in_adc[2][DSP_BLOCK_SIZE * NUM_MIC_INPUTS]; // TODO -int dspBuffer_in_usb[2][DSP_BLOCK_SIZE]; -int dspBuffer_out_usb[2][DSP_BLOCK_SIZE]; -int dspBuffer_out_dac[2][DSP_BLOCK_SIZE]; - - -/* TODO could this be a general channel management call? */ -/* usbSamples: the sample frame the device is going to play to the output audio interfaces */ -/* adcSamples: the sample frame the device is going to send to the host */ -#pragma unsafe arrays -unsigned DspBufferManagement(int dspBuffer_in_adc[], int dspBuffer_in_usb[], - int dspBuffer_out_usb[], int dspBuffer_out_dac[], - unsigned usbSamples[], unsigned adcSamples[], - unsigned sampleCount) -{ - /* Add samples to DSP buffers */ - dspBuffer_in_adc[(sampleCount * NUM_MIC_INPUTS)] = adcSamples[PDM_MIC_INDEX]; - dspBuffer_in_adc[(sampleCount * NUM_MIC_INPUTS) + 1] = adcSamples[PDM_MIC_INDEX+1]; - dspBuffer_in_usb[sampleCount] = 0; // TODO - - /* Read out of DSP buffer */ - adcSamples[0] = dspBuffer_out_usb[sampleCount]; - adcSamples[1] = dspBuffer_out_usb[sampleCount]; - - return sampleCount+1; -} +/* sampsFromUsbToAudio: The sample frame the device has recived from the host and is going to play to the output audio interfaces */ +/* sampsFromAudioToUsb: The sample frame that was received from the audio interfaces and that the device is going to send to the host */ +void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[], client dsp_if i_dsp); #pragma unsafe arrays static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, const unsigned underflowWord, client dsp_if i_dsp) { - static unsigned dspSampleCount = 0; - static unsigned dspBufferNo = 0; - -#if 1 - /* Add samples to DSP buffer */ - /* TODO need to use samplesIn_1 and samplesIn_0 using readBuffNo */ - dspSampleCount = DspBufferManagement(dspBuffer_in_adc[dspBufferNo], dspBuffer_in_usb[dspBufferNo], - dspBuffer_out_usb[dspBufferNo], dspBuffer_out_dac[dspBufferNo], - samplesOut, samplesIn_0, dspSampleCount); - - if(dspSampleCount >= DSP_BLOCK_SIZE) - unsafe{ - i_dsp.transfer_buffers((int * unsafe) dspBuffer_in_adc[dspBufferNo], (int * unsafe) dspBuffer_in_usb[dspBufferNo], - (int * unsafe) dspBuffer_out_usb[dspBufferNo], (int * unsafe) dspBuffer_out_dac[dspBufferNo]); - dspSampleCount = 0; - dspBufferNo = 1-dspBufferNo; - } -#endif - + outuint(c_out, underflowWord); /* Check for sample freq change (or other command) or new samples from mixer*/ @@ -323,27 +273,18 @@ static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, con #else inuint(c_out); #endif + + UserBufferManagement(samplesOut, samplesIn[readBuffNo], i_dsp); + #if NUM_USB_CHAN_IN > 0 #pragma loop unroll -#if NUM_USB_CHAN_IN < I2S_CHANS_ADC for(int i = 0; i < NUM_USB_CHAN_IN; i++) -#else - for(int i = 0; i < I2S_CHANS_ADC; i++) -#endif { - if(readBuffNo) - outuint(c_out, samplesIn_1[i]); - else - outuint(c_out, samplesIn_0[i]); - } - /* Send over the digi channels - no odd buffering required */ -#pragma loop unroll - for(int i = I2S_CHANS_ADC; i < NUM_USB_CHAN_IN; i++) - { - outuint(c_out, samplesIn_0[i]); - } + outuint(c_out, samplesIn[readBuffNo][i]); + } #endif } + return 0; } @@ -481,8 +422,6 @@ static inline void InitPorts(unsigned divide) #endif } - - /* I2S delivery thread */ #pragma unsafe arrays unsigned static deliver(chanend c_out, chanend ?c_spd_out, @@ -556,7 +495,6 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, /* Main Audio I/O loop */ while (1) { - #if (DSD_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT > 0) if(dsdMode == DSD_MODE_NATIVE) { @@ -680,10 +618,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, asm volatile("in %0, res[%1]" : "=r"(sample) : "r"(p_i2s_adc[index++])); /* Note the use of readBuffNo changes based on frameCount */ - if(buffIndex) - samplesIn_1[((frameCount-2)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); // channels 0, 2, 4.. on each line. - else - samplesIn_0[((frameCount-2)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); + samplesIn[buffIndex][((frameCount-2)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); // channels 0, 2, 4.. on each line. } #endif @@ -730,22 +665,21 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, /* Sync with clockgen */ inuint(c_dig_rx); - /* Note, digi-data we just store in samplesIn_0 - we only double buffer the I2S input data */ + /* Note, digi-data we just store in samplesIn[readBuffNo] - we only double buffer the I2S input data */ #endif #ifdef SPDIF_RX - asm("ldw %0, dp[g_digData]":"=r"(samplesIn_0[SPDIF_RX_INDEX + 0])); - asm("ldw %0, dp[g_digData+4]":"=r"(samplesIn_0[SPDIF_RX_INDEX + 1])); - + asm("ldw %0, dp[g_digData]" :"=r"(samplesIn[readBuffNo][SPDIF_RX_INDEX + 0])); + asm("ldw %0, dp[g_digData+4]":"=r"(samplesIn[readBuffNo][SPDIF_RX_INDEX + 1])); #endif #ifdef ADAT_RX - asm("ldw %0, dp[g_digData+8]":"=r"(samplesIn_0[ADAT_RX_INDEX])); - asm("ldw %0, dp[g_digData+12]":"=r"(samplesIn_0[ADAT_RX_INDEX + 1])); - asm("ldw %0, dp[g_digData+16]":"=r"(samplesIn_0[ADAT_RX_INDEX + 2])); - asm("ldw %0, dp[g_digData+20]":"=r"(samplesIn_0[ADAT_RX_INDEX + 3])); - asm("ldw %0, dp[g_digData+24]":"=r"(samplesIn_0[ADAT_RX_INDEX + 4])); - asm("ldw %0, dp[g_digData+28]":"=r"(samplesIn_0[ADAT_RX_INDEX + 5])); - asm("ldw %0, dp[g_digData+32]":"=r"(samplesIn_0[ADAT_RX_INDEX + 6])); - asm("ldw %0, dp[g_digData+36]":"=r"(samplesIn_0[ADAT_RX_INDEX + 7])); + asm("ldw %0, dp[g_digData+8]" :"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX])); + asm("ldw %0, dp[g_digData+12]":"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX + 1])); + asm("ldw %0, dp[g_digData+16]":"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX + 2])); + asm("ldw %0, dp[g_digData+20]":"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX + 3])); + asm("ldw %0, dp[g_digData+24]":"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX + 4])); + asm("ldw %0, dp[g_digData+28]":"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX + 5])); + asm("ldw %0, dp[g_digData+32]":"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX + 6])); + asm("ldw %0, dp[g_digData+36]":"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX + 7])); #endif #if defined(SPDIF_RX) || defined(ADAT_RX) @@ -764,7 +698,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, #pragma loop unroll for(int i = 0; i < NUM_PDM_MICS; i++) { - c_pdm_pcm :> samplesIn_0[i]; + c_pdm_pcm :> samplesIn[readBuffNo][i]; } #endif } @@ -780,10 +714,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, unsigned sample; asm volatile("in %0, res[%1]" : "=r"(sample) : "r"(p_i2s_adc[index++])); - if(buffIndex) - samplesIn_1[((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); // channels 1, 3, 5.. on each line. - else - samplesIn_0[((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); // channels 1, 3, 5.. on each line. + samplesIn[buffIndex][((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); // channels 1, 3, 5.. on each line. } #endif diff --git a/module_usb_audio/audio_io/xua_audio.h b/module_usb_audio/audio_io/xua_audio.h index c5c97f87..ab167830 100644 --- a/module_usb_audio/audio_io/xua_audio.h +++ b/module_usb_audio/audio_io/xua_audio.h @@ -3,7 +3,7 @@ #include "devicedefines.h" #include "dfu_interface.h" -#include "dsp.h" +#include "xua_dsp.h" /** The audio driver thread. * From f3819eeee372e7396ecf2fc04f75b8066340f40b Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Thu, 21 Apr 2016 18:23:18 +0100 Subject: [PATCH 18/57] PDM function rename and PDM buffer tidy --- module_usb_audio/pdm_mics/pdm_mic.xc | 111 +++++++++++------------- module_usb_audio/pdm_mics/xua_pdm_mic.h | 12 ++- 2 files changed, 58 insertions(+), 65 deletions(-) diff --git a/module_usb_audio/pdm_mics/pdm_mic.xc b/module_usb_audio/pdm_mics/pdm_mic.xc index 9dbeca43..662165bf 100644 --- a/module_usb_audio/pdm_mics/pdm_mic.xc +++ b/module_usb_audio/pdm_mics/pdm_mic.xc @@ -14,7 +14,7 @@ #include #include "mic_array.h" -#include "pcm_pdm_mic.h" +#include "xua_pdm_mic.h" #define MAX_DECIMATION_FACTOR 12 @@ -30,14 +30,15 @@ int data_1[4*THIRD_STAGE_COEFS_PER_STAGE * MAX_DECIMATION_FACTOR] = {0}; mic_array_frame_time_domain mic_audio[2]; [[combinable]] -void pdm_process(streaming chanend c_ds_output[2], chanend c_audio +void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio #ifdef MIC_PROCESSING_USE_INTERFACE , client mic_process_if i_mic_process #endif ) { - unsigned buffer = 1; // Buffer index + unsigned buffer; int output[NUM_PDM_MICS]; + unsigned samplerate; #ifdef MIC_PROCESSING_USE_INTERFACE i_mic_process.init(); @@ -49,14 +50,11 @@ void pdm_process(streaming chanend c_ds_output[2], chanend c_audio const int * unsafe fir_coefs[7]; mic_array_frame_time_domain * unsafe current; mic_array_decimator_config_t dc[2]; - - unsigned samplerate; + /* Get initial sample-rate and compute decimation factor */ c_audio :> samplerate; - unsigned decimationfactor = 96000/samplerate; - unsafe { fir_coefs[0] = 0; @@ -104,65 +102,70 @@ void pdm_process(streaming chanend c_ds_output[2], chanend c_audio current = mic_array_get_next_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); } - /* Run user code */ + /* Run user code */ #ifdef MIC_PROCESSING_USE_INTERFACE - i_mic_process.transfer_buffers(current, output); + i_mic_process.transfer_buffers(current, output); #else - user_pdm_process(current, output); + user_pdm_process(current, output); #endif - int req; - while(1) + int req; + while(1) + { + select { - select - { - case c_audio :> req: + case c_audio :> req: - if(req) - unsafe{ - for(int i = 0; i < NUM_PDM_MICS; i++) - { - c_audio <: output[i]; - } - - - mic_array_frame_time_domain * unsafe current = mic_array_get_next_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); - - -#ifdef MIC_PROCESSING_USE_INTERFACE - i_mic_process.transfer_buffers(current, output); -#else - user_pdm_process(current, output); -#endif + /* Audio IO core requests samples */ + if(req) + unsafe{ + for(int i = 0; i < NUM_PDM_MICS; i++) + { + c_audio <: output[i]; } - else - unsafe{ - /* Sample rate change */ - c_audio :> samplerate; - decimationfactor = 96000/samplerate; - dcc.output_decimation_factor = decimationfactor; - dcc.coefs=fir_coefs[decimationfactor/2]; - mic_array_decimator_configure(c_ds_output, 2, dc); - - mic_array_init_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); - mic_array_frame_time_domain * unsafe current = mic_array_get_next_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); + /* Get a new frame of mic data */ + mic_array_frame_time_domain * unsafe current = mic_array_get_next_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); + /* Run user code */ #ifdef MIC_PROCESSING_USE_INTERFACE - i_mic_process.transfer_buffers(current, output); + i_mic_process.transfer_buffers(current, output); #else - user_pdm_process(current, output); + user_pdm_process(current, output); #endif - } - break; - } - } + } + else + unsafe{ + /* Sample rate change */ + c_audio :> samplerate; + + /* Re-config the mic decimators for the new sample-rate */ + decimationfactor = 96000/samplerate; + dcc.output_decimation_factor = decimationfactor; + dcc.coefs=fir_coefs[decimationfactor/2]; + + mic_array_decimator_configure(c_ds_output, 2, dc); + mic_array_init_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); + + /* Get a new mic data frame */ + mic_array_frame_time_domain * unsafe current = mic_array_get_next_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); + + /* Run user code */ +#ifdef MIC_PROCESSING_USE_INTERFACE + i_mic_process.transfer_buffers(current, output); +#else + user_pdm_process(current, output); +#endif + } + break; + } /* select */ + } /* while(1) */ } #if MAX_FREQ > 48000 #error MAX_FREQ > 48000 NOT CURRENTLY SUPPORTED #endif -void pcm_pdm_mic(streaming chanend c_ds_output[2]) +void pdm_mic(streaming chanend c_ds_output[2]) { streaming chan c_4x_pdm_mic_0, c_4x_pdm_mic_1; @@ -172,20 +175,12 @@ void pcm_pdm_mic(streaming chanend c_ds_output[2]) configure_in_port(p_pdm_mics, pdmclk); start_clock(pdmclk); - unsafe - { par { mic_array_pdm_rx(p_pdm_mics, c_4x_pdm_mic_0, c_4x_pdm_mic_1); mic_array_decimate_to_pcm_4ch(c_4x_pdm_mic_0, c_ds_output[0]); mic_array_decimate_to_pcm_4ch(c_4x_pdm_mic_1, c_ds_output[1]); -//#ifdef MIC_PROCESSING_USE_INTERFACE -// pdm_process(c_ds_output, c_pcm_out, i_mic_process); -/// /* Note: user_pdm process is included in main.xc to allow maximum flexibilty for customisation/distribution etc */ -//#else -// pdm_process(c_ds_output, c_pcm_out); -//#endif - }} + } } #endif diff --git a/module_usb_audio/pdm_mics/xua_pdm_mic.h b/module_usb_audio/pdm_mics/xua_pdm_mic.h index 499097a0..cf6f0e6d 100644 --- a/module_usb_audio/pdm_mics/xua_pdm_mic.h +++ b/module_usb_audio/pdm_mics/xua_pdm_mic.h @@ -5,16 +5,13 @@ /* Interface based user processing */ typedef interface mic_process_if { - //[[guarded]] - //void transfer_buffers(int * unsafe in_mic_buf, int * unsafe in_spk_buf, int * unsafe out_mic_buf, int * unsafe out_spk_buf); void transfer_buffers(mic_array_frame_time_domain * unsafe audio, int output[]); - void init(); } mic_process_if; [[combinable]] -void pdm_process(streaming chanend c_ds_output[2], chanend c_audio +void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio #ifdef MIC_PROCESSING_USE_INTERFACE , client mic_process_if i_mic_process #endif @@ -23,8 +20,8 @@ void pdm_process(streaming chanend c_ds_output[2], chanend c_audio [[combinable]] void user_pdm_process(server mic_process_if i_mic_data); - -void pcm_pdm_mic(streaming chanend c_ds_output[2]); +/* PDM interface and decimation cores */ +void pdm_mic(streaming chanend c_ds_output[2]); #else @@ -33,7 +30,8 @@ unsafe void user_pdm_process(mic_array_frame_time_domain * unsafe audio, int out void user_pdm_init(); -void pcm_pdm_mic(streaming chanend c_ds_output[2]); +/* PDM interface and decimation cores */ +void pdm_mic(streaming chanend c_ds_output[2]); #endif From aee3851f4c8dfd623aacbd81b194eedd7f3a6253 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Thu, 21 Apr 2016 18:40:37 +0100 Subject: [PATCH 19/57] Audio sample buffers now magic value of 32. Was NUM_USB_CHAN_OUT/IN which causes issues if USB chan count < audio IF count. --- module_usb_audio/audio_io/audio_io.xc | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/module_usb_audio/audio_io/audio_io.xc b/module_usb_audio/audio_io/audio_io.xc index 98afa9bc..4e4728b8 100755 --- a/module_usb_audio/audio_io/audio_io.xc +++ b/module_usb_audio/audio_io/audio_io.xc @@ -36,18 +36,17 @@ #include "xua_dsp.h" #endif -static unsigned samplesOut[NUM_USB_CHAN_OUT]; +/* TODO 32 is max expected channels */ +static unsigned samplesOut[32]; /* Two buffers for ADC data to allow for DAC and ADC ports being offset */ -static unsigned samplesIn[2][NUM_USB_CHAN_IN]; +static unsigned samplesIn[2][32]; #if (DSD_CHANS_DAC != 0) extern buffered out port:32 p_dsd_dac[DSD_CHANS_DAC]; extern buffered out port:32 p_dsd_clk; #endif -unsigned g_adcVal = 0; - #ifdef XTA_TIMING_AUDIO #pragma xta command "add exclusion received_command" #pragma xta command "analyse path i2s_output_l i2s_output_r" @@ -280,7 +279,7 @@ static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, con #pragma loop unroll for(int i = 0; i < NUM_USB_CHAN_IN; i++) { - outuint(c_out, samplesIn[readBuffNo][i]); + outuint(c_out, samplesIn[readBuffNo][i]); } #endif } @@ -423,7 +422,7 @@ static inline void InitPorts(unsigned divide) } /* I2S delivery thread */ -#pragma unsafe arrays +//#pragma unsafe arrays unsigned static deliver(chanend c_out, chanend ?c_spd_out, #ifdef ADAT_TX chanend c_adat_out, From 782b0cea9285356cc753ad66fc98778e91a7d0a7 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Fri, 22 Apr 2016 14:54:50 +0100 Subject: [PATCH 20/57] Comment removal --- module_usb_audio/dsp/xua_dsp.h | 1 - 1 file changed, 1 deletion(-) diff --git a/module_usb_audio/dsp/xua_dsp.h b/module_usb_audio/dsp/xua_dsp.h index 9a3e5a66..922d5645 100644 --- a/module_usb_audio/dsp/xua_dsp.h +++ b/module_usb_audio/dsp/xua_dsp.h @@ -16,7 +16,6 @@ typedef interface dsp_if typedef interface dsp_ctrl_if { int setControl(unsigned moduleId, unsigned control, unsigned setting); - //TODO add GetConttol } dsp_ctrl_if; From a816b0915aa63bc3176ce57319345675f9faf315 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Fri, 22 Apr 2016 15:14:58 +0100 Subject: [PATCH 21/57] Changelog update --- CHANGELOG.rst | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index a25c0058..3aa58cf1 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,9 +1,18 @@ sc_usb_audio Change Log ======================= +6.16.0 +------ + - ADDED: Call to UserBufferManagement() + - ADDED: PDM_MIC_INDEX in devicedefines.h and usage + - CHANGE: pdm_buffer() task now combinable + - CHANGE: Audio I/O task now takes i_dsp interface as a parameter + - CHANGE: Removed built-in support for A/U series internal ADC + - CHANGE: User PDM Microphone processing now uses an interface (previously function call) + 6.15.2 ------ - - RESOLVED: interrupt.h (used in audio buffering) now compatible with xCORE-200 ABI + - RESOLVED: interrupt.h (used in audio buffering) now compatible with xCORE-200 ABI 6.15.1 ------ From bcdc690d0dea1b6f466d812c6391b6a10f443e45 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Fri, 22 Apr 2016 15:51:11 +0100 Subject: [PATCH 22/57] Removed dsp_process() from main() --- module_usb_audio/main.xc | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/module_usb_audio/main.xc b/module_usb_audio/main.xc index 1ca7cc27..14845ea8 100755 --- a/module_usb_audio/main.xc +++ b/module_usb_audio/main.xc @@ -673,10 +673,7 @@ int main() on stdcore[PDM_TILE]: pdm_mic(c_ds_output); on stdcore[PDM_TILE].core[0]: pdm_buffer(c_ds_output, c_pdm_pcm, i_mic_process); #endif - // TODO move this to USER_MAIN_CORES or guard with RUN_DSP_TASK - // TODO NUM_DSP_CTRL_INTS - on stdcore[AUDIO_IO_TILE] : dsp_process(i_dsp, i_dsp_ctrl, 1); - + USER_MAIN_CORES } From c4d4505e83bcc310941e0fccdfd737a46edce96d Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Fri, 22 Apr 2016 17:23:37 +0100 Subject: [PATCH 23/57] All instances of i_dsp guarded by RUN_DSP_TASK --- module_usb_audio/audio_io/audio_io.xc | 53 +++++++++++++++---- .../audio_io/userbuffermanagement.c | 13 ++++- module_usb_audio/audio_io/xua_audio.h | 2 + module_usb_audio/main.xc | 7 ++- 4 files changed, 62 insertions(+), 13 deletions(-) diff --git a/module_usb_audio/audio_io/audio_io.xc b/module_usb_audio/audio_io/audio_io.xc index 4e4728b8..8d7afc39 100755 --- a/module_usb_audio/audio_io/audio_io.xc +++ b/module_usb_audio/audio_io/audio_io.xc @@ -226,12 +226,19 @@ static inline void TransferAdatTxSamples(chanend c_adat_out, const unsigned samp /* sampsFromUsbToAudio: The sample frame the device has recived from the host and is going to play to the output audio interfaces */ /* sampsFromAudioToUsb: The sample frame that was received from the audio interfaces and that the device is going to send to the host */ -void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[], client dsp_if i_dsp); +void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[] +#ifdef RUN_DSP_TASK +, client dsp_if i_dsp +#endif +); #pragma unsafe arrays -static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, const unsigned underflowWord, client dsp_if i_dsp) +static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, const unsigned underflowWord +#ifdef RUN_DSP_TASK +, client dsp_if i_dsp +#endif +) { - outuint(c_out, underflowWord); /* Check for sample freq change (or other command) or new samples from mixer*/ @@ -273,7 +280,11 @@ static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, con inuint(c_out); #endif - UserBufferManagement(samplesOut, samplesIn[readBuffNo], i_dsp); + UserBufferManagement(samplesOut, samplesIn[readBuffNo] +#ifdef RUN_DSP_TASK + , i_dsp +#endif + ); #if NUM_USB_CHAN_IN > 0 #pragma loop unroll @@ -435,8 +446,11 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, #if (NUM_PDM_MICS > 0) chanend c_pdm_pcm, #endif - chanend ?unused, - client dsp_if i_dsp) + chanend ?unused +#ifdef RUN_DSP_TASK + , client dsp_if i_dsp +#endif + ) { /* Since DAC and ADC buffered ports off by one sample we buffer previous ADC frame */ @@ -473,7 +487,12 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, } #endif - unsigned command = DoSampleTransfer(c_out, readBuffNo, underflowWord, i_dsp); + unsigned command = DoSampleTransfer(c_out, readBuffNo, underflowWord +#ifdef RUN_DSP_TASK + , i_dsp +#endif + ); + #ifdef ADAT_TX unsafe{ //TransferAdatTxSamples(c_adat_out, samplesOut, adatSmuxMode, 0); @@ -803,9 +822,17 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, /* The below looks a bit odd but forces the compiler to inline twice */ unsigned command; if(readBuffNo) - command = DoSampleTransfer(c_out, 1, underflowWord, i_dsp); + command = DoSampleTransfer(c_out, 1, underflowWord +#ifdef RUN_DSP_TASK + , i_dsp +#endif + ); else - command = DoSampleTransfer(c_out, 0, underflowWord, i_dsp); + command = DoSampleTransfer(c_out, 0, underflowWord +#ifdef RUN_DSP_TASK + , i_dsp +#endif + ); if(command) @@ -918,7 +945,9 @@ chanend ?c_config, chanend ?c #if (NUM_PDM_MICS > 0) , chanend c_pdm_in #endif +#ifdef RUN_DSP_TASK , client dsp_if i_dsp +#endif ) { #if defined (SPDIF_TX) && (SPDIF_TX_TILE == AUDIO_IO_TILE) @@ -1161,7 +1190,11 @@ chanend ?c_config, chanend ?c #if (NUM_PDM_MICS > 0) c_pdm_in, #endif - null, i_dsp); + null +#ifdef RUN_DSP_TASK + , i_dsp +#endif + ); if(command == SET_SAMPLE_FREQ) { diff --git a/module_usb_audio/audio_io/userbuffermanagement.c b/module_usb_audio/audio_io/userbuffermanagement.c index 7b5f65d8..6d7ed233 100644 --- a/module_usb_audio/audio_io/userbuffermanagement.c +++ b/module_usb_audio/audio_io/userbuffermanagement.c @@ -1,9 +1,18 @@ #include "xccompat.h" +#include "devicedefines.h" /* Default implentation for UserBufferManagement() */ -void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[], unsigned i_dsp) __attribute__ ((weak)); -void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[], unsigned i_dsp) +void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[] +#ifdef RUN_DSP_TASK + , unsigned i_dsp +#endif + ) __attribute__ ((weak)); +void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[] +#ifdef RUN_DSP_TASK + , unsigned i_dsp +#endif +) { /* Do nothing */ } diff --git a/module_usb_audio/audio_io/xua_audio.h b/module_usb_audio/audio_io/xua_audio.h index ab167830..a7e196fa 100644 --- a/module_usb_audio/audio_io/xua_audio.h +++ b/module_usb_audio/audio_io/xua_audio.h @@ -31,7 +31,9 @@ void audio(chanend c_in, #if (NUM_PDM_MICS > 0) , chanend c_pdm_in #endif +#ifdef RUN_DSP_TASK , client dsp_if i_dsp +#endif ); void SpdifTxWrapper(chanend c_spdif_tx); diff --git a/module_usb_audio/main.xc b/module_usb_audio/main.xc index 14845ea8..7d9e7fe8 100755 --- a/module_usb_audio/main.xc +++ b/module_usb_audio/main.xc @@ -419,7 +419,9 @@ void usb_audio_io(chanend c_aud_in, chanend ?c_adc, #if (NUM_PDM_MICS > 0) , chanend c_pdm_pcm #endif +#ifdef RUN_DSP_TASK , client dsp_if i_dsp +#endif ) { #ifdef MIXER @@ -463,7 +465,9 @@ void usb_audio_io(chanend c_aud_in, chanend ?c_adc, #if (NUM_PDM_MICS > 0) , c_pdm_pcm #endif +#ifdef RUN_DSP_TASK , i_dsp +#endif ); } @@ -606,8 +610,9 @@ int main() #if (NUM_PDM_MICS > 0) , c_pdm_pcm #endif +#ifdef RUN_DSP_TASK , i_dsp - +#endif ); #if defined(SPDIF_TX) && (SPDIF_TX_TILE != AUDIO_IO_TILE) From 9b8e00610fd8a3c6c51493c9b6e32afcbb721c33 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Mon, 25 Apr 2016 12:09:55 +0100 Subject: [PATCH 24/57] BCD_DEVICE bump --- module_usb_audio/devicedefines.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module_usb_audio/devicedefines.h b/module_usb_audio/devicedefines.h index 21152868..46a6292f 100644 --- a/module_usb_audio/devicedefines.h +++ b/module_usb_audio/devicedefines.h @@ -475,14 +475,14 @@ * @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 15 +#define BCD_DEVICE_M 16 #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 2 +#define BCD_DEVICE_N 0 #endif /** From 7b1b5ea7803d21280563bdca8266c8f33ad7a2fa Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Mon, 25 Apr 2016 14:50:47 +0100 Subject: [PATCH 25/57] Warning removal --- module_usb_audio/dsp/xua_dsp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_usb_audio/dsp/xua_dsp.h b/module_usb_audio/dsp/xua_dsp.h index 922d5645..5ea82e97 100644 --- a/module_usb_audio/dsp/xua_dsp.h +++ b/module_usb_audio/dsp/xua_dsp.h @@ -19,7 +19,7 @@ typedef interface dsp_ctrl_if } dsp_ctrl_if; -void dsp_process(server dsp_if i_dsp, server dsp_ctrl_if ?i_dsp_ctrl[numDspCtrlInts], unsigned numDspCtrlInts); +void dsp_process(server dsp_if i_dsp, server dsp_ctrl_if i_dsp_ctrl[numDspCtrlInts], unsigned numDspCtrlInts); #endif From dbb519dee250a8425832de227218e0800967fb3b Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Mon, 25 Apr 2016 16:26:26 +0100 Subject: [PATCH 26/57] fl_readImageRead() -> fl_readImagePage() due to deprecation warning --- module_dfu/src/flash_interface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_dfu/src/flash_interface.c b/module_dfu/src/flash_interface.c index e0578210..a122c413 100755 --- a/module_dfu/src/flash_interface.c +++ b/module_dfu/src/flash_interface.c @@ -102,7 +102,7 @@ int flash_cmd_read_page(unsigned char *data) current_flash_subpage_index = 0; - if (fl_readImageRead(current_flash_page_data) == 0) + if (fl_readImagePage(current_flash_page_data) == 0) { *(unsigned int *)data = 0; } From b4fd87b9e2c30861211bedcb336c8739c34c74b3 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 26 Apr 2016 11:32:19 +0100 Subject: [PATCH 27/57] xpd: Patched version number --- module_usb_audio/.cproject | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/module_usb_audio/.cproject b/module_usb_audio/.cproject index c461ef06..ac9370f6 100644 --- a/module_usb_audio/.cproject +++ b/module_usb_audio/.cproject @@ -157,8 +157,10 @@ + + @@ -282,8 +284,10 @@ + + @@ -413,8 +417,10 @@ + + From d0929ae0676896b94a119e4b7c44ffadec1471d8 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 26 Apr 2016 11:32:19 +0100 Subject: [PATCH 28/57] xpd: Cleaned up whitespace --- module_usb_audio/audio_io/audio_io.xc | 14 +++++++------- .../audio_io/userbuffermanagement.c | 2 +- module_usb_audio/main.xc | 2 +- module_usb_audio/pdm_mics/pdm_mic.xc | 18 +++++++++--------- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/module_usb_audio/audio_io/audio_io.xc b/module_usb_audio/audio_io/audio_io.xc index 8d7afc39..6b4022b5 100755 --- a/module_usb_audio/audio_io/audio_io.xc +++ b/module_usb_audio/audio_io/audio_io.xc @@ -279,7 +279,7 @@ static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, con #else inuint(c_out); #endif - + UserBufferManagement(samplesOut, samplesIn[readBuffNo] #ifdef RUN_DSP_TASK , i_dsp @@ -294,7 +294,7 @@ static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, con } #endif } - + return 0; } @@ -487,8 +487,8 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, } #endif - unsigned command = DoSampleTransfer(c_out, readBuffNo, underflowWord -#ifdef RUN_DSP_TASK + unsigned command = DoSampleTransfer(c_out, readBuffNo, underflowWord +#ifdef RUN_DSP_TASK , i_dsp #endif ); @@ -822,10 +822,10 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, /* The below looks a bit odd but forces the compiler to inline twice */ unsigned command; if(readBuffNo) - command = DoSampleTransfer(c_out, 1, underflowWord + command = DoSampleTransfer(c_out, 1, underflowWord #ifdef RUN_DSP_TASK , i_dsp -#endif +#endif ); else command = DoSampleTransfer(c_out, 0, underflowWord @@ -1190,7 +1190,7 @@ chanend ?c_config, chanend ?c #if (NUM_PDM_MICS > 0) c_pdm_in, #endif - null + null #ifdef RUN_DSP_TASK , i_dsp #endif diff --git a/module_usb_audio/audio_io/userbuffermanagement.c b/module_usb_audio/audio_io/userbuffermanagement.c index 6d7ed233..57cfe3f2 100644 --- a/module_usb_audio/audio_io/userbuffermanagement.c +++ b/module_usb_audio/audio_io/userbuffermanagement.c @@ -3,7 +3,7 @@ #include "devicedefines.h" /* Default implentation for UserBufferManagement() */ -void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[] +void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[] #ifdef RUN_DSP_TASK , unsigned i_dsp #endif diff --git a/module_usb_audio/main.xc b/module_usb_audio/main.xc index 7d9e7fe8..07d92846 100755 --- a/module_usb_audio/main.xc +++ b/module_usb_audio/main.xc @@ -678,7 +678,7 @@ int main() on stdcore[PDM_TILE]: pdm_mic(c_ds_output); on stdcore[PDM_TILE].core[0]: pdm_buffer(c_ds_output, c_pdm_pcm, i_mic_process); #endif - + USER_MAIN_CORES } diff --git a/module_usb_audio/pdm_mics/pdm_mic.xc b/module_usb_audio/pdm_mics/pdm_mic.xc index 662165bf..1180940d 100644 --- a/module_usb_audio/pdm_mics/pdm_mic.xc +++ b/module_usb_audio/pdm_mics/pdm_mic.xc @@ -36,7 +36,7 @@ void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio #endif ) { - unsigned buffer; + unsigned buffer; int output[NUM_PDM_MICS]; unsigned samplerate; @@ -45,13 +45,13 @@ void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio #else user_pdm_init(); #endif - + mic_array_decimator_conf_common_t dcc; const int * unsafe fir_coefs[7]; - mic_array_frame_time_domain * unsafe current; - mic_array_decimator_config_t dc[2]; + 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 and compute decimation factor */ c_audio :> samplerate; unsigned decimationfactor = 96000/samplerate; @@ -114,7 +114,7 @@ void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio select { case c_audio :> req: - + /* Audio IO core requests samples */ if(req) unsafe{ @@ -123,7 +123,7 @@ void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio c_audio <: output[i]; } - /* Get a new frame of mic data */ + /* Get a new frame of mic data */ mic_array_frame_time_domain * unsafe current = mic_array_get_next_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); /* Run user code */ @@ -137,12 +137,12 @@ void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio unsafe{ /* Sample rate change */ c_audio :> samplerate; - + /* Re-config the mic decimators for the new sample-rate */ decimationfactor = 96000/samplerate; dcc.output_decimation_factor = decimationfactor; dcc.coefs=fir_coefs[decimationfactor/2]; - + mic_array_decimator_configure(c_ds_output, 2, dc); mic_array_init_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); From 5f2fec1d2ab32999c69536635f21ca42312dc267 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 26 Apr 2016 11:32:20 +0100 Subject: [PATCH 29/57] 'Release: 6.16.0alpha0' --- README.rst | 2 +- xpd.xml | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 39906d19..0b057da5 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ USB Audio Shared ................ -:Latest release: 6.15.2rc0 +:Latest release: 6.16.0alpha0 :Maintainer: xross :Description: USB Audio Shared Components. For use in the XMOS USB Audio Refererence Designs. diff --git a/xpd.xml b/xpd.xml index b201845d..ce339a77 100644 --- a/xpd.xml +++ b/xpd.xml @@ -15,7 +15,7 @@ - module_queue + module_queue MIDI @@ -101,7 +101,8 @@ - + + XM-004720-SM XMOS From 563763bceb56496878dadef5dcede5b0f6b7c1d8 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Thu, 12 May 2016 13:00:18 +0100 Subject: [PATCH 30/57] BCD_DEVICE version bump --- module_usb_audio/devicedefines.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_usb_audio/devicedefines.h b/module_usb_audio/devicedefines.h index 46a6292f..bd77651d 100644 --- a/module_usb_audio/devicedefines.h +++ b/module_usb_audio/devicedefines.h @@ -482,7 +482,7 @@ * @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 0 +#define BCD_DEVICE_N 1 #endif /** From 702e7a7e1f352cfc87837d9fc0794973dce5f7bb Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 17 May 2016 11:06:19 +0100 Subject: [PATCH 31/57] Initial work to move DSP location --- module_usb_audio/audio_io/audio_io.xc | 64 ++++++++++++++------------- module_usb_audio/audio_io/xua_audio.h | 25 ++++++++--- module_usb_audio/dsp/xua_dsp.h | 4 ++ module_usb_audio/main.xc | 27 +++++------ 4 files changed, 72 insertions(+), 48 deletions(-) diff --git a/module_usb_audio/audio_io/audio_io.xc b/module_usb_audio/audio_io/audio_io.xc index 6b4022b5..242beae0 100755 --- a/module_usb_audio/audio_io/audio_io.xc +++ b/module_usb_audio/audio_io/audio_io.xc @@ -29,12 +29,16 @@ #endif #endif +#include "xua_audio.h" + #include "commands.h" #include "xc_ptr.h" -#ifdef RUN_DSP_TASK -#include "xua_dsp.h" -#endif +//#ifdef RUN_DSP_TASK +//#include "xua_dsp.h" +//#endif + + /* TODO 32 is max expected channels */ static unsigned samplesOut[32]; @@ -227,16 +231,16 @@ static inline void TransferAdatTxSamples(chanend c_adat_out, const unsigned samp /* sampsFromUsbToAudio: The sample frame the device has recived from the host and is going to play to the output audio interfaces */ /* sampsFromAudioToUsb: The sample frame that was received from the audio interfaces and that the device is going to send to the host */ void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[] -#ifdef RUN_DSP_TASK -, client dsp_if i_dsp -#endif +//#ifdef RUN_DSP_TASK +, client audManage_if i_audMan +//#endif ); #pragma unsafe arrays static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, const unsigned underflowWord -#ifdef RUN_DSP_TASK -, client dsp_if i_dsp -#endif +//#ifdef RUN_DSP_TASK +, client audManage_if i_audMan +//#endif ) { outuint(c_out, underflowWord); @@ -281,9 +285,9 @@ static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, con #endif UserBufferManagement(samplesOut, samplesIn[readBuffNo] -#ifdef RUN_DSP_TASK - , i_dsp -#endif +//#ifdef RUN_DSP_TASK + , i_audMan +//#endif ); #if NUM_USB_CHAN_IN > 0 @@ -447,9 +451,9 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, chanend c_pdm_pcm, #endif chanend ?unused -#ifdef RUN_DSP_TASK - , client dsp_if i_dsp -#endif +//#ifdef RUN_DSP_TASK + , client audManage_if i_audMan +//#endif ) { @@ -488,9 +492,9 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, #endif unsigned command = DoSampleTransfer(c_out, readBuffNo, underflowWord -#ifdef RUN_DSP_TASK - , i_dsp -#endif +//#ifdef RUN_DSP_TASK + , i_audMan +//#endif ); #ifdef ADAT_TX @@ -823,15 +827,15 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, unsigned command; if(readBuffNo) command = DoSampleTransfer(c_out, 1, underflowWord -#ifdef RUN_DSP_TASK - , i_dsp -#endif +//#ifdef RUN_DSP_TASK + , i_audMan +//#endif ); else command = DoSampleTransfer(c_out, 0, underflowWord -#ifdef RUN_DSP_TASK - , i_dsp -#endif +//#ifdef RUN_DSP_TASK + , i_audMan +//#endif ); @@ -945,9 +949,9 @@ chanend ?c_config, chanend ?c #if (NUM_PDM_MICS > 0) , chanend c_pdm_in #endif -#ifdef RUN_DSP_TASK -, client dsp_if i_dsp -#endif +//#ifdef RUN_DSP_TASK +, client audManage_if i_audMan +//#endif ) { #if defined (SPDIF_TX) && (SPDIF_TX_TILE == AUDIO_IO_TILE) @@ -1191,9 +1195,9 @@ chanend ?c_config, chanend ?c c_pdm_in, #endif null -#ifdef RUN_DSP_TASK - , i_dsp -#endif +//#ifdef RUN_DSP_TASK + , i_audMan +//#endif ); if(command == SET_SAMPLE_FREQ) diff --git a/module_usb_audio/audio_io/xua_audio.h b/module_usb_audio/audio_io/xua_audio.h index a7e196fa..473dfe9a 100644 --- a/module_usb_audio/audio_io/xua_audio.h +++ b/module_usb_audio/audio_io/xua_audio.h @@ -1,9 +1,24 @@ #ifndef __audio_h__ #define __audio_h__ -#include "devicedefines.h" +//#include "devicedefines.h" #include "dfu_interface.h" -#include "xua_dsp.h" +//#include "xua_dsp.h" + + +typedef interface audManage_if +{ + [[guarded]] + void transfer_buffers(int * unsafe in_aud_buf, int * unsafe in_usb_buf, + int * unsafe out_usb_buf, int * unsafe out_aud_buf); + + [[guarded]] + void transfer_samples(int in_mic_buf[], int in_spk_buf[], int out_mic_buf[], int out_spk_buf[]); + +} audManage_if; + + + /** The audio driver thread. * @@ -31,9 +46,9 @@ void audio(chanend c_in, #if (NUM_PDM_MICS > 0) , chanend c_pdm_in #endif -#ifdef RUN_DSP_TASK - , client dsp_if i_dsp -#endif +//#ifdef RUN_DSP_TASK + , client audManage_if i_audMan +//#endif ); void SpdifTxWrapper(chanend c_spdif_tx); diff --git a/module_usb_audio/dsp/xua_dsp.h b/module_usb_audio/dsp/xua_dsp.h index 5ea82e97..7da787f4 100644 --- a/module_usb_audio/dsp/xua_dsp.h +++ b/module_usb_audio/dsp/xua_dsp.h @@ -9,6 +9,10 @@ typedef interface dsp_if [[guarded]] void transfer_buffers(int * unsafe in_aud_buf, int * unsafe in_usb_buf, int * unsafe out_usb_buf, int * unsafe out_aud_buf); + + [[guarded]] + void transfer_samples(int in_mic_buf[], int in_spk_buf[], int out_mic_buf[], int out_spk_buf[]); + } dsp_if; diff --git a/module_usb_audio/main.xc b/module_usb_audio/main.xc index 07d92846..988be177 100755 --- a/module_usb_audio/main.xc +++ b/module_usb_audio/main.xc @@ -419,9 +419,9 @@ void usb_audio_io(chanend c_aud_in, chanend ?c_adc, #if (NUM_PDM_MICS > 0) , chanend c_pdm_pcm #endif -#ifdef RUN_DSP_TASK - , client dsp_if i_dsp -#endif +//#ifdef RUN_DSP_TASK + , client audManage_if i_audMan +//#endif ) { #ifdef MIXER @@ -465,9 +465,9 @@ void usb_audio_io(chanend c_aud_in, chanend ?c_adc, #if (NUM_PDM_MICS > 0) , c_pdm_pcm #endif -#ifdef RUN_DSP_TASK - , i_dsp -#endif +//#ifdef RUN_DSP_TASK + , i_audMan +//#endif ); } @@ -560,10 +560,11 @@ int main() #endif #endif -#ifdef RUN_DSP_TASK - interface dsp_if i_dsp; - interface dsp_ctrl_if i_dsp_ctrl[1]; // TODO NUM_DSP_CTRL_INTERFACES -#endif +//#ifdef RUN_DSP_TASK + //interface dsp_if i_dsp; + //interface dsp_ctrl_if i_dsp_ctrl[1]; // TODO NUM_DSP_CTRL_INTERFACES + interface audManage_if i_audMan; +//#endif USER_MAIN_DECLARATIONS par @@ -610,9 +611,9 @@ int main() #if (NUM_PDM_MICS > 0) , c_pdm_pcm #endif -#ifdef RUN_DSP_TASK - , i_dsp -#endif +//#ifdef RUN_DSP_TASK + , i_audMan +//#endif ); #if defined(SPDIF_TX) && (SPDIF_TX_TILE != AUDIO_IO_TILE) From 2514a464a2464db2d19d616d139fbec8063810b6 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 18 May 2016 10:14:30 +0100 Subject: [PATCH 32/57] DSP move mostly functional --- module_usb_audio/main.xc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/module_usb_audio/main.xc b/module_usb_audio/main.xc index 988be177..b79123ed 100755 --- a/module_usb_audio/main.xc +++ b/module_usb_audio/main.xc @@ -561,8 +561,9 @@ int main() #endif //#ifdef RUN_DSP_TASK - //interface dsp_if i_dsp; - //interface dsp_ctrl_if i_dsp_ctrl[1]; // TODO NUM_DSP_CTRL_INTERFACES + // TODO move to USER_MAIN_DECLARATIONS + interface dsp_if i_dsp; + interface dsp_ctrl_if i_dsp_ctrl[1]; // TODO NUM_DSP_CTRL_INTERFACES interface audManage_if i_audMan; //#endif From 5376b5027fd0d43abb46a193829cf5071d5296cc Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Fri, 20 May 2016 14:39:01 +0100 Subject: [PATCH 33/57] i_audMan no longer hidden by a define. PDM min transfer uses transaction. --- module_usb_audio/audio_io/audio_io.xc | 10 ++++------ module_usb_audio/pdm_mics/pdm_mic.xc | 11 +++++++---- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/module_usb_audio/audio_io/audio_io.xc b/module_usb_audio/audio_io/audio_io.xc index 242beae0..f6dbfe5a 100755 --- a/module_usb_audio/audio_io/audio_io.xc +++ b/module_usb_audio/audio_io/audio_io.xc @@ -283,12 +283,7 @@ static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, con #else inuint(c_out); #endif - - UserBufferManagement(samplesOut, samplesIn[readBuffNo] -//#ifdef RUN_DSP_TASK - , i_audMan -//#endif - ); + UserBufferManagement(samplesOut, samplesIn[readBuffNo], i_audMan); #if NUM_USB_CHAN_IN > 0 #pragma loop unroll @@ -717,11 +712,14 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, #if (NUM_PDM_MICS > 0) /* Get samples from PDM->PCM comverter */ c_pdm_pcm <: 1; + master + { #pragma loop unroll for(int i = 0; i < NUM_PDM_MICS; i++) { c_pdm_pcm :> samplesIn[readBuffNo][i]; } + } #endif } diff --git a/module_usb_audio/pdm_mics/pdm_mic.xc b/module_usb_audio/pdm_mics/pdm_mic.xc index 1180940d..9c76235b 100644 --- a/module_usb_audio/pdm_mics/pdm_mic.xc +++ b/module_usb_audio/pdm_mics/pdm_mic.xc @@ -114,13 +114,17 @@ void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio select { case c_audio :> req: - + /* Audio IO core requests samples */ if(req) unsafe{ - for(int i = 0; i < NUM_PDM_MICS; i++) + slave { - c_audio <: output[i]; +#pragma loop unroll + for(int i = 0; i < NUM_PDM_MICS; i++) + { + c_audio <: output[i]; + } } /* Get a new frame of mic data */ @@ -182,5 +186,4 @@ void pdm_mic(streaming chanend c_ds_output[2]) mic_array_decimate_to_pcm_4ch(c_4x_pdm_mic_1, c_ds_output[1]); } } - #endif From 1e25625106163686d38d27f69854f504189a9c87 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Fri, 20 May 2016 15:04:28 +0100 Subject: [PATCH 34/57] Removal of RUN_DSP_TASK --- module_usb_audio/audio_io/userbuffermanagement.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/module_usb_audio/audio_io/userbuffermanagement.c b/module_usb_audio/audio_io/userbuffermanagement.c index 57cfe3f2..25cddcc7 100644 --- a/module_usb_audio/audio_io/userbuffermanagement.c +++ b/module_usb_audio/audio_io/userbuffermanagement.c @@ -4,14 +4,10 @@ /* Default implentation for UserBufferManagement() */ void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[] -#ifdef RUN_DSP_TASK , unsigned i_dsp -#endif ) __attribute__ ((weak)); void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[] -#ifdef RUN_DSP_TASK , unsigned i_dsp -#endif ) { /* Do nothing */ From 2e978246047a88048037e77a44dd9f2494957d94 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Fri, 20 May 2016 15:05:37 +0100 Subject: [PATCH 35/57] Fixed !MIC_PROCESSING_USE_INTERFACE build --- module_usb_audio/main.xc | 4 ++++ module_usb_audio/pdm_mics/pdm_mic.xc | 10 ++++++---- module_usb_audio/pdm_mics/xua_pdm_mic.h | 5 ++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/module_usb_audio/main.xc b/module_usb_audio/main.xc index b79123ed..5d06954c 100755 --- a/module_usb_audio/main.xc +++ b/module_usb_audio/main.xc @@ -678,7 +678,11 @@ int main() #if (NUM_PDM_MICS > 0) on stdcore[PDM_TILE]: pdm_mic(c_ds_output); +#ifdef MIC_PROCESSING_USE_INTERFACE on stdcore[PDM_TILE].core[0]: pdm_buffer(c_ds_output, c_pdm_pcm, i_mic_process); +#else + on stdcore[PDM_TILE]: pdm_buffer(c_ds_output, c_pdm_pcm); +#endif #endif USER_MAIN_CORES diff --git a/module_usb_audio/pdm_mics/pdm_mic.xc b/module_usb_audio/pdm_mics/pdm_mic.xc index 9c76235b..fa0d54de 100644 --- a/module_usb_audio/pdm_mics/pdm_mic.xc +++ b/module_usb_audio/pdm_mics/pdm_mic.xc @@ -29,12 +29,14 @@ int data_1[4*THIRD_STAGE_COEFS_PER_STAGE * MAX_DECIMATION_FACTOR] = {0}; mic_array_frame_time_domain mic_audio[2]; -[[combinable]] -void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio #ifdef MIC_PROCESSING_USE_INTERFACE - , client mic_process_if i_mic_process +[[combinable]] +#pragma unsafe arrays +void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio, client mic_process_if i_mic_process) +#else +#pragma unsafe arrays +void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio) #endif -) { unsigned buffer; int output[NUM_PDM_MICS]; diff --git a/module_usb_audio/pdm_mics/xua_pdm_mic.h b/module_usb_audio/pdm_mics/xua_pdm_mic.h index cf6f0e6d..69e52d5c 100644 --- a/module_usb_audio/pdm_mics/xua_pdm_mic.h +++ b/module_usb_audio/pdm_mics/xua_pdm_mic.h @@ -26,10 +26,13 @@ void pdm_mic(streaming chanend c_ds_output[2]); #else /* Simple user hooks/call-backs */ -unsafe void user_pdm_process(mic_array_frame_time_domain * unsafe audio, int output[]); +void user_pdm_process(mic_array_frame_time_domain * unsafe audio, int output[]); void user_pdm_init(); +/* PDM interface and decimation cores */ +void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio); + /* PDM interface and decimation cores */ void pdm_mic(streaming chanend c_ds_output[2]); From 547d9a77d3247450d2e87999288f2b12f93ddd71 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Fri, 20 May 2016 15:29:35 +0100 Subject: [PATCH 36/57] RUN_DSP_TASK tidy in audio_io --- module_usb_audio/audio_io/audio_io.xc | 44 +++++---------------------- 1 file changed, 8 insertions(+), 36 deletions(-) diff --git a/module_usb_audio/audio_io/audio_io.xc b/module_usb_audio/audio_io/audio_io.xc index f6dbfe5a..d39b480b 100755 --- a/module_usb_audio/audio_io/audio_io.xc +++ b/module_usb_audio/audio_io/audio_io.xc @@ -230,18 +230,10 @@ static inline void TransferAdatTxSamples(chanend c_adat_out, const unsigned samp /* sampsFromUsbToAudio: The sample frame the device has recived from the host and is going to play to the output audio interfaces */ /* sampsFromAudioToUsb: The sample frame that was received from the audio interfaces and that the device is going to send to the host */ -void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[] -//#ifdef RUN_DSP_TASK -, client audManage_if i_audMan -//#endif -); +void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[], client audManage_if i_audMan); #pragma unsafe arrays -static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, const unsigned underflowWord -//#ifdef RUN_DSP_TASK -, client audManage_if i_audMan -//#endif -) +static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, const unsigned underflowWord, client audManage_if i_audMan) { outuint(c_out, underflowWord); @@ -294,7 +286,6 @@ static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, con #endif } - return 0; } @@ -432,7 +423,7 @@ static inline void InitPorts(unsigned divide) } /* I2S delivery thread */ -//#pragma unsafe arrays +#pragma unsafe arrays unsigned static deliver(chanend c_out, chanend ?c_spd_out, #ifdef ADAT_TX chanend c_adat_out, @@ -445,11 +436,8 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, #if (NUM_PDM_MICS > 0) chanend c_pdm_pcm, #endif - chanend ?unused -//#ifdef RUN_DSP_TASK - , client audManage_if i_audMan -//#endif - ) + chanend ?unused, + client audManage_if i_audMan) { /* Since DAC and ADC buffered ports off by one sample we buffer previous ADC frame */ @@ -486,11 +474,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, } #endif - unsigned command = DoSampleTransfer(c_out, readBuffNo, underflowWord -//#ifdef RUN_DSP_TASK - , i_audMan -//#endif - ); + unsigned command = DoSampleTransfer(c_out, readBuffNo, underflowWord, i_audMan); #ifdef ADAT_TX unsafe{ @@ -650,7 +634,6 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, p_lrclk <: 0x00000000; #else p_lrclk <: 0x80000000; - #endif #endif @@ -824,18 +807,9 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, /* The below looks a bit odd but forces the compiler to inline twice */ unsigned command; if(readBuffNo) - command = DoSampleTransfer(c_out, 1, underflowWord -//#ifdef RUN_DSP_TASK - , i_audMan -//#endif - ); + command = DoSampleTransfer(c_out, 1, underflowWord, i_audMan); else - command = DoSampleTransfer(c_out, 0, underflowWord -//#ifdef RUN_DSP_TASK - , i_audMan -//#endif - ); - + command = DoSampleTransfer(c_out, 0, underflowWord, i_audMan); if(command) { @@ -947,9 +921,7 @@ chanend ?c_config, chanend ?c #if (NUM_PDM_MICS > 0) , chanend c_pdm_in #endif -//#ifdef RUN_DSP_TASK , client audManage_if i_audMan -//#endif ) { #if defined (SPDIF_TX) && (SPDIF_TX_TILE == AUDIO_IO_TILE) From 82944f1caee5e9ac48cbe4249807d5d27fc7f998 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Fri, 20 May 2016 15:34:15 +0100 Subject: [PATCH 37/57] DSP header moved into app space --- module_usb_audio/dsp/xua_dsp.h | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 module_usb_audio/dsp/xua_dsp.h diff --git a/module_usb_audio/dsp/xua_dsp.h b/module_usb_audio/dsp/xua_dsp.h deleted file mode 100644 index 7da787f4..00000000 --- a/module_usb_audio/dsp/xua_dsp.h +++ /dev/null @@ -1,30 +0,0 @@ - - -#ifndef _DSP_H_ -#define _DSP_H_ -/* Processing interface and task */ -/* Interface to transfer block of samples to/from DSP task */ -typedef interface dsp_if -{ - [[guarded]] - void transfer_buffers(int * unsafe in_aud_buf, int * unsafe in_usb_buf, - int * unsafe out_usb_buf, int * unsafe out_aud_buf); - - [[guarded]] - void transfer_samples(int in_mic_buf[], int in_spk_buf[], int out_mic_buf[], int out_spk_buf[]); - -} dsp_if; - - -/* Control interface and task */ -typedef interface dsp_ctrl_if -{ - int setControl(unsigned moduleId, unsigned control, unsigned setting); -} dsp_ctrl_if; - - -void dsp_process(server dsp_if i_dsp, server dsp_ctrl_if i_dsp_ctrl[numDspCtrlInts], unsigned numDspCtrlInts); - - -#endif - From 50e07c33d312bfe2b8b8ae1f534626d5cb4ae82e Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Fri, 20 May 2016 17:34:05 +0100 Subject: [PATCH 38/57] RUN_DSP_TASK tidy --- module_usb_audio/main.xc | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/module_usb_audio/main.xc b/module_usb_audio/main.xc index 5d06954c..855e3f23 100755 --- a/module_usb_audio/main.xc +++ b/module_usb_audio/main.xc @@ -48,10 +48,6 @@ #include "xua_pdm_mic.h" #endif -#ifdef RUN_DSP_TASK -#include "xua_dsp.h" -#endif - [[distributable]] void DFUHandler(server interface i_dfu i, chanend ?c_user_cmd); @@ -419,9 +415,7 @@ void usb_audio_io(chanend c_aud_in, chanend ?c_adc, #if (NUM_PDM_MICS > 0) , chanend c_pdm_pcm #endif -//#ifdef RUN_DSP_TASK , client audManage_if i_audMan -//#endif ) { #ifdef MIXER @@ -465,9 +459,7 @@ void usb_audio_io(chanend c_aud_in, chanend ?c_adc, #if (NUM_PDM_MICS > 0) , c_pdm_pcm #endif -//#ifdef RUN_DSP_TASK , i_audMan -//#endif ); } @@ -560,12 +552,7 @@ int main() #endif #endif -//#ifdef RUN_DSP_TASK - // TODO move to USER_MAIN_DECLARATIONS - interface dsp_if i_dsp; - interface dsp_ctrl_if i_dsp_ctrl[1]; // TODO NUM_DSP_CTRL_INTERFACES interface audManage_if i_audMan; -//#endif USER_MAIN_DECLARATIONS par @@ -612,9 +599,7 @@ int main() #if (NUM_PDM_MICS > 0) , c_pdm_pcm #endif -//#ifdef RUN_DSP_TASK , i_audMan -//#endif ); #if defined(SPDIF_TX) && (SPDIF_TX_TILE != AUDIO_IO_TILE) From 959c0f3ca9611e140ff012dc6e6a2e4200f6e09a Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 25 May 2016 10:45:30 +0100 Subject: [PATCH 39/57] BCD_DEVICE bump --- module_usb_audio/devicedefines.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module_usb_audio/devicedefines.h b/module_usb_audio/devicedefines.h index bd77651d..a2252895 100644 --- a/module_usb_audio/devicedefines.h +++ b/module_usb_audio/devicedefines.h @@ -475,14 +475,14 @@ * @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 16 +#define BCD_DEVICE_M 17 #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 1 +#define BCD_DEVICE_N 0 #endif /** From 78ab9a067a1e204ed2c0156eac92369dd57c8af0 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 8 Jun 2016 12:40:29 +0100 Subject: [PATCH 40/57] Adding support for VENDOR_REQUESTS_PARAMS --- module_usb_audio/endpoint0/endpoint0.c | 31 +++++++++++++-------- module_usb_audio/endpoint0/endpoint0.h | 5 +++- module_usb_audio/endpoint0/vendorrequests.c | 26 +++++++++++++++++ module_usb_audio/endpoint0/vendorrequests.h | 17 +++++++++++ module_usb_audio/main.xc | 4 ++- 5 files changed, 69 insertions(+), 14 deletions(-) create mode 100644 module_usb_audio/endpoint0/vendorrequests.c diff --git a/module_usb_audio/endpoint0/endpoint0.c b/module_usb_audio/endpoint0/endpoint0.c index f3d4f51b..66cbc2af 100755 --- a/module_usb_audio/endpoint0/endpoint0.c +++ b/module_usb_audio/endpoint0/endpoint0.c @@ -1,6 +1,4 @@ /** - * g - * @file endpoint0.xc * @brief Implements endpoint zero for an USB Audio 1.0/2.0 device * @author Ross Owen, XMOS Semiconductor */ @@ -15,7 +13,7 @@ #include "devicedefines.h" #include "usb_device.h" /* Standard descriptor requests */ -#include "descriptors.h" /* This devices descriptors */ +#include "descriptors.h" /* This devices descriptors */ #include "commands.h" #include "audiostream.h" #include "hostactive.h" @@ -31,7 +29,7 @@ #endif #ifndef __XC__ -/* Support for C */ +/* Support for xCORE channels in C */ #define null 0 #define outuint(c, x) asm ("out res[%0], %1" :: "r" (c), "r" (x)) #define chkct(c, x) asm ("chkct res[%0], %1" :: "r" (c), "r" (x)) @@ -65,11 +63,9 @@ unsigned int DFU_mode_active = 0; // 0 - App active, 1 - DFU active /* Global volume and mute tables */ int volsOut[NUM_USB_CHAN_OUT + 1]; unsigned int mutesOut[NUM_USB_CHAN_OUT + 1]; -//unsigned int multOut[NUM_USB_CHAN_OUT + 1]; int volsIn[NUM_USB_CHAN_IN + 1]; unsigned int mutesIn[NUM_USB_CHAN_IN + 1]; -//unsigned int multIn[NUM_USB_CHAN_IN + 1]; #ifdef MIXER unsigned char mixer1Crossbar[18]; @@ -204,7 +200,7 @@ const unsigned g_chanCount_In_HS[INPUT_FORMAT_COUNT] = {HS_STREAM_FORMAT_I /* Endpoint 0 function. Handles all requests to the device */ void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, - chanend c_mix_ctl, chanend c_clk_ctl, chanend c_EANativeTransport_ctrl, CLIENT_INTERFACE(i_dfu, dfuInterface)) + chanend c_mix_ctl, chanend c_clk_ctl, chanend c_EANativeTransport_ctrl, CLIENT_INTERFACE(i_dfu, dfuInterface) VENDOR_REQUESTS_PARAMS_DEC_) { USB_SetupPacket_t sp; XUD_ep ep0_out = XUD_InitEp(c_ep0_out); @@ -271,10 +267,10 @@ void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, /* Init mixer inputs */ for(int j = 0; j < MAX_MIX_COUNT; j++) - for(int i = 0; i < MIX_INPUTS; i++) - { - mixSel[j][i] = i; - } + for(int i = 0; i < MIX_INPUTS; i++) + { + mixSel[j][i] = i; + } #endif #ifdef VENDOR_AUDIO_REQS @@ -288,7 +284,7 @@ void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, /* Stop audio */ outuint(c_audioControl, SET_SAMPLE_FREQ); outuint(c_audioControl, AUDIO_STOP_FOR_DFU); - // No Handshake + /* No Handshake */ DFU_mode_active = 1; } #endif @@ -628,6 +624,17 @@ void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, } /* if(result == XUD_RES_OKAY) */ + //if(i_vendorRequests != null) + { + if(result == XUD_RES_ERR) + { + /* Run vendor defined parsing/processing */ + /* Note, an interface might seem ideal hear but this *must* be executed on the same + * core sure to shared memory depandancy */ + VendorRequests(ep0_out, ep0_in, &sp VENDOR_REQUESTS_PARAMS_); + } + } + if(result == XUD_RES_ERR) { #ifdef DFU diff --git a/module_usb_audio/endpoint0/endpoint0.h b/module_usb_audio/endpoint0/endpoint0.h index ef3afaa8..b5303864 100644 --- a/module_usb_audio/endpoint0/endpoint0.h +++ b/module_usb_audio/endpoint0/endpoint0.h @@ -3,6 +3,8 @@ #define _ENDPOINT0_H_ #include "dfu_interface.h" +#include "devicedefines.h" +#include "vendorrequests.h" /** Function implementing Endpoint 0 for enumeration, control and configuration * of USB audio devices. It uses the descriptors defined in ``descriptors_2.h``. @@ -21,6 +23,7 @@ * endpoint manager if present */ void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioCtrl, - chanend ?c_mix_ctl,chanend ?c_clk_ctl, chanend ?c_EANativeTransport_ctr, client interface i_dfu dfuInterface); + chanend ?c_mix_ctl,chanend ?c_clk_ctl, chanend ?c_EANativeTransport_ctr, client interface i_dfu dfuInterface + VENDOR_REQUESTS_PARAMS_DEC_); #endif diff --git a/module_usb_audio/endpoint0/vendorrequests.c b/module_usb_audio/endpoint0/vendorrequests.c new file mode 100644 index 00000000..d5196685 --- /dev/null +++ b/module_usb_audio/endpoint0/vendorrequests.c @@ -0,0 +1,26 @@ + + +#include "xud.h" +#include "vendorrequests.h" + +int VendorAudioRequests(XUD_ep ep0_out, XUD_ep ep0_in, unsigned char bRequest, unsigned char cs, unsigned char cn, + unsigned short unitId, unsigned char direction, chanend c_audioControl, + NULLABLE_RESOURCE(chanend, c_mix_ctl), + NULLABLE_RESOURCE(chanend, c_clk_ctL)) __attribute__ ((weak)); + +int VendorAudioRequests(XUD_ep ep0_out, XUD_ep ep0_in, unsigned char bRequest, unsigned char cs, unsigned char cn, + unsigned short unitId, unsigned char direction, chanend c_audioControl, + NULLABLE_RESOURCE(chanend, c_mix_ctl), + NULLABLE_RESOURCE(chanend, c_clk_ctL)) +{ + + return XUD_RES_ERR; +} + +int VendorRequests(XUD_ep ep0_out, XUD_ep ep0_in, REFERENCE_PARAM(USB_SetupPacket_t, sp) VENDOR_REQUESTS_PARAMS_DEC_) __attribute__ ((weak)); + +int VendorRequests(XUD_ep ep0_out, XUD_ep ep0_in, REFERENCE_PARAM(USB_SetupPacket_t, sp) VENDOR_REQUESTS_PARAMS_DEC_) +{ + return XUD_RES_ERR; +} + diff --git a/module_usb_audio/endpoint0/vendorrequests.h b/module_usb_audio/endpoint0/vendorrequests.h index 99662fd1..8dcc4120 100644 --- a/module_usb_audio/endpoint0/vendorrequests.h +++ b/module_usb_audio/endpoint0/vendorrequests.h @@ -2,6 +2,9 @@ #define _VENDORREQUESTS_H_ #include +#include "devicedefines.h" +#include "xud.h" +#include "usb_std_requests.h" /* Functions that handle vustomer vendor requests. * @@ -11,10 +14,24 @@ * * */ +#define PREPEND_COMMA(x) ,x + +#ifndef VENDOR_REQUESTS_PARAMS +#define VENDOR_REQUESTS_PARAMS_ +#define VENDOR_REQUESTS_PARAMS_DEC_ +#else +#define VENDOR_REQUESTS_PARAMS_ PREPEND_COMMA(VENDOR_REQUESTS_PARAMS) +#define VENDOR_REQUESTS_PARAMS_DEC_ PREPEND_COMMA(VENDOR_REQUESTS_PARAMS_DEC) +#endif + int VendorAudioRequests(XUD_ep ep0_out, XUD_ep ep0_in, unsigned char bRequest, unsigned char cs, unsigned char cn, unsigned short unitId, unsigned char direction, chanend c_audioControl, NULLABLE_RESOURCE(chanend, c_mix_ctl), NULLABLE_RESOURCE(chanend, c_clk_ctL)); + +int VendorRequests(XUD_ep ep0_out, XUD_ep ep0_in, REFERENCE_PARAM(USB_SetupPacket_t, sp) VENDOR_REQUESTS_PARAMS_DEC_); + + #endif diff --git a/module_usb_audio/main.xc b/module_usb_audio/main.xc index 855e3f23..ba5c232c 100755 --- a/module_usb_audio/main.xc +++ b/module_usb_audio/main.xc @@ -287,6 +287,7 @@ void usb_audio_core(chanend c_mix_out , chanend ?c_clk_int , chanend ?c_clk_ctl , client interface i_dfu ?dfuInterface +VENDOR_REQUESTS_PARAMS_DEC_ ) { chan c_sof; @@ -381,7 +382,7 @@ void usb_audio_core(chanend c_mix_out /* Endpoint 0 Core */ { thread_speed(); - Endpoint0( c_xud_out[0], c_xud_in[0], c_aud_ctl, c_mix_ctl, c_clk_ctl, c_EANativeTransport_ctrl, dfuInterface); + Endpoint0( c_xud_out[0], c_xud_in[0], c_aud_ctl, c_mix_ctl, c_clk_ctl, c_EANativeTransport_ctrl, dfuInterface VENDOR_REQUESTS_PARAMS_); } /* Decoupling core */ @@ -581,6 +582,7 @@ int main() , c_mix_ctl #endif , c_clk_int, c_clk_ctl, dfuInterface + VENDOR_REQUESTS_PARAMS_ ); } From 2a0933c62aeb1519e252c36020d0ec82b0be23bb Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 15 Jun 2016 13:36:10 +0100 Subject: [PATCH 41/57] Added Call to VendorRequests() and VendorRequests_Init() into EP0 --- module_usb_audio/endpoint0/endpoint0.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/module_usb_audio/endpoint0/endpoint0.c b/module_usb_audio/endpoint0/endpoint0.c index 66cbc2af..e1bc9f49 100755 --- a/module_usb_audio/endpoint0/endpoint0.c +++ b/module_usb_audio/endpoint0/endpoint0.c @@ -198,6 +198,8 @@ const unsigned g_chanCount_In_HS[INPUT_FORMAT_COUNT] = {HS_STREAM_FORMAT_I #endif }; +void VendorRequests_Init(VENDOR_REQUESTS_PARAMS_DEC); + /* Endpoint 0 function. Handles all requests to the device */ void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, chanend c_mix_ctl, chanend c_clk_ctl, chanend c_EANativeTransport_ctrl, CLIENT_INTERFACE(i_dfu, dfuInterface) VENDOR_REQUESTS_PARAMS_DEC_) @@ -219,6 +221,8 @@ void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, mutesIn[i] = 0; } + VendorRequests_Init(VENDOR_REQUESTS_PARAMS); + #ifdef MIXER /* Set up mixer default state */ for (int i = 0; i < 18*8; i++) @@ -604,7 +608,6 @@ void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, #endif #ifdef VENDOR_AUDIO_REQS -#error /* If result is ERR at this point, then request to audio interface not handled - handle vendor audio reqs */ if(result == XUD_RES_ERR) { @@ -624,14 +627,13 @@ void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, } /* if(result == XUD_RES_OKAY) */ - //if(i_vendorRequests != null) { if(result == XUD_RES_ERR) { /* Run vendor defined parsing/processing */ - /* Note, an interface might seem ideal hear but this *must* be executed on the same + /* Note, an interface might seem ideal here but this *must* be executed on the same * core sure to shared memory depandancy */ - VendorRequests(ep0_out, ep0_in, &sp VENDOR_REQUESTS_PARAMS_); + result = VendorRequests(ep0_out, ep0_in, &sp VENDOR_REQUESTS_PARAMS_); } } From 645209a97b61e559cacc01eeedc2f64b48830c5f Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Thu, 23 Jun 2016 12:53:32 +0100 Subject: [PATCH 42/57] Removed old comment. --- module_usb_audio/audio_io/audio_io.xc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/module_usb_audio/audio_io/audio_io.xc b/module_usb_audio/audio_io/audio_io.xc index d39b480b..3590f491 100755 --- a/module_usb_audio/audio_io/audio_io.xc +++ b/module_usb_audio/audio_io/audio_io.xc @@ -34,12 +34,6 @@ #include "commands.h" #include "xc_ptr.h" -//#ifdef RUN_DSP_TASK -//#include "xua_dsp.h" -//#endif - - - /* TODO 32 is max expected channels */ static unsigned samplesOut[32]; From d5a87390217216914f7a556dca195add6001dcb8 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Thu, 23 Jun 2016 13:45:53 +0100 Subject: [PATCH 43/57] FIR gain compensation set appropriately in lib_mic_array --- module_usb_audio/pdm_mics/pdm_mic.xc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/module_usb_audio/pdm_mics/pdm_mic.xc b/module_usb_audio/pdm_mics/pdm_mic.xc index fa0d54de..88d28995 100644 --- a/module_usb_audio/pdm_mics/pdm_mic.xc +++ b/module_usb_audio/pdm_mics/pdm_mic.xc @@ -57,8 +57,18 @@ void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio) c_audio :> samplerate; unsigned decimationfactor = 96000/samplerate; + int fir_gain_compen[7]; + unsafe { + fir_gain_compen[0] = 0; + fir_gain_compen[1] = FIR_COMPENSATOR_DIV_2; + fir_gain_compen[2] = FIR_COMPENSATOR_DIV_4; + fir_gain_compen[3] = FIR_COMPENSATOR_DIV_6; + fir_gain_compen[4] = FIR_COMPENSATOR_DIV_6; + fir_gain_compen[5] = 0; + fir_gain_compen[6] = FIR_COMPENSATOR_DIV_12; + fir_coefs[0] = 0; fir_coefs[1] = g_third_stage_div_2_fir; fir_coefs[2] = g_third_stage_div_4_fir; @@ -75,7 +85,7 @@ void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio) dcc.output_decimation_factor = decimationfactor; dcc.coefs = fir_coefs[decimationfactor/2]; dcc.apply_mic_gain_compensation = 0; - dcc.fir_gain_compensation = 0; + dcc.fir_gain_compensation = fir_gain_compen[decimationfactor/2]; dcc.buffering_type = DECIMATOR_NO_FRAME_OVERLAP; dcc.number_of_frame_buffers = 2; @@ -148,7 +158,7 @@ void pdm_buffer(streaming chanend c_ds_output[2], chanend c_audio) decimationfactor = 96000/samplerate; dcc.output_decimation_factor = decimationfactor; dcc.coefs=fir_coefs[decimationfactor/2]; - + dcc.fir_gain_compensation = fir_gain_compen[decimationfactor/2]; mic_array_decimator_configure(c_ds_output, 2, dc); mic_array_init_time_domain_frame(c_ds_output, 2, buffer, mic_audio, dc); From 5eb4997828ee646219ee33820c8d0890f469feec Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Fri, 24 Jun 2016 16:34:29 +0100 Subject: [PATCH 44/57] Resolved build issue when VENDOR_REQUEST_PARAMS_... not defined --- module_usb_audio/endpoint0/endpoint0.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/module_usb_audio/endpoint0/endpoint0.c b/module_usb_audio/endpoint0/endpoint0.c index e1bc9f49..05a7d0b6 100755 --- a/module_usb_audio/endpoint0/endpoint0.c +++ b/module_usb_audio/endpoint0/endpoint0.c @@ -198,6 +198,13 @@ const unsigned g_chanCount_In_HS[INPUT_FORMAT_COUNT] = {HS_STREAM_FORMAT_I #endif }; +#ifndef VENDOR_REQUESTS_PARAMS_DEC +#define VENDOR_REQUESTS_PARAMS_DEC +#endif +#ifndef VENDOR_REQUESTS_PARAMS +#define VENDOR_REQUESTS_PARAMS +#endif + void VendorRequests_Init(VENDOR_REQUESTS_PARAMS_DEC); /* Endpoint 0 function. Handles all requests to the device */ From 07e02f77f524dede84d033e7555e1bf1740e29e0 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Fri, 24 Jun 2016 16:48:24 +0100 Subject: [PATCH 45/57] Added default implementation of VendorRequests_Init (sandbox build fail) --- module_usb_audio/endpoint0/endpoint0.c | 9 --------- module_usb_audio/endpoint0/vendorrequests.c | 7 +++++++ module_usb_audio/endpoint0/vendorrequests.h | 8 ++++++++ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/module_usb_audio/endpoint0/endpoint0.c b/module_usb_audio/endpoint0/endpoint0.c index 05a7d0b6..981fccd3 100755 --- a/module_usb_audio/endpoint0/endpoint0.c +++ b/module_usb_audio/endpoint0/endpoint0.c @@ -198,15 +198,6 @@ const unsigned g_chanCount_In_HS[INPUT_FORMAT_COUNT] = {HS_STREAM_FORMAT_I #endif }; -#ifndef VENDOR_REQUESTS_PARAMS_DEC -#define VENDOR_REQUESTS_PARAMS_DEC -#endif -#ifndef VENDOR_REQUESTS_PARAMS -#define VENDOR_REQUESTS_PARAMS -#endif - -void VendorRequests_Init(VENDOR_REQUESTS_PARAMS_DEC); - /* Endpoint 0 function. Handles all requests to the device */ void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_audioControl, chanend c_mix_ctl, chanend c_clk_ctl, chanend c_EANativeTransport_ctrl, CLIENT_INTERFACE(i_dfu, dfuInterface) VENDOR_REQUESTS_PARAMS_DEC_) diff --git a/module_usb_audio/endpoint0/vendorrequests.c b/module_usb_audio/endpoint0/vendorrequests.c index d5196685..cfb3c63d 100644 --- a/module_usb_audio/endpoint0/vendorrequests.c +++ b/module_usb_audio/endpoint0/vendorrequests.c @@ -24,3 +24,10 @@ int VendorRequests(XUD_ep ep0_out, XUD_ep ep0_in, REFERENCE_PARAM(USB_SetupPack return XUD_RES_ERR; } +void VendorRequests_Init(VENDOR_REQUESTS_PARAMS_DEC) __attribute__ ((weak)); + +void VendorRequests_Init(VENDOR_REQUESTS_PARAMS_DEC) +{ + +} + diff --git a/module_usb_audio/endpoint0/vendorrequests.h b/module_usb_audio/endpoint0/vendorrequests.h index 8dcc4120..7bb8052c 100644 --- a/module_usb_audio/endpoint0/vendorrequests.h +++ b/module_usb_audio/endpoint0/vendorrequests.h @@ -24,6 +24,13 @@ #define VENDOR_REQUESTS_PARAMS_DEC_ PREPEND_COMMA(VENDOR_REQUESTS_PARAMS_DEC) #endif +#ifndef VENDOR_REQUESTS_PARAMS_DEC +#define VENDOR_REQUESTS_PARAMS_DEC +#endif +#ifndef VENDOR_REQUESTS_PARAMS +#define VENDOR_REQUESTS_PARAMS +#endif + int VendorAudioRequests(XUD_ep ep0_out, XUD_ep ep0_in, unsigned char bRequest, unsigned char cs, unsigned char cn, unsigned short unitId, unsigned char direction, chanend c_audioControl, NULLABLE_RESOURCE(chanend, c_mix_ctl), @@ -32,6 +39,7 @@ int VendorAudioRequests(XUD_ep ep0_out, XUD_ep ep0_in, unsigned char bRequest, u int VendorRequests(XUD_ep ep0_out, XUD_ep ep0_in, REFERENCE_PARAM(USB_SetupPacket_t, sp) VENDOR_REQUESTS_PARAMS_DEC_); +void VendorRequests_Init(VENDOR_REQUESTS_PARAMS_DEC); #endif From 0f1690cc770e098ab26263a65f3be14af8bd2407 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 29 Jun 2016 09:07:04 +0530 Subject: [PATCH 46/57] BCD_DEVICE update --- module_usb_audio/devicedefines.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module_usb_audio/devicedefines.h b/module_usb_audio/devicedefines.h index a2252895..ba0cee8e 100644 --- a/module_usb_audio/devicedefines.h +++ b/module_usb_audio/devicedefines.h @@ -475,7 +475,7 @@ * @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 17 +#define BCD_DEVICE_M 18 #endif /** From dd8d985e209d46bcdbdca61faa65ef6b79424274 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Mon, 11 Jul 2016 13:55:41 +0100 Subject: [PATCH 47/57] Added 6.18 to changelog --- CHANGELOG.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 3aa58cf1..0f18b180 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,13 @@ sc_usb_audio Change Log ======================= +6.18.0 +------ + - ADDED: Call to VendorRequests() and VendorRequests_Init() to Endpoint 0 + - ADDED: VENDOR_REQUESTS_PARAMS define to allow for custom parameters to VendorRequest calls + - RESOLVED: FIR gain compensation set appropriately in lib_mic_array usage + - CHANGE: i_dsp interface renamed i_audManage + 6.16.0 ------ - ADDED: Call to UserBufferManagement() From 81f9bfc2327ead9340aab65d9037a5eeb25ea2d8 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Mon, 11 Jul 2016 16:59:39 +0100 Subject: [PATCH 48/57] Fixed UAC1 descriptors using some UAC2 strings. --- module_usb_audio/endpoint0/descriptors.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/module_usb_audio/endpoint0/descriptors.h b/module_usb_audio/endpoint0/descriptors.h index 6a925f7f..28d14576 100644 --- a/module_usb_audio/endpoint0/descriptors.h +++ b/module_usb_audio/endpoint0/descriptors.h @@ -391,7 +391,7 @@ USB_Descriptor_Device_t devDesc_Audio1 = .idProduct = PID_AUDIO_1, .bcdDevice = BCD_DEVICE, .iManufacturer = offsetof(StringDescTable_t, vendorStr)/sizeof(char *), - .iProduct = offsetof(StringDescTable_t, productStr_Audio2)/sizeof(char *), + .iProduct = offsetof(StringDescTable_t, productStr_Audio1)/sizeof(char *), .iSerialNumber = 0, .bNumConfigurations = 1 }; @@ -2454,7 +2454,7 @@ unsigned char cfgDesc_Audio1[] = 0x01, /* Interface class - AUDIO */ 0x02, /* subclass - AUDIO_STREAMING */ 0x00, /* Unused */ - 0x04, /* String table index */ + 0x09, /* String table index */ /* Class-Specific AS Interface Descriptor (4.5.2) */ 0x07, @@ -2568,22 +2568,22 @@ unsigned char cfgDesc_Audio1[] = 0x04, /* INTERFACE */ (OUTPUT_INTERFACES_A1 + 1), /* bInterfaceNumber*/ 0x00, /* AlternateSetting */ - 0x00, /* num endpoints */ + 0x00, /* bNumEndpoints */ 0x01, /* Interface class - AUDIO */ 0x02, /* subclass - AUDIO_STREAMING */ 0x00, /* Unused */ - 0x05, /* String table index */ + 0x0A, /* iInterface */ /* Standard Interface Descriptor - Audio streaming IN */ 0x09, 0x04, /* INTERFACE */ (OUTPUT_INTERFACES_A1 + 1), /* bInterfaceNumber */ 0x01, /* AlternateSetting */ - 0x01, /* num endpoints */ + 0x01, /* bNumEndpoints */ 0x01, /* Interface class - AUDIO */ 0x02, /* Subclass - AUDIO_STREAMING */ 0x00, /* Unused */ - 0x0A, /* String table index */ + 0x0A, /* iInterface*/ /* CS_Interface AC interface header descriptor */ 0x07, From 26bcc1db6e98b388a5e44350ca1b35c81e84178e Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Mon, 11 Jul 2016 17:01:12 +0100 Subject: [PATCH 49/57] xpd: Patched version number --- module_dfu/.cproject | 9 +++------ module_queue/.cproject | 9 +++------ module_usb_audio/.cproject | 9 +++------ module_usb_midi/.cproject | 12 +++--------- 4 files changed, 12 insertions(+), 27 deletions(-) diff --git a/module_dfu/.cproject b/module_dfu/.cproject index daca0c0a..4a5d77a6 100644 --- a/module_dfu/.cproject +++ b/module_dfu/.cproject @@ -156,8 +156,7 @@