boards/xtensa/esp32s2-kaluga-1: Add support for the ES8311 codec

Adds support for the ES8311 codec on the ESP32-S2-Kaluga-1 board. This commit also adds basic configurations for testing and updates the board documentation.
This commit is contained in:
Lucas Saavedra Vaz
2023-05-04 14:58:48 -03:00
committed by Alan Carvalho de Assis
parent 8b9dc54a0a
commit b738379684
12 changed files with 660 additions and 13 deletions
@@ -602,7 +602,7 @@ The ``nxlooper`` application captures data from the audio device with receiving
capabilities (the I2S1 on this example) and forwards the audio data frame to capabilities (the I2S1 on this example) and forwards the audio data frame to
the audio device with transmitting capabilities (the I2S0 on this example). the audio device with transmitting capabilities (the I2S0 on this example).
After successfully built and flashed, run on the boards's terminal:: After successfully built and flashed, run on the boards' terminal::
nsh> nxlooper nsh> nxlooper
nxlooper> loopback nxlooper> loopback
@@ -180,11 +180,41 @@ Configurations
All of the configurations presented below can be tested by running the following commands:: All of the configurations presented below can be tested by running the following commands::
$ ./tools/configure.sh esp32s2-kaluga-1:<config_name> $ ./tools/configure.sh esp32s2-kaluga-1:<config_name>
$ make flash ESPTOOL_PORT=/dev/ttyUSB0 -j $ make flash ESPTOOL_PORT=/dev/ttyUSB1 -j
Where <config_name> is the name of board configuration you want to use, i.e.: nsh, buttons, wifi... Where <config_name> is the name of board configuration you want to use, i.e.: nsh, buttons, wifi...
Then use a serial console terminal like ``picocom`` configured to 115200 8N1. Then use a serial console terminal like ``picocom`` configured to 115200 8N1.
audio
-----
This configuration uses the I2S peripheral and the ES8311 audio
codec to play an audio file. The easiest way of playing an uncompressed file
is embedding into the firmware. This configuration selects
`romfs example <https://github.com/apache/nuttx-apps/tree/master/examples/romfs>`__
to allow that.
**ROMFS example**
Prepare and build the ``audio`` defconfig::
$ make -j distclean && ./tools/configure.sh esp32s2-kaluga-1:audio && make
This will create a temporary folder in ``apps/examples/romfs/testdir``. Move
a PCM-encoded (``.wav``) audio file with 16 or 24 bits/sample (sampled at 16~48kHz)
to this folder.
.. note:: You can use :download:`this 440 Hz sinusoidal tone <tone.wav>`.
The audio file should be located at ``apps/examples/romfs/testdir/tone.wav``
Build the project again and flash it (make sure not to clean it, just build)
After successfully built and flashed, load the romfs and play it::
nsh> romfs
nsh> nxplayer
nxplayer> play /usr/share/local/tone.wav
buttons buttons
------- -------
@@ -210,6 +240,14 @@ the ``buttons`` application and pressing on any of the available board buttons a
Sample = 64 Sample = 64
Sample = 0 Sample = 0
i2c
---
This configuration can be used to scan and manipulate I2C devices.
You can scan for all I2C devices using the following command::
nsh> i2c dev 0x00 0x7f
lvgl_ili9341 lvgl_ili9341
------------ ------------
@@ -219,8 +257,8 @@ driver with the ILI9341 display. You can find LVGL here::
https://www.lvgl.io/ https://www.lvgl.io/
https://github.com/lvgl/lvgl https://github.com/lvgl/lvgl
This configuration uses the LVGL demonstration at `apps/examples/lvgldemo` and This configuration uses the LVGL demonstration at ``apps/examples/lvgldemo`` and
can be executed by running the `lvgldemo` application. can be executed by running the ``lvgldemo`` application.
lvgl_st7789 lvgl_st7789
----------- -----------
@@ -231,11 +269,30 @@ driver with the ST7799 display. You can find LVGL here::
https://www.lvgl.io/ https://www.lvgl.io/
https://github.com/lvgl/lvgl https://github.com/lvgl/lvgl
This configuration uses the LVGL demonstration at `apps/examples/lvgldemo` and This configuration uses the LVGL demonstration at ``apps/examples/lvgldemo`` and
can be executed by running the `lvgldemo` application. can be executed by running the ``lvgldemo`` application.
nsh nsh
--- ---
Basic NuttShell configuration (console enabled in UART0, exposed via Basic NuttShell configuration (console enabled in UART0, exposed via
USB connection by means of CP2102 converter, at 115200 bps). USB connection by means of CP2102 converter, at 115200 bps).
nxlooper
--------
The ``nxlooper`` application captures data from the audio device with receiving
capabilities and forwards the audio data frame to the audio device with transmitting
capabilities.
After successfully built and flashed, run on the boards' terminal::
nsh> nxlooper
nxlooper> loopback
.. note:: ``loopback`` command default arguments for the channel configuration,
the data width and the sample rate are, respectively, 2 channels,
16 bits/sample and 48KHz. These arguments can be supplied to select
different audio formats, for instance::
nxlooper> loopback 2 8 44100
@@ -0,0 +1,90 @@
/****************************************************************************
* boards/xtensa/esp32s2/common/include/esp32s2_es8311.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
#ifndef __BOARDS_XTENSA_ESP32S2_COMMON_INCLUDE_ESP32S2_ES8311_H
#define __BOARDS_XTENSA_ESP32S2_COMMON_INCLUDE_ESP32S2_ES8311_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdint.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/****************************************************************************
* Type Definitions
****************************************************************************/
/****************************************************************************
* Public Types
****************************************************************************/
/****************************************************************************
* Public Data
****************************************************************************/
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
/****************************************************************************
* Inline Functions
****************************************************************************/
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
/****************************************************************************
* Name: esp32s2_es8311_initialize
*
* Description:
* This function is called by platform-specific, setup logic to configure
* and register the ES8311 device. This function will register the driver
* as /dev/audio/pcm[x] where x is determined by the I2S port number.
*
* Input Parameters:
* i2c_port - The I2C port used for the device;
* i2c_addr - The I2C address used by the device;
* i2c_freq - The I2C frequency used for the device.
*
* Returned Value:
* Zero is returned on success. Otherwise, a negated errno value is
* returned to indicate the nature of the failure.
*
****************************************************************************/
int esp32s2_es8311_initialize(int i2c_port, uint8_t i2c_addr, int i2c_freq);
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* __BOARDS_XTENSA_ESP32S2_COMMON_INCLUDE_ESP32S2_ES8311_H */
@@ -44,6 +44,10 @@ ifeq ($(CONFIG_LCD_ST7789),y)
CSRCS += esp32s2_st7789.c CSRCS += esp32s2_st7789.c
endif endif
ifeq ($(CONFIG_AUDIO_ES8311),y)
CSRCS += esp32s2_es8311.c
endif
DEPPATH += --dep-path src DEPPATH += --dep-path src
VPATH += :src VPATH += :src
CFLAGS += $(shell $(INCDIR) "$(CC)" $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)src) CFLAGS += $(shell $(INCDIR) "$(CC)" $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)src)
@@ -37,7 +37,8 @@
#include "esp32s2_i2s.h" #include "esp32s2_i2s.h"
#if defined(CONFIG_ESP32S2_I2S) && !defined(CONFIG_AUDIO_CS4344) #if defined(CONFIG_ESP32S2_I2S) && !defined(CONFIG_AUDIO_CS4344) && \
!defined(CONFIG_AUDIO_ES8311)
/**************************************************************************** /****************************************************************************
* Public Functions * Public Functions
@@ -152,4 +153,5 @@ int board_i2sdev_initialize(bool enable_tx, bool enable_rx)
return ret; return ret;
} }
#endif /* (CONFIG_ESP32S2_I2S) && !defined (CONFIG_AUDIO_CS4344) */ #endif /* (CONFIG_ESP32S2_I2S) && !(CONFIG_AUDIO_CS4344) *
* !(CONFIG_AUDIO_ES8311) */
@@ -0,0 +1,212 @@
/****************************************************************************
* boards/xtensa/esp32s2/common/src/esp32s2_es8311.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdbool.h>
#include <stdio.h>
#include <debug.h>
#include <assert.h>
#include <errno.h>
#include <nuttx/irq.h>
#include <nuttx/audio/i2s.h>
#include <nuttx/audio/pcm.h>
#include <nuttx/audio/es8311.h>
#include <nuttx/i2c/i2c_master.h>
#include <nuttx/kmalloc.h>
#include <arch/board/board.h>
#include "esp32s2_i2c.h"
#include "esp32s2_i2s.h"
#if defined(CONFIG_ESP32S2_I2S) && defined(CONFIG_AUDIO_ES8311)
/****************************************************************************
* Private Data
****************************************************************************/
static struct es8311_lower_s g_es8311_lower[2];
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: esp32s2_es8311_initialize
*
* Description:
* This function is called by platform-specific, setup logic to configure
* and register the ES8311 device. This function will register the driver
* as /dev/audio/pcm[x] where x is determined by the I2S port number.
*
* Input Parameters:
* i2c_port - The I2C port used for the device;
* i2c_addr - The I2C address used by the device;
* i2c_freq - The I2C frequency used for the device.
*
* Returned Value:
* Zero is returned on success. Otherwise, a negated errno value is
* returned to indicate the nature of the failure.
*
****************************************************************************/
int esp32s2_es8311_initialize(int i2c_port, uint8_t i2c_addr, int i2c_freq)
{
struct audio_lowerhalf_s *es8311;
struct i2s_dev_s *i2s;
struct i2c_master_s *i2c;
static bool initialized = false;
int ret;
audinfo("i2c_port %d, i2c_addr %d, i2c_freq %d\n",
i2c_port, i2c_addr, i2c_freq);
/* Have we already initialized? Since we never uninitialize we must
* prevent multiple initializations. This is necessary, for example,
* when the touchscreen example is used as a built-in application in
* NSH and can be called numerous time. It will attempt to initialize
* each time.
*/
if (!initialized)
{
/* Get an instance of the I2S interface for the ES8311 data channel */
i2s = esp32s2_i2sbus_initialize();
if (i2s == NULL)
{
auderr("ERROR: Failed to initialize I2S\n");
ret = -ENODEV;
goto errout;
}
i2c = esp32s2_i2cbus_initialize(i2c_port);
if (i2c == NULL)
{
auderr("ERROR: Failed to initialize I2C%d\n", i2c_port);
ret = -ENODEV;
goto errout;
}
/* Check wheter to enable a simple character driver that supports I2S
* transfers via a read() and write(). The intent of this driver is to
* support I2S testing. It is not an audio driver but does conform to
* some of the buffer management heuristics of an audio driver. It is
* not suitable for use in any real driver application in its current
* form. The i2schar driver will be initialized at /dev/i2schar0
*/
#ifdef CONFIG_AUDIO_I2SCHAR
ret = i2schar_register(i2s, 0);
if (ret < 0)
{
auderr("ERROR: i2schar_register failed: %d\n", ret);
goto errout;
}
#endif
/* Now we can use this I2S interface to initialize the ES8311 output
* which will return an audio interface.
*/
g_es8311_lower[0].address = i2c_addr;
g_es8311_lower[0].frequency = i2c_freq;
es8311 = es8311_initialize(i2c, i2s, &g_es8311_lower[0]);
if (es8311 == NULL)
{
auderr("ERROR: Failed to initialize the ES8311\n");
ret = -ENODEV;
goto errout;
}
#ifdef CONFIG_SYSTEM_NXLOOPER
/* If nxlooper is selected, the playback buffer is not rendered as
* a WAV file. Therefore, PCM decode will fail while processing such
* output buffer. In such a case, we bypass the PCM decode.
*/
ret = audio_register("pcm0", es8311);
#else
/* Now we can embed the ES8311/I2S conglomerate into a PCM decoder
* instance so that we will have a PCM front end for the the ES8311
* driver.
*/
struct audio_lowerhalf_s *pcm = pcm_decode_initialize(es8311);
if (pcm == NULL)
{
auderr("ERROR: Failed create the PCM decoder\n");
ret = -ENODEV;
goto errout;
}
/* Finally, we can register the PCM/ES8311/I2S audio device. */
ret = audio_register("pcm0", pcm);
#endif
if (ret < 0)
{
auderr("ERROR: Failed to register /dev/pcm0 device: %d\n", ret);
goto errout;
}
/* Now we can use this I2S interface to initialize the ES8311 input
* which will return an audio interface.
*/
g_es8311_lower[1].address = i2c_addr;
g_es8311_lower[1].frequency = i2c_freq;
es8311 = es8311_initialize(i2c, i2s, &g_es8311_lower[1]);
if (es8311 == NULL)
{
auderr("ERROR: Failed to initialize the ES8311\n");
ret = -ENODEV;
goto errout;
}
/* Finally, we can register the PCM/ES8311/I2S audio device. */
ret = audio_register("pcm_in0", es8311);
if (ret < 0)
{
auderr("ERROR: Failed to register /dev/pcm_in0 device: %d\n", ret);
goto errout;
}
/* Now we are initialized */
initialized = true;
}
return OK;
errout:
return ret;
}
#endif /* CONFIG_ESP32S2_I2S && CONFIG_AUDIO_ES8311 */
@@ -0,0 +1,80 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_ARCH_LEDS is not set
# CONFIG_AUDIO_FORMAT_MP3 is not set
# CONFIG_ESP32S2_I2S_RX is not set
# CONFIG_NSH_ARGCAT is not set
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
CONFIG_ARCH="xtensa"
CONFIG_ARCH_BOARD="esp32s2-kaluga-1"
CONFIG_ARCH_BOARD_COMMON=y
CONFIG_ARCH_BOARD_ESP32S2_KALUGA_1=y
CONFIG_ARCH_CHIP="esp32s2"
CONFIG_ARCH_CHIP_ESP32S2=y
CONFIG_ARCH_CHIP_ESP32S2WROVER=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_ARCH_XTENSA=y
CONFIG_AUDIO=y
CONFIG_AUDIO_ES8311=y
CONFIG_AUDIO_EXCLUDE_BALANCE=y
CONFIG_AUDIO_EXCLUDE_FFORWARD=y
CONFIG_AUDIO_EXCLUDE_TONE=y
CONFIG_BOARDCTL_ROMDISK=y
CONFIG_BOARD_LOOPSPERMSEC=16717
CONFIG_BUILTIN=y
CONFIG_DEFAULT_TASK_STACKSIZE=4096
CONFIG_DRIVERS_AUDIO=y
CONFIG_ES8311_BUFFER_SIZE=4096
CONFIG_ES8311_SRC_BCLK=y
CONFIG_ESP32S2_I2C0=y
CONFIG_ESP32S2_I2C0_SCLPIN=7
CONFIG_ESP32S2_I2C0_SDAPIN=8
CONFIG_ESP32S2_I2S=y
CONFIG_ESP32S2_I2S_BCLKPIN=18
CONFIG_ESP32S2_I2S_DATA_BIT_WIDTH_16BIT=y
CONFIG_ESP32S2_I2S_DOUTPIN=12
CONFIG_ESP32S2_I2S_MCLK=y
CONFIG_ESP32S2_I2S_MCLKPIN=35
CONFIG_ESP32S2_I2S_SAMPLE_RATE=48000
CONFIG_ESP32S2_I2S_WSPIN=17
CONFIG_ESP32S2_UART0=y
CONFIG_EXAMPLES_ROMFS=y
CONFIG_FS_PROCFS=y
CONFIG_FS_ROMFS=y
CONFIG_HAVE_CXX=y
CONFIG_HAVE_CXXINITIALIZE=y
CONFIG_I2CTOOL_DEFFREQ=100000
CONFIG_I2CTOOL_MAXBUS=1
CONFIG_I2C_RESET=y
CONFIG_I2S_DMADESC_NUM=4
CONFIG_IDLETHREAD_STACKSIZE=3072
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INIT_STACKSIZE=2048
CONFIG_INTELHEX_BINARY=y
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_LINELEN=64
CONFIG_NSH_READLINE=y
CONFIG_POSIX_SPAWN_DEFAULT_STACKSIZE=2048
CONFIG_PREALLOC_TIMERS=4
CONFIG_PTHREAD_STACK_DEFAULT=2048
CONFIG_RAM_SIZE=114688
CONFIG_RAM_START=0x20000000
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_HPWORK=y
CONFIG_SCHED_LPWORK=y
CONFIG_SCHED_WAITPID=y
CONFIG_START_DAY=6
CONFIG_START_MONTH=12
CONFIG_START_YEAR=2011
CONFIG_SYSTEM_I2CTOOL=y
CONFIG_SYSTEM_NSH=y
CONFIG_SYSTEM_NSH_STACKSIZE=2048
CONFIG_SYSTEM_NXPLAYER=y
CONFIG_UART0_SERIAL_CONSOLE=y
@@ -0,0 +1,51 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_ARCH_LEDS is not set
# CONFIG_NDEBUG is not set
# CONFIG_NSH_ARGCAT is not set
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
CONFIG_ARCH="xtensa"
CONFIG_ARCH_BOARD="esp32s2-kaluga-1"
CONFIG_ARCH_BOARD_COMMON=y
CONFIG_ARCH_BOARD_ESP32S2_KALUGA_1=y
CONFIG_ARCH_CHIP="esp32s2"
CONFIG_ARCH_CHIP_ESP32S2=y
CONFIG_ARCH_CHIP_ESP32S2WROVER=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_ARCH_XTENSA=y
CONFIG_BOARD_LOOPSPERMSEC=16717
CONFIG_BUILTIN=y
CONFIG_ESP32S2_I2C0=y
CONFIG_ESP32S2_I2C0_SCLPIN=7
CONFIG_ESP32S2_I2C0_SDAPIN=8
CONFIG_ESP32S2_UART0=y
CONFIG_FS_PROCFS=y
CONFIG_HAVE_CXX=y
CONFIG_HAVE_CXXINITIALIZE=y
CONFIG_I2CTOOL_DEFFREQ=100000
CONFIG_I2CTOOL_MAXBUS=0
CONFIG_I2C_RESET=y
CONFIG_IDLETHREAD_STACKSIZE=3072
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INTELHEX_BINARY=y
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_LINELEN=64
CONFIG_NSH_READLINE=y
CONFIG_PREALLOC_TIMERS=4
CONFIG_RAM_SIZE=114688
CONFIG_RAM_START=0x20000000
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_WAITPID=y
CONFIG_START_DAY=28
CONFIG_START_MONTH=6
CONFIG_START_YEAR=2022
CONFIG_SYSTEM_I2CTOOL=y
CONFIG_SYSTEM_NSH=y
CONFIG_UART0_SERIAL_CONSOLE=y
@@ -0,0 +1,78 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_ARCH_LEDS is not set
# CONFIG_AUDIO_FORMAT_MP3 is not set
# CONFIG_NSH_ARGCAT is not set
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
CONFIG_ARCH="xtensa"
CONFIG_ARCH_BOARD="esp32s2-kaluga-1"
CONFIG_ARCH_BOARD_COMMON=y
CONFIG_ARCH_BOARD_ESP32S2_KALUGA_1=y
CONFIG_ARCH_CHIP="esp32s2"
CONFIG_ARCH_CHIP_ESP32S2=y
CONFIG_ARCH_CHIP_ESP32S2WROVER=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_ARCH_XTENSA=y
CONFIG_AUDIO=y
CONFIG_AUDIO_ES8311=y
CONFIG_AUDIO_EXCLUDE_BALANCE=y
CONFIG_AUDIO_EXCLUDE_FFORWARD=y
CONFIG_AUDIO_EXCLUDE_TONE=y
CONFIG_BOARDCTL_ROMDISK=y
CONFIG_BOARD_LOOPSPERMSEC=16717
CONFIG_BUILTIN=y
CONFIG_DEFAULT_TASK_STACKSIZE=4096
CONFIG_DRIVERS_AUDIO=y
CONFIG_ES8311_BUFFER_SIZE=4096
CONFIG_ES8311_SRC_BCLK=y
CONFIG_ESP32S2_I2C0=y
CONFIG_ESP32S2_I2C0_SCLPIN=7
CONFIG_ESP32S2_I2C0_SDAPIN=8
CONFIG_ESP32S2_I2S=y
CONFIG_ESP32S2_I2S_BCLKPIN=18
CONFIG_ESP32S2_I2S_DATA_BIT_WIDTH_16BIT=y
CONFIG_ESP32S2_I2S_DINPIN=34
CONFIG_ESP32S2_I2S_DOUTPIN=12
CONFIG_ESP32S2_I2S_MCLK=y
CONFIG_ESP32S2_I2S_MCLKPIN=35
CONFIG_ESP32S2_I2S_SAMPLE_RATE=48000
CONFIG_ESP32S2_I2S_WSPIN=17
CONFIG_ESP32S2_UART0=y
CONFIG_FS_PROCFS=y
CONFIG_HAVE_CXX=y
CONFIG_HAVE_CXXINITIALIZE=y
CONFIG_I2CTOOL_DEFFREQ=100000
CONFIG_I2CTOOL_MAXBUS=1
CONFIG_I2C_RESET=y
CONFIG_I2S_DMADESC_NUM=4
CONFIG_IDLETHREAD_STACKSIZE=3072
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INIT_STACKSIZE=2048
CONFIG_INTELHEX_BINARY=y
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_LINELEN=64
CONFIG_NSH_READLINE=y
CONFIG_POSIX_SPAWN_DEFAULT_STACKSIZE=2048
CONFIG_PREALLOC_TIMERS=4
CONFIG_PTHREAD_STACK_DEFAULT=2048
CONFIG_RAM_SIZE=114688
CONFIG_RAM_START=0x20000000
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_HPWORK=y
CONFIG_SCHED_LPWORK=y
CONFIG_SCHED_WAITPID=y
CONFIG_START_DAY=6
CONFIG_START_MONTH=12
CONFIG_START_YEAR=2011
CONFIG_SYSTEM_I2CTOOL=y
CONFIG_SYSTEM_NSH=y
CONFIG_SYSTEM_NSH_STACKSIZE=2048
CONFIG_SYSTEM_NXLOOPER=y
CONFIG_UART0_SERIAL_CONSOLE=y
@@ -75,6 +75,17 @@
#define GPIO_LCD_RST 16 #define GPIO_LCD_RST 16
#define GPIO_LCD_BCKL 6 #define GPIO_LCD_BCKL 6
/* ES8311 Codec */
#define ES8311_I2C_CCLK 7 /* SCL */
#define ES8311_I2C_CDATA 8 /* SDA */
#define ES8311_I2S_MCLK 35 /* Master clock */
#define ES8311_I2S_SCLK 18 /* Audio data bit clock */
#define ES8311_I2S_LRCK 17 /* Audio data left and right clock */
#define ES8311_I2S_DSDIN 34 /* DAC audio data (to speakers) */
#define ES8311_I2S_ASDOUT 12 /* ADC audio data (from microphone) */
#define ES8311_GPIO_PA_EN 10 /* Power amplifier */
/* LED definitions **********************************************************/ /* LED definitions **********************************************************/
/* Define how many LEDs this board has (needed by userleds) */ /* Define how many LEDs this board has (needed by userleds) */
@@ -87,4 +98,11 @@
#define BOARD_NGPIOIN 1 /* Amount of GPIO Input without Interruption */ #define BOARD_NGPIOIN 1 /* Amount of GPIO Input without Interruption */
#define BOARD_NGPIOINT 1 /* Amount of GPIO Input w/ Interruption pins */ #define BOARD_NGPIOINT 1 /* Amount of GPIO Input w/ Interruption pins */
/* Peripherals definitions **************************************************/
/* ES8311 CODEC */
#define ES8311_I2C_FREQ 100000
#define ES8311_I2C_ADDR 0x18
#endif /* __BOARDS_XTENSA_ESP32S2_ESP32S2_KALUGA_1_INCLUDE_BOARD_H */ #endif /* __BOARDS_XTENSA_ESP32S2_ESP32S2_KALUGA_1_INCLUDE_BOARD_H */
@@ -27,6 +27,7 @@
#include <nuttx/config.h> #include <nuttx/config.h>
#include <nuttx/compiler.h> #include <nuttx/compiler.h>
#include <stdint.h> #include <stdint.h>
/**************************************************************************** /****************************************************************************
@@ -35,6 +36,10 @@
/* ESP32S2-Kaluga-1 GPIOs ***************************************************/ /* ESP32S2-Kaluga-1 GPIOs ***************************************************/
/* Audio Amplifier */
#define SPEAKER_ENABLE_GPIO 10
/* Buttons */ /* Buttons */
#define BUTTON_BOOT 0 #define BUTTON_BOOT 0
@@ -144,7 +149,7 @@ int board_i2c_init(void);
* *
* Description: * Description:
* This function is called by platform-specific, setup logic to configure * This function is called by platform-specific, setup logic to configure
* and register the generic I2S audio driver. This function will register * and register the generic I2S audio driver. This function will register
* the driver as /dev/audio/pcm[x] where x is determined by the I2S port * the driver as /dev/audio/pcm[x] where x is determined by the I2S port
* number. * number.
* *
@@ -152,14 +157,35 @@ int board_i2c_init(void);
* None. * None.
* *
* Returned Value: * Returned Value:
* Zero is returned on success. Otherwise, a negated errno value is * Zero is returned on success. Otherwise, a negated errno value is
* returned to indicate the nature of the failure. * returned to indicate the nature of the failure.
* *
****************************************************************************/ ****************************************************************************/
#if defined(CONFIG_ESP32S2_I2S) && !defined(CONFIG_AUDIO_CS4344) #if defined(CONFIG_ESP32S2_I2S) && !defined(CONFIG_AUDIO_ES8311)
int board_i2sdev_initialize(void); int board_i2sdev_initialize(void);
#endif #endif
/****************************************************************************
* Name: esp32s2_es8311_initialize
*
* Description:
* This function is called by platform-specific, setup logic to configure
* and register the ES8311 device. This function will register the driver
* as /dev/audio/pcm[x] where x is determined by the I2S port number.
*
* Input Parameters:
* i2c_port - The I2C port used for the device;
* i2c_addr - The I2C address used by the device;
* i2c_freq - The I2C frequency used for the device.
*
* Returned Value:
* Zero is returned on success. Otherwise, a negated errno value is
* returned to indicate the nature of the failure.
*
****************************************************************************/
int esp32s2_es8311_initialize(int i2c_port, uint8_t i2c_addr, int i2c_freq);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* __BOARDS_XTENSA_ESP32S2_ESP32S2_KALUGA_1_SRC_ESP32S2_KALUGA_1_H */ #endif /* __BOARDS_XTENSA_ESP32S2_ESP32S2_KALUGA_1_SRC_ESP32S2_KALUGA_1_H */
@@ -34,9 +34,12 @@
#include <syslog.h> #include <syslog.h>
#include <debug.h> #include <debug.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h> #include <errno.h>
#include <nuttx/fs/fs.h> #include <nuttx/fs/fs.h>
#include <arch/board/board.h>
#include "esp32s2_gpio.h"
#ifdef CONFIG_USERLED #ifdef CONFIG_USERLED
# include <nuttx/leds/userled.h> # include <nuttx/leds/userled.h>
@@ -54,6 +57,10 @@
# include "esp32s2_i2c.h" # include "esp32s2_i2c.h"
#endif #endif
#ifdef CONFIG_ESP32_I2S
# include "esp32s2_i2s.h"
#endif
#ifdef CONFIG_ESP32S2_RT_TIMER #ifdef CONFIG_ESP32S2_RT_TIMER
# include "esp32s2_rt_timer.h" # include "esp32s2_rt_timer.h"
#endif #endif
@@ -235,6 +242,28 @@ int esp32s2_bringup(void)
} }
#endif #endif
#ifdef CONFIG_ESP32S2_I2S
/* Configure I2S0 */
#ifdef CONFIG_AUDIO_ES8311
/* Configure ES8311 audio on I2C0 and I2S0 */
esp32s2_configgpio(SPEAKER_ENABLE_GPIO, OUTPUT);
esp32s2_gpiowrite(SPEAKER_ENABLE_GPIO, true);
ret = esp32s2_es8311_initialize(ESP32S2_I2C0, ES8311_I2C_ADDR,
ES8311_I2C_FREQ);
if (ret != OK)
{
syslog(LOG_ERR, "Failed to initialize ES8311 audio: %d\n", ret);
}
#endif /* CONFIG_AUDIO_ES8311 */
#endif /* CONFIG_ESP32S2_I2S */
/* If we got here then perhaps not all initialization was successful, but /* If we got here then perhaps not all initialization was successful, but
* at least enough succeeded to bring-up NSH with perhaps reduced * at least enough succeeded to bring-up NSH with perhaps reduced
* capabilities. * capabilities.