From be0bf0d9833dfed02895e89a0f29c26d67c8fe8e Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 22 Sep 2015 11:15:05 +0100 Subject: [PATCH] Trial add of PDM code --- module_usb_audio/audio.h | 3 + module_usb_audio/audio.xc | 10 ++++ module_usb_audio/main.xc | 36 +++++------ module_usb_audio/pcm_pdm_mic.xc | 103 ++++++++++++++++++++++++++++++++ 4 files changed, 135 insertions(+), 17 deletions(-) create mode 100644 module_usb_audio/pcm_pdm_mic.xc diff --git a/module_usb_audio/audio.h b/module_usb_audio/audio.h index 271def28..662a9af3 100644 --- a/module_usb_audio/audio.h +++ b/module_usb_audio/audio.h @@ -26,6 +26,9 @@ void audio(chanend c_in, #if (XUD_TILE != 0) , server interface i_dfu dfuInterface #endif +#ifdef PDM_PCM_IN +, streaming chanend c_pdm_in +#endif ); void SpdifTxWrapper(chanend c_spdif_tx); diff --git a/module_usb_audio/audio.xc b/module_usb_audio/audio.xc index 2d1f36db..5b6c23a8 100755 --- a/module_usb_audio/audio.xc +++ b/module_usb_audio/audio.xc @@ -696,6 +696,15 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, unsigned sample = samplesOut[SPDIF_TX_INDEX + 1]; outuint(c_spd_out, sample); /* Forward sample to S/PDIF Tx thread */ #endif + +#ifdef PDM_PCM_IN + c_pdm_in <: 1; + c_pdm_in :> samplesIn_0[0]; + c_pdm_in :> samplesIn_0[1]; +#endif + + + } @@ -1171,6 +1180,7 @@ chanend ?c_config, chanend ?c outuint(c_spdif_out, mClk); #endif + #ifdef ADAT_TX // Configure ADAT parameters ... // diff --git a/module_usb_audio/main.xc b/module_usb_audio/main.xc index b4c08e8a..9eb586b2 100755 --- a/module_usb_audio/main.xc +++ b/module_usb_audio/main.xc @@ -43,6 +43,10 @@ #include "clocking.h" +#ifdef PDM_PCM_IN +void pcm_pdm_mic(streaming chanend c_pcm_out); +#endif + void genclock(); [[distributable]] @@ -267,14 +271,6 @@ void xscope_user_init() } #endif -#ifdef PDM_PCM_IN -void dummy_pdm_code(streaming chanend c) -{ - while(1) - c <: 0xff00ff00; -} -#endif - /* Core USB Audio functions - must be called on the Tile connected to the USB Phy */ void usb_audio_core(chanend c_mix_out #ifdef MIDI @@ -417,6 +413,9 @@ void usb_audio_io(chanend c_aud_in, chanend ?c_adc, #if (XUD_TILE != 0) , server interface i_dfu dfuInterface #endif +#ifdef PDM_PCM_IN + , streaming chanend c_pdm_pcm +#endif ) { #ifdef MIXER @@ -429,10 +428,6 @@ void usb_audio_io(chanend c_aud_in, chanend ?c_adc, #define c_dig_rx null #endif -#ifdef PDM_PCM_IN - streaming chan c_pdm_pcm -#endif - par { #ifdef MIXER @@ -476,10 +471,6 @@ void usb_audio_io(chanend c_aud_in, chanend ?c_adc, } #endif -#ifdef PDM_PCM_IN - dummy_pdm_code(c_pdm_pcm); -#endif - //: } } @@ -491,7 +482,6 @@ void usb_audio_io(chanend c_aud_in, chanend ?c_adc, #ifndef USER_MAIN_CORES #define USER_MAIN_CORES #endif -//:: /* Main for USB Audio Applications */ int main() @@ -553,6 +543,9 @@ int main() #define dfuInterface null #endif +#ifdef PDM_PCM_IN + streaming chan c_pdm_pcm; +#endif USER_MAIN_DECLARATIONS @@ -582,6 +575,7 @@ int main() , c_mix_ctl #endif , c_clk_int, c_clk_ctl, dfuInterface + ); } @@ -596,6 +590,9 @@ int main() #if XUD_TILE != 0 , dfuInterface #endif +#ifdef PDM_PCM_IN + , c_pdm_pcm +#endif ); @@ -657,6 +654,11 @@ int main() } } #endif + +#ifdef PDM_PCM_IN + // TODO tile + on stdcore[0]: pcm_pdm_mic(c_pdm_pcm); +#endif USER_MAIN_CORES } diff --git a/module_usb_audio/pcm_pdm_mic.xc b/module_usb_audio/pcm_pdm_mic.xc new file mode 100644 index 00000000..427df39c --- /dev/null +++ b/module_usb_audio/pcm_pdm_mic.xc @@ -0,0 +1,103 @@ +#include +#include +#include +#include +#include "beam.h" +#include +#include +#include + +#include "static_constants.h" +#if 1 +on tile[0]: in port p_pdm_clk = XS1_PORT_1E; +on tile[0]: in buffered port:8 p_pdm_mics = XS1_PORT_8B; +in port p_mclk = on tile[0]: XS1_PORT_1F; +clock mclk = on tile[0]: XS1_CLKBLK_1; +clock pdmclk = on tile[0]: XS1_CLKBLK_3; + +in port p_buttons = on tile[0]: XS1_PORT_4C; + +typedef struct { + unsigned ch_a; + unsigned ch_b; +} double_packed_audio; + +typedef struct { + double_packed_audio data[4][1< unsigned req; + c_pcm_out <: audio[buffer].data[0][0].ch_a; + c_pcm_out <: audio[buffer].data[0][0].ch_b; + printintln(audio[buffer].data[0][0].ch_b); + } + } +} + + +void pcm_pdm_mic(streaming chanend c_pcm_out) +{ + streaming chan c_multi_channel_pdm, c_sync, c_4x_pdm_mic_0, c_4x_pdm_mic_1; + streaming chan c_ds_output_0, c_ds_output_1; + streaming chan c_buffer_mic0, c_buffer_mic1; + unsigned long long shared_memory[2] = {0}; + + configure_clock_src(mclk, p_mclk); + configure_clock_src_divide(pdmclk, p_mclk, 2); + configure_port_clock_output(p_pdm_clk, pdmclk); + configure_in_port(p_pdm_mics, pdmclk); + start_clock(mclk); + start_clock(pdmclk); + + unsafe + { + unsigned long long * unsafe p_shared_memory = shared_memory; + par + { + + //Input stage + pdm_first_stage(p_pdm_mics, p_shared_memory, + PDM_BUFFER_LENGTH_LOG2, c_sync, + c_4x_pdm_mic_0, c_4x_pdm_mic_1); + + pdm_to_pcm_4x(c_4x_pdm_mic_0, c_ds_output_0); + pdm_to_pcm_4x(c_4x_pdm_mic_1, c_ds_output_1); + + example(c_ds_output_0, c_ds_output_1, c_pcm_out); + + } + } +} + +#endif