Skip to main content

Audio Codec Driver Guide

A codec driver in TuyaOpen connects an audio codec IC to the tdl_audio_* application interface, so an app can play and capture PCM without touching the I2S or I2C buses directly. This guide integrates a codec for voice interaction, audio playback, and AI applications.

Prerequisitesโ€‹

Audio Architectureโ€‹

TDL Audio Interfaceโ€‹

The application interacts through tdl_audio_*:

tdl_audio_find("audio_device", &handle);
tdl_audio_open(handle, &audio_cfg);
tdl_audio_play(handle, pcm_data, len);
tdl_audio_close(handle);

Platform Differencesโ€‹

AspectT5AIESP32-S3
TDD locationsrc/peripherals/audio_codecs/tdd_audio/boards/ESP32/common/audio/
I2S driverTKL tkl_i2s_*ESP-IDF i2s_channel_*
I2C controlTKL tkl_i2c_*ESP-IDF i2c_master_*
Codec libraryInternalesp_codec_dev (ESP-IDF component)
Supported codecsPlatform audio ICES8311, ES8388, ES8389, no-codec (DAC)

ESP32 Audio Codec Registration Flowโ€‹

Using ES8311 as example (from boards/ESP32/common/audio/tdd_audio_8311_codec.c):

1. Configure the codecโ€‹

TDD_AUDIO_8311_CODEC_T codec_cfg = {
.i2c_cfg = {
.i2c_scl_io = I2C_SCL_IO,
.i2c_sda_io = I2C_SDA_IO,
.i2c_port = 0,
.i2c_addr = 0x18,
},
.i2s_cfg = {
.i2s_mclk_io = I2S_MCK_IO,
.i2s_bclk_io = I2S_BCK_IO,
.i2s_ws_io = I2S_WS_IO,
.i2s_dout_io = I2S_DO_IO,
.i2s_din_io = I2S_DI_IO,
},
.sample_rate = 16000,
.pa_gpio = GPIO_OUTPUT_PA,
};

2. Register in board initโ€‹

void board_register_hardware(void)
{
tdd_audio_8311_codec_register("audio", codec_cfg);
}

3. TDD internallyโ€‹

  • Creates I2C master bus via ESP-IDF
  • Creates I2S duplex channel via ESP-IDF
  • Initializes ES8311 via esp_codec_dev
  • Fills TDD_AUDIO_INTFS_T (open, play, config, close)
  • Calls tdl_audio_driver_register("audio", handle, &intfs, &info)

Available ESP32 Audio Codecsโ€‹

CodecFileI2C AddrNotes
ES8311tdd_audio_8311_codec.c0x18Common on S3 boards
ES8388tdd_audio_es8388_codec.c0x20Alternate codec
ES8389tdd_audio_es8389_codec.cVariesDNESP32S3-BOX2
No codectdd_audio_no_codec.cN/ADirect DAC output
ATK no codectdd_audio_atk_no_codec.cN/AAlternate no-codec

Writing a New Codec TDDโ€‹

To add support for a new codec (e.g., WM8960):

  1. Create tdd_audio_wm8960.c and tdd_audio_wm8960.h
  2. Implement the four interface functions: open, play, config, close
  3. In open: init I2C, init I2S, configure codec registers
  4. In play: write PCM data to I2S channel
  5. In config: handle sample rate changes, volume, mute
  6. In close: stop I2S, power down codec
  7. Call tdl_audio_driver_register() at the end of your register function

Referencesโ€‹