I2S connection limitations

Hi,

I’m hoping to find out what the limitations of the I2S connection are:

  • Can native DSD be sent via I2S connection, or does Volumio always convert it to PCM (DoP)?
  • Can Volumio perform any kind of DAC configuration or management over the I2S interface? Or, is this achieved via other pins on the GPIO (e.g. IC2)?

I have a generic ES9038Q2M board connected to the RPi3B+ GPIO pins via the 3x I2S pins and Ground. It is not a HAT. I’m using Volumio v2.619.

The DAC only works if I use the “R-PI DAC” model in the Audio Output section of the settings. It works really well for PCM, playing 44.1/96/192KHz tracks without problem. However, Volumio seems to be converting DSD tracks to PCM.

How can I see and change the R-PI DAC profile (not just via the GUI)? I believe that it sends all data as 32bit packets, but where is this specified/configured?! The dacs.json file doesn’t control this.

In your configuration you cannot play DSD. You would need a special i2s driver, made on purpose for your DAC (ESS requires also a MCU to handle i2s communications, for various reasons). Also, volume and DAC configuration is done via I2C.
I tell you this because this is what we’ve made with Primo (ESS 9038Q2M connected via i2s to ASUS Tinkerboard S)

Thanks Michelangelo,

I would like to learn about the drivers, and the configuration and commands that can adjusted. Where do I start?!

How do I view the content of a driver?
Do the drivers simply configure the alsa settings?
Can the drivers allocate I2C GPIO pins and define the commands that can be sent to the DAC? (the DAC has an MCU and interface pins)

Any pointers would be much appreciated.

I’d like to follow up on this topic to understand better how Volumio works with pi audio hats for i2s and DSD out. I understand now that the easiest way to get DSD to an external DAC is thru USB.

Having read thru the threads that I can here and elsewhere, it appears that many ppl are trying to get some kind of audio hat, dac hat or transport hat to get DSD out. However, seeing some of the responses from the admins and developers here, it appears that it is not the case at all, as I have read several times that the limitation is in the GPIO.

So I guess my first question is, pardon my ignorance…Is that a limitation of the current Volumio implementation? I’ve also read that to use i2s thru HDMI for DSD will require a DDC…but elsewhere I’ve read that i2s audio isolation boards could work, but aren’t those for extract audio from a regular HDMI A/V signal?

Please point this newb to enlightenment.

I²S and DSD Support in Volumio 3

Native DSD over I²S: Not supported without a custom driver

In Volumio 3, native DSD over I²S remains unsupported by default. This is not due to a hardware limitation of the GPIO/I²S bus itself, but rather:

  1. Lack of proper kernel-level I²S DAC drivers that expose native DSD playback via ALSA.
  2. The use of generic overlays like hifiberry-dac, which only support PCM up to 32-bit.
  3. Absence of MCU-driven DAC initialization logic, which is often required to switch the ESS DAC into native DSD mode.

By default, Volumio 3 uses DoP (DSD over PCM) or converts DSD to PCM on the fly when playing through I²S. Native DSD playback typically requires either:

  • A USB DAC with UAC2 and DSD descriptors.
  • A DAC board with a supported I²S driver that exposes DSD_UXX_BE or DSD_RAW in aplay -Dhw:X,X -v.

I²S is not a control interface

No DAC configuration is possible over I²S

I²S is a unidirectional audio data bus. It does not support:

  • Volume control
  • Filter selection
  • Input switching
  • Register configuration

All of the above are handled via:

  • I²C (most common)
  • SPI (in some designs)
  • Or an onboard MCU that listens for these commands and programs the DAC accordingly.

Volumio 3 does not natively control DACs over I²C unless:

  • A plugin exists for that DAC
  • You implement a custom ALSA control layer, or userland I²C command handler

If your ES9038Q2M board includes a microcontroller (e.g., STM32 or PIC) that is pre-configured to handle DSD/PCM switching and filter control, then it’s possible to achieve limited functionality using just I²S, but Volumio will have no visibility or control over it.

Understanding Volumio 3’s Audio Output and Driver Model

“R-PI DAC” overlay

When you select “R-PI DAC” in the GUI, Volumio applies the hifiberry-dac device tree overlay:

dtoverlay=hifiberry-dac

This overlay:

  • Enables the I²S peripheral
  • Registers a simple soundcard interface (no mixer)
  • Supports PCM up to 32-bit, 192kHz
  • Does not support native DSD or expose advanced ALSA controls

There is no DSD capability in the ALSA hw_params of this device:

cat /proc/asound/card0/pcm0p/sub0/hw_params

Only PCM formats will be listed.

Enabling Native DSD via I²S in Volumio 3

This is possible only if:

  1. The DAC supports native DSD over I²S (ES9038Q2M does).
  2. The DAC board either:
    • Has an MCU to switch modes based on signal type, or
    • Is controlled by I²C/SPI and has a compatible Volumio plugin or driver.
  3. You write a custom device tree overlay that:
    • Registers a soundcard with DSD formats exposed via ALSA.
    • Optionally configures I²C GPIO pins for control.
  4. The kernel ALSA subsystem advertises DSD_U16_LE, DSD_U32_BE, or DSD_RAW as valid formats.

In such a case, a modified or entirely new overlay might include:

sound-dai = <&i2s>;
format = "dsd";
bitclock-master;
frame-master;
...

And a compatible codec driver that registers these formats.

Tools and Validation Methods

Validate current I²S output capabilities

aplay -l
aplay -Dhw:0 -v <path_to_pcm_file>
cat /proc/asound/card0/pcm0p/sub0/hw_params

If DSD_UXX_XX is not listed in FORMAT:, the device does not support native DSD over I²S.

Dump audio interfaces and format negotiation

cat /proc/asound/cards
cat /proc/asound/devices

Check dmesg for overlay or driver load messages:

dmesg | grep -i snd

Summary of Limitations in Volumio 3 for I²S and DSD

Capability Volumio 3 + RPi I²S
PCM playback over I²S Yes
Native DSD over I²S No (needs driver)
DoP over I²S Sometimes possible
DAC configuration via I²S Not possible
DAC config via I²C Possible if supported manually
Volume control via I²S No
Volume control via I²C Only with support

Kind Regards,

1 Like