From baaef3b7492b5704f8530c5767767e7c0c3ea669 Mon Sep 17 00:00:00 2001 From: Ed Clarke Date: Tue, 9 Oct 2018 18:06:11 +0100 Subject: [PATCH 1/4] Initial modifications for 24b I2S slave (without sync error check) --- .../src/core/audiohub/audiohub_initport.xc | 6 ++++-- lib_xua/src/core/audiohub/xua_audiohub.xc | 20 +++++++++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lib_xua/src/core/audiohub/audiohub_initport.xc b/lib_xua/src/core/audiohub/audiohub_initport.xc index fc8d4f9d..a7d601c2 100644 --- a/lib_xua/src/core/audiohub/audiohub_initport.xc +++ b/lib_xua/src/core/audiohub/audiohub_initport.xc @@ -91,7 +91,7 @@ void InitPorts_slave(unsigned divide, buffered _XUA_CLK_DIR port:32 p_lrclk, buf p_lrclk when pinseq(0) :> void @ tmp; #endif - tmp += (I2S_CHANS_PER_FRAME * 32) - 32 + 1 ; + tmp += (I2S_CHANS_PER_FRAME * N_BITS_I2S) - N_BITS_I2S + 1 ; /* E.g. 2 * 32 - 32 + 1 = 33 for stereo */ /* E.g. 8 * 32 - 32 + 1 = 225 for 8 chan TDM */ @@ -99,7 +99,7 @@ void InitPorts_slave(unsigned divide, buffered _XUA_CLK_DIR port:32 p_lrclk, buf #pragma loop unroll for(int i = 0; i < I2S_WIRES_DAC; i++) { - p_i2s_dac[i] @ tmp <: 0; + partout_timed(p_i2s_dac[i], N_BITS_I2S, 0, tmp); } #endif @@ -108,10 +108,12 @@ void InitPorts_slave(unsigned divide, buffered _XUA_CLK_DIR port:32 p_lrclk, buf for(int i = 0; i < I2S_WIRES_ADC; i++) { asm("setpt res[%0], %1"::"r"(p_i2s_adc[i]),"r"(tmp-1)); + set_port_shift_count(p_i2s_adc[i], N_BITS_I2S); } #endif asm("setpt res[%0], %1"::"r"(p_lrclk),"r"(tmp-1)); + set_port_shift_count(p_lrclk, N_BITS_I2S); #endif /* (I2S_CHANS_ADC != 0 || I2S_CHANS_DAC != 0) */ } #endif diff --git a/lib_xua/src/core/audiohub/xua_audiohub.xc b/lib_xua/src/core/audiohub/xua_audiohub.xc index 11667b04..7d344dad 100755 --- a/lib_xua/src/core/audiohub/xua_audiohub.xc +++ b/lib_xua/src/core/audiohub/xua_audiohub.xc @@ -158,7 +158,9 @@ static inline int HandleSampleClock(int frameCount, buffered _XUA_CLK_DIR port:3 #if CODEC_MASTER unsigned syncError = 0; unsigned lrval = 0; - p_lrclk :> lrval; + + asm volatile("in %0, res[%1]":"=r"(lrval):"r"(p_lrclk):"memory"); + set_port_shift_count(p_lrclk, N_BITS_I2S); if(I2S_MODE_TDM) { @@ -182,7 +184,8 @@ static inline int HandleSampleClock(int frameCount, buffered _XUA_CLK_DIR port:3 syncError += (lrval != 0x7FFFFFFF); } - return syncError; + //return syncError; + return 0; //TMP bodge! #else if(I2S_MODE_TDM) @@ -353,7 +356,8 @@ unsigned static AudioHub_MainLoop(chanend ?c_out, chanend ?c_spd_out // Manual IN instruction since compiler generates an extra setc per IN (bug #15256) unsigned sample; asm volatile("in %0, res[%1]" : "=r"(sample) : "r"(p_i2s_adc[index++])); - sample = bitrev(sample); + set_port_shift_count(p_i2s_adc[i], N_BITS_I2S); + sample = bitrev(sample) << (32 - N_BITS_I2S); int chanIndex = ((frameCount-2)&(I2S_CHANS_PER_FRAME-1))+i; // channels 0, 2, 4.. on each line. #if (AUD_TO_USB_RATIO > 1) @@ -406,7 +410,8 @@ unsigned static AudioHub_MainLoop(chanend ?c_out, chanend ?c_spd_out src_ff3v_fir_coefs[2-audioToUsbRatioCounter]); } #endif /* (AUD_TO_USB_RATIO > 1) */ - p_i2s_dac[index++] <: bitrev(samplesOut[frameCount +i]); + partout(p_i2s_dac[index++], N_BITS_I2S, bitrev(samplesOut[frameCount +i])); + } #endif // (I2S_CHANS_DAC != 0) @@ -481,7 +486,9 @@ unsigned static AudioHub_MainLoop(chanend ?c_out, chanend ?c_spd_out /* Manual IN instruction since compiler generates an extra setc per IN (bug #15256) */ unsigned sample; asm volatile("in %0, res[%1]" : "=r"(sample) : "r"(p_i2s_adc[index++])); - sample = bitrev(sample); + set_port_shift_count(p_i2s_adc[i], N_BITS_I2S); + sample = bitrev(sample) << (32 - N_BITS_I2S); + int chanIndex = ((frameCount-2)&(I2S_CHANS_PER_FRAME-1))+i; // channels 1, 3, 5.. on each line. #if (AUD_TO_USB_RATIO > 1 && !I2S_DOWNSAMPLE_MONO_IN) if ((AUD_TO_USB_RATIO - 1) == audioToUsbRatioCounter) @@ -532,7 +539,8 @@ unsigned static AudioHub_MainLoop(chanend ?c_out, chanend ?c_spd_out src_ff3v_fir_coefs[2-audioToUsbRatioCounter]); } #endif /* (AUD_TO_USB_RATIO > 1) */ - p_i2s_dac[index++] <: bitrev(samplesOut[frameCount + i]); + partout(p_i2s_dac[index++], N_BITS_I2S, bitrev(samplesOut[frameCount + i])); + } #endif // (I2S_CHANS_DAC != 0) From 2562f0eb31832c82a8bb56a816303cc60698fccd Mon Sep 17 00:00:00 2001 From: Ed Clarke Date: Fri, 12 Oct 2018 14:25:47 +0100 Subject: [PATCH 2/4] Fix I2S alignment --- lib_xua/src/core/audiohub/audiohub_initport.xc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_xua/src/core/audiohub/audiohub_initport.xc b/lib_xua/src/core/audiohub/audiohub_initport.xc index a7d601c2..724c1e83 100644 --- a/lib_xua/src/core/audiohub/audiohub_initport.xc +++ b/lib_xua/src/core/audiohub/audiohub_initport.xc @@ -99,7 +99,7 @@ void InitPorts_slave(unsigned divide, buffered _XUA_CLK_DIR port:32 p_lrclk, buf #pragma loop unroll for(int i = 0; i < I2S_WIRES_DAC; i++) { - partout_timed(p_i2s_dac[i], N_BITS_I2S, 0, tmp); + partout_timed(p_i2s_dac[i], N_BITS_I2S, 0, tmp-1); } #endif From 7ae04ca313688c24d79f45030a28a742be1f8880 Mon Sep 17 00:00:00 2001 From: Ed Clarke Date: Fri, 12 Oct 2018 14:26:02 +0100 Subject: [PATCH 3/4] Enable error checking (helps recover from noise) --- lib_xua/src/core/audiohub/xua_audiohub.xc | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lib_xua/src/core/audiohub/xua_audiohub.xc b/lib_xua/src/core/audiohub/xua_audiohub.xc index 7d344dad..e474ea5d 100755 --- a/lib_xua/src/core/audiohub/xua_audiohub.xc +++ b/lib_xua/src/core/audiohub/xua_audiohub.xc @@ -14,6 +14,7 @@ #include #include #include +#include #include "xua.h" @@ -179,13 +180,24 @@ static inline int HandleSampleClock(int frameCount, buffered _XUA_CLK_DIR port:3 else { if(frameCount == 0) - syncError += (lrval != 0x80000000); + { + if ((lrval & 0xFFFFFF00) != 0x80000000) + { + syncError = 1; + printhexln(lrval); + } + } else - syncError += (lrval != 0x7FFFFFFF); + { + if ((lrval | 0x000000FF) != 0x7FFFFFFF) + { + syncError = 1; + printhexln(lrval); + } + } } - //return syncError; - return 0; //TMP bodge! + return syncError; #else if(I2S_MODE_TDM) From c59f9a7c0c628bffc9f9de5a6a4ee55e660d32fe Mon Sep 17 00:00:00 2001 From: Ed Clarke Date: Mon, 15 Oct 2018 08:56:57 +0100 Subject: [PATCH 4/4] Make lrcheck mask track the data size --- lib_xua/src/core/audiohub/xua_audiohub.xc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib_xua/src/core/audiohub/xua_audiohub.xc b/lib_xua/src/core/audiohub/xua_audiohub.xc index e474ea5d..6b2e6c21 100755 --- a/lib_xua/src/core/audiohub/xua_audiohub.xc +++ b/lib_xua/src/core/audiohub/xua_audiohub.xc @@ -159,6 +159,7 @@ static inline int HandleSampleClock(int frameCount, buffered _XUA_CLK_DIR port:3 #if CODEC_MASTER unsigned syncError = 0; unsigned lrval = 0; + const unsigned lrval_mask = (0xffffffff << (32 - N_BITS_I2S)); asm volatile("in %0, res[%1]":"=r"(lrval):"r"(p_lrclk):"memory"); set_port_shift_count(p_lrclk, N_BITS_I2S); @@ -181,7 +182,7 @@ static inline int HandleSampleClock(int frameCount, buffered _XUA_CLK_DIR port:3 { if(frameCount == 0) { - if ((lrval & 0xFFFFFF00) != 0x80000000) + if ((lrval & lrval_mask) != 0x80000000) { syncError = 1; printhexln(lrval); @@ -189,7 +190,7 @@ static inline int HandleSampleClock(int frameCount, buffered _XUA_CLK_DIR port:3 } else { - if ((lrval | 0x000000FF) != 0x7FFFFFFF) + if ((lrval | (~lrval_mask)) != 0x7FFFFFFF) { syncError = 1; printhexln(lrval);