mchp_asrc e1610000.asrc: hw version: 0x240You should see the above message (or something similar) if the ASRC driver probe succeeds. The next important step is the probing of the sound card Linux driver, needed to glue to ASRC and the rest of the audio peripherals. At boot, look for something like:
mchp-asrc-card sound: ASRC 4 FEs mchp-asrc-card sound: Found DPCM FE: asrc-pcm-1 mchp-asrc-card sound: Found DPCM FE: asrc-pcm-2 mchp-asrc-card sound: Found DPCM FE: asrc-pcm-3 mchp-asrc-card sound: Found DPCM FE: asrc-pcm-4This suggests that 4 FEs will be used for ASRC. We can also see the names of the FE audio devices. The sound card driver logs should continue with:
mchp-asrc-card sound: Found DPCM BE: BE mchp-pdmc - dmic-hifi, id 4 mchp-asrc-card sound: Found DPCM BE: BE mchp-spdiftx - dit-hifi, id 6 mchp-asrc-card sound: Found DPCM BE: BE mchp-spdifrx - dir-hifi, id 8These are the interfaces registered as BEs, which can be used with ASRC. In our case, we can see the PDMC, SPDIFTX and SPDIFRX interfaces, all registered with generic codecs. Details regarding how to use a different number of ASRC FE instances or how to add/remove BE interfaces are described in the sound card device-tree bindings: microchip,asrc-card.yaml. The ASRC registers 4 * 2 PCM devices. 4, because there are 4 DSPs, which are not identical in terms of usage, but, with some restrictions, they can run independently at the same time. Is multiplied by 2 because the DSPs can be used for both capture and playback.
root@sama7g5ek-sd:~# aplay -l **** List of PLAYBACK Hardware Devices **** card 0: EK [mchp-asrc-card @ sama7g5 EK], device 0: asrc-pcm-1 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: EK [mchp-asrc-card @ sama7g5 EK], device 1: asrc-pcm-2 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: EK [mchp-asrc-card @ sama7g5 EK], device 2: asrc-pcm-3 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: EK [mchp-asrc-card @ sama7g5 EK], device 3: asrc-pcm-4 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 ... root@sama7g5ek-sd:~# arecord -l **** List of CAPTURE Hardware Devices **** card 0: EK [mchp-asrc-card @ sama7g5 EK], device 0: asrc-pcm-1 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: EK [mchp-asrc-card @ sama7g5 EK], device 1: asrc-pcm-2 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: EK [mchp-asrc-card @ sama7g5 EK], device 2: asrc-pcm-3 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: EK [mchp-asrc-card @ sama7g5 EK], device 3: asrc-pcm-4 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 ...The rest of the non-ASRC peripherals are registered twice. Once as normal PCM, to be used without ASRC, and as Back-End, to be used with ASRC. The normal PCM devices can be seen using aplay/arecord commands:
root@sama7g5ek-sd:~# aplay -l **** List of PLAYBACK Hardware Devices **** ... card 0: EK [mchp-asrc-card @ sama7g5 EK], device 4: e161c000.i2s - wm8731-hifi wm8731-hifi-4 [e161c000.i2s - wm8731-hifi wm8731-hifi-4] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: EK [mchp-asrc-card @ sama7g5 EK], device 8: mchp-spdiftx - dit-hifi dit-hifi-8 [mchp-spdiftx - dit-hifi dit-hifi-8] Subdevices: 1/1 Subdevice #0: subdevice #0 root@sama7g5ek-sd:~# arecord -l **** List of CAPTURE Hardware Devices **** ... card 0: EK [mchp-asrc-card @ sama7g5 EK], device 4: e161c000.i2s - wm8731-hifi wm8731-hifi-4 [e161c000.i2s - wm8731-hifi wm8731-hifi-4] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: EK [mchp-asrc-card @ sama7g5 EK], device 6: mchp-pdmc - dmic-hifi dmic-hifi-6 [mchp-pdmc - dmic-hifi dmic-hifi-6] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: EK [mchp-asrc-card @ sama7g5 EK], device 10: mchp-spdifrx - dir-hifi dir-hifi-10 [mchp-spdifrx - dir-hifi dir-hifi-10] Subdevices: 1/1 Subdevice #0: subdevice #0Here we can see the I2SMCC is registered with the wm8731 codec, SPDIF RX/TX and PDMC. These are the normal PCM devices, since the Back-End instances are not exported to Linux user-space. This is because of the current ASoC implementation, which only allows the presence of the Front-End. The PCM parameters for the BEs (sampling rate, frame format, number of channels) are fixed, set at boot via device-tree. For example, the parameters for I2SMCC with the Mikroe Audio PROTO Board can be described with a device-tree overlay:
microchip,dai-link@3 { reg = <3>; microchip,format = "i2s"; microchip,frame-master = <&dailink3_master>; microchip,bitclock-master = <&dailink3_master>; microchip,convert-channels = <2>; microchip,convert-rate = <48000>; microchip,convert-sample-format = <MCHP_ASRC_PCM_FORMAT_S24_LE>; dailink3_master: cpu { /* make sure label is unique */ sound-dai = <&i2s0>; }; codec { sound-dai = <&wm8731>; }; };Here, when I2SMCC with WM8731 is used as a BE with ASRC, the interface will run 2 audio channels, at 48KHz, using an S24_LE format. These parameters must be supported by both the controller and the codec. As previously mentioned, these parameters are used only when the interface is used as a BE with ASRC. When used standalone, these device-tree properties are ignored, since they are taken fro the Linu user-space audio applications. The complete overlay can be found here. Also, the sound card device-tree node in the SAMA7G5 EK DTS file can be found here, while the sound card driver bindings are described here. We explained the registration of DPCM devices, the FEs, which are the 4 ASRC DSPs, and the BEs, which are the audio peripherals that interact with ASRC. The connection between the FEs and the BEs is done using audio routing. Each BE instance is routed to each FE instance using audio sound card controls. The controls can be seen using amixer controls or alsamixer commands. The syntax for these controls is: '< interface name >< interface_id > RX/TX'. For example, for I2SMCC0, we have both 'I2SMCC0 RX' and 'I2SMCC0 TX', since the I2SMCC and WM8731 support both capture and playback. For PDMC0, we have 'PDMC0 RX', since PDMC can only do capture. These controls can take one of the values with the syntax: 'ASRC Playback/Capture PCM < FE_instance_id > BE < order_id >'. FE_instance_id refers to the ASRC FE instance asrc_pcm_< instance > and order_id represents the order of BE's, when there are multiple BEs enabled for the same ASRC FE instance. The order of the BEs is important because it maps the TDM audio channels to the BE itself. The first channels will be mapped to the BE with the order_id 1 (the number of channels for this BE will be taken from device-tree, as explained above), the next channels will be mapped to the BE with the order_id 2, and so on. Since we have 4 DSPs there can't be more than 4 BEs used at the same time, for one direction (playback or capture), the total number of values a control can take is 4 x 4:
root@sama7g5ek-sd:~# amixer sget 'I2SMCC0 TX' Simple mixer control 'I2SMCC0 TX',0 Capabilities: enum Items: 'Off' 'ASRC Playback PCM 1 BE 1' 'ASRC Playback PCM 1 BE 2' 'ASRC Playback PCM 1 BE 3' 'ASRC Playback PCM 1 BE 4' 'ASRC Playback PCM 2 BE 1' 'ASRC Playback PCM 2 BE 2' 'ASRC Playback PCM 2 BE 3' 'ASRC Playback PCM 2 BE 4' 'ASRC Playback PCM 3 BE 1' 'ASRC Playback PCM 3 BE 2' 'ASRC Playback PCM 3 BE 3' 'ASRC Playback PCM 3 BE 4' 'ASRC Playback PCM 4 BE 1' 'ASRC Playback PCM 4 BE 2' 'ASRC Playback PCM 4 BE 3' 'ASRC Playback PCM 4 BE 4' Item0: 'Off'In the above example, we can see all the values available for the 'I2SMCC0 TX' control.
root@sama7g5ek-sd:~# amixer sset 'I2SMCC0 TX' 'ASRC Playback PCM 1 BE 1' Simple mixer control 'I2SMCC0 TX',0 Capabilities: enum Items: 'Off' 'ASRC Playback PCM 1 BE 1' 'ASRC Playback PCM 1 BE 2' 'ASRC Playback PCM 1 BE 3' 'ASRC Playback PCM 1 BE 4' 'ASRC Playback PCM 2 BE 1' 'ASRC Playback PCM 2 BE 2' 'ASRC Playback PCM 2 BE 3' 'ASRC P layback PCM 2 BE 4' 'ASRC Playback PCM 3 BE 1' 'ASRC Playback PCM 3 BE 2' 'ASRC Playback PCM 3 BE 3' 'ASRC Playback PCM 3 BE 4' 'ASRC Playback PCM 4 BE 1' 'ASRC Playback PCM 4 BE 2' 'ASRC Playback PCM 4 BE 3' 'A SRC Playback PCM 4 BE 4' Item0: 'ASRC Playback PCM 1 BE 1' root@sama7g5ek-sd:~# amixer sset 'SPDIFTX0 TX' 'ASRC Playback PCM 1 BE 2' Simple mixer control 'SPDIFTX0 TX',0 Capabilities: enum Items: 'Off' 'ASRC Playback PCM 1 BE 1' 'ASRC Playback PCM 1 BE 2' 'ASRC Playback PCM 1 BE 3' 'ASRC Playback PCM 1 BE 4' 'ASRC Playback PCM 2 BE 1' 'ASRC Playback PCM 2 BE 2' 'ASRC Playback PCM 2 BE 3' 'ASRC P layback PCM 2 BE 4' 'ASRC Playback PCM 3 BE 1' 'ASRC Playback PCM 3 BE 2' 'ASRC Playback PCM 3 BE 3' 'ASRC Playback PCM 3 BE 4' 'ASRC Playback PCM 4 BE 1' 'ASRC Playback PCM 4 BE 2' 'ASRC Playback PCM 4 BE 3' 'A SRC Playback PCM 4 BE 4' Item0: 'ASRC Playback PCM 1 BE 2'The same configuration can be accomplished using alsamixer command. Now we can send a 4 channel audio stream to the first ASRC FE instance, which will have the first two channels split to I2SMCC0 and SPDIFTX0. We use speaker test Linux application for simplicity:
root@sama7g5ek-sd:~# speaker-test -Dhw:0,0 -c 4 -t waveAs you can see, we are sending the audio data to hw:0,0, which is card id 0 and device id 0. These values are taken from the output of aplay -l:
root@sama7g5ek-sd:~# aplay -l **** List of PLAYBACK Hardware Devices **** card 0: EK [mchp-asrc-card @ sama7g5 EK], device 0: asrc-pcm-1 (*) [] ...As shown above, we have card 0 and device 0 for asrc-pcm-1, hence the device name will be -Dhw:0,0. Make sure the correct card and device values are used for your use-case. At this point, on the default serial (or dmesg) you should see a message like:
mchp_asrc e1610000.sound: ASRC IN AIF(s): mchp_asrc e1610000.sound: front-end mchp_asrc e1610000.sound: ASRC OUT AIF(s): mchp_asrc e1610000.sound: i2s@e161c000, 2 channels mchp_asrc e1610000.sound: spdiftx@e1618000, 2 channelsThis means that the DPLLs of the assigned ASRC DSPs locked and that an audio stream is taken from the user (front-end) and first 2 channels sent to i2s@e161c000, which is I2SMCC0, and the next 2 sent to spdiftx@e1618000. If the sound is not heard on the Mikroe AUDIO Proto board, please troubleshoout it by using it without ASRC, by following the steps here For capture, we need something simmilar, but we will use the 'RX' controls instead. For this, first, we set the 'Tx' controlls back to 'Off':
root@sama7g5ek-sd:~# amixer sset 'I2SMCC0 TX' 'Off' Simple mixer control 'I2SMCC0 TX',0 Capabilities: enum Items: 'Off' 'ASRC Playback PCM 1 BE 1' 'ASRC Playback PCM 1 BE 2' 'ASRC Playback PCM 1 BE 3' 'ASRC Playback PCM 1 BE 4' 'ASRC Playback PCM 2 BE 1' 'ASRC Playback PCM 2 BE 2' 'ASRC Playback PCM 2 BE 3' 'ASRC P layback PCM 2 BE 4' 'ASRC Playback PCM 3 BE 1' 'ASRC Playback PCM 3 BE 2' 'ASRC Playback PCM 3 BE 3' 'ASRC Playback PCM 3 BE 4' 'ASRC Playback PCM 4 BE 1' 'ASRC Playback PCM 4 BE 2' 'ASRC Playback PCM 4 BE 3' 'A SRC Playback PCM 4 BE 4' Item0: 'Off' root@sama7g5ek-sd:~# amixer sset 'SPDIFTX0 TX' 'Off' Simple mixer control 'SPDIFTX0 TX',0 Capabilities: enum Items: 'Off' 'ASRC Playback PCM 1 BE 1' 'ASRC Playback PCM 1 BE 2' 'ASRC Playback PCM 1 BE 3' 'ASRC Playback PCM 1 BE 4' 'ASRC Playback PCM 2 BE 1' 'ASRC Playback PCM 2 BE 2' 'ASRC Playback PCM 2 BE 3' 'ASRC P layback PCM 2 BE 4' 'ASRC Playback PCM 3 BE 1' 'ASRC Playback PCM 3 BE 2' 'ASRC Playback PCM 3 BE 3' 'ASRC Playback PCM 3 BE 4' 'ASRC Playback PCM 4 BE 1' 'ASRC Playback PCM 4 BE 2' 'ASRC Playback PCM 4 BE 3' 'A SRC Playback PCM 4 BE 4' Item0: 'Off'For recording a 6 channel capture stream from PDMC0 (4 channels) and SPDIFRX (2 channels), we set the 'PDMC0 RX' control to 'ASRC Capture PCM 1 BE 1' and 'SPDIFRX0 RX' to 'ASRC Capture PCM 1 BE 2':
root@sama7g5ek-sd:~# amixer sset 'PDMC0 RX' 'ASRC Capture PCM 1 BE 1' Simple mixer control 'PDMC0 RX',0 Capabilities: enum Items: 'Off' 'ASRC Capture PCM 1 BE 1' 'ASRC Capture PCM 1 BE 2' 'ASRC Capture PCM 1 BE 3' 'ASRC Capture PCM 1 BE 4' 'ASRC Capture PCM 2 BE 1' 'ASRC Capture PCM 2 BE 2' 'ASRC Capture PCM 2 BE 3' 'ASRC Capture PCM 2 BE 4' 'ASRC Capture PCM 3 BE 1' 'ASRC Capture PCM 3 BE 2' 'ASRC Capture PCM 3 BE 3' 'ASRC Capture PCM 3 BE 4' 'ASRC Capture PCM 4 BE 1' 'ASRC Capture PCM 4 BE 2' 'ASRC Capture PCM 4 BE 3' 'ASRC Capture PCM 4 BE 4' Item0: 'ASRC Capture PCM 1 BE 1' root@sama7g5ek-sd:~# amixer sset 'SPDIFRX0 RX' 'ASRC Capture PCM 1 BE 2' Simple mixer control 'SPDIFRX0 RX',0 Capabilities: enum Items: 'Off' 'ASRC Capture PCM 1 BE 1' 'ASRC Capture PCM 1 BE 2' 'ASRC Capture PCM 1 BE 3' 'ASRC Capture PCM 1 BE 4' 'ASRC Capture PCM 2 BE 1' 'ASRC Capture PCM 2 BE 2' 'ASRC Capture PCM 2 BE 3' 'ASRC Capture PCM 2 BE 4' 'ASRC Capture PCM 3 BE 1' 'ASRC Capture PCM 3 BE 2' 'ASRC Capture PCM 3 BE 3' 'ASRC Capture PCM 3 BE 4' 'ASRC Capture PCM 4 BE 1' 'ASRC Capture PCM 4 BE 2' 'ASRC Capture PCM 4 BE 3' 'ASRC Capture PCM 4 BE 4' Item0: 'ASRC Capture PCM 1 BE 2'We start the recording with the following command:
root@sama7g5ek-sd:~# arecord -Dhw:0,0 -c 6 -r 48000 -f S24_LE out.wav Recording WAVE 'out.wav' : Signed 24 bit Little Endian, Rate 48000 Hz, Channels 6If everything is fine, we should see the following message on the serial (or on dmesg):
mchp_asrc e1610000.sound: ASRC IN AIF(s): mchp_asrc e1610000.sound: sound@e1608000, 4 channels mchp_asrc e1610000.sound: spdifrx@e1614000, 2 channels mchp_asrc e1610000.sound: ASRC OUT AIF(s): mchp_asrc e1610000.sound: front-endWhich mentions that a 6 channel capture stream is sent to the user (front-end), composed of 4 channels from PDMC0 (sound@e1608000) and 2 channels from SPDIFRX (spdifrx@e1614000). To enable PDMC0 on SAMA7G5 EK, make sure the J3 jumper is closed. Also, the #pdmc0 overlay must be applied in u-boot.
root@sama7g5ek-sd:~# amixer sset 'I2SMCC0 TX' 'ASRC Playback PCM 1 BE 1' Simple mixer control 'I2SMCC0 TX',0 Capabilities: enum Items: 'Off' 'ASRC Playback PCM 1 BE 1' 'ASRC Playback PCM 1 BE 2' 'ASRC Playback PCM 1 BE 3' 'ASRC Playback PCM 1 BE 4' 'ASRC Playback PCM 2 BE 1' 'ASRC Playback PCM 2 BE 2' 'ASRC Playback PCM 2 BE 3' 'ASRC P layback PCM 2 BE 4' 'ASRC Playback PCM 3 BE 1' 'ASRC Playback PCM 3 BE 2' 'ASRC Playback PCM 3 BE 3' 'ASRC Playback PCM 3 BE 4' 'ASRC Playback PCM 4 BE 1' 'ASRC Playback PCM 4 BE 2' 'ASRC Playback PCM 4 BE 3' 'A SRC Playback PCM 4 BE 4' Item0: 'ASRC Playback PCM 1 BE 1' root@sama7g5ek-sd:~# amixer sset 'SPDIFTX0 TX' 'ASRC Playback PCM 1 BE 2' Simple mixer control 'SPDIFTX0 TX',0 Capabilities: enum Items: 'Off' 'ASRC Playback PCM 1 BE 1' 'ASRC Playback PCM 1 BE 2' 'ASRC Playback PCM 1 BE 3' 'ASRC Playback PCM 1 BE 4' 'ASRC Playback PCM 2 BE 1' 'ASRC Playback PCM 2 BE 2' 'ASRC Playback PCM 2 BE 3' 'ASRC P layback PCM 2 BE 4' 'ASRC Playback PCM 3 BE 1' 'ASRC Playback PCM 3 BE 2' 'ASRC Playback PCM 3 BE 3' 'ASRC Playback PCM 3 BE 4' 'ASRC Playback PCM 4 BE 1' 'ASRC Playback PCM 4 BE 2' 'ASRC Playback PCM 4 BE 3' 'A SRC Playback PCM 4 BE 4' Item0: 'ASRC Playback PCM 1 BE 2' root@sama7g5ek-sd:~# amixer sset 'PDMC0 RX' 'ASRC Capture PCM 1 BE 1' Simple mixer control 'PDMC0 RX',0 Capabilities: enum Items: 'Off' 'ASRC Capture PCM 1 BE 1' 'ASRC Capture PCM 1 BE 2' 'ASRC Capture PCM 1 BE 3' 'ASRC Capture PCM 1 BE 4' 'ASRC Capture PCM 2 BE 1' 'ASRC Capture PCM 2 BE 2' 'ASRC Capture PCM 2 BE 3' 'ASRC Capture PCM 2 BE 4' 'ASRC Capture PCM 3 BE 1' 'ASRC Capture PCM 3 BE 2' 'ASRC Capture PCM 3 BE 3' 'ASRC Capture PCM 3 BE 4' 'ASRC Capture PCM 4 BE 1' 'ASRC Capture PCM 4 BE 2' 'ASRC Capture PCM 4 BE 3' 'ASRC Capture PCM 4 BE 4' Item0: 'ASRC Capture PCM 1 BE 1'Right after this, on the default serial, or on dmesg we should see:
mchp_asrc e1610000.sound: ASRC IN AIF(s): mchp_asrc e1610000.sound: sound@e1608000, 4 channels mchp_asrc e1610000.sound: ASRC OUT AIF(s): mchp_asrc e1610000.sound: i2s@e161c000, 2 channels mchp_asrc e1610000.sound: spdiftx@e1618000, 2 channelsThis means that the DSPs' DPLLs locked and the 4 channel audio stream is running from the PDMC0 (sound@e1608000), through ASRC, and then, first 2 channels sent to I2SMCC0 and next 2 channels sent to SPDIFTX (spdiftx@e1618000). This can only happen if the 'RX' and the 'TX' use the controls assigned to the same ASRC FE instance, in our case, the first instance: 'PCM 1'.
mchp_asrc e1610000.sound: the nr of DSPs needed for each BE is not in a descending order mchp_asrc e1610000.sound: ASoC: error at snd_soc_dai_hw_params on asrc-pcm-1: -22 asrc-pcm-1: ASoC: soc_pcm_hw_params() failed (-22) asrc-pcm-1: ASoC: dpcm_fe_dai_hw_params failed (-22)This means that the order of the BEs is not support by ASRC. The ASRC must have the BEs put in a descending order relativ to their number of channels. For example, if we used PDMC0 with 4 channels and 2 channels with SPDIRX, PDMC0 must be set as the first BE and the SPDIFRX must be used as the second BE.
mchp_asrc e1610000.sound: FE uses X channels, BEs uses Y channels mchp_asrc e1610000.sound: ASoC: error at snd_soc_dai_hw_params on asrc-pcm-1: -22 asrc-pcm-1: ASoC: soc_pcm_hw_params() failed (-22) asrc-pcm-1: ASoC: dpcm_fe_dai_hw_params failed (-22)This means that the number of audio channels asked by the used-space audio applications doesn't match with the number of audio channels summed up by the BEs. The number of the audio channels requested on the FE (ASRC) must be the same as the number of audio channels used on the BEs. For example, if aplay/arecord commands are used, the number of audio channels on the FE can be easily set using -c < channel_number > parameter. For more deiltas on the aplay/arecord parameters please see the manual here.
mchp_asrc e1610000.sound: 2 -> 1 DSPs; number needs to match mchp_asrc e1610000.sound: ASoC: error at snd_soc_dai_hw_params on asrc-pcm-1: -22 asrc-pcm-1: ASoC: soc_pcm_hw_params() failed (-22) asrc-pcm-1: ASoC: hw_params for FE failed -22 asrc-pcm-1: ASoC: dpcm_run_update_startup() failed (-22) asrc-pcm-1: ASoC: failed to startup some BEsThis happens when the number of DSPs needed by the capture BEs is different than the number of DSPs needed by the playback BEs. For example, in our case, the capture BE is PDMC0 with 4 microphones, hence 4 channels, and the playback BE is SPDIFTX with 2 channels only. The DSPs are stereo, so we need 1 DSP for every 2 channels. Since we need 2 DSPs for PDMC and 1 DSP for SPDIFTX, the audrio stream can't start. This error might also appear while the cross use-case configration is ongoing and not finished. In this case, please igonre the error messages.
WebFaqBaseForm | |
---|---|
Boards | Sama7g5-ek |
Components | Kernel, linux-5.15-mchp, linux-6.1-mchp, linux-6.6-mchp |
Summary | How to use ASRC |
Copyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Linux® is the registered trademark of Linus Torvalds in the U.S. and other countries.
Microchip and others, are registered trademarks or trademarks of Microchip Technology Inc. and its subsidiaries.
Arm® and others are registered trademarks or trademarks of Arm Limited (or its affiliates). Other terms and product names may be trademarks of others.
Ideas, requests, contributions ? Connect to LinksToCommunities page.