From 386f0b201de550eacad3041063e5356733b6556b Mon Sep 17 00:00:00 2001 From: Pan Xiuli Date: Wed, 20 May 2020 14:34:43 +0800 Subject: [PATCH] topology: Add nocodec demux test tplg This test topology test with 4ch to 2ch demux. Signed-off-by: Pan Xiuli --- tools/topology/CMakeLists.txt | 1 + tools/topology/sof-apl-demux-nocodec.m4 | 203 ++++++++++++++++++++++++ 2 files changed, 204 insertions(+) create mode 100644 tools/topology/sof-apl-demux-nocodec.m4 diff --git a/tools/topology/CMakeLists.txt b/tools/topology/CMakeLists.txt index 8fac3e32a573..5f93080732cd 100644 --- a/tools/topology/CMakeLists.txt +++ b/tools/topology/CMakeLists.txt @@ -136,6 +136,7 @@ set(TPLGS "sof-jsl-da7219\;sof-jsl-da7219-mx98360a\;-DPLATFORM=jsl-dedede" "sof-imx8mp-wm8960\;sof-imx8mp-wm8960" "sof-smart-amplifier-nocodec\;sof-smart-amplifier-nocodec" + "sof-apl-demux-nocodec\;sof-apl-demux-nocodec" ) add_custom_target(topologies ALL) diff --git a/tools/topology/sof-apl-demux-nocodec.m4 b/tools/topology/sof-apl-demux-nocodec.m4 new file mode 100644 index 000000000000..e125a19c7385 --- /dev/null +++ b/tools/topology/sof-apl-demux-nocodec.m4 @@ -0,0 +1,203 @@ +# +# Topology for generic Apollolake board with no codec and digital mic array. +# +# APL Host GW DMAC support max 6 playback and max 6 capture channels so some +# pipelines/PCMs/DAIs are commented out to keep within HW bounds. If these +# are needed then they can be used provided other PCMs/pipelines/SSPs are +# commented out in their place. + +# Include topology builder +include(`utils.m4') +include(`dai.m4') +include(`ssp.m4') +include(`muxdemux.m4') +include(`pipeline.m4') + +# Include TLV library +include(`common/tlv.m4') + +# Include Token library +include(`sof/tokens.m4') + +# Include Apollolake DSP configuration +include(`platform/intel/bxt.m4') +include(`platform/intel/dmic.m4') + +DEBUG_START +dnl Configure demux +dnl name, pipeline_id, routing_matrix_rows +dnl Diagonal 1's in routing matrix mean that every input channel is +dnl copied to corresponding output channels in all output streams. +dnl I.e. row index is the input channel, 1 means it is copied to +dnl corresponding output channel (column index), 0 means it is discarded. +dnl There's a separate matrix for all outputs. +define(matrix1, `ROUTE_MATRIX(1, + `BITS_TO_BYTE(1, 0, 0 ,0 ,0 ,0 ,0 ,0)', + `BITS_TO_BYTE(0, 1, 0 ,0 ,0 ,0 ,0 ,0)', + `BITS_TO_BYTE(0, 0, 1 ,0 ,0 ,0 ,0 ,0)', + `BITS_TO_BYTE(0, 0, 0 ,1 ,0 ,0 ,0 ,0)', + `BITS_TO_BYTE(0, 0, 0 ,0 ,1 ,0 ,0 ,0)', + `BITS_TO_BYTE(0, 0, 0 ,0 ,0 ,1 ,0 ,0)', + `BITS_TO_BYTE(0, 0, 0 ,0 ,0 ,0 ,1 ,0)', + `BITS_TO_BYTE(0, 0, 0 ,0 ,0 ,0 ,0 ,1)')') + +define(matrix2, `ROUTE_MATRIX(5, + `BITS_TO_BYTE(1, 0, 0 ,0 ,0 ,0 ,0 ,0)', + `BITS_TO_BYTE(0, 1, 0 ,0 ,0 ,0 ,0 ,0)', + `BITS_TO_BYTE(0, 0, 1 ,0 ,0 ,0 ,0 ,0)', + `BITS_TO_BYTE(0, 0, 0 ,1 ,0 ,0 ,0 ,0)', + `BITS_TO_BYTE(0, 0, 0 ,0 ,1 ,0 ,0 ,0)', + `BITS_TO_BYTE(0, 0, 0 ,0 ,0 ,1 ,0 ,0)', + `BITS_TO_BYTE(0, 0, 0 ,0 ,0 ,0 ,1 ,0)', + `BITS_TO_BYTE(0, 0, 0 ,0 ,0 ,0 ,0 ,1)')') + +dnl name, num_streams, route_matrix list +MUXDEMUX_CONFIG(demux_priv, 2, LIST(` ', `matrix1,', `matrix2')) +# +# Define the pipelines +# +# PCM0 <---> volume <----> SSP0 +# PCM6 <---- volume <----- DMIC6 (DMIC01) +# + +dnl PIPELINE_PCM_ADD(pipeline, +dnl pipe id, pcm, max channels, format, +dnl period, priority, core, +dnl pcm_min_rate, pcm_max_rate, pipeline_rate, +dnl time_domain, sched_comp) + +# Demux pipeline 1 on PCM 0 using max 2 channels of s32le. +# Set 1000us deadline on core 0 with priority 0 +PIPELINE_PCM_ADD(sof/pipe-volume-demux-playback.m4, + 1, 0, 4, s32le, + 1000, 0, 0, + 48000, 48000, 48000) + +# Low Latency capture pipeline 2 on PCM 0 using max 2 channels of s16le. +# 1000us deadline on core 0 with priority 0 +PIPELINE_PCM_ADD(sof/pipe-volume-capture.m4, + 2, 0, 4, s32le, + 1000, 0, 0, + 48000, 48000, 48000) + +# Low Latency playback pipeline 11 on PCM 5 using max 2 channels of s16le. +# 1000us deadline on core 0 with priority 0 +PIPELINE_PCM_ADD(sof/pipe-volume-playback.m4, + 11, 5, 2, s32le, + 1000, 0, 0, + 48000, 48000, 48000) + +# Passthrough capture pipeline 13 on PCM 6 using max 2 channels. +# 1000us deadline on core 0 with priority 0 +PIPELINE_PCM_ADD(sof/pipe-passthrough-capture.m4, + 13, 6, 2, s32le, + 1000, 0, 0, + 48000, 48000, 48000) + +# +# DAIs configuration +# + +dnl DAI_ADD(pipeline, +dnl pipe id, dai type, dai_index, dai_be, +dnl buffer, periods, format, +dnl deadline, priority, core, time_domain) + +# playback DAI is SSP0 using 2 periods +# Buffers use s16le format, 1000us deadline on core 0 with priority 0 +DAI_ADD(sof/pipe-dai-playback.m4, + 1, SSP, 0, NoCodec-0, + PIPELINE_SOURCE_1, 2, s16le, + 1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER) + +# playback DAI is SSP5 using 2 periods +# Buffers use s16le format, 1000us deadline on core 0 with priority 0 +DAI_ADD(sof/pipe-dai-playback.m4, + 11, SSP, 5, NoCodec-5, + PIPELINE_SOURCE_11, 2, s16le, + 1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER) + +# currently this dai is here as "virtual" capture backend +W_DAI_IN(SSP, 5, NoCodec-5, s24le, 3, 0) + +# Capture pipeline 5 from demux on PCM 4 using max 2 channels of s32le. +PIPELINE_PCM_ADD(sof/pipe-passthrough-capture-sched.m4, + 5, 4, 2, s32le, + 1000, 1, 0, + 48000, 48000, 48000, + SCHEDULE_TIME_DOMAIN_TIMER, + PIPELINE_PLAYBACK_SCHED_COMP_1) + +# Connect demux to capture +SectionGraph."PIPE_CAP" { + index "0" + + lines [ + # mux to capture + dapm(PIPELINE_SINK_5, PIPELINE_DEMUX_1) + ] +} + +# Connect virtual capture to dai +SectionGraph."PIPE_CAP_VIRT" { + index "5" + + lines [ + # mux to capture + dapm(ECHO REF 5, SSP5.IN) + ] +} + +# capture DAI is SSP0 using 2 periods +# Buffers use s16le format, 1000us deadline on core 0 with priority 0 +DAI_ADD(sof/pipe-dai-capture.m4, + 2, SSP, 0, NoCodec-0, + PIPELINE_SINK_2, 2, s16le, + 1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER) + +# capture DAI is DMIC 0 using 2 periods +# Buffers use s32le format, 1000us deadline on core 0 with priority 0 +DAI_ADD(sof/pipe-dai-capture.m4, + 13, DMIC, 0, NoCodec-6, + PIPELINE_SINK_13, 2, s32le, + 1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER) + +dnl PCM_DUPLEX_ADD(name, pcm_id, playback, capture) +PCM_DUPLEX_ADD(Port0, 0, PIPELINE_PCM_1, PIPELINE_PCM_2) +PCM_PLAYBACK_ADD(Port5, 5, PIPELINE_PCM_11) +PCM_CAPTURE_ADD(EchoRef, 4, PIPELINE_PCM_5) +dnl PCM_CAPTURE_ADD(name, pipeline, capture) +PCM_CAPTURE_ADD(DMIC, 6, PIPELINE_PCM_13) + +# +# BE configurations - overrides config in ACPI if present +# + +dnl DAI_CONFIG(type, dai_index, link_id, name, ssp_config/dmic_config) +DAI_CONFIG(SSP, 0, 0, NoCodec-0, + dnl SSP_CONFIG(format, mclk, bclk, fsync, tdm, ssp_config_data) + SSP_CONFIG(I2S, SSP_CLOCK(mclk, 24576000, codec_mclk_in), + SSP_CLOCK(bclk, 3072000, codec_slave), + SSP_CLOCK(fsync, 48000, codec_slave), + SSP_TDM(4, 16, 15, 15), + dnl SSP_CONFIG_DATA(type, dai_index, valid bits, mclk_id, quirks) + SSP_CONFIG_DATA(SSP, 0, 16, 0, SSP_QUIRK_LBM))) + +DAI_CONFIG(SSP, 5, 5, NoCodec-5, + SSP_CONFIG(I2S, SSP_CLOCK(mclk, 24576000, codec_mclk_in), + SSP_CLOCK(bclk, 1536000, codec_slave), + SSP_CLOCK(fsync, 48000, codec_slave), + SSP_TDM(2, 16, 3, 3), + SSP_CONFIG_DATA(SSP, 5, 16, 0, SSP_QUIRK_LBM))) + +DAI_CONFIG(DMIC, 0, 6, NoCodec-6, + dnl DMIC_CONFIG(driver_version, clk_min, clk_mac, duty_min, duty_max, + dnl sample_rate, fifo word length, unmute time, type, + dnl dai_index, pdm controller config) + DMIC_CONFIG(1, 500000, 4800000, 40, 60, 48000, + DMIC_WORD_LENGTH(s32le), 400, DMIC, 0, + dnl PDM_CONFIG(type, dai_index, num pdm active, pdm tuples list) + dnl STEREO_PDM0 is a pre-defined pdm config for stereo capture + PDM_CONFIG(DMIC, 0, STEREO_PDM0))) + +DEBUG_END