forked from PAWPAW-Mirror/lib_xua
Ensure guarding for XS2 builds and fix clockgen race condition
This commit is contained in:
@@ -36,7 +36,7 @@ void clockGen( streaming chanend ?c_spdif_rx,
|
|||||||
chanend c_audio,
|
chanend c_audio,
|
||||||
chanend c_clk_ctl,
|
chanend c_clk_ctl,
|
||||||
chanend c_clk_int,
|
chanend c_clk_int,
|
||||||
port p_for_mclk_count_aud,
|
port ?p_for_mclk_count_aud,
|
||||||
chanend c_mclk_change);
|
chanend c_mclk_change);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -373,21 +373,21 @@ void SigmaDeltaTask(chanend c_sigma_delta, unsigned sdm_interval){
|
|||||||
tmr :> time_trigger;
|
tmr :> time_trigger;
|
||||||
int send_ack_once = 1;
|
int send_ack_once = 1;
|
||||||
|
|
||||||
|
unsigned rx_word;
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
/* Poll for new SDM control value */
|
/* Poll for new SDM control value */
|
||||||
unsigned tmp;
|
|
||||||
select
|
select
|
||||||
{
|
{
|
||||||
case inuint_byref(c_sigma_delta, tmp):
|
case inuint_byref(c_sigma_delta, rx_word):
|
||||||
if(tmp == DISABLE_SDM)
|
if(rx_word == DISABLE_SDM)
|
||||||
{
|
{
|
||||||
f_error = 0;
|
f_error = 0;
|
||||||
send_ack_once = 1;
|
send_ack_once = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
f_error = (int32_t)tmp;
|
f_error = (int32_t)rx_word;
|
||||||
unsafe
|
unsafe
|
||||||
{
|
{
|
||||||
sw_pll_sdm_do_control_from_error(sw_pll_ptr, -f_error);
|
sw_pll_sdm_do_control_from_error(sw_pll_ptr, -f_error);
|
||||||
@@ -415,7 +415,7 @@ void SigmaDeltaTask(chanend c_sigma_delta, unsigned sdm_interval){
|
|||||||
control value. This will avoid the writing of the
|
control value. This will avoid the writing of the
|
||||||
frac reg from two different threads which may cause
|
frac reg from two different threads which may cause
|
||||||
a channel deadlock. */
|
a channel deadlock. */
|
||||||
if(tmp != DISABLE_SDM)
|
if(rx_word != DISABLE_SDM)
|
||||||
unsafe {
|
unsafe {
|
||||||
sw_pll_do_sigma_delta(&sw_pll_ptr->sdm_state, this_tile, dco_setting);
|
sw_pll_do_sigma_delta(&sw_pll_ptr->sdm_state, this_tile, dco_setting);
|
||||||
send_ack_once = 1;
|
send_ack_once = 1;
|
||||||
@@ -454,7 +454,7 @@ void clockGen ( streaming chanend ?c_spdif_rx,
|
|||||||
chanend c_dig_rx,
|
chanend c_dig_rx,
|
||||||
chanend c_clk_ctl,
|
chanend c_clk_ctl,
|
||||||
chanend c_clk_int,
|
chanend c_clk_int,
|
||||||
port p_for_mclk_count_aud,
|
port ?p_for_mclk_count_aud,
|
||||||
chanend c_mclk_change)
|
chanend c_mclk_change)
|
||||||
{
|
{
|
||||||
timer t_local;
|
timer t_local;
|
||||||
@@ -477,7 +477,10 @@ void clockGen ( streaming chanend ?c_spdif_rx,
|
|||||||
unsigned mclks_per_sample = 0;
|
unsigned mclks_per_sample = 0;
|
||||||
unsigned short mclk_time_stamp = 0;
|
unsigned short mclk_time_stamp = 0;
|
||||||
/* Get MCLK count */
|
/* Get MCLK count */
|
||||||
asm volatile(" getts %0, res[%1]" : "=r" (mclk_time_stamp) : "r" (p_for_mclk_count_aud));
|
if(!isnull(p_for_mclk_count_aud))
|
||||||
|
{
|
||||||
|
asm volatile(" getts %0, res[%1]" : "=r" (mclk_time_stamp) : "r" (p_for_mclk_count_aud));
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (XUA_SPDIF_RX_EN)
|
#if (XUA_SPDIF_RX_EN)
|
||||||
@@ -569,7 +572,7 @@ void clockGen ( streaming chanend ?c_spdif_rx,
|
|||||||
/* Initial ref clock output and get timestamp */
|
/* Initial ref clock output and get timestamp */
|
||||||
i_pll_ref.init();
|
i_pll_ref.init();
|
||||||
|
|
||||||
#if USE_SW_PLL
|
#if (USE_SW_PLL && (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN))
|
||||||
chan c_sigma_delta;
|
chan c_sigma_delta;
|
||||||
sw_pll_state_t sw_pll;
|
sw_pll_state_t sw_pll;
|
||||||
int reset_sw_pll_pfd = 1;
|
int reset_sw_pll_pfd = 1;
|
||||||
@@ -777,7 +780,10 @@ void clockGen ( streaming chanend ?c_spdif_rx,
|
|||||||
case c_spdif_rx :> spdifRxData:
|
case c_spdif_rx :> spdifRxData:
|
||||||
|
|
||||||
/* Record time of sample */
|
/* Record time of sample */
|
||||||
asm volatile(" getts %0, res[%1]" : "=r" (mclk_time_stamp) : "r" (p_for_mclk_count_aud));
|
if(!isnull(p_for_mclk_count_aud))
|
||||||
|
{
|
||||||
|
asm volatile(" getts %0, res[%1]" : "=r" (mclk_time_stamp) : "r" (p_for_mclk_count_aud));
|
||||||
|
}
|
||||||
t_local :> spdifRxTime;
|
t_local :> spdifRxTime;
|
||||||
|
|
||||||
/* Check parity and ignore if bad */
|
/* Check parity and ignore if bad */
|
||||||
@@ -866,7 +872,10 @@ void clockGen ( streaming chanend ?c_spdif_rx,
|
|||||||
/* receive sample from ADAT rx thread (streaming channel with CT_END) */
|
/* receive sample from ADAT rx thread (streaming channel with CT_END) */
|
||||||
case inuint_byref(c_adat_rx, tmp):
|
case inuint_byref(c_adat_rx, tmp):
|
||||||
/* record time of sample */
|
/* record time of sample */
|
||||||
asm volatile(" getts %0, res[%1]" : "=r" (mclk_time_stamp) : "r" (p_for_mclk_count_aud));
|
if(!isnull(p_for_mclk_count_aud))
|
||||||
|
{
|
||||||
|
asm volatile(" getts %0, res[%1]" : "=r" (mclk_time_stamp) : "r" (p_for_mclk_count_aud));
|
||||||
|
}
|
||||||
t_local :> adatReceivedTime;
|
t_local :> adatReceivedTime;
|
||||||
|
|
||||||
/* Sync is: 1 | (user_byte << 4) */
|
/* Sync is: 1 | (user_byte << 4) */
|
||||||
|
|||||||
@@ -144,7 +144,11 @@ on tile[XUD_TILE] : in port p_spdif_rx = PORT_SPDIF_IN;
|
|||||||
#if (XUA_SPDIF_RX_EN) || (XUA_ADAT_RX_EN) || (XUA_SYNCMODE == XUA_SYNCMODE_SYNC)
|
#if (XUA_SPDIF_RX_EN) || (XUA_ADAT_RX_EN) || (XUA_SYNCMODE == XUA_SYNCMODE_SYNC)
|
||||||
/* Reference to external clock multiplier */
|
/* Reference to external clock multiplier */
|
||||||
on tile[PLL_REF_TILE] : out port p_pll_ref = PORT_PLL_REF;
|
on tile[PLL_REF_TILE] : out port p_pll_ref = PORT_PLL_REF;
|
||||||
on tile[AUDIO_IO_TILE] : port p_for_mclk_count_aud = PORT_MCLK_COUNT_2;
|
#ifdef __XS3A__
|
||||||
|
on tile[AUDIO_IO_TILE] : port p_for_mclk_count_audio = PORT_MCLK_COUNT_2;
|
||||||
|
#else /* __XS3A__ */
|
||||||
|
#define p_for_mclk_count_audio null
|
||||||
|
#endif /* __XS3A__ */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MIDI
|
#ifdef MIDI
|
||||||
@@ -310,7 +314,7 @@ void usb_audio_io(chanend ?c_aud_in,
|
|||||||
#endif
|
#endif
|
||||||
#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN)
|
#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN)
|
||||||
, client interface pll_ref_if i_pll_ref
|
, client interface pll_ref_if i_pll_ref
|
||||||
, port p_for_mclk_count_aud
|
, port ?p_for_mclk_count_aud
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@@ -322,15 +326,14 @@ void usb_audio_io(chanend ?c_aud_in,
|
|||||||
chan c_dig_rx;
|
chan c_dig_rx;
|
||||||
chan c_mclk_change; /* Notification of new mclk freq to clockgen */
|
chan c_mclk_change; /* Notification of new mclk freq to clockgen */
|
||||||
|
|
||||||
|
|
||||||
/* Connect p_for_mclk_count_aud to clk_audio_mclk so we can count mclks/timestamp in digital rx*/
|
/* Connect p_for_mclk_count_aud to clk_audio_mclk so we can count mclks/timestamp in digital rx*/
|
||||||
unsigned x = 0;
|
if(!isnull(p_for_mclk_count_aud))
|
||||||
asm("ldw %0, dp[clk_audio_mclk]":"=r"(x));
|
{
|
||||||
asm("setclk res[%0], %1"::"r"(p_for_mclk_count_aud), "r"(x));
|
unsigned x = 0;
|
||||||
|
asm("ldw %0, dp[clk_audio_mclk]":"=r"(x));
|
||||||
#else
|
asm("setclk res[%0], %1"::"r"(p_for_mclk_count_aud), "r"(x));
|
||||||
#define c_dig_rx null
|
}
|
||||||
#endif
|
#endif /* (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) */
|
||||||
|
|
||||||
#if (XUA_NUM_PDM_MICS > 0) && (PDM_TILE == AUDIO_IO_TILE)
|
#if (XUA_NUM_PDM_MICS > 0) && (PDM_TILE == AUDIO_IO_TILE)
|
||||||
/* Configure clocks ports - sharing mclk port with I2S */
|
/* Configure clocks ports - sharing mclk port with I2S */
|
||||||
@@ -613,7 +616,7 @@ int main()
|
|||||||
#endif
|
#endif
|
||||||
#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN)
|
#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN)
|
||||||
, i_pll_ref
|
, i_pll_ref
|
||||||
, p_for_mclk_count_aud
|
, p_for_mclk_count_audio
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user