Linux I2S Driver
Table of Contents
Introduction
The Xilinx® LogiCORE™ IP I2S Transmitter and Receiver cores are soft Xilinx IP core for use with the Xilinx Vivado® Design Suite. These IPs provide easy way of sending/receiving PCM audio over I2S interface and IPs provide an easy way to interface I2S based audio DAC/ADC. These IPs requires minimal register programming. Further, the IPs support any audio sampling rates.Features:
- Up to 4 I2S channels
- AXI4S compliant
- Supports up to 8 audio channels.
Typical system using I2S Rx and I2S Tx
The following figure shows the data flow from i2s rx to i2s tx. In the design, External I2S DAC(video FMC card consist of 3.5mm Jack) receives the data from audio source to I2S Rx where audio data is encoded into AES and audio data is sampled at 48KHz with 24bit depth and transferred to i2s Tx. I2S Tx further decodes the audio data and send it over Video FMC's Line Out interface to play audio on Speaker.
Driver Overview
The I2S Rx/Tx driver (xilinx_iis.c) is based on the ALSA framework. It creates a device node(/dev/snd/pcmCxDx*) which can be used to query and configure the I2S Rx IP and also exposes various ALSA audio parameters Like: Sampling Rate, No.of channels and bit depth which can be used to configure the subsystem.Kernel Configuration options for Driver
CONFIG_SND_SOC_XILINX_IIS should be enabled.Device Tree Binding
i2s_receiver_0: i2s_receiver@80050000 { compatible = "xlnx,i2s-receiver-1.0"; interrupt-parent = <&&gic>; interrupts = <0 89 4>; bit_width = <0x18>; mclk_freq = <0x180>; reg = <0x0 0x80050000 0x0 0x10000>; };
i2s_transmitter_0: i2s_transmitter@80020000 { compatible = "xlnx,i2s-transmitter-1.0"; interrupt-parent = <&&gic>; interrupts = <0 93 4>; bit_width = <0x18>; mclk_freq = <0x180>; reg = <0x0 0x80020000 0x0 0x10000>; };
Test Procedure
The driver has been tested using following tools:
1. ALSA Utilities.
2. Gstreamer Utilities.
Procedure to test I2s with ALSA Utilities
Recording a file: arecord tool is used to record the audio file with 24bit bit depth, 48khz sampling frequency and 2 channel audio properties.
arecord -D hw:0,1 -f S32_LE -r 48000 -c 2 ./test.wav
aplay -D hw:0,0 -f S32_LE -r 48000 -c 2 ./test.wav
Procedure to test I2s with Gstreamer Utilities
Recording a file: gst-launch is used to record the audio file with 24bit bit depth, 48khz sampling frequency and 2 channel audio properties. Gst-launch is using alsa src plugin to enable recording on i2s driver.gst-launch-1.0 -v alsasrc device=hw:0,1 num-buffers=1000 ! wavenc ! filesink location="test.wav"
gst-launch-1.0 filesrc location=/home/root/test.wav ! wavparse ! alsasink or gst-play-1.0 /home/root/test.wav
Pass Through i2s driver testing Procedure
G-streamer and alsa-utils tools enables pass through design for the i2s Linux driver i.e i2s receiver is connecting to i2s transmitter.arecord -D hw:0,1 -f S32_LE -r 48000 -c 2 | aplay -D hw:0,0 -c 2 -f S32_LE -r 48000 or gst-launch-1.0 alsasrc device=hw:0,1 ! alsasink device=hw:0,0
Debug capability
This page provides different tools and techniques useful for debugging audio issues encountered in Linux-based systems. The document is mostly focused on the Linux operating system and also describes the build-in ALSA driver tool to debug PCM ring buffer positions./proc/asound/card#/pcm0p/xrun_debug
Replace '#' with your card number (usually 0). This proc file can enable various debugging tools. The CONFIG_SND_PCM_XRUN_DEBUG, CONFIG_SND_VERBOSE_PROCFS, CONFIG_SND_DEBUG options must be enabled in your kernel (if xrun_debug proc file is present - this feature is enabled).1 Basic debugging - show xruns in ksyslog interface 2 Dump stack - dump stack for basic debugging 4 Jiffies check - compare the position with kernel jiffies (a sort of in-kernel monotonic clock), show what's changed when basic debugging is enabled 8 Dump positions on each period update call 16 Dump positions on each hardware pointer update call 32 Enable logging of last 10 ring buffer positions 64 Show the last 10 ring buffer position only once (when first error situation occured)
Some good value combinations:
# Enable basic debugging and dump stack # Usefull to just see, if PCM stream is stopped for a reason (usually wrong audio process timing from scheduler) echo 3 > /proc/asound/card0/pcm0p/xrun_debug
Boards Supported
Driver has been tested on the following boards- ZCU106 Rev D
Change log
Related Links
© Copyright 2019 - 2022 Xilinx Inc. Privacy Policy