diff --git a/tests/test_i2s_loopback.py b/tests/test_i2s_loopback.py index c824a355..b08c464b 100644 --- a/tests/test_i2s_loopback.py +++ b/tests/test_i2s_loopback.py @@ -11,16 +11,21 @@ import sys def test_file(request): return str(request.node.fspath) - def do_test( - pcm_format, i2s_role, channel_count, sample_rate, test_file, options, capfd + pcm_format, i2s_role, channel_count, sample_rate, word_length, test_file, options, capfd ): build_options = [] output = [] testname, _ = os.path.splitext(os.path.basename(test_file)) - desc = f"simulation_{pcm_format}_{i2s_role}_{channel_count}in_{channel_count}out_{sample_rate}" + build_options += [f"pcm_format={pcm_format}"] + build_options += [f"i2s_role={i2s_role}"] + build_options += [f"channel_count={channel_count}"] + build_options += [f"sample_rate={sample_rate}"] + build_options += [f"word_length={word_length}"] + + desc = f"simulation_{pcm_format}_{i2s_role}_{channel_count}in_{channel_count}out_{sample_rate}_{word_length}bit" binary = f"{testname}/bin/{desc}/{testname}_{desc}.xe" tester = testers.ComparisonTester(open("pass.expect")) @@ -52,6 +57,7 @@ def do_test( result = Pyxsim.run_on_simulator( binary, + build_options=build_options, tester=tester, simargs=simargs, capfd=capfd, @@ -65,25 +71,26 @@ def do_test( @pytest.mark.parametrize("i2s_role", ["master", "slave"]) @pytest.mark.parametrize("pcm_format", ["i2s", "tdm"]) @pytest.mark.parametrize("channel_count", [2, 8, 16]) -@pytest.mark.parametrize("sample_rate", ["48khz", "96khz", "192khz"]) +@pytest.mark.parametrize("word_length", [32]) # I2S world length in bits +@pytest.mark.parametrize("sample_rate", [48000, 96000, 192000]) def test_i2s_loopback( - i2s_role, pcm_format, channel_count, sample_rate, test_file, options, capfd + i2s_role, pcm_format, channel_count, sample_rate, word_length, test_file, options, capfd ): if pcm_format == "i2s" and channel_count == 16: pytest.skip("Invalid parameter combination") - if pcm_format == "i2s" and sample_rate not in ["48khz", "192khz"]: + if pcm_format == "i2s" and sample_rate not in [48000, 192000]: pytest.skip("Invalid parameter combination") if pcm_format == "tdm" and channel_count == 2: pytest.skip("Invalid parameter combination") - if pcm_format == "tdm" and sample_rate == "192khz": + if pcm_format == "tdm" and sample_rate == 192000: pytest.skip("Invalid parameter combination") result = do_test( - pcm_format, i2s_role, channel_count, sample_rate, test_file, options, capfd + pcm_format, i2s_role, channel_count, sample_rate, word_length, test_file, options, capfd ) assert result diff --git a/tests/test_i2s_loopback/Makefile b/tests/test_i2s_loopback/Makefile index 32615bb1..f0e5ae82 100644 --- a/tests/test_i2s_loopback/Makefile +++ b/tests/test_i2s_loopback/Makefile @@ -1,126 +1,43 @@ TARGET = xk-audio-216-mc.xn USED_MODULES = lib_xua lib_i2c lib_logging -BUILD_FLAGS = -O0 -g -lflash -DXUD_CORE_CLOCK=600 -fxscope -save-temps -march=xs2a -DUSB_TILE=tile[1] +BUILD_FLAGS = -O3 -g -lflash -DXUD_CORE_CLOCK=600 -fxscope -save-temps -march=xs2a -DUSB_TILE=tile[1] \ + -DXUA_ADAT_RX_EN=0 -DXUA_ADAT_TX_EN=0 -DXUA_SPDIF_RX_EN=0 -DXUA_SPDIF_TX_EN=0 -DMIDI=0 \ + -DSIMULATION=1 -BUILD_FLAGS_i2s_master_2in_2out_48khz = $(BUILD_FLAGS) \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=2 -D NUM_USB_CHAN_OUT=2 -DI2S_CHANS_ADC=2 -DI2S_CHANS_DAC=2 \ - -D DEFAULT_FREQ=48000 +ifndef pcm_format +$(error pcm_format is not set) +endif -BUILD_FLAGS_i2s_slave_2in_2out_48khz = $(BUILD_FLAGS) \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=2 -D NUM_USB_CHAN_OUT=2 -DI2S_CHANS_ADC=2 -DI2S_CHANS_DAC=2 \ - -D DEFAULT_FREQ=48000 -DCODEC_MASTER=1 +ifndef i2s_role +$(error i2s_role is not set) +endif -BUILD_FLAGS_i2s_master_2in_2out_192khz = $(BUILD_FLAGS) \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=2 -D NUM_USB_CHAN_OUT=2 -D I2S_CHANS_ADC=2 -D I2S_CHANS_DAC=2 \ - -D DEFAULT_FREQ=192000 +ifndef channel_count +$(error channel_count is not set) +endif -BUILD_FLAGS_i2s_slave_2in_2out_192khz = $(BUILD_FLAGS) \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=2 -D NUM_USB_CHAN_OUT=2 -DI2S_CHANS_ADC=2 -DI2S_CHANS_DAC=2 \ - -D DEFAULT_FREQ=192000 -DCODEC_MASTER=1 +ifndef sample_rate +$(error sample_rate is not set) +endif -BUILD_FLAGS_i2s_master_8in_8out_48khz = $(BUILD_FLAGS) \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=8 -D NUM_USB_CHAN_OUT=8 -D I2S_CHANS_ADC=8 -D I2S_CHANS_DAC=8 \ - -D DEFAULT_FREQ=48000 +ifndef word_length +$(error word_length is not set) +endif -BUILD_FLAGS_i2s_slave_8in_8out_48khz = $(BUILD_FLAGS) \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=8 -D NUM_USB_CHAN_OUT=8 -D I2S_CHANS_ADC=8 -D I2S_CHANS_DAC=8 \ - -D DEFAULT_FREQ=48000 -DCODEC_MASTER=1 +ifeq ($(pcm_format),tdm) + BUILD_FLAGS += -DXUA_PCM_FORMAT=XUA_PCM_FORMAT_TDM +endif +ifeq ($(i2s_role),slave) + BUILD_FLAGS += -DCODEC_MASTER=1 +endif -BUILD_FLAGS_i2s_master_8in_8out_192khz = $(BUILD_FLAGS) \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=8 -D NUM_USB_CHAN_OUT=8 -D I2S_CHANS_ADC=8 -D I2S_CHANS_DAC=8 \ - -D DEFAULT_FREQ=192000 \ - -O2 # optimisations to meet timing - -BUILD_FLAGS_i2s_slave_8in_8out_192khz = $(BUILD_FLAGS) \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=8 -D NUM_USB_CHAN_OUT=8 -D I2S_CHANS_ADC=8 -D I2S_CHANS_DAC=8 \ - -D DEFAULT_FREQ=192000 -DCODEC_MASTER=1 \ - -O2 # optimisations to meet timing - -BUILD_FLAGS_tdm_master_8in_8out_48khz = $(BUILD_FLAGS) -D XUA_PCM_FORMAT=XUA_PCM_FORMAT_TDM \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=8 -D NUM_USB_CHAN_OUT=8 -D I2S_CHANS_ADC=8 -D I2S_CHANS_DAC=8 \ - -D DEFAULT_FREQ=48000 \ - -O2 # optimisations to meet timing - -BUILD_FLAGS_tdm_master_8in_8out_96khz = $(BUILD_FLAGS) -D XUA_PCM_FORMAT=XUA_PCM_FORMAT_TDM \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=8 -D NUM_USB_CHAN_OUT=8 -D I2S_CHANS_ADC=8 -D I2S_CHANS_DAC=8 \ - -D DEFAULT_FREQ=96000 \ - -O3 # optimisations to meet timing - -BUILD_FLAGS_tdm_slave_8in_8out_48khz = $(BUILD_FLAGS) -D XUA_PCM_FORMAT=XUA_PCM_FORMAT_TDM \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=8 -D NUM_USB_CHAN_OUT=8 -D I2S_CHANS_ADC=8 -D I2S_CHANS_DAC=8 \ - -D DEFAULT_FREQ=48000 -DCODEC_MASTER=1 \ - -O2 # optimisations to meet timing - -BUILD_FLAGS_tdm_slave_8in_8out_96khz = $(BUILD_FLAGS) -D XUA_PCM_FORMAT=XUA_PCM_FORMAT_TDM \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=8 -D NUM_USB_CHAN_OUT=8 -D I2S_CHANS_ADC=8 -D I2S_CHANS_DAC=8 \ - -D DEFAULT_FREQ=96000 -DCODEC_MASTER=1 \ - -O2 # optimisations to meet timing - -BUILD_FLAGS_tdm_master_16in_16out_48khz = $(BUILD_FLAGS) -D XUA_PCM_FORMAT=XUA_PCM_FORMAT_TDM \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=16 -D NUM_USB_CHAN_OUT=16 -D I2S_CHANS_ADC=16 -D I2S_CHANS_DAC=16 \ - -D DEFAULT_FREQ=48000 \ - -O2 # optimisations to meet timing - -BUILD_FLAGS_tdm_master_16in_16out_96khz = $(BUILD_FLAGS) -D XUA_PCM_FORMAT=XUA_PCM_FORMAT_TDM \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=16 -D NUM_USB_CHAN_OUT=16 -D I2S_CHANS_ADC=16 -D I2S_CHANS_DAC=16 \ - -D DEFAULT_FREQ=96000 \ - -O2 # optimisations to meet timing - -BUILD_FLAGS_tdm_slave_16in_16out_48khz = $(BUILD_FLAGS) -D XUA_PCM_FORMAT=XUA_PCM_FORMAT_TDM \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=16 -D NUM_USB_CHAN_OUT=16 -D I2S_CHANS_ADC=16 -D I2S_CHANS_DAC=16 \ - -D DEFAULT_FREQ=48000 -DCODEC_MASTER=1 \ - -O2 # optimisations to meet timing - -BUILD_FLAGS_tdm_slave_16in_16out_96khz = $(BUILD_FLAGS) -D XUA_PCM_FORMAT=XUA_PCM_FORMAT_TDM \ - -D XUA_ADAT_RX_EN=0 -D XUA_ADAT_TX_EN=0 -D XUA_SPDIF_RX_EN=0 -D XUA_SPDIF_TX_EN=0 -D MIDI=0 \ - -D NUM_USB_CHAN_IN=16 -D NUM_USB_CHAN_OUT=16 -D I2S_CHANS_ADC=16 -D I2S_CHANS_DAC=16 \ - -D DEFAULT_FREQ=96000 -DCODEC_MASTER=1 \ - -O2 # optimisations to meet timing - - -#XCC_FLAGS_hardware_i2s_master_2in_2out_48khz = -D HARDWARE $(BUILD_FLAGS_i2s_master_2in_2out_48khz) -#XCC_FLAGS_hardware_i2s_master_2in_2out_192khz = -D HARDWARE $(BUILD_FLAGS_i2s_master_2in_2out_192khz) -#XCC_FLAGS_hardware_i2s_master_8in_8out_48khz = -D HARDWARE $(BUILD_FLAGS_i2s_master_8in_8out_48khz) -#XCC_FLAGS_hardware_i2s_master_8in_8out_192khz = -D HARDWARE $(BUILD_FLAGS_i2s_master_8in_8out_192khz) -#XCC_FLAGS_hardware_tdm_master_8in_8out_48khz = -D HARDWARE $(BUILD_FLAGS_tdm_master_8in_8out_48khz) - -XCC_FLAGS_simulation_i2s_master_2in_2out_48khz = -D SIMULATION $(BUILD_FLAGS_i2s_master_2in_2out_48khz) -XCC_FLAGS_simulation_i2s_slave_2in_2out_48khz = -D SIMULATION $(BUILD_FLAGS_i2s_slave_2in_2out_48khz) - -XCC_FLAGS_simulation_i2s_master_2in_2out_192khz = -D SIMULATION $(BUILD_FLAGS_i2s_master_2in_2out_192khz) -XCC_FLAGS_simulation_i2s_slave_2in_2out_192khz = -D SIMULATION $(BUILD_FLAGS_i2s_slave_2in_2out_192khz) - -XCC_FLAGS_simulation_i2s_master_8in_8out_48khz = -D SIMULATION $(BUILD_FLAGS_i2s_master_8in_8out_48khz) -XCC_FLAGS_simulation_i2s_slave_8in_8out_48khz = -D SIMULATION $(BUILD_FLAGS_i2s_slave_8in_8out_48khz) - -XCC_FLAGS_simulation_i2s_master_8in_8out_192khz = -D SIMULATION $(BUILD_FLAGS_i2s_master_8in_8out_192khz) -XCC_FLAGS_simulation_i2s_slave_8in_8out_192khz = -D SIMULATION $(BUILD_FLAGS_i2s_slave_8in_8out_192khz) - -XCC_FLAGS_simulation_tdm_master_8in_8out_48khz = -D SIMULATION $(BUILD_FLAGS_tdm_master_8in_8out_48khz) -XCC_FLAGS_simulation_tdm_master_8in_8out_96khz = -D SIMULATION $(BUILD_FLAGS_tdm_master_8in_8out_96khz) -XCC_FLAGS_simulation_tdm_slave_8in_8out_48khz = -D SIMULATION $(BUILD_FLAGS_tdm_slave_8in_8out_48khz) -XCC_FLAGS_simulation_tdm_slave_8in_8out_96khz = -D SIMULATION $(BUILD_FLAGS_tdm_slave_8in_8out_96khz) - -XCC_FLAGS_simulation_tdm_master_16in_16out_48khz = -D SIMULATION $(BUILD_FLAGS_tdm_master_16in_16out_48khz) -XCC_FLAGS_simulation_tdm_master_16in_16out_96khz = -D SIMULATION $(BUILD_FLAGS_tdm_master_16in_16out_96khz) -XCC_FLAGS_simulation_tdm_slave_16in_16out_48khz = -D SIMULATION $(BUILD_FLAGS_tdm_slave_16in_16out_48khz) -XCC_FLAGS_simulation_tdm_slave_16in_16out_96khz = -D SIMULATION $(BUILD_FLAGS_tdm_slave_16in_16out_96khz) +XCC_FLAGS_simulation_${pcm_format}_${i2s_role}_$(channel_count)in_$(channel_count)out_$(sample_rate)_$(word_length)bit = $(BUILD_FLAGS) \ + -DNUM_USB_CHAN_IN=${channel_count} \ + -DNUM_USB_CHAN_OUT=${channel_count} \ + -DI2S_CHANS_DAC=${channel_count} \ + -DI2S_CHANS_ADC=${channel_count} \ + -DEFAULT_FREQ=${sample_rate} XMOS_MAKE_PATH ?= ../.. -include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.common