Difference between revisions of "I2S Linux driver"

[quality revision] [checked revision]
imported>Frq08988
m
 

1 Article purpose[edit]

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

2 Short Description[edit]

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

The I2S driver requests two clocks which can be used as parent clocks of the IS2 peripheral kernel clock. The rates of these parent clocks must be respectively a multiple of 8kHz and 11.025kHz. One of these two clocks is selected at run-time through the I2S clock mux, depending on audio stream sampling rate.

Restriction on STM32MP15x lines More info.png

SPI/I2S2 and SPI/I2S3 internal peripherals share the same clock mux. This may result in a conflict on clock mux configuration, if I2S2 and I2S3 are used to run audio streams having incompatible rates (i.e. rates not multiple of each other). The I2S driver does not protect by itself against such conflict.

3 Configuration[edit]

3.1 Kernel Configuration[edit]

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]

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

Info.png 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]

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]

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]

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

7 References[edit]




<noinclude>

{{ArticleBasedOnModel | [[Linux driver article model]]}}
{{ArticleMainWriter | OlivierM}}
{{ArticleApprovedVersion | OlivierM | ArnaudP(Pass, 14/01/2019) | No previous approved version | BrunoB - 29Jan'19 - 10338 | 29Jan'19}}
[[Category:ALSA]]</noinclude>

== Article purpose ==
This article introduces the I2S Linux<sup>&reg;</sup> driver for the [[SPI internal peripheral|SPI/I2S internal peripheral]].

== Short Description ==
The I2S Linux driver is an ASoC CPU DAI driver implemented in the Linux [[ALSA_overview|ALSA framework]].
==The I2S driver requests two clocks which can be used as parent clocks of the IS2 peripheral kernel clock.
The rates of these parent clocks must be respectively a multiple of 8kHz and 11.025kHz.
One of these two clocks  is selected at run-time through the I2S clock mux, depending on audio stream sampling rate.
<div class="mw-collapsible mw-collapsed">

'''Restriction on {{MicroprocessorDevice | device=15}}'''<br />
<div class="mw-collapsible-content">

SPI/I2S2 and SPI/I2S3 internal peripherals share the same clock mux. 
This may result in a conflict on clock mux configuration, if I2S2 and I2S3 are used to run audio streams having
incompatible rates (i.e. rates not multiple of each other). The I2S driver does not protect by itself against such conflict.</div></div>


== Configuration ==

=== Kernel Configuration ===
Activate the I2S Linux driver in the kernel configuration using the Linux Menuconfig tool: [[Menuconfig or how to configure kernel]].<pre>

[*] 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</pre>


=== Device tree ===
Refer to the [[I2S _device _tree _configuration]] article when configuring the I2S Linux kernel driver.


{{ReviewsComments| olivierM w902: Device tree configuration to be detailed in specific article{{Info|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.}}

== How to use ==
The I2S Linux driver can be accessed from userland through an ALSA device. Refer to [[ALSA_overview#How_to_use|ALSA overview]] for information on how to list and use ALSA devices.

==How to trace and debug==
The [[Debugfs|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#How_to_trace_and_debug_the_framework|ALSA overview]] for more details on debugging tools.

* debugfs entries:
:* '''asoc''': refer to [[ALSA_overview#How_to_monitor]]
:* '''clk''': refer to [[Clock_overview#How_to_monitor_with_debugfs]] to get information on clocks.
:* '''pinctrl''': refer to [[Pinctrl_overview#How_to_monitor]] to get information on pins.
:* '''regmap''': allow to monitor SPI/I2S peripheral registers.<div style="margin-left: 2em;">

 $ cat /sys/kernel/debug/regmap/xxx.audio-controller/registers</div>

* procfs entries:
:* '''asound''': refer to [[ALSA_overview#How_to_debug]]
:* '''interrupts''': allow to check interrupts.<div style="margin-left: 2em;">

 $ cat /proc/interrupts</div>


== Source code location ==
{{CodeSource | Linux kernel | sound/soc/stm/stm32_i2s.c}}: implements the I2S Linux driver.

==References==<references />

<noinclude>

{{ArticleBasedOnModel | [[Linux driver article model]]}}
{{PublicationRequestId | 10338 | 2019-01-29}}
[[Category:ALSA]]</noinclude>
(6 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<noinclude>
 
{{ArticleBasedOnModel | [[Linux driver article model]]}}
 
{{ArticleMainWriter | OlivierM}}
 
{{ArticleApprovedVersion | OlivierM | ArnaudP(Pass, 14/01/2019) | No previous approved version | BrunoB - 29Jan'19 - 10338 | 29Jan'19}}
 
[[Category:ALSA]]
 
</noinclude>
 
 
 
== Article purpose ==
 
== Article purpose ==
 
This article introduces the I2S Linux<sup>&reg;</sup> driver for the [[SPI internal peripheral|SPI/I2S internal peripheral]].
 
This article introduces the I2S Linux<sup>&reg;</sup> driver for the [[SPI internal peripheral|SPI/I2S internal peripheral]].
Line 11: Line 4:
 
== Short Description ==
 
== Short Description ==
 
The I2S Linux driver is an ASoC CPU DAI driver implemented in the Linux [[ALSA_overview|ALSA framework]].
 
The I2S Linux driver is an ASoC CPU DAI driver implemented in the Linux [[ALSA_overview|ALSA framework]].
  +
  +
The I2S driver requests two clocks which can be used as parent clocks of the IS2 peripheral kernel clock.
  +
The rates of these parent clocks must be respectively a multiple of 8kHz and 11.025kHz.
  +
One of these two clocks  is selected at run-time through the I2S clock mux, depending on audio stream sampling rate.
  +
  +
<div class="mw-collapsible mw-collapsed">
  +
'''Restriction on {{MicroprocessorDevice | device=15}}'''<br />
  +
<div class="mw-collapsible-content">
  +
SPI/I2S2 and SPI/I2S3 internal peripherals share the same clock mux.
  +
This may result in a conflict on clock mux configuration, if I2S2 and I2S3 are used to run audio streams having
  +
incompatible rates (i.e. rates not multiple of each other). The I2S driver does not protect by itself against such conflict.
  +
</div></div>
   
 
== Configuration ==
 
== Configuration ==
Line 26: Line 31:
   
 
=== Device tree ===
 
=== Device tree ===
Refer to the I2S device tree configuration article when configuring the I2S Linux kernel driver.
+
Refer to the [[I2S_device_tree_configuration]] article when configuring the I2S Linux kernel driver.
+
 
{{ReviewsComments| olivierM w902: Device tree configuration to be detailed in specific article}}
+
{{Info|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.}}
   
 
== How to use ==
 
== How to use ==
Line 56: Line 63:
 
==References==
 
==References==
 
<references />
 
<references />
  +
  +
<noinclude>
  +
{{ArticleBasedOnModel | [[Linux driver article model]]}}
  +
{{PublicationRequestId | 10338 | 2019-01-29}}
  +
[[Category:ALSA]]
  +
</noinclude>

Attachments

Discussions