diff --git a/lib_xua/api/xua_audiohub.h b/lib_xua/api/xua_audiohub.h index ed9da2aa..c056d591 100644 --- a/lib_xua/api/xua_audiohub.h +++ b/lib_xua/api/xua_audiohub.h @@ -38,12 +38,16 @@ * * \param i_SoftPll Interface to software PLL task * - * \param c_spdif_tx Channel connected to S/PDIF transmiter core from lib_spdif + * \param c_spdif_tx Channel connected to S/PDIF transmitter core from lib_spdif * * \param c_dig Channel connected to the clockGen() thread for * receiving/transmitting samples * - * \param c_mclk_change Channel notifying clockgen of an mclk frequency change + * \param c_mclk_change Channel notifying ep_buffer of an mclk frequency change and sync for stable clock + * + * \param dfuInterface Interface supporting DFU methods + * + * \param c_pdm_in Channel for receiving decimated PDM samples */ void XUA_AudioHub(chanend ?c_aud, clock ?clk_audio_mclk, @@ -61,12 +65,14 @@ void XUA_AudioHub(chanend ?c_aud, #endif #if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN || defined(__DOXYGEN__)) , chanend c_dig +#endif +#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC || XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN || defined(__DOXYGEN__)) , chanend c_mclk_change #endif -#if (XUD_TILE != 0) && (AUDIO_IO_TILE == 0) && (XUA_DFU_EN == 1) +#if (((XUD_TILE != 0) && (AUDIO_IO_TILE == 0) && (XUA_DFU_EN == 1)) || defined(__DOXYGEN__)) , server interface i_dfu ?dfuInterface #endif -#if (XUA_NUM_PDM_MICS > 0) +#if (XUA_NUM_PDM_MICS > 0 || defined(__DOXYGEN__)) , chanend c_pdm_in #endif ); diff --git a/lib_xua/api/xua_buffer.h b/lib_xua/api/xua_buffer.h index 0e2dd3ee..10539bfa 100644 --- a/lib_xua/api/xua_buffer.h +++ b/lib_xua/api/xua_buffer.h @@ -53,6 +53,7 @@ void XUA_Buffer( #endif , chanend c_aud #if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) || defined(__DOYXGEN__) + , chanend c_mclk_change #if (!XUA_USE_SW_PLL) || defined(__DOXYGEN__) , client interface pll_ref_if i_pll_ref #endif @@ -88,6 +89,7 @@ void XUA_Buffer_Ep(chanend c_aud_out, , chanend c_buff_ctrl #endif #if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) || defined(__DOYXGEN__) + , chanend c_mclk_change #if (!XUA_USE_SW_PLL) || defined(__DOXYGEN__) , client interface pll_ref_if i_pll_ref #endif diff --git a/lib_xua/src/core/audiohub/xua_audiohub.xc b/lib_xua/src/core/audiohub/xua_audiohub.xc index ca499f28..b4a62e9e 100755 --- a/lib_xua/src/core/audiohub/xua_audiohub.xc +++ b/lib_xua/src/core/audiohub/xua_audiohub.xc @@ -641,6 +641,8 @@ void XUA_AudioHub(chanend ?c_aud, clock ?clk_audio_mclk, clock ?clk_audio_bclk, #endif #if (XUA_ADAT_RX_EN || XUA_SPDIF_RX_EN) , chanend c_dig_rx +#endif +#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC || XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) , chanend c_mclk_change #endif #if (XUD_TILE != 0) && (AUDIO_IO_TILE == 0) && (XUA_DFU_EN == 1) @@ -807,12 +809,12 @@ void XUA_AudioHub(chanend ?c_aud, clock ?clk_audio_mclk, clock ?clk_audio_bclk, /* User code should configure audio harware for SampleFreq/MClk etc */ AudioHwConfig(curFreq, mClk, dsdMode, curSamRes_DAC, curSamRes_ADC); -#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) +#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC || XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) /* Notify clockgen of new mCLk */ c_mclk_change <: mClk; c_mclk_change <: curFreq; - /* Wait for ACK back from clockgen to signal clocks all good */ + /* Wait for ACK back from clockgen or ep_buffer to signal clocks all good */ c_mclk_change :> int _; #endif diff --git a/lib_xua/src/core/buffer/ep/ep_buffer.xc b/lib_xua/src/core/buffer/ep/ep_buffer.xc index 608f301b..c5261512 100644 --- a/lib_xua/src/core/buffer/ep/ep_buffer.xc +++ b/lib_xua/src/core/buffer/ep/ep_buffer.xc @@ -105,6 +105,7 @@ void XUA_Buffer( #endif , chanend c_aud #if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) + , chanend c_mclk_change #if(XUA_USE_SW_PLL) , chanend c_sw_pll #else @@ -145,6 +146,7 @@ void XUA_Buffer( , c_buff_ctrl #endif #if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) + , c_mclk_change #if(XUA_USE_SW_PLL) , c_sw_pll #else @@ -199,6 +201,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out, , chanend c_buff_ctrl #endif #if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) + , chanend c_mclk_change #if (XUA_USE_SW_PLL) , chanend c_sw_pll #else @@ -1030,14 +1033,22 @@ void XUA_Buffer_Ep(register chanend c_aud_out, break; #endif /* ifdef MIDI */ -#if ((XUA_SYNCMODE == XUA_SYNCMODE_SYNC) && XUA_USE_SW_PLL) +#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) + case c_mclk_change :> u_tmp: + unsigned selected_mclk_rate = u_tmp; + c_mclk_change :> u_tmp; /* Sample rate we discard */ + c_mclk_change <: 0; /* ACK back to audio to release */ + break; + +#if (XUA_USE_SW_PLL) /* This is fired when sw_pll has completed initialising a new mclk_rate */ case inuint_byref(c_sw_pll, u_tmp): printstr("SWPLL synch\n"); //TODO - hold off audio until we get this ACK break; -#endif /* ((XUA_SYNCMODE == XUA_SYNCMODE_SYNC) && XUA_USE_SW_PLL) */ +#endif /* (XUA_USE_SW_PLL) */ +#endif /* (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) */ #ifdef IAP /* Received word from iap thread - Check for ACK or Data */ diff --git a/lib_xua/src/core/main.xc b/lib_xua/src/core/main.xc index 901e59bc..85cd0f29 100755 --- a/lib_xua/src/core/main.xc +++ b/lib_xua/src/core/main.xc @@ -315,6 +315,9 @@ void usb_audio_io(chanend ?c_aud_in, #if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) , client interface pll_ref_if i_pll_ref #endif +#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) + , chanend c_mclk_change +#endif #if ((XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) && XUA_USE_SW_PLL) , port p_for_mclk_count_aud , chanend c_sw_pll @@ -328,7 +331,6 @@ void usb_audio_io(chanend ?c_aud_in, #if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) chan c_dig_rx; chan c_mclk_change; /* Notification of new mclk freq to clockgen */ - #if XUA_USE_SW_PLL /* Connect p_for_mclk_count_aud to clk_audio_mclk so we can count mclks/timestamp in digital rx*/ @@ -381,6 +383,8 @@ void usb_audio_io(chanend ?c_aud_in, #endif #if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) , c_dig_rx +#endif +#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC || XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) , c_mclk_change #endif #if (XUD_TILE != 0) && (AUDIO_IO_TILE == 0) && (XUA_DFU_EN == 1) @@ -496,6 +500,9 @@ int main() #if ((XUA_SYNCMODE == XUA_SYNCMODE_SYNC || XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) && XUA_USE_SW_PLL) chan c_sw_pll; +#endif +#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) + chan c_mclk_change; /* Notification of new mclk freq to ep_buffer */ #endif chan c_sof; chan c_xud_out[ENDPOINT_COUNT_OUT]; /* Endpoint channels for XUD */ @@ -589,6 +596,7 @@ int main() #endif , c_mix_out #if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) + , c_mclk_change #if (!XUA_USE_SW_PLL) , i_pll_ref #else @@ -632,6 +640,9 @@ int main() #if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) , i_pll_ref #endif +#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) + , c_mclk_change +#endif #if ((XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) && XUA_USE_SW_PLL) , p_for_mclk_count_audio , c_sw_pll