Peripherals
The port exposes peripherals through standard Linux interfaces, including TTY, I2C, SPI, ALSA, and SocketCAN. Use a device-tree overlay to enable an optional controller and select its pins.
The standard build configuration includes the native I2C, SPI, I2S, Ethernet, SD/MMC and other optional controller drivers in this chapter. External devices can require additional drivers.
Enable a peripheral
For example, to enable I2C0:
s31-overlay apply i2c0
The selection is saved and restored at boot. Add --volatile for a temporary
setup. To inspect the pins and available settings, run:
s31-overlay routes i2c0
s31-overlay parameters i2c0
Check the board schematic before connecting a device. The overlay catalog lists the available controllers and their configuration options.
For wiring, commands, expected observations, and cleanup, use the peripheral examples. GPIO numbers refer to SoC signals; the board defaults describe the shipped routes and reservations.
Interfaces
Peripheral |
Linux interface |
Overlay or setup |
|---|---|---|
GPIO |
GPIO character device; libgpiod and |
Select free pins; managed GPIO settings persist at boot |
UART |
|
|
I2C |
|
|
SPI |
SPI subsystem; |
|
I2S/TDM |
ALSA PCM |
|
TWAI/CAN |
SocketCAN |
|
SD/MMC |
MMC block devices |
|
Ethernet |
Network interface and PHY driver |
|
USB |
DWC2 host, ACM serial gadget, or ECM network gadget |
|
GDMA |
Kernel DMAengine API |
AHB/AXI provider selected by the client |
General-purpose timers |
Counter framework |
|
LEDC, MCPWM, SDM, and pulse counter |
PWM and Counter frameworks |
|
ADC, DAC, touch, comparator |
IIO |
|
Temperature sensor |
hwmon |
|
Watchdogs |
Watchdog framework |
|
eFuse, random numbers, crypto |
Read-only NVMEM, hwrng, and kernel crypto APIs |
Corresponding kernel drivers |
UART0 is the serial console. UART3’s DMA overlay also uses UHCI0 and an AHB GDMA channel. For the current feature status, see the support matrix.
I2C
Both I2C controllers support 7-bit and 10-bit addresses and combined write/read transactions. The default bus speed is 100 kHz. To select 400 kHz and route I2C0 to GPIO35 and GPIO36:
s31-overlay apply i2c0 i2c0.scl=35 i2c0.sda=36 clock-frequency=400000
Use suitable pull-up resistors on SCL and SDA. The overlay also accepts 100000 and 1000000 Hz.
List the adapters with:
i2cdetect -l
For a device at address 0x51 on adapter 0, a one-byte register selection
followed by a one-byte read can be sent as one transaction:
i2ctransfer -y 0 w1@0x51 0x00 r1
Replace the adapter, address, and register with those for your device. In C,
use I2C_RDWR for this combined operation so the write and read are separated
by a repeated START.
Transfer limits and errors
Userspace I2C_RDWR messages can contain up to 8192 bytes each. Kernel clients
use a 16-bit message length, allowing up to 65535 bytes. Zero-length writes
are accepted; zero-length reads and protocol-mangling flags are unsupported.
Long transfers are split into batches of up to 32 TX bytes or 31 RX bytes. The controller holds the bus between batches and sends STOP after the final message. Each batch has a 500 ms completion timeout.
Error |
Meaning |
|---|---|
|
The target did not acknowledge |
|
Arbitration was lost |
|
Hardware or completion timeout |
|
Unexpected receive FIFO count |
The driver includes bus recovery. Repeated timeouts should also be checked against the pull-ups, wiring, bus speed, and target behavior.
SPI
GPSPI2 and GPSPI3 can operate as a host or as a target. Choose the matching
overlay for the instance and role, for example gpspi2 or gpspi2-target.
Host clients use the Linux SPI API. Applications using spidev select their mode, clock rate, and transfer buffers through its ioctls. Host mode accepts only 8-bit words. The supplied host overlays set a 20 MHz maximum for their spidev child; the requested rate must also fit the controller’s clock range. The host loopback example starts at 100 kHz.
Target transfers
Target mode waits for an external host to supply the clock and chip select. It supports modes 0–3, active-high chip select, and 8-, 16-, or 32-bit words. The transfer length must be a whole number of words.
Setting |
Limit |
|---|---|
Transfer with DMA |
4096 bytes |
FIFO-only transfer |
64 bytes |
Wait for the external host |
Interruptible; no fixed timeout |
DMA completion after the transaction |
100 ms for each required direction |
The target converts little-endian Linux words to the selected wire byte order. For 16- and 32-bit MSB-first transfers, bytes within each word are reversed on transmit and converted back on receive.
Allow time for the target to arm each transfer before asserting chip select. Applications needing a ready signal should implement that handshake separately. Target mode uses a single data lane and has no separate command, address, or dummy phases.
An interrupted or aborted wait returns EINTR. An unexpected transaction
length returns EMSGSIZE, and a DMA completion timeout returns ETIMEDOUT.
I2S and TDM
I2S0 and I2S1 use ALSA SoC with GDMA-backed playback and capture. After enabling the appropriate overlay, list the PCM devices:
aplay -l
arecord -l
Use the card and device numbers from that output in your application.
The shipped i2s0 and i2s1 overlays consume external BCLK and frame clock
for both playback and capture. They need a clock-producing codec or test
peer. A DAC that also consumes those clocks needs a different card and pin
configuration, as shown in the
complete audio example.
PCM settings
Setting |
Values |
|---|---|
Sample formats |
|
Sample rates |
8–192 kHz, subject to clock and card configuration |
Channels |
1–16 |
Period size |
256–4032 bytes |
Periods per buffer |
2–8 |
Playback and capture share MCLK and must use the same sample rate when both streams are configured. Configure both streams with compatible clock settings. ALSA handles cache synchronization for the non-coherent DMA buffers.
Framing and clocks
The CPU DAI supports I2S, left-justified, DSP A, and DSP B framing. It can provide both BCLK and frame clock, or consume both from the other device. Frame-clock inversion is supported. Mixed clock roles, bit-clock inversion, and an external MCLK input are currently unsupported.
set_sysclk() uses ID 0 and SND_SOC_CLOCK_OUT for internal MCLK. A rate of
zero selects MCLK automatically. When consuming external BCLK, the internal
module clock must run at least eight times faster than BCLK.
TDM slots
Use set_tdm_slot() to select 1–16 slots, each 8–32 bits wide. The slot width
must fit the sample, and the total number of bits in a frame must be even.
Nonzero TX/RX masks select the active slots and must contain one bit for each
PCM channel. Passing zero slots with zero masks clears the explicit slot setup.
Release the configured stream before changing its format, slots, or MCLK. Reapplying an identical setting is allowed.
Connect an external codec
Use an ASoC machine driver, such as simple-audio-card, for a board with an
external codec. Add the following properties to the selected controller:
&i2s0 {
#sound-dai-cells = <0>;
espressif,external-card;
status = "okay";
};
Then describe the CPU/codec link, pins, framing, clocks, and any TDM settings
in the machine card. espressif,external-card disables the built-in dummy
card so the external card can use the controller. Enable the machine driver
and the selected codec driver in the kernel configuration as well; the full
configuration alone does not select CONFIG_SND_SIMPLE_CARD or a real codec.
The machine driver’s format setup selects the clock roles for both directions.
The shipped dummy-card overlays use clock inputs for both directions.
Raw PDM options are also present in the driver; PCM-to-PDM conversion is not provided by these options.
Storage, networking, and other peripherals
Use the MMC block layer for SD cards, SocketCAN for TWAI, and the normal Linux network interfaces for Ethernet. Their overlays select the controller and pins; the carrier board supplies the socket, transceiver, or PHY.
The base device tree enables DWC2 host mode, including USB storage; ext4 support
is built into the standard kernel. Use esp32-config usb for managed host,
ACM serial and ECM network modes. The manager applies usb-device temporarily,
creates the selected ConfigFS gadget and binds it to the UDC. A raw usb-device
overlay by itself only switches the controller role; custom gadget developers
must configure and bind their own function. Do not give a manually configured
gadget and the manager ownership of the same UDC. Unmount USB filesystems and
disable USB-backed swap before switching roles. The
storage and gadget examples cover setup
and cleanup; implementation availability is separate from the recorded
hardware status in the support matrix.
Timing and analog devices use their Linux subsystem interfaces. In the
timers overlay, timer 0 of each group is available to applications; timer 1
is reserved for CPU idle wakeups. Analog and digital routes can share physical
pads, so choose one function for each pin.
Driver sources are under linux-esp32-s31/drivers/, with audio under
sound/soc/espressif/. See Adding a driver
for integration steps.