Merge feat/new_spdif_rx -> develop

This commit is contained in:
Ross Owen
2023-10-25 14:51:06 +01:00
2 changed files with 29 additions and 53 deletions

View File

@@ -1,6 +1,5 @@
// Copyright 2011-2023 XMOS LIMITED. // Copyright 2011-2023 XMOS LIMITED.
// This Software is subject to the terms of the XMOS Public Licence: Version 1. // This Software is subject to the terms of the XMOS Public Licence: Version 1.
#include <xs1.h> #include <xs1.h>
#include <assert.h> #include <assert.h>
#include <print.h> #include <print.h>
@@ -141,9 +140,6 @@ static inline void setClockValidity(chanend c_interruptControl, int clkIndex, in
} }
} }
/* Returns 1 for valid clock found else 0 */ /* Returns 1 for valid clock found else 0 */
static inline int validSamples(Counter &counter, int clockIndex) static inline int validSamples(Counter &counter, int clockIndex)
{ {
@@ -219,18 +215,6 @@ static inline int validSamples(Counter &counter, int clockIndex)
} }
#endif #endif
#if (XUA_SPDIF_RX_EN)
//:badParity
/* Returns 1 for bad parity, else 0 */
static inline int badParity(unsigned x)
{
unsigned X = (x>>4);
crc32(X, 0, 1);
return X & 1;
}
//:
#endif
#ifdef LEVEL_METER_LEDS #ifdef LEVEL_METER_LEDS
void VendorLedRefresh(unsigned levelData[]); void VendorLedRefresh(unsigned levelData[]);
unsigned g_inputLevelData[NUM_USB_CHAN_IN]; unsigned g_inputLevelData[NUM_USB_CHAN_IN];
@@ -262,16 +246,17 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
#if (XUA_SPDIF_RX_EN) #if (XUA_SPDIF_RX_EN)
/* S/PDIF buffer state */ /* S/PDIF buffer state */
int spdifSamples[MAX_SPDIF_SAMPLES]; /* S/PDIF sample buffer */ int spdifSamples[MAX_SPDIF_SAMPLES]; /* S/PDIF sample buffer */
int spdifWr = 0; /* Write index */ int spdifWr = 0; /* Write index */
int spdifRd = 0; /* Read index */ //(spdifWriteIndex ^ (MAX_SPDIF_SAMPLES >> 1)) & ~1; // Start in middle int spdifRd = 0; /* Read index */ //(spdifWriteIndex ^ (MAX_SPDIF_SAMPLES >> 1)) & ~1; // Start in middle
int spdifOverflow = 0; /* Overflow/undeflow flags */ int spdifOverflow = 0; /* Overflow/undeflow flags */
int spdifUnderflow = 1; int spdifUnderflow = 1;
int spdifSamps = 0; /* Number of samples in buffer */ int spdifSamps = 0; /* Number of samples in buffer */
Counter spdifCounters; Counter spdifCounters;
int spdifReceivedTime; int spdifRxTime;
unsigned tmp2; unsigned tmp2;
unsigned spdifLeft = 0; unsigned spdifLeft = 0;
unsigned spdifRxData;
#endif #endif
#if (XUA_ADAT_RX_EN) #if (XUA_ADAT_RX_EN)
@@ -330,7 +315,6 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
adatCounters.samplesPerTick = 0; adatCounters.samplesPerTick = 0;
#endif #endif
t_local :> timeNextEdge; t_local :> timeNextEdge;
timeLastEdge = timeNextEdge; timeLastEdge = timeNextEdge;
timeNextClockDetection = timeNextEdge + (LOCAL_CLOCK_INCREMENT / 2); timeNextClockDetection = timeNextEdge + (LOCAL_CLOCK_INCREMENT / 2);
@@ -390,8 +374,8 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
break; break;
#endif #endif
/* Updates to clock settings from endpoint 0 */ /* Updates to clock settings from endpoint 0 */
case inuint_byref(c_clk_ctl, tmp): case inuint_byref(c_clk_ctl, tmp):
switch(tmp) switch(tmp)
{ {
case GET_SEL: case GET_SEL:
@@ -465,7 +449,7 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
break; break;
} }
break; break;
/* Generate local clock from timer */ /* Generate local clock from timer */
case t_local when timerafter(timeNextEdge) :> void: case t_local when timerafter(timeNextEdge) :> void:
@@ -521,25 +505,25 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
#endif #endif
#if (XUA_SPDIF_RX_EN) #if (XUA_SPDIF_RX_EN)
/* Receive sample from S/PDIF RX thread (steaming chan) */ /* Receive sample from S/PDIF RX thread (streaming chan) */
case c_spdif_rx :> tmp: case c_spdif_rx :> spdifRxData:
/* Record time of sample */ /* Record time of sample */
t_local :> spdifReceivedTime; t_local :> spdifRxTime;
/* Check parity and ignore if bad */ /* Check parity and ignore if bad */
if(badParity(tmp)) if(spdif_rx_check_parity(spdifRxData))
continue; continue;
/* Get pre-amble */ /* Get preamble */
tmp2 = tmp & 0xF; unsigned preamble = spdifRxData & SPDIF_RX_PREAMBLE_MASK;
switch(tmp2)
switch(preamble)
{ {
/* LEFT */ /* LEFT */
case SPDIF_FRAME_X: case SPDIF_FRAME_X:
case SPDIF_FRAME_Z: case SPDIF_FRAME_Z:
spdifLeft = SPDIF_RX_EXTRACT_SAMPLE(spdifRxData);
spdifLeft = tmp << 4;
break; break;
/* RIGHT */ /* RIGHT */
@@ -550,7 +534,7 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
{ {
/* Store left and right sample pair to buffer */ /* Store left and right sample pair to buffer */
spdifSamples[spdifWr] = spdifLeft; spdifSamples[spdifWr] = spdifLeft;
spdifSamples[spdifWr+1] = tmp << 4; spdifSamples[spdifWr+1] = SPDIF_RX_EXTRACT_SAMPLE(spdifRxData);
spdifWr = (spdifWr + 2) & (MAX_SPDIF_SAMPLES - 1); spdifWr = (spdifWr + 2) & (MAX_SPDIF_SAMPLES - 1);
@@ -586,13 +570,13 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
if((spdifCounters.receivedSamples >= spdifCounters.samplesPerTick)) if((spdifCounters.receivedSamples >= spdifCounters.samplesPerTick))
{ {
/* Check edge is about right... S/PDIF may have changed freq... */ /* Check edge is about right... S/PDIF may have changed freq... */
if(timeafter(spdifReceivedTime, (timeLastEdge + LOCAL_CLOCK_INCREMENT - LOCAL_CLOCK_MARGIN))) if(timeafter(spdifRxTime, (timeLastEdge + LOCAL_CLOCK_INCREMENT - LOCAL_CLOCK_MARGIN)))
{ {
/* Record edge time */ /* Record edge time */
timeLastEdge = spdifReceivedTime; timeLastEdge = spdifRxTime;
/* Setup for next edge */ /* Setup for next edge */
timeNextEdge = spdifReceivedTime + LOCAL_CLOCK_INCREMENT + LOCAL_CLOCK_MARGIN; timeNextEdge = spdifRxTime + LOCAL_CLOCK_INCREMENT + LOCAL_CLOCK_MARGIN;
/* Toggle edge */ /* Toggle edge */
i_pll_ref.toggle_timed(1); i_pll_ref.toggle_timed(1);
@@ -705,7 +689,6 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
/* Reset counters */ /* Reset counters */
adatCounters.receivedSamples = 0; adatCounters.receivedSamples = 0;
} }
} }
} }
@@ -716,10 +699,9 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
break; break;
#endif #endif
#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) #if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN)
/* AudioHub requests data */ /* AudioHub requests data */
case inuint_byref(c_dig_rx, tmp): case inuint_byref(c_dig_rx, tmp):
#if (XUA_SPDIF_RX_EN) #if (XUA_SPDIF_RX_EN)
if(spdifUnderflow) if(spdifUnderflow)
{ {
@@ -734,7 +716,7 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
tmp2 = spdifSamples[spdifRd + 1]; tmp2 = spdifSamples[spdifRd + 1];
spdifRd += 2; spdifRd += 2;
spdifRd &= (MAX_SPDIF_SAMPLES - 1); spdifRd &= (MAX_SPDIF_SAMPLES - 1);
g_digData[0] = tmp; g_digData[0] = tmp;
g_digData[1] = tmp2; g_digData[1] = tmp2;
@@ -839,11 +821,9 @@ void clockGen (streaming chanend ?c_spdif_rx, chanend ?c_adat_rx, client interfa
} }
#endif #endif
outuint(c_dig_rx, 1); outuint(c_dig_rx, 1);
break; break;
#endif #endif
} }
} }
} }

View File

@@ -30,8 +30,8 @@
#include "iap.h" #include "iap.h"
#endif #endif
#if (XUA_SPDIF_RX_EN) #if (XUA_SPDIF_RX_EN || XUA_SPDIF_TX_EN)
#include "spdif.h" #include "spdif.h" /* From lib_spdif */
#endif #endif
#if (XUA_ADAT_RX_EN) #if (XUA_ADAT_RX_EN)
@@ -42,10 +42,6 @@
#include "xua_pdm_mic.h" #include "xua_pdm_mic.h"
#endif #endif
#if (XUA_SPDIF_TX_EN)
#include "spdif.h" /* From lib_spdif */
#endif
#if (XUA_DFU_EN == 1) #if (XUA_DFU_EN == 1)
[[distributable]] [[distributable]]
void DFUHandler(server interface i_dfu i, chanend ?c_user_cmd); void DFUHandler(server interface i_dfu i, chanend ?c_user_cmd);
@@ -643,7 +639,7 @@ int main()
on tile[XUD_TILE]: on tile[XUD_TILE]:
{ {
thread_speed(); thread_speed();
spdif_rx(c_spdif_rx,p_spdif_rx,clk_spd_rx,192000); spdif_rx(c_spdif_rx, p_spdif_rx, clk_spd_rx, 192000);
} }
#endif #endif