forked from PAWPAW-Mirror/lib_xua
Set DCO to midpoint of SDM restart
This commit is contained in:
@@ -535,7 +535,7 @@ void clockGen ( streaming chanend ?c_spdif_rx,
|
|||||||
|
|
||||||
#if ((XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) && USE_SW_PLL)
|
#if ((XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) && USE_SW_PLL)
|
||||||
case inuint_byref(c_sigma_delta, tmp):
|
case inuint_byref(c_sigma_delta, tmp):
|
||||||
printstr("ACK\n");
|
/* Send ACK back to audiohub to allow I2S to start */
|
||||||
if(require_ack_to_audio)
|
if(require_ack_to_audio)
|
||||||
{
|
{
|
||||||
c_mclk_change <: tmp;
|
c_mclk_change <: tmp;
|
||||||
@@ -545,9 +545,9 @@ void clockGen ( streaming chanend ?c_spdif_rx,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN)
|
#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN)
|
||||||
|
/* Receive notification of audio streaming settings change */
|
||||||
case c_mclk_change :> selected_mclk_rate:
|
case c_mclk_change :> selected_mclk_rate:
|
||||||
c_mclk_change :> selected_sample_rate;
|
c_mclk_change :> selected_sample_rate;
|
||||||
printintln(selected_sample_rate);
|
|
||||||
#if USE_SW_PLL
|
#if USE_SW_PLL
|
||||||
mclks_per_sample = selected_mclk_rate / selected_sample_rate;
|
mclks_per_sample = selected_mclk_rate / selected_sample_rate;
|
||||||
restart_sigma_delta(c_sigma_delta);
|
restart_sigma_delta(c_sigma_delta);
|
||||||
@@ -555,7 +555,7 @@ void clockGen ( streaming chanend ?c_spdif_rx,
|
|||||||
/* We will shedule an ACK when sigma delta is up and running */
|
/* We will shedule an ACK when sigma delta is up and running */
|
||||||
require_ack_to_audio = 1;
|
require_ack_to_audio = 1;
|
||||||
#else
|
#else
|
||||||
/* Send ACK immediately as we are good to go */
|
/* Send ACK immediately as we are good to go if not using SW_PLL */
|
||||||
c_mclk_change <: 0;
|
c_mclk_change <: 0;
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -57,8 +57,9 @@ void do_sw_pll_phase_frequency_detector_dig_rx( unsigned short mclk_time_stamp,
|
|||||||
*
|
*
|
||||||
* \param sw_pll Reference to a software pll state struct to be initialised.
|
* \param sw_pll Reference to a software pll state struct to be initialised.
|
||||||
* \param mClk The current nominal mClk frequency.
|
* \param mClk The current nominal mClk frequency.
|
||||||
*/
|
*
|
||||||
unsigned InitSWPLL(sw_pll_state_t &sw_pll, unsigned mClk);
|
* returns The SDM update interval and the initial DCO setting for nominal frequency */
|
||||||
|
{unsigned, unsigned} InitSWPLL(sw_pll_state_t &sw_pll, unsigned mClk);
|
||||||
|
|
||||||
#endif /* USE_SW_PLL */
|
#endif /* USE_SW_PLL */
|
||||||
#endif /* _SW_PLL_WRAPPPER_H_ */
|
#endif /* _SW_PLL_WRAPPPER_H_ */
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
#if USE_SW_PLL
|
#if USE_SW_PLL
|
||||||
|
|
||||||
|
|
||||||
unsigned InitSWPLL(sw_pll_state_t &sw_pll, unsigned mClk)
|
{unsigned, unsigned} InitSWPLL(sw_pll_state_t &sw_pll, unsigned mClk)
|
||||||
{
|
{
|
||||||
/* Autogenerated SDM App PLL setup by dco_model.py using 22.5792_1M profile */
|
/* Autogenerated SDM App PLL setup by dco_model.py using 22.5792_1M profile */
|
||||||
/* Input freq: 24000000
|
/* Input freq: 24000000
|
||||||
@@ -69,7 +69,7 @@ unsigned InitSWPLL(sw_pll_state_t &sw_pll, unsigned mClk)
|
|||||||
/* Reset SDM too */
|
/* Reset SDM too */
|
||||||
sw_pll_init_sigma_delta(&sw_pll.sdm_state);
|
sw_pll_init_sigma_delta(&sw_pll.sdm_state);
|
||||||
|
|
||||||
return (XS1_TIMER_HZ / sw_pll_sdm_rate[clkIndex]);
|
return {XS1_TIMER_HZ / sw_pll_sdm_rate[clkIndex], sw_pll_sdm_ctrl_mid[clkIndex]};
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_sw_pll_phase_frequency_detector_dig_rx( unsigned short mclk_time_stamp,
|
void do_sw_pll_phase_frequency_detector_dig_rx( unsigned short mclk_time_stamp,
|
||||||
@@ -120,14 +120,14 @@ void SigmaDeltaTask(chanend c_sigma_delta, unsigned * unsafe selected_mclk_rate_
|
|||||||
channel lockup if two tasks (eg. init and SDM) try to write at the same time. */
|
channel lockup if two tasks (eg. init and SDM) try to write at the same time. */
|
||||||
|
|
||||||
int f_error = 0;
|
int f_error = 0;
|
||||||
int dco_setting = SW_PLL_SDM_CTRL_MID_24; // Assume 24.576MHz as initial clock
|
int dco_setting = 0; /* gets set at InitSWPLL */
|
||||||
unsigned sdm_interval = 0;
|
unsigned sdm_interval = 0; /* gets set at InitSWPLL */
|
||||||
sw_pll_state_t sw_pll;
|
sw_pll_state_t sw_pll;
|
||||||
|
|
||||||
unsafe
|
unsafe
|
||||||
{
|
{
|
||||||
printf("SigmaDeltaTask: %u\n", *selected_mclk_rate_ptr);
|
printf("SigmaDeltaTask: %u\n", *selected_mclk_rate_ptr);
|
||||||
sdm_interval = InitSWPLL(sw_pll, (unsigned)*selected_mclk_rate_ptr);
|
{sdm_interval, dco_setting} = InitSWPLL(sw_pll, (unsigned)*selected_mclk_rate_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
tileref_t this_tile = get_local_tile_id();
|
tileref_t this_tile = get_local_tile_id();
|
||||||
|
|||||||
Reference in New Issue
Block a user