diff --git a/lib_xua/src/core/audiohub/xua_audiohub.xc b/lib_xua/src/core/audiohub/xua_audiohub.xc index 885fe521..3089523a 100755 --- a/lib_xua/src/core/audiohub/xua_audiohub.xc +++ b/lib_xua/src/core/audiohub/xua_audiohub.xc @@ -805,6 +805,9 @@ void XUA_AudioHub(chanend ?c_aud, clock ?clk_audio_mclk, clock ?clk_audio_bclk, /* Notify clockgen of new mCLk */ c_mclk_change <: mClk; c_mclk_change <: curFreq; + + /* Wait for ACK back from clockgen to signal clocks all good */ + c_mclk_change :> int _; #endif } diff --git a/lib_xua/src/core/clocking/clockgen.xc b/lib_xua/src/core/clocking/clockgen.xc index b22dd906..b3fd4c18 100644 --- a/lib_xua/src/core/clocking/clockgen.xc +++ b/lib_xua/src/core/clocking/clockgen.xc @@ -347,6 +347,8 @@ void clockGen ( streaming chanend ?c_spdif_rx, #if (USE_SW_PLL && (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN)) chan c_sigma_delta; int reset_sw_pll_pfd = 1; + int require_ack_to_audio = 0; + unsafe { selected_mclk_rate_ptr = &selected_mclk_rate; } @@ -531,6 +533,17 @@ void clockGen ( streaming chanend ?c_spdif_rx, break; #endif +#if ((XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) && USE_SW_PLL) + case inuint_byref(c_sigma_delta, tmp): + printstr("ACK\n"); + if(require_ack_to_audio) + { + c_mclk_change <: tmp; + require_ack_to_audio = 0; + } + break; +#endif + #if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) case c_mclk_change :> selected_mclk_rate: c_mclk_change :> selected_sample_rate; @@ -539,6 +552,7 @@ void clockGen ( streaming chanend ?c_spdif_rx, mclks_per_sample = selected_mclk_rate / selected_sample_rate; restart_sigma_delta(c_sigma_delta); reset_sw_pll_pfd = 1; + require_ack_to_audio = 1; #endif break; #endif diff --git a/lib_xua/src/core/clocking/sw_pll_wrapper.xc b/lib_xua/src/core/clocking/sw_pll_wrapper.xc index 664fa5c2..64fbfdec 100644 --- a/lib_xua/src/core/clocking/sw_pll_wrapper.xc +++ b/lib_xua/src/core/clocking/sw_pll_wrapper.xc @@ -137,7 +137,9 @@ void SigmaDeltaTask(chanend c_sigma_delta, unsigned * unsafe selected_mclk_rate_ tmr :> time_trigger; int running = 1; - unsigned rx_word; + outuint(c_sigma_delta, 0); /* Signal back via clockgen to audio to start I2S */ + + unsigned rx_word = 0; while(running) { /* Poll for new SDM control value */ @@ -146,7 +148,6 @@ void SigmaDeltaTask(chanend c_sigma_delta, unsigned * unsafe selected_mclk_rate_ case inuint_byref(c_sigma_delta, rx_word): if(rx_word == DISABLE_SDM) { - printhexln(rx_word); f_error = 0; running = 0; }