From 86b4ab89ea031f7df279bc838ded367843454b86 Mon Sep 17 00:00:00 2001 From: Oscar Bailey Date: Tue, 26 Feb 2019 16:59:29 +0000 Subject: [PATCH] Change version of lib_mic_array; Fix synchronous endpoint behaviour The device now adjusts it's clock to the USB clock when host is not pushing data to device. --- examples/xua_lite_example/Makefile | 2 +- examples/xua_lite_example/src/app_xua_lite.xc | 7 +++--- examples/xua_lite_example/src/audio_hub.xc | 8 ++++++- examples/xua_lite_example/src/pdm_mic.h | 4 +++- examples/xua_lite_example/src/pdm_mic.xc | 21 ++++++++++------ .../xua_lite_example/src/xua_buffer_lite.xc | 12 +++++++--- examples/xua_lite_example/wscript | 24 +++++++++++++++++++ lib_xua/src/core/pdm_mics/pdm_mic.xc | 2 +- 8 files changed, 62 insertions(+), 18 deletions(-) create mode 100644 examples/xua_lite_example/wscript diff --git a/examples/xua_lite_example/Makefile b/examples/xua_lite_example/Makefile index 85c75385..daa7dc5f 100644 --- a/examples/xua_lite_example/Makefile +++ b/examples/xua_lite_example/Makefile @@ -10,7 +10,7 @@ XCC_FLAGS = -fcomment-asm -Xmapper --map -Xmapper MAPFILE -Os -report \ # The USED_MODULES variable lists other module used by the application. These # modules will extend the SOURCE_DIRS, INCLUDE_DIRS and LIB_DIRS variables. # Modules are expected to be in the directory above the BASE_DIR directory. -USED_MODULES = lib_xua lib_i2s lib_xud lib_i2c lib_mic_array_ddr +USED_MODULES = lib_xua lib_i2s lib_xud lib_i2c lib_mic_array #============================================================================= # The following part of the Makefile includes the common build infrastructure diff --git a/examples/xua_lite_example/src/app_xua_lite.xc b/examples/xua_lite_example/src/app_xua_lite.xc index a53982ca..2616914a 100644 --- a/examples/xua_lite_example/src/app_xua_lite.xc +++ b/examples/xua_lite_example/src/app_xua_lite.xc @@ -11,7 +11,7 @@ #include "i2s.h" #include "i2c.h" #include "mic_array.h" -#include "XUA_Buffer_lite.h" +#include "xua_buffer_lite.h" #include "xua_ep0_wrapper.h" #include "pdm_mic.h" #include "audio_config.h" @@ -96,12 +96,11 @@ int main() c_audio :> int _; //Now wait until i2c has finished mclk setup const unsigned micDiv = MCLK_48/3072000; - if (XUA_ADAPTIVE) mic_array_setup_ddr_xcore(pdmclk, pdmclk6, p_pdm_clk, p_pdm_mics, micDiv); - else mic_array_setup_ddr(pdmclk, pdmclk6, p_mclk_in, p_pdm_clk, p_pdm_mics, micDiv); + mic_array_setup_ddr(pdmclk, pdmclk6, p_mclk_in, p_pdm_clk, p_pdm_mics, micDiv); par { i2s_frame_master(i_i2s, p_i2s_dac, 1, p_i2s_adc, 1, p_bclk, p_lrclk, p_mclk_in, clk_audio_bclk); - [[distribute]]AudioHub(i_i2s, c_audio, c_ds_output); + [[distribute]] AudioHub(i_i2s, c_audio, c_ds_output); pdm_mic(c_ds_output[0], p_pdm_mics); par (int i = 0; i < 5; i++) burn_normal_priority(); diff --git a/examples/xua_lite_example/src/audio_hub.xc b/examples/xua_lite_example/src/audio_hub.xc index 1fb3c4f0..06fd32dc 100644 --- a/examples/xua_lite_example/src/audio_hub.xc +++ b/examples/xua_lite_example/src/audio_hub.xc @@ -1,3 +1,4 @@ +#include #include "i2s.h" #include "i2c.h" #include "xua.h" @@ -34,6 +35,8 @@ void AudioHub(server i2s_frame_callback_if i2s, mic_array_decimator_configure(c_ds_output, decimatorCount, dc); mic_array_init_time_domain_frame(c_ds_output, decimatorCount, buffer, mic_audio_frame, dc); + // Used for debug + //int saw = 0; while (1) { select { @@ -57,7 +60,7 @@ void AudioHub(server i2s_frame_callback_if i2s, case i2s.restart_check() -> i2s_restart_t restart: restart = I2S_NO_RESTART; // Keep on looping timer tmr; int t0, t1; tmr :> t0; - + //Transfer samples. Takes about 25 ticks for (int i = 0; i < NUM_USB_CHAN_OUT; i++) c_audio :> samples_out[i]; if (XUA_ADAPTIVE) c_audio :> clock_nudge; @@ -70,6 +73,9 @@ void AudioHub(server i2s_frame_callback_if i2s, for (int i = 0; i < XUA_NUM_PDM_MICS; i++) raw_mics[i] = current->data[i][0]; } + //memset(raw_mics, saw, sizeof(int) * XUA_NUM_PDM_MICS); + //saw += 500; + //Taking about 160 ticks when adjusting, 100 when not tmr :> t0; pll_nudge(clock_nudge); diff --git a/examples/xua_lite_example/src/pdm_mic.h b/examples/xua_lite_example/src/pdm_mic.h index 2b00567d..04b13c3f 100644 --- a/examples/xua_lite_example/src/pdm_mic.h +++ b/examples/xua_lite_example/src/pdm_mic.h @@ -5,6 +5,8 @@ void mic_array_decimator_set_samprate(const unsigned samplerate, int mic_decimator_fir_data_array[], mic_array_decimator_conf_common_t *dcc, mic_array_decimator_config_t dc[]); void pdm_mic(streaming chanend c_ds_output, in buffered port:32 p_pdm_mics); -void mic_array_setup_ddr_xcore(clock pdmclk, clock pdmclk6, out port p_pdm_clk, buffered in port:32 p_pdm_data, int divide); +void mic_array_setup_ddr(clock pdmclk, clock pdmclk6, in port p_mclk, + out port p_pdm_clk, buffered in port:32 p_pdm_data, + int divide); #endif diff --git a/examples/xua_lite_example/src/pdm_mic.xc b/examples/xua_lite_example/src/pdm_mic.xc index 417d6eb4..59d506be 100644 --- a/examples/xua_lite_example/src/pdm_mic.xc +++ b/examples/xua_lite_example/src/pdm_mic.xc @@ -35,7 +35,7 @@ void mic_array_decimator_set_samprate(const unsigned samplerate, int mic_decimat fir_coefs[6] = (int * unsafe)g_third_stage_div_12_fir; //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->len = MIC_ARRAY_MAX_FRAME_SIZE_LOG2; dcc->apply_dc_offset_removal = 1; dcc->index_bit_reversal = 0; dcc->windowing_function = null; @@ -73,17 +73,24 @@ void pdm_mic(streaming chanend c_ds_output, in buffered port:32 p_pdm_mics) } } -void mic_array_setup_ddr_xcore(clock pdmclk, +void mic_array_setup_ddr(clock pdmclk, clock pdmclk6, + in port p_mclk, /*used only in I2S slave case*/ out port p_pdm_clk, buffered in port:32 p_pdm_data, int divide) { - configure_clock_xcore(pdmclk, 80); - //configure_clock_src_divide(pdmclk, p_mclk, divide/2); - configure_clock_xcore(pdmclk6, 40); - //configure_clock_src_divide(pdmclk6, p_mclk, divide/4); - + +#if !XUA_ADAPTIVE //i2s slave + //p_mclk coming from the Pi is 24.576 MHz + configure_clock_src_divide(pdmclk, p_mclk, 4); //3.072 = 24.576 / 8 + configure_clock_src_divide(pdmclk6, p_mclk, 2); //6.144 = 24.576 / 4 + +#else + configure_clock_xcore(pdmclk, 80); // 3.072 + configure_clock_xcore(pdmclk6, 40); // 6.144 +#endif + configure_port_clock_output(p_pdm_clk, pdmclk); configure_in_port(p_pdm_data, pdmclk6); diff --git a/examples/xua_lite_example/src/xua_buffer_lite.xc b/examples/xua_lite_example/src/xua_buffer_lite.xc index d86cdf38..b0253955 100644 --- a/examples/xua_lite_example/src/xua_buffer_lite.xc +++ b/examples/xua_lite_example/src/xua_buffer_lite.xc @@ -27,6 +27,7 @@ void XUD_GetSetupData_Select(chanend c, XUD_ep e_out, unsigned &length, XUD_Resu extern XUD_ep ep0_out; extern XUD_ep ep0_in; +#if 0 //Unsafe to allow us to use fifo API without local unsafe scope unsafe void XUA_Buffer_lite(chanend c_ep0_out, chanend c_ep0_in, chanend c_aud_out, chanend ?c_feedback, chanend c_aud_in, chanend c_sof, in port p_for_mclk_count, streaming chanend c_audio_hub) { @@ -197,6 +198,7 @@ unsafe void XUA_Buffer_lite(chanend c_ep0_out, chanend c_ep0_in, chanend c_aud_o } } } +#endif extern port p_sda; [[combinable]] @@ -336,7 +338,11 @@ unsafe void XUA_Buffer_lite2(server ep0_control_if i_ep0_ctl, chanend c_aud_out, timer tmr; int t0, t1; tmr :> t0; //If host is not streaming out, then send a fixed number of samples to host - if (output_interface_num == 0) num_samples_to_send_to_host = (DEFAULT_FREQ / SOF_FREQ_HZ) * NUM_USB_CHAN_IN; + if (output_interface_num == 0) { + num_samples_to_send_to_host = (DEFAULT_FREQ / SOF_FREQ_HZ) * NUM_USB_CHAN_IN; + int fill_level = fifo_get_fill_short(device_to_host_fifo_ptr); + if (isnull(c_feedback)) do_clock_nudge_pdm(-do_rate_control(fill_level, &pid_state), &clock_nudge); + } fifo_ret_t ret = fifo_block_pop_short_fast(device_to_host_fifo_ptr, buffer_aud_in.short_words, num_samples_received_from_host); if (ret != FIFO_SUCCESS) { @@ -349,7 +355,7 @@ unsafe void XUA_Buffer_lite2(server ep0_control_if i_ep0_ctl, chanend c_aud_out, //Use the number of samples we received last time so we are always balanced (assumes same in/out count) unsigned input_buffer_size = num_samples_to_send_to_host * in_subslot_size; - XUD_SetReady_InPtr(ep_aud_in, (unsigned)buffer_aud_in.long_words, input_buffer_size); //loopback + XUD_SetReady_InPtr(ep_aud_in, (unsigned) buffer_aud_in.long_words, input_buffer_size); //loopback num_samples_to_send_to_host = 0; //tmr :> t1; debug_printf("i%d\n", t1 - t0); break; @@ -375,4 +381,4 @@ unsafe void XUA_Buffer_lite2(server ep0_control_if i_ep0_ctl, chanend c_aud_out, break; } } -} \ No newline at end of file +} diff --git a/examples/xua_lite_example/wscript b/examples/xua_lite_example/wscript new file mode 100644 index 00000000..7373dcd9 --- /dev/null +++ b/examples/xua_lite_example/wscript @@ -0,0 +1,24 @@ +def options(ctx): + ctx.add_option('--target', action='store', default='xua_lite_example.xe') + ctx.add_option('--debug', action='store_true') + + +def configure(conf): + conf.load('xwaf.compiler_xcc') + conf.env.PROJECT_ROOT = '../../..' + +def build(bld): + target_path = 'bin/' + bld.options.target + bld.env.TARGET_ARCH ='src/RPI_HAT_60QFN.xn' + bld.env.XSCOPE = bld.path.find_resource('config.xscope') + depends_on = ['lib_xua','lib_i2s','lib_xud','lib_mic_array', 'lib_i2c'] + #bld.env.XCC_FLAGS = ['-O2', '-g', '-Wall', '-fcmdline-buffer-bytes=512', '-report', '-DDISABLE_STAGE_C'] + bld.env.XCC_FLAGS = ['-fcomment-asm','-Xmapper','--map','-Xmapper','MAPFILE', + '-Os','-report','-g','-Wno-unused-function','-Wno-timing', + '-DXUD_SERIES_SUPPORT=XUD_X200_SERIES','-DUSB_TILE=tile[1]', + '-DMIC_ARRAY_CH0=PIN0','-DMIC_ARRAY_CH1=PIN4', '-DDEBUG_PRINT_ENABLE=1'] + if bld.options.debug: + bld.env.XCC_FLAGS.append('-DDEBUG') + + source = bld.path.ant_glob(['src/**/*.xc', 'src/**/*.c']) + bld.program(source=source, depends_on=depends_on,target=target_path) diff --git a/lib_xua/src/core/pdm_mics/pdm_mic.xc b/lib_xua/src/core/pdm_mics/pdm_mic.xc index 2221d1f7..dabfb794 100644 --- a/lib_xua/src/core/pdm_mics/pdm_mic.xc +++ b/lib_xua/src/core/pdm_mics/pdm_mic.xc @@ -88,7 +88,7 @@ void XUA_PdmBuffer(streaming chanend c_ds_output[2], chanend c_audio) fir_coefs[6] = g_third_stage_div_12_fir; //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.len = MIC_ARRAY_MAX_FRAME_SIZE_LOG2; dcc.apply_dc_offset_removal = 1; dcc.index_bit_reversal = 0; dcc.windowing_function = null;