Last edited 2 months ago

I2S Linux driver

Applicable for STM32MP13x lines, STM32MP15x lines, STM32MP21x lines, STM32MP23x lines, STM32MP25x lines

1. Article purpose[edit | edit source]

This article introduces the I2S Linux® driver for the SPI/I2S internal peripheral.

2. Short Description[edit | edit source]

The I2S Linux driver is an ASoC CPU DAI driver implemented in the Linux ALSA framework.

Info white.png Information

The SPI/I2S2 and SPI/I2S3 internal peripherals share the same parent clock, which can result in a conflict on clock configuration if I2S2 and I2S3 are used to run audio streams with incompatible rates (i.e. rates not multiples of each other).

  • On STM32MP1 series, the I2S driver does not protect against such conflicts by itself.
  • On STM32MP23x lines More info.png and STM32MP25x lines More info.png, the I2S driver manages such conflicts by rejecting the incompatible stream.
  • On STM32MP21x lines More info.png, there is no risk of conflict, as the SPI/I2S2 and SPI/I2S3 have their own distinct flexgen.

3. Configuration[edit | edit source]

3.1. Kernel Configuration[edit | edit source]

Activate the I2S Linux driver in the kernel configuration using the Linux Menuconfig tool: Menuconfig or how to configure kernel.

[*] Device Drivers
    [*] Sound card support
        [*] Advanced Linux Sound Architecture
            [*] ALSA for SoC audio support
                STMicroelectronics STM32 SOC audio support
	             [*] STM32 I2S interface (SPI/I2S block) support

3.2. Device tree[edit | edit source]

Refer to the I2S_device_tree_configuration article when configuring the I2S Linux kernel driver.

Info white.png Information
The I2S peripheral can be configured in transmit only, receive only or full-duplex mode, via its configuration register.

The I2S driver offers the support of transmit only, receive only, or full-duplex use cases. However, the driver always configure the I2S in full-duplex mode in the configuration register, whatever the chosen use case. If a path (transmit or capture) is not used, it is simply discarded. So, there is no property in the I2S device tree bindings to configure the mode of the I2S peripheral.

4. How to use[edit | edit source]

The I2S Linux driver can be accessed from userland through an ALSA device. Refer to ALSA overview for information on how to list and use ALSA devices.

5. How to trace and debug[edit | edit source]

The debugfs and procfs file system can be checked to get information on the I2S driver and the resources it uses. A non-exhaustive list of these file system entries is provided below. Refer to ALSA overview for more details on debugging tools.

  • debugfs entries:
$ cat /sys/kernel/debug/regmap/xxx.audio-controller/registers
  • procfs entries:
$ cat /proc/interrupts

6. Source code location[edit | edit source]

sound/soc/stm/stm32_i2s.c : implements the I2S Linux driver.

7. References[edit | edit source]