Basic addition of ADAT tx core.

This commit is contained in:
Ross Owen
2015-01-29 18:33:45 +00:00
parent ab8e0d8af7
commit 6816278557
3 changed files with 78 additions and 6 deletions

View File

@@ -19,6 +19,9 @@
#ifdef SPDIF #ifdef SPDIF
#include "SpdifTransmit.h" #include "SpdifTransmit.h"
#endif #endif
#ifdef ADAT_TX
#include "adat_tx.h"
#endif
#include "commands.h" #include "commands.h"
#include "xc_ptr.h" #include "xc_ptr.h"
@@ -76,6 +79,10 @@ extern port p_mclk_in;
extern buffered out port:32 p_spdif_tx; extern buffered out port:32 p_spdif_tx;
#endif #endif
#ifdef ADAT_TX
extern buffered out port:32 p_adat_tx;
#endif
extern clock clk_audio_mclk; extern clock clk_audio_mclk;
extern clock clk_audio_bclk; extern clock clk_audio_bclk;
extern clock clk_mst_spd; extern clock clk_mst_spd;
@@ -378,12 +385,17 @@ static inline void InitPorts(unsigned divide)
/* I2S delivery thread */ /* I2S delivery thread */
#pragma unsafe arrays #pragma unsafe arrays
unsigned static deliver(chanend c_out, chanend ?c_spd_out, unsigned divide, unsigned curSamFreq, unsigned static deliver(chanend c_out, chanend ?c_spd_out,
#if(defined(SPDIF_RX) || defined(ADAT_RX)) #ifdef ADAT_TX
chanend c_dig_rx, chanend c_adat_out,
#endif #endif
chanend ?c_adc) unsigned divide, unsigned curSamFreq,
#if(defined(SPDIF_RX) || defined(ADAT_RX))
chanend c_dig_rx,
#endif
chanend ?c_adc)
{ {
#if (I2S_CHANS_ADC != 0) || defined(SPDIF) #if (I2S_CHANS_ADC != 0) || defined(SPDIF)
unsigned sample; unsigned sample;
#endif #endif
@@ -397,6 +409,11 @@ chanend ?c_adc)
unsigned tmp; unsigned tmp;
unsigned index; unsigned index;
#ifdef ADAT_TX
unsigned adatSmuxMode = 0;
#endif
#ifdef RAMP_CHECK #ifdef RAMP_CHECK
unsigned prev=0; unsigned prev=0;
int started = 0; int started = 0;
@@ -824,6 +841,11 @@ chanend ?c_config, chanend ?c)
#ifdef SPDIF #ifdef SPDIF
chan c_spdif_out; chan c_spdif_out;
#endif #endif
#ifdef ADAT_TX
chan c_adat_out;
unsigned adatSmuxMode = 0;
#endif
unsigned curSamFreq = DEFAULT_FREQ; unsigned curSamFreq = DEFAULT_FREQ;
unsigned curSamRes_DAC = STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS; /* Default to something reasonable */ unsigned curSamRes_DAC = STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS; /* Default to something reasonable */
unsigned curSamRes_ADC = STREAM_FORMAT_INPUT_1_RESOLUTION_BITS; /* Default to something reasonable - note, currently this never changes*/ unsigned curSamRes_ADC = STREAM_FORMAT_INPUT_1_RESOLUTION_BITS; /* Default to something reasonable - note, currently this never changes*/
@@ -879,9 +901,13 @@ chanend ?c_config, chanend ?c)
} }
#endif #endif
/* Configure ADAT/SPDIF tx ports */
#ifdef SPDIF #ifdef SPDIF
SpdifTransmitPortConfig(p_spdif_tx, clk_mst_spd, p_mclk_in); SpdifTransmitPortConfig(p_spdif_tx, clk_mst_spd, p_mclk_in);
#endif #endif
#ifdef ADAT_TX
configure_out_port_no_ready(p_adat_tx, clk_audio_mclk, 0);
#endif
/* Perform required CODEC/ADC/DAC initialisation */ /* Perform required CODEC/ADC/DAC initialisation */
AudioHwInit(c_config); AudioHwInit(c_config);
@@ -892,10 +918,18 @@ chanend ?c_config, chanend ?c)
if ((MCLK_441 % curSamFreq) == 0) if ((MCLK_441 % curSamFreq) == 0)
{ {
mClk = MCLK_441; mClk = MCLK_441;
#ifdef ADAT_TX
/* Calculate ADAT SMUX mode (1, 2, 4) */
adatSmuxMode = curSamFreq / 44100;
#endif
} }
else if ((MCLK_48 % curSamFreq) == 0) else if ((MCLK_48 % curSamFreq) == 0)
{ {
mClk = MCLK_48; mClk = MCLK_48;
#ifdef ADAT_TX
/* Calculate ADAT SMUX mode (1, 2, 4) */
adatSmuxMode = curSamFreq / 48000;
#endif
} }
/* Calculate master clock to bit clock (or DSD clock) divide for current sample freq /* Calculate master clock to bit clock (or DSD clock) divide for current sample freq
@@ -1011,8 +1045,6 @@ chanend ?c_config, chanend ?c)
} }
firstRun = 0; firstRun = 0;
par par
{ {
@@ -1023,6 +1055,11 @@ chanend ?c_config, chanend ?c)
} }
#endif #endif
#ifdef ADAT_TX
{
adat_tx_port(c_adat_out, p_adat_tx);
}
#endif
{ {
#ifdef SPDIF #ifdef SPDIF
/* Communicate master clock and sample freq to S/PDIF thread */ /* Communicate master clock and sample freq to S/PDIF thread */
@@ -1030,11 +1067,27 @@ chanend ?c_config, chanend ?c)
outuint(c_spdif_out, mClk); outuint(c_spdif_out, mClk);
#endif #endif
#ifdef ADAT_TX
// Configure ADAT parameters ...
//
// adat_oversampling = 256 for MCLK = 12M288 or 11M2896
// = 512 for MCLK = 24M576 or 22M5792
// = 1024 for MCLK = 49M152 or 45M1584
//
// adatSmuxMode = 1 for FS = 44K1 or 48K0
// = 2 for FS = 88K2 or 96K0
// = 4 for FS = 176K4 or 192K0
outuint(c_adat_out, mClk/curSamFreq );
outuint(c_adat_out, adatSmuxMode);
#endif
command = deliver(c_mix_out, command = deliver(c_mix_out,
#ifdef SPDIF #ifdef SPDIF
c_spdif_out, c_spdif_out,
#else #else
null, null,
#endif
#ifdef ADAT_TX
c_adat_out,
#endif #endif
divide, curSamFreq, divide, curSamFreq,
#if defined (ADAT_RX) || defined (SPDIF_RX) #if defined (ADAT_RX) || defined (SPDIF_RX)

View File

@@ -231,6 +231,21 @@
#undef SPDIF #undef SPDIF
#endif #endif
/**
* @brief Enables ADAT Tx. Default: 0 (Disabled)
*/
#ifndef ADAT_TX
#define ADAT_TX (0)
#endif
/* Tidy up old SPDIF usage */
#if defined(ADAT_TX) && (ADAT_TX == 0)
#undef ADAT_TX
#endif
/** /**
* @brief Defines which output channels (stereo) should be output on S/PDIF. Note, Output channels indexed from 0. * @brief Defines which output channels (stereo) should be output on S/PDIF. Note, Output channels indexed from 0.
* *

View File

@@ -119,6 +119,10 @@ on tile[XUD_TILE] : in port p_for_mclk_count = PORT_MCLK_COUNT;
on tile[AUDIO_IO_TILE] : buffered out port:32 p_spdif_tx = PORT_SPDIF_OUT; on tile[AUDIO_IO_TILE] : buffered out port:32 p_spdif_tx = PORT_SPDIF_OUT;
#endif #endif
#ifdef ADAT_TX
on stdcore[AUDIO_IO_TILE] : buffered out port:32 p_adat_tx = PORT_ADAT_OUT;
#endif
#ifdef ADAT_RX #ifdef ADAT_RX
on stdcore[XUD_TILE] : buffered in port:32 p_adat_rx = PORT_ADAT_IN; on stdcore[XUD_TILE] : buffered in port:32 p_adat_rx = PORT_ADAT_IN;
#endif #endif