forked from PAWPAW-Mirror/lib_xua
WIP sync mode
This commit is contained in:
@@ -636,9 +636,6 @@ void XUA_AudioHub(chanend ?c_aud, clock ?clk_audio_mclk, clock ?clk_audio_bclk,
|
|||||||
buffered _XUA_CLK_DIR port:32 ?p_bclk,
|
buffered _XUA_CLK_DIR port:32 ?p_bclk,
|
||||||
buffered out port:32 (&?p_i2s_dac)[I2S_WIRES_DAC],
|
buffered out port:32 (&?p_i2s_dac)[I2S_WIRES_DAC],
|
||||||
buffered in port:32 (&?p_i2s_adc)[I2S_WIRES_ADC]
|
buffered in port:32 (&?p_i2s_adc)[I2S_WIRES_ADC]
|
||||||
#if (XUA_USE_APP_PLL)
|
|
||||||
, client interface SoftPll_if i_softPll
|
|
||||||
#endif
|
|
||||||
#if (XUA_SPDIF_TX_EN) //&& (SPDIF_TX_TILE != AUDIO_IO_TILE)
|
#if (XUA_SPDIF_TX_EN) //&& (SPDIF_TX_TILE != AUDIO_IO_TILE)
|
||||||
, chanend c_spdif_out
|
, chanend c_spdif_out
|
||||||
#endif
|
#endif
|
||||||
@@ -667,12 +664,6 @@ void XUA_AudioHub(chanend ?c_aud, clock ?clk_audio_mclk, clock ?clk_audio_bclk,
|
|||||||
unsigned divide;
|
unsigned divide;
|
||||||
unsigned firstRun = 1;
|
unsigned firstRun = 1;
|
||||||
|
|
||||||
#if (XUA_USE_APP_PLL)
|
|
||||||
/* Use xCORE.ai Secondary PLL to generate master clock
|
|
||||||
* This could be "fixed" for async mode or adjusted if in sync mode */
|
|
||||||
i_softPll.init(DEFAULT_MCLK);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Clock master clock-block from master-clock port */
|
/* Clock master clock-block from master-clock port */
|
||||||
/* Note, marked unsafe since other cores may be using this mclk port */
|
/* Note, marked unsafe since other cores may be using this mclk port */
|
||||||
configure_clock_src(clk_audio_mclk, p_mclk_in);
|
configure_clock_src(clk_audio_mclk, p_mclk_in);
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ void XUA_Buffer(
|
|||||||
, chanend c_aud
|
, chanend c_aud
|
||||||
#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC)
|
#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC)
|
||||||
#if(USE_SW_PLL)
|
#if(USE_SW_PLL)
|
||||||
, chanend c_swpll_update
|
, chanend c_sw_pll
|
||||||
#else
|
#else
|
||||||
, client interface pll_ref_if i_pll_ref
|
, client interface pll_ref_if i_pll_ref
|
||||||
#endif
|
#endif
|
||||||
@@ -146,7 +146,7 @@ void XUA_Buffer(
|
|||||||
#endif
|
#endif
|
||||||
#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC)
|
#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC)
|
||||||
#if(USE_SW_PLL)
|
#if(USE_SW_PLL)
|
||||||
, c_swpll_update
|
, c_sw_pll
|
||||||
#else
|
#else
|
||||||
, i_pll_ref
|
, i_pll_ref
|
||||||
#endif
|
#endif
|
||||||
@@ -200,7 +200,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
|||||||
#endif
|
#endif
|
||||||
#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC)
|
#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC)
|
||||||
#if (USE_SW_PLL)
|
#if (USE_SW_PLL)
|
||||||
, chanend c_swpll_update
|
, chanend c_sw_pll
|
||||||
#else
|
#else
|
||||||
, client interface pll_ref_if i_pll_ref
|
, client interface pll_ref_if i_pll_ref
|
||||||
#endif
|
#endif
|
||||||
@@ -370,7 +370,21 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
|||||||
#define LOCAL_CLOCK_MARGIN (1000)
|
#define LOCAL_CLOCK_MARGIN (1000)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (!USE_SW_PLL)
|
#if (USE_SW_PLL)
|
||||||
|
/* Setup the phase frequency detector */
|
||||||
|
const unsigned controller_rate_hz = 100;
|
||||||
|
const unsigned sof_rate_hz = (AUDIO_CLASS == 1 ? 1000 : 8000);
|
||||||
|
|
||||||
|
sw_pll_pfd_state_t sw_pll_pfd;
|
||||||
|
sw_pll_pfd_init(&sw_pll_pfd,
|
||||||
|
sof_rate_hz / controller_rate_hz, /* How often the PFD is invoked */
|
||||||
|
masterClockFreq / sof_rate_hz, /* pll ratio integer */
|
||||||
|
0, /* Assume precise timing of sampling */
|
||||||
|
2000); /* PPM range before we assume unlocked */
|
||||||
|
outuint(c_sw_pll, masterClockFreq);
|
||||||
|
inuint(c_sw_pll); /* receive ACK */
|
||||||
|
|
||||||
|
#else /* USE_SW_PLL */
|
||||||
timer t_sofCheck;
|
timer t_sofCheck;
|
||||||
unsigned timeLastEdge;
|
unsigned timeLastEdge;
|
||||||
unsigned timeNextEdge;
|
unsigned timeNextEdge;
|
||||||
@@ -466,7 +480,7 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
|||||||
{
|
{
|
||||||
masterClockFreq = MCLK_441;
|
masterClockFreq = MCLK_441;
|
||||||
}
|
}
|
||||||
// TODO add signalling to sw_pll here
|
restart_sigma_delta(c_sw_pll, masterClockFreq);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* Ideally we want to wait for handshake (and pass back up) here. But we cannot keep this
|
/* Ideally we want to wait for handshake (and pass back up) here. But we cannot keep this
|
||||||
@@ -572,8 +586,15 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
|||||||
pllUpdate = 0;
|
pllUpdate = 0;
|
||||||
unsigned short mclk_pt;
|
unsigned short mclk_pt;
|
||||||
asm volatile("getts %0, res[%1]" : "=r" (mclk_pt) : "r" (p_off_mclk));
|
asm volatile("getts %0, res[%1]" : "=r" (mclk_pt) : "r" (p_off_mclk));
|
||||||
outuint(c_swpll_update, mclk_pt);
|
|
||||||
outct(c_swpll_update, XS1_CT_END);
|
uint8_t first_loop = 0;
|
||||||
|
unsafe{
|
||||||
|
sw_pll_calc_error_from_port_timers(&sw_pll_pfd, &first_loop, mclk_pt, 0);
|
||||||
|
}
|
||||||
|
int error = sw_pll_pfd.mclk_diff;
|
||||||
|
|
||||||
|
outuint(c_sw_pll, error);
|
||||||
|
// outct(c_sw_pll, XS1_CT_END);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -994,6 +1015,15 @@ void XUA_Buffer_Ep(register chanend c_aud_out,
|
|||||||
break;
|
break;
|
||||||
#endif /* ifdef MIDI */
|
#endif /* ifdef MIDI */
|
||||||
|
|
||||||
|
#if ((XUA_SYNCMODE == XUA_SYNCMODE_SYNC) && USE_SW_PLL)
|
||||||
|
/* This is fired when sw_pll has completed initialising a new mclk_rate */
|
||||||
|
case inuint_byref(c_sw_pll, u_tmp):
|
||||||
|
printstrln("SWPLL synch\n");
|
||||||
|
|
||||||
|
//TODO - hold off audio until we get this ACK
|
||||||
|
break;
|
||||||
|
#endif /* ((XUA_SYNCMODE == XUA_SYNCMODE_SYNC) && USE_SW_PLL) */
|
||||||
|
|
||||||
#ifdef IAP
|
#ifdef IAP
|
||||||
/* Received word from iap thread - Check for ACK or Data */
|
/* Received word from iap thread - Check for ACK or Data */
|
||||||
case iap_get_ack_or_reset_or_data(c_iap, is_ack_iap, is_reset, datum_iap):
|
case iap_get_ack_or_reset_or_data(c_iap, is_ack_iap, is_reset, datum_iap):
|
||||||
|
|||||||
Reference in New Issue
Block a user