From b87eb7c82fcdd2310d571521e022aebda256cf2b Mon Sep 17 00:00:00 2001 From: Alan Carvalho de Assis Date: Sat, 25 Mar 2023 11:21:18 -0300 Subject: [PATCH] esp32: Add Ai-Thinker ESP32 Audio Kit board This commit adds support to Ai-Thinker ESP32 Audio Kit V2.2 A247 board. There are two modules of this board. The old model uses AC101 audio and is not supported currently (AFAIK there is no AC101 driver) and the new version uses the ES8388 audio codec. This model is supported by this commit. Just read the documentation to test playing an audio file. TODO: Test audio recording. --- .../esp32-audio-config-file.png | Bin 0 -> 21276 bytes .../esp32-audio-kit/esp32-audio-kit.png | Bin 0 -> 161397 bytes .../esp32/boards/esp32-audio-kit/index.rst | 155 ++++++ boards/Kconfig | 16 + boards/xtensa/esp32/esp32-audio-kit/Kconfig | 8 + .../esp32-audio-kit/configs/audio/defconfig | 120 +++++ .../esp32-audio-kit/configs/nsh/defconfig | 44 ++ .../esp32-audio-kit/configs/wifi/defconfig | 90 ++++ .../esp32/esp32-audio-kit/include/board.h | 78 +++ .../esp32-audio-kit/include/board_memorymap.h | 128 +++++ .../esp32/esp32-audio-kit/scripts/Make.defs | 72 +++ .../esp32/esp32-audio-kit/src/Make.defs | 51 ++ .../esp32-audio-kit/src/esp32-audio-kit.h | 181 +++++++ .../esp32/esp32-audio-kit/src/esp32_appinit.c | 80 ++++ .../esp32/esp32-audio-kit/src/esp32_boot.c | 101 ++++ .../esp32/esp32-audio-kit/src/esp32_bringup.c | 450 ++++++++++++++++++ .../esp32/esp32-audio-kit/src/esp32_buttons.c | 166 +++++++ .../esp32/esp32-audio-kit/src/esp32_gpio.c | 391 +++++++++++++++ .../esp32/esp32-audio-kit/src/esp32_mmcsd.c | 84 ++++ .../esp32/esp32-audio-kit/src/esp32_reset.c | 63 +++ .../esp32-audio-kit/src/esp32_userleds.c | 95 ++++ 21 files changed, 2373 insertions(+) create mode 100644 Documentation/platforms/xtensa/esp32/boards/esp32-audio-kit/esp32-audio-config-file.png create mode 100644 Documentation/platforms/xtensa/esp32/boards/esp32-audio-kit/esp32-audio-kit.png create mode 100644 Documentation/platforms/xtensa/esp32/boards/esp32-audio-kit/index.rst create mode 100644 boards/xtensa/esp32/esp32-audio-kit/Kconfig create mode 100644 boards/xtensa/esp32/esp32-audio-kit/configs/audio/defconfig create mode 100644 boards/xtensa/esp32/esp32-audio-kit/configs/nsh/defconfig create mode 100644 boards/xtensa/esp32/esp32-audio-kit/configs/wifi/defconfig create mode 100644 boards/xtensa/esp32/esp32-audio-kit/include/board.h create mode 100644 boards/xtensa/esp32/esp32-audio-kit/include/board_memorymap.h create mode 100644 boards/xtensa/esp32/esp32-audio-kit/scripts/Make.defs create mode 100644 boards/xtensa/esp32/esp32-audio-kit/src/Make.defs create mode 100644 boards/xtensa/esp32/esp32-audio-kit/src/esp32-audio-kit.h create mode 100644 boards/xtensa/esp32/esp32-audio-kit/src/esp32_appinit.c create mode 100644 boards/xtensa/esp32/esp32-audio-kit/src/esp32_boot.c create mode 100644 boards/xtensa/esp32/esp32-audio-kit/src/esp32_bringup.c create mode 100644 boards/xtensa/esp32/esp32-audio-kit/src/esp32_buttons.c create mode 100644 boards/xtensa/esp32/esp32-audio-kit/src/esp32_gpio.c create mode 100644 boards/xtensa/esp32/esp32-audio-kit/src/esp32_mmcsd.c create mode 100644 boards/xtensa/esp32/esp32-audio-kit/src/esp32_reset.c create mode 100644 boards/xtensa/esp32/esp32-audio-kit/src/esp32_userleds.c diff --git a/Documentation/platforms/xtensa/esp32/boards/esp32-audio-kit/esp32-audio-config-file.png b/Documentation/platforms/xtensa/esp32/boards/esp32-audio-kit/esp32-audio-config-file.png new file mode 100644 index 0000000000000000000000000000000000000000..c51fa32e29db74ad0e4ddd96042948f03527fa0b GIT binary patch literal 21276 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 S*>?aY#P;;rQx#U168;AO3v{#q literal 0 HcmV?d00001 diff --git a/Documentation/platforms/xtensa/esp32/boards/esp32-audio-kit/esp32-audio-kit.png b/Documentation/platforms/xtensa/esp32/boards/esp32-audio-kit/esp32-audio-kit.png new file mode 100644 index 0000000000000000000000000000000000000000..a3dd18a730000c3417d12fe37e6b559f1b7513f6 GIT binary patch literal 161397 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

cVhIILY;?H<=0v3va_$ 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 kd`_ is a development board for the ESP32 SoC from Espressif, based on Ai-Thinker ESP32-A1S audio module. + +.. list-table:: + :align: center + + * - .. figure:: esp32-audio-kit.png + :align: center + + Ai-Thinker ESP32 Audio Kit board + +Features +======== + + - ESP32-A1S module + - Audio Earphones Output + - Audio LINEIN Input + - 2 Microphones in the board (stereo audio input) + - 8 Buttons in the boards (1 RST Button and 7 user buttons) + - MicroSD card slot + +Some of the ESP32 I/O pins are broken out to the board's pin header. + +Serial Console +============== + +UART0 is, by default, the serial console. It connects to the on-board +Silabs CP2102 converter and is available on the USB connector (UART label). + +It will show up as /dev/ttyUSB[n] where [n] normally is 0 if you don't have +another USB/Serial adapter connected in your computer. + +Buttons and LEDs +================ + +Board Buttons +------------- + +There are eight buttons labeled as RST, BOOT, KEY1..KEY6. +The RST button is not available to software. + +The BOOT button is connected to IO0. On reset it is used as a strapping +pin to determine whether the chip boots normally or into the serial +bootloader. After reset, however, the BOOT button can be used for software +input. + +Board LEDs +---------- + +There are several on-board LEDs for that indicate the presence of power +and USB activity. + +I/O Mapping +=========== + +===== ========================= ========== +I/O Signal Notes +===== ========================= ========== +0 BOOT Button +2 DATA0 SDCard +4 DATA1 SDCard +5 KEY6 Button +12 DATA2 SDCard +13 KEY2 Button/DATA3 SDCard (DIP Switch) +14 CLK SDCard +15 CMD SDCard/JTAG MTDO (DIP Switch) +18 KEY5 Button +19 KEY3 Button/LED5 +21 CTRL Audio AMP +22 LED4 +23 KEY4 Button +34 SDCard Detect +36 KEY1 Button +===== ========================= ========== + +Configurations +============== + +All of the configurations presented below can be tested by running the following commands:: + + $ ./tools/configure.sh esp32-audio-kit: + $ make flash ESPTOOL_PORT=/dev/ttyUSB0 -j + +Where is the name of board configuration you want to use, i.e.: nsh, buttons, wifi... +Then use a serial console terminal like ``minicom`` or ``picocom`` configured to 115200 8N1. + +audio +----- + +This configuration uses the I2S0 peripheral and the ES8388 audio codec +present on the ESP32-Audio-Kit board to play an audio file streamed over +HTTP while connected to a Wi-Fi network. + +**Simple HTTP server** + +Prepare a PCM-encoded (`.wav`) audio file with 16 bits/sample (sampled at +44.1kHz). This file must be placed into a folder in a computer that could +be accessed on the same Wi-Fi network the ESP32 will be connecting to. + +Python provides a simple HTTP server. `cd` to the audio file folder on the +PC and run:: + + $ python3 -m http.server + + Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) + +Look for your PC IP address and test playing the prepared audio on your +browser: + +.. figure:: esp32-audio-config-file.png + :align: center + +After successfully built and flashed, connect the board to the Wi-Fi network:: + + $ nsh> wapi psk wlan0 mypasswd 1 + $ nsh> wapi essid wlan0 myssid 1 + $ nsh> renew wlan0 + +Once connected, open NuttX's player and play the file according to its file +name and the IP address of the HTTP server (For example `tone.wav` and +`192.168.1.239:8000`, respectively):: + + $ nsh> nxplayer + $ nxplayer> play http://192.168.1.239:8000/tone.wav + +.. note:: + The codec implementation on the LyraT board was validated using 16-bit, + 44.1kHz WAV files. Other configurations might not work as expected. + +nsh +--- + +Basic NuttShell configuration (console enabled in UART0, exposed via +USB connection by means of FT2232HL converter, at 115200 bps). + +wifi +---- + +Enables Wi-Fi support. You can define your credentials this way:: + + $ make menuconfig + -> Application Configuration + -> Network Utilities + -> Network initialization (NETUTILS_NETINIT [=y]) + -> WAPI Configuration + +Or if you don't want to keep it saved in the firmware you can do it +at runtime:: + + nsh> wapi psk wlan0 mypasswd 3 + nsh> wapi essid wlan0 myssid 1 + nsh> renew wlan0 diff --git a/boards/Kconfig b/boards/Kconfig index 98646fd0e35..06da8216665 100644 --- a/boards/Kconfig +++ b/boards/Kconfig @@ -211,6 +211,18 @@ config ARCH_BOARD_QUICKFEATHER MC3635 accelerometer, DPS310 pressure sensor, IM69D130 PDM microphone, internal programmable FPGA fabric. +config ARCH_BOARD_ESP32_AUDIO_KIT + bool "Ai-Thinker ESP32 Audio Kit" + depends on ARCH_CHIP_ESP32_A1S + select ARCH_HAVE_LEDS + select ARCH_HAVE_BUTTONS + select ARCH_HAVE_IRQBUTTONS if ESP32_GPIO_IRQ + ---help--- + The Ai-Thinker ESP32-Audio-Kit is a board with the ESP32-A1S module + powered by ESP32-D0WD-V3 with 16MB of SPI Flash and 8MB PSRAM, and an + audio codec on it. There are two versions of ESP32-A1S module: ES8388 + codec and other with AC101. Currently only ES8388 is supported. + config ARCH_BOARD_ESP32_DEVKITC bool "Espressif ESP32 DevkitC board V4" depends on ARCH_CHIP_ESP32WROOM32 || ARCH_CHIP_ESP32WROOM32_8MB || ARCH_CHIP_ESP32WROOM32_16MB || ARCH_CHIP_ESP32WROVER || ARCH_CHIP_ESP32SOLO1 @@ -2791,6 +2803,7 @@ config ARCH_BOARD default "ekk-lm3s9b96" if ARCH_BOARD_EKKLM3S9B96 default "emw3162" if ARCH_BOARD_EMW3162 default "quickfeather" if ARCH_BOARD_QUICKFEATHER + default "esp32-audio-kit" if ARCH_BOARD_ESP32_AUDIO_KIT default "esp32-devkitc" if ARCH_BOARD_ESP32_DEVKITC default "ttgo_eink5_v2" if ARCH_BOARD_TTGO_T5V2_ESP32 default "esp32-ethernet-kit" if ARCH_BOARD_ESP32_ETHERNETKIT @@ -3831,6 +3844,9 @@ endif if ARCH_BOARD_RX65N_GRROSE source "boards/renesas/rx65n/rx65n-grrose/Kconfig" endif +if ARCH_BOARD_ESP32_AUDIO_KIT +source "boards/xtensa/esp32/esp32-audio-kit/Kconfig" +endif if ARCH_BOARD_ESP32_DEVKITC source "boards/xtensa/esp32/esp32-devkitc/Kconfig" endif diff --git a/boards/xtensa/esp32/esp32-audio-kit/Kconfig b/boards/xtensa/esp32/esp32-audio-kit/Kconfig new file mode 100644 index 00000000000..fd7affca599 --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/Kconfig @@ -0,0 +1,8 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +if ARCH_BOARD_ESP32_AUDIO_KIT + +endif # ARCH_BOARD_ESP32_AUDIO_KIT diff --git a/boards/xtensa/esp32/esp32-audio-kit/configs/audio/defconfig b/boards/xtensa/esp32/esp32-audio-kit/configs/audio/defconfig new file mode 100644 index 00000000000..8ce0811cd85 --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/configs/audio/defconfig @@ -0,0 +1,120 @@ +# +# 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_ESP32_I2S0_RX is not set +# CONFIG_NDEBUG is not set +# CONFIG_NSH_ARGCAT is not set +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +CONFIG_ALLOW_BSD_COMPONENTS=y +CONFIG_ARCH="xtensa" +CONFIG_ARCH_BOARD="esp32-audio-kit" +CONFIG_ARCH_BOARD_COMMON=y +CONFIG_ARCH_BOARD_ESP32_AUDIO_KIT=y +CONFIG_ARCH_CHIP="esp32" +CONFIG_ARCH_CHIP_ESP32=y +CONFIG_ARCH_CHIP_ESP32_A1S=y +CONFIG_ARCH_INTERRUPTSTACK=4096 +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARCH_XTENSA=y +CONFIG_AUDIO=y +CONFIG_AUDIOUTILS_MMLPARSER_LIB=y +CONFIG_AUDIO_BUFFER_NUMBYTES=4096 +CONFIG_AUDIO_ES8388=y +CONFIG_AUDIO_EXCLUDE_FFORWARD=y +CONFIG_AUDIO_EXCLUDE_TONE=y +CONFIG_AUDIO_I2S=y +CONFIG_AUDIO_I2SCHAR=y +CONFIG_AUDIO_NUM_BUFFERS=4 +CONFIG_BOARDCTL_ROMDISK=y +CONFIG_BOARD_LOOPSPERMSEC=16717 +CONFIG_BUILTIN=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEFAULT_TASK_STACKSIZE=4096 +CONFIG_DEV_URANDOM=y +CONFIG_DRIVERS_AUDIO=y +CONFIG_DRIVERS_IEEE80211=y +CONFIG_DRIVERS_WIRELESS=y +CONFIG_ESP32_I2C0=y +CONFIG_ESP32_I2C0_SCLPIN=32 +CONFIG_ESP32_I2C0_SDAPIN=33 +CONFIG_ESP32_I2S0=y +CONFIG_ESP32_I2S0_BCLKPIN=27 +CONFIG_ESP32_I2S0_DATA_BIT_WIDTH_16BIT=y +CONFIG_ESP32_I2S0_DOUTPIN=26 +CONFIG_ESP32_I2S0_MCLK=y +CONFIG_ESP32_I2S0_WSPIN=25 +CONFIG_ESP32_I2S=y +CONFIG_ESP32_SPIFLASH=y +CONFIG_ESP32_SPIFLASH_SPIFFS=y +CONFIG_ESP32_STORAGE_MTD_SIZE=0x80000 +CONFIG_ESP32_UART0=y +CONFIG_ESP32_WIFI=y +CONFIG_ESP32_WIFI_SAVE_PARAM=y +CONFIG_EXAMPLES_I2SCHAR=y +CONFIG_EXAMPLES_I2SCHAR_TX=y +CONFIG_EXAMPLES_I2SCHAR_TXBUFFERS=2 +CONFIG_EXAMPLES_I2SCHAR_TXSTACKSIZE=2048 +CONFIG_EXAMPLES_ROMFS=y +CONFIG_FS_PROCFS=y +CONFIG_FS_ROMFS=y +CONFIG_I2C=y +CONFIG_I2S_DMADESC_NUM=4 +CONFIG_IDLETHREAD_STACKSIZE=3072 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INTELHEX_BINARY=y +CONFIG_MM_REGIONS=3 +CONFIG_NAME_MAX=48 +CONFIG_NETDB_DNSCLIENT=y +CONFIG_NETDB_DNSCLIENT_NAMESIZE=64 +CONFIG_NETDEV_LATEINIT=y +CONFIG_NETDEV_PHY_IOCTL=y +CONFIG_NETDEV_WIRELESS_IOCTL=y +CONFIG_NETUTILS_IPERF=y +CONFIG_NETUTILS_TELNETD=y +CONFIG_NET_BROADCAST=y +CONFIG_NET_ETH_PKTSIZE=1518 +CONFIG_NET_ICMP=y +CONFIG_NET_ICMP_SOCKET=y +CONFIG_NET_PREALLOC_DEVIF_CALLBACKS=32 +CONFIG_NET_STATISTICS=y +CONFIG_NET_TCP=y +CONFIG_NET_TCP_DELAYED_ACK=y +CONFIG_NET_TCP_WRITE_BUFFERS=y +CONFIG_NET_UDP=y +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_LINELEN=300 +CONFIG_NSH_READLINE=y +CONFIG_NXPLAYER_HTTP_STREAMING_SUPPORT=y +CONFIG_POSIX_SPAWN_DEFAULT_STACKSIZE=2048 +CONFIG_PREALLOC_TIMERS=4 +CONFIG_PTHREAD_MUTEX_TYPES=y +CONFIG_RAM_SIZE=114688 +CONFIG_RAM_START=0x20000000 +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_HPWORKSTACKSIZE=2048 +CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_WAITPID=y +CONFIG_SIG_DEFAULT=y +CONFIG_SPI=y +CONFIG_SPIFFS_NAME_MAX=48 +CONFIG_START_DAY=6 +CONFIG_START_MONTH=12 +CONFIG_START_YEAR=2011 +CONFIG_SYSTEM_DHCPC_RENEW=y +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_NXPLAYER=y +CONFIG_SYSTEM_PING=y +CONFIG_TELNET_CHARACTER_MODE=y +CONFIG_TLS_TASK_NELEM=4 +CONFIG_UART0_SERIAL_CONSOLE=y +CONFIG_WIRELESS=y +CONFIG_WIRELESS_WAPI=y +CONFIG_WIRELESS_WAPI_CMDTOOL=y diff --git a/boards/xtensa/esp32/esp32-audio-kit/configs/nsh/defconfig b/boards/xtensa/esp32/esp32-audio-kit/configs/nsh/defconfig new file mode 100644 index 00000000000..6f19fa933ab --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/configs/nsh/defconfig @@ -0,0 +1,44 @@ +# +# 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_NSH_ARGCAT is not set +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +CONFIG_ARCH="xtensa" +CONFIG_ARCH_BOARD="esp32-audio-kit" +CONFIG_ARCH_BOARD_COMMON=y +CONFIG_ARCH_BOARD_ESP32_AUDIO_KIT=y +CONFIG_ARCH_CHIP="esp32" +CONFIG_ARCH_CHIP_ESP32=y +CONFIG_ARCH_CHIP_ESP32_A1S=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARCH_XTENSA=y +CONFIG_BOARD_LOOPSPERMSEC=16717 +CONFIG_BUILTIN=y +CONFIG_ESP32_UART0=y +CONFIG_FS_PROCFS=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_IDLETHREAD_STACKSIZE=3072 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INTELHEX_BINARY=y +CONFIG_MM_REGIONS=3 +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=6 +CONFIG_START_MONTH=12 +CONFIG_START_YEAR=2011 +CONFIG_SYSTEM_NSH=y +CONFIG_UART0_SERIAL_CONSOLE=y diff --git a/boards/xtensa/esp32/esp32-audio-kit/configs/wifi/defconfig b/boards/xtensa/esp32/esp32-audio-kit/configs/wifi/defconfig new file mode 100644 index 00000000000..6ff6b8c758b --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/configs/wifi/defconfig @@ -0,0 +1,90 @@ +# +# 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_NSH_ARGCAT is not set +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +CONFIG_ALLOW_BSD_COMPONENTS=y +CONFIG_ARCH="xtensa" +CONFIG_ARCH_BOARD="esp32-audio-kit" +CONFIG_ARCH_BOARD_COMMON=y +CONFIG_ARCH_BOARD_ESP32_AUDIO_KIT=y +CONFIG_ARCH_CHIP="esp32" +CONFIG_ARCH_CHIP_ESP32=y +CONFIG_ARCH_CHIP_ESP32_A1S=y +CONFIG_ARCH_INTERRUPTSTACK=4096 +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARCH_XTENSA=y +CONFIG_BOARD_LOOPSPERMSEC=16717 +CONFIG_BUILTIN=y +CONFIG_DEBUG_ASSERTIONS=y +CONFIG_DEBUG_FEATURES=y +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEFAULT_TASK_STACKSIZE=4096 +CONFIG_DEV_URANDOM=y +CONFIG_DRIVERS_IEEE80211=y +CONFIG_DRIVERS_WIRELESS=y +CONFIG_ESP32_SPIFLASH=y +CONFIG_ESP32_SPIFLASH_SPIFFS=y +CONFIG_ESP32_STORAGE_MTD_SIZE=0x80000 +CONFIG_ESP32_UART0=y +CONFIG_ESP32_WIFI=y +CONFIG_ESP32_WIFI_SAVE_PARAM=y +CONFIG_FS_PROCFS=y +CONFIG_IDLETHREAD_STACKSIZE=3072 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INTELHEX_BINARY=y +CONFIG_MM_REGIONS=3 +CONFIG_NAME_MAX=48 +CONFIG_NETDB_DNSCLIENT=y +CONFIG_NETDB_DNSCLIENT_NAMESIZE=64 +CONFIG_NETDEV_LATEINIT=y +CONFIG_NETDEV_PHY_IOCTL=y +CONFIG_NETDEV_WIRELESS_IOCTL=y +CONFIG_NETUTILS_IPERF=y +CONFIG_NETUTILS_TELNETD=y +CONFIG_NET_BROADCAST=y +CONFIG_NET_ETH_PKTSIZE=1518 +CONFIG_NET_ICMP=y +CONFIG_NET_ICMP_SOCKET=y +CONFIG_NET_PREALLOC_DEVIF_CALLBACKS=32 +CONFIG_NET_STATISTICS=y +CONFIG_NET_TCP=y +CONFIG_NET_TCP_DELAYED_ACK=y +CONFIG_NET_TCP_WRITE_BUFFERS=y +CONFIG_NET_UDP=y +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_LINELEN=300 +CONFIG_NSH_READLINE=y +CONFIG_POSIX_SPAWN_DEFAULT_STACKSIZE=2048 +CONFIG_PREALLOC_TIMERS=4 +CONFIG_PTHREAD_MUTEX_TYPES=y +CONFIG_RAM_SIZE=114688 +CONFIG_RAM_START=0x20000000 +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_WAITPID=y +CONFIG_SIG_DEFAULT=y +CONFIG_SPI=y +CONFIG_SPIFFS_NAME_MAX=48 +CONFIG_STACK_COLORATION=y +CONFIG_START_DAY=6 +CONFIG_START_MONTH=12 +CONFIG_START_YEAR=2011 +CONFIG_SYSTEM_DHCPC_RENEW=y +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_PING=y +CONFIG_SYSTEM_STACKMONITOR=y +CONFIG_TELNET_CHARACTER_MODE=y +CONFIG_TLS_TASK_NELEM=4 +CONFIG_UART0_SERIAL_CONSOLE=y +CONFIG_WIRELESS=y +CONFIG_WIRELESS_WAPI=y +CONFIG_WIRELESS_WAPI_CMDTOOL=y diff --git a/boards/xtensa/esp32/esp32-audio-kit/include/board.h b/boards/xtensa/esp32/esp32-audio-kit/include/board.h new file mode 100644 index 00000000000..3e6a8941cbf --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/include/board.h @@ -0,0 +1,78 @@ +/**************************************************************************** + * boards/xtensa/esp32/esp32-audio-kit/include/board.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_ESP32_ESP32_AUDIO_KIT_INCLUDE_BOARD_H +#define __BOARDS_XTENSA_ESP32_ESP32_AUDIO_KIT_INCLUDE_BOARD_H + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Clocking *****************************************************************/ + +/* The ESP32-LyraT board is fitted with either a 26 or a 40MHz crystal */ + +#ifdef CONFIG_ESP32_XTAL_26MHz +# define BOARD_XTAL_FREQUENCY 26000000 +#else +# define BOARD_XTAL_FREQUENCY 40000000 +#endif + +#ifdef CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ +# define BOARD_CLOCK_FREQUENCY (CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ * 1000000) +#else +# define BOARD_CLOCK_FREQUENCY 80000000 +#endif + +/* Button definitions *******************************************************/ + +/* GPIO definitions *********************************************************/ + +/* ES8388 CODEC */ + +#define ES8388_I2C_CCLK 23 /* SCL */ +#define ES8388_I2C_CDATA 18 /* SDA */ + +#define ES8388_I2S_MCLK 0 /* Master clock */ +#define ES8388_I2S_SCLK 5 /* Audio data bit clock */ +#define ES8388_I2S_LRCK 25 /* Audio data left and right clock */ +#define ES8388_I2S_DSDIN 26 /* DAC audio data (to speakers) */ +#define ES8388_I2S_ASDOUT 35 /* ADC audio data (from microphone) */ + +/* LED definitions **********************************************************/ + +/* Define how many LEDs this board has (needed by userleds) */ + +#define BOARD_NLEDS 2 + +/* GPIO pins used by the GPIO Subsystem */ + +#define BOARD_NGPIOOUT 1 /* Amount of GPIO Output pins */ +#define BOARD_NGPIOIN 1 /* Amount of GPIO Input without Interruption */ +#define BOARD_NGPIOINT 1 /* Amount of GPIO Input w/ Interruption pins */ + +/* Peripherals definitions **************************************************/ + +/* ES8388 CODEC */ + +#define ES8388_I2C_FREQ 400000 +#define ES8388_I2C_ADDR 0x10 + +#endif /* __BOARDS_XTENSA_ESP32_ESP32_AUDIO_KIT_INCLUDE_BOARD_H */ diff --git a/boards/xtensa/esp32/esp32-audio-kit/include/board_memorymap.h b/boards/xtensa/esp32/esp32-audio-kit/include/board_memorymap.h new file mode 100644 index 00000000000..ece46113e8f --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/include/board_memorymap.h @@ -0,0 +1,128 @@ +/**************************************************************************** + * boards/xtensa/esp32/esp32-audio-kit/include/board_memorymap.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_ESP32_ESP32_AUDIO_KIT_INCLUDE_BOARD_MEMORYMAP_H +#define __BOARDS_XTENSA_ESP32_ESP32_AUDIO_KIT_INCLUDE_BOARD_MEMORYMAP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Kernel ROM */ + +#define KIROM_START (uintptr_t)__kirom_start +#define KIROM_SIZE (uintptr_t)__kirom_size +#define KDROM_START (uintptr_t)__kdrom_start +#define KDROM_SIZE (uintptr_t)__kdrom_size + +/* Kernel RAM */ + +#define KIRAM_0_START (uintptr_t)__kiram_0_start +#define KIRAM_0_SIZE (uintptr_t)__kiram_0_size +#define KIRAM_0_END (uintptr_t)__kiram_0_end +#define KIRAM_1_START (uintptr_t)__kiram_1_start +#define KIRAM_1_SIZE (uintptr_t)__kiram_1_size +#define KIRAM_1_END (uintptr_t)__kiram_1_end +#define KDRAM_0_START (uintptr_t)__kdram_0_start +#define KDRAM_0_SIZE (uintptr_t)__kdram_0_size +#define KDRAM_0_END (uintptr_t)__kdram_0_end +#define KDRAM_1_START (uintptr_t)__kdram_1_start +#define KDRAM_1_SIZE (uintptr_t)__kdram_1_size +#define KDRAM_1_END (uintptr_t)__kdram_1_end + +/* Exception vectors */ + +#define VECTORS_START (uintptr_t)__vectors_start +#define VECTORS_END (uintptr_t)__vectors_end + +/* User ROM */ + +#define UIROM_START (uintptr_t)__uirom_start +#define UIROM_SIZE (uintptr_t)__uirom_size +#define UIROM_END (uintptr_t)__uirom_end +#define UDROM_START (uintptr_t)__udrom_start +#define UDROM_SIZE (uintptr_t)__udrom_size +#define UDROM_END (uintptr_t)__udrom_end + +/* User RAM */ + +#define UIRAM_START (uintptr_t)__uiram_start +#define UIRAM_SIZE (uintptr_t)__uiram_size +#define UIRAM_END (uintptr_t)__uiram_end +#define UDRAM_START (uintptr_t)__udram_start +#define UDRAM_SIZE (uintptr_t)__udram_size +#define UDRAM_END (uintptr_t)__udram_end + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/* Kernel ROM (RX) */ + +extern uint8_t __kirom_start[]; +extern uint8_t __kirom_size[]; +extern uint8_t __kdrom_start[]; +extern uint8_t __kdrom_size[]; + +/* Kernel RAM (RW) */ + +extern uint8_t __kiram_0_start[]; +extern uint8_t __kiram_0_size[]; +extern uint8_t __kiram_0_end[]; +extern uint8_t __kiram_1_start[]; +extern uint8_t __kiram_1_size[]; +extern uint8_t __kiram_1_end[]; +extern uint8_t __kdram_0_start[]; +extern uint8_t __kdram_0_size[]; +extern uint8_t __kdram_0_end[]; +extern uint8_t __kdram_1_start[]; +extern uint8_t __kdram_1_size[]; +extern uint8_t __kdram_1_end[]; + +/* Exception vectors */ + +extern uint8_t __vectors_start[]; +extern uint8_t __vectors_end[]; + +/* User ROM (RX) */ + +extern uint8_t __uirom_start[]; +extern uint8_t __uirom_size[]; +extern uint8_t __uirom_end[]; +extern uint8_t __udrom_start[]; +extern uint8_t __udrom_size[]; +extern uint8_t __udrom_end[]; + +/* User RAM (RW) */ + +extern uint8_t __uiram_start[]; +extern uint8_t __uiram_size[]; +extern uint8_t __uiram_end[]; +extern uint8_t __udram_start[]; +extern uint8_t __udram_size[]; +extern uint8_t __udram_end[]; + +#endif /* __BOARDS_XTENSA_ESP32_ESP32_AUDIO_KIT_INCLUDE_BOARD_MEMORYMAP_H */ diff --git a/boards/xtensa/esp32/esp32-audio-kit/scripts/Make.defs b/boards/xtensa/esp32/esp32-audio-kit/scripts/Make.defs new file mode 100644 index 00000000000..11cc302c5b2 --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/scripts/Make.defs @@ -0,0 +1,72 @@ +############################################################################ +# boards/xtensa/esp32/esp32-audio-kit/scripts/Make.defs +# +# 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. +# +############################################################################ + +include $(TOPDIR)/.config +include $(TOPDIR)/tools/Config.mk +include $(TOPDIR)/tools/esp32/Config.mk +include $(TOPDIR)/arch/xtensa/src/lx6/Toolchain.defs + +ARCHSCRIPT += $(BOARD_COMMON_DIR)$(DELIM)scripts$(DELIM)esp32_rom.ld + +# Pick the linker scripts from the board level if they exist, if not +# pick the common linker scripts. + +ifeq ($(CONFIG_BUILD_PROTECTED),y) + ARCHSCRIPT += $(call FINDSCRIPT,protected_memory.ld) + ARCHSCRIPT += $(call FINDSCRIPT,kernel-space.ld) +else + ARCHSCRIPT += $(call FINDSCRIPT,flat_memory.ld) + + ifeq ($(CONFIG_ESP32_APP_FORMAT_MCUBOOT),y) + ARCHSCRIPT += $(call FINDSCRIPT,mcuboot_sections.ld) + else + ARCHSCRIPT += $(call FINDSCRIPT,legacy_sections.ld) + endif +endif + +ARCHPICFLAGS = -fpic + +# if SPIRAM/PSRAM is used then we need to include a workaround + +ifeq ($(CONFIG_ESP32_SPIRAM),y) + ARCHCFLAGS += -mfix-esp32-psram-cache-issue +endif + +CFLAGS := $(ARCHCFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe +CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS) +CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe +CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS) +CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +AFLAGS := $(CFLAGS) -D__ASSEMBLY__ + +# Loadable module definitions + +CMODULEFLAGS = $(CFLAGS) -mtext-section-literals + +LDMODULEFLAGS = -r -e module_initialize +LDMODULEFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld) + +# ELF module definitions + +CELFFLAGS = $(CFLAGS) -mtext-section-literals +CXXELFFLAGS = $(CXXFLAGS) -mtext-section-literals + +LDELFFLAGS = -r -e main +LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld) diff --git a/boards/xtensa/esp32/esp32-audio-kit/src/Make.defs b/boards/xtensa/esp32/esp32-audio-kit/src/Make.defs new file mode 100644 index 00000000000..0b9528e64f3 --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/src/Make.defs @@ -0,0 +1,51 @@ +############################################################################# +# boards/xtensa/esp32/esp32-audio-kit/src/Make.defs +# +# 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. +# +############################################################################# + +include $(TOPDIR)/Make.defs + +CSRCS = esp32_boot.c esp32_bringup.c + +ifeq ($(CONFIG_USERLED),y) +CSRCS += esp32_userleds.c +endif + +ifeq ($(CONFIG_BOARDCTL),y) +CSRCS += esp32_appinit.c +ifeq ($(CONFIG_BOARDCTL_RESET),y) +CSRCS += esp32_reset.c +endif +endif + +ifeq ($(CONFIG_MMCSD),y) +CSRCS += esp32_mmcsd.c +endif + +ifeq ($(CONFIG_DEV_GPIO),y) +CSRCS += esp32_gpio.c +endif + +ifeq ($(CONFIG_ARCH_BUTTONS),y) +CSRCS += esp32_buttons.c +endif + +DEPPATH += --dep-path board +VPATH += :board +CFLAGS += $(shell $(INCDIR) "$(CC)" $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board) + diff --git a/boards/xtensa/esp32/esp32-audio-kit/src/esp32-audio-kit.h b/boards/xtensa/esp32/esp32-audio-kit/src/esp32-audio-kit.h new file mode 100644 index 00000000000..489f7b01068 --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/src/esp32-audio-kit.h @@ -0,0 +1,181 @@ +/**************************************************************************** + * boards/xtensa/esp32/esp32-audio-kit/src/esp32-audio-kit.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_ESP32_ESP32_AUDIO_KIT_SRC_ESP32_AUDIO_KIT_H +#define __BOARDS_XTENSA_ESP32_ESP32_AUDIO_KIT_SRC_ESP32_AUDIO_KIT_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* ESP32-Audio-Kit GPIOs ****************************************************/ + +/* BOOT Button */ + +#define BUTTON_BOOT 0 + +/* LEDs */ + +#define GPIO_LED1 22 + +/* Audio Amplifier */ + +#define SPEAKER_ENABLE_GPIO 21 + +/* Buttons */ + +/* As BOOT_BUTTON shares pins with I2S and the SD card it cannot be used + * as an user button like regular ESP32 boards. As the ESP32-LyraT has + * other buttons that can be used, BOOT_BUTTON is disabled in the buttons + * driver to avoid conflict with the remaining peripherals. + */ + +#define BUTTON_REC 36 +#define BUTTON_MODE 39 +#define BUTTON_PLAY_TP_CHANNEL 8 +#define BUTTON_SET_TP_CHANNEL 9 +#define BUTTON_VOLM_TP_CHANNEL 4 +#define BUTTON_VOLP_TP_CHANNEL 7 + +/* TIMERS */ + +#define TIMER0 0 +#define TIMER1 1 +#define TIMER2 2 +#define TIMER3 3 + +/* ONESHOT */ + +#define ONESHOT_TIMER 1 +#define ONESHOT_RESOLUTION_US 1 + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: esp32_bringup + * + * Description: + * Perform architecture-specific initialization + * + * CONFIG_BOARD_LATE_INITIALIZE=y : + * Called from board_late_initialize(). + * + * CONFIG_BOARD_LATE_INITIALIZE=y && CONFIG_BOARDCTL=y : + * Called from the NSH library via board_app_initialize() + * + ****************************************************************************/ + +int esp32_bringup(void); + +/**************************************************************************** + * Name: esp32_es8388_initialize + * + * Description: + * This function is called by platform-specific, setup logic to configure + * and register the ES8388 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 + * i2s_port - The I2S port 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 esp32_es8388_initialize(int i2c_port, uint8_t i2c_addr, int i2c_freq, + int i2s_port); + +/**************************************************************************** + * Name: board_i2sdev_initialize + * + * Description: + * This function is called by platform-specific, setup logic to configure + * 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 + * number. + * + * Input Parameters: + * port - The I2S port 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. + * + ****************************************************************************/ + +#if defined CONFIG_ESP32_I2S0 && !defined CONFIG_AUDIO_ES8388 || \ + defined CONFIG_ESP32_I2S1 +int board_i2sdev_initialize(int port); +#endif + +/**************************************************************************** + * Name: esp32_mmcsd_initialize + * + * Description: + * Initialize SPI-based SD card and card detect thread. + * + ****************************************************************************/ + +int esp32_mmcsd_initialize(int minor); + +/**************************************************************************** + * Name: esp32_spiflash_init + * + * Description: + * Initialize the SPIFLASH and register the MTD device. + ****************************************************************************/ + +int esp32_spiflash_init(void); + +/**************************************************************************** + * Name: esp32_gpio_init + ****************************************************************************/ + +#ifdef CONFIG_DEV_GPIO +int esp32_gpio_init(void); +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __BOARDS_XTENSA_ESP32_ESP32_AUDIO_KIT_SRC_ESP32_AUDIO_KIT_H */ diff --git a/boards/xtensa/esp32/esp32-audio-kit/src/esp32_appinit.c b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_appinit.c new file mode 100644 index 00000000000..2959ca024b6 --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_appinit.c @@ -0,0 +1,80 @@ +/**************************************************************************** + * boards/xtensa/esp32/esp32-audio-kit/src/esp32_appinit.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 + +#include +#include + +#include "esp32-audio-kit.h" + +#ifdef CONFIG_BOARDCTL + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_app_initialize + * + * Description: + * Perform application specific initialization. This function is never + * called directly from application code, but only indirectly via the + * (non-standard) boardctl() interface using the command BOARDIOC_INIT. + * + * Input Parameters: + * arg - The boardctl() argument is passed to the board_app_initialize() + * implementation without modification. The argument has no + * meaning to NuttX; the meaning of the argument is a contract + * between the board-specific initialization logic and the + * matching application logic. The value could be such things as a + * mode enumeration value, a set of DIP switch settings, a + * pointer to configuration data read from a file or serial FLASH, + * or whatever you would like to do with it. Every implementation + * should accept zero/NULL as a default configuration. + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned on + * any failure to indicate the nature of the failure. + * + ****************************************************************************/ + +int board_app_initialize(uintptr_t arg) +{ +#ifdef CONFIG_BOARD_LATE_INITIALIZE + /* Board initialization already performed by board_late_initialize() */ + + return OK; +#else + /* Perform board-specific initialization */ + + return esp32_bringup(); +#endif +} + +#endif /* CONFIG_BOARDCTL */ diff --git a/boards/xtensa/esp32/esp32-audio-kit/src/esp32_boot.c b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_boot.c new file mode 100644 index 00000000000..a4446c86b42 --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_boot.c @@ -0,0 +1,101 @@ +/**************************************************************************** + * boards/xtensa/esp32/esp32-audio-kit/src/esp32_boot.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 + +#include + +#include +#include +#include +#include + +#include "esp32-audio-kit.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: esp32_board_initialize + * + * Description: + * All ESP32 architectures must provide the following entry point. + * This entry point is called early in the initialization -- after all + * memory has been configured and mapped but before any devices have been + * initialized. + * + ****************************************************************************/ + +void esp32_board_initialize(void) +{ + /* Configure on-board LEDs if LED support has been selected. */ + +#ifdef CONFIG_ARCH_LEDS + board_autoled_initialize(); +#endif +} + +/**************************************************************************** + * Name: board_late_initialize + * + * Description: + * If CONFIG_BOARD_LATE_INITIALIZE is selected, then an additional + * initialization call will be performed in the boot-up sequence to a + * function called board_late_initialize(). board_late_initialize() will + * be called immediately after up_initialize() is called and just before + * the initial application is started. This additional initialization + * phase may be used, for example, to initialize board-specific device + * drivers. + * + ****************************************************************************/ + +#ifdef CONFIG_BOARD_LATE_INITIALIZE +void board_late_initialize(void) +{ + /* Perform board-specific initialization */ + + esp32_bringup(); + +#ifdef CONFIG_SMP + /* To avoid corrupting the heap, this region of memory (~3KB) is not + * included until the APP CPU has started. + * So we can't add it with the rest of the regions at xtensa_add_region(), + * that function is called early from up_initialize(). We wait until the + * SMP bringup is complete. + */ + + umm_addregion((void *)HEAP_REGION_ROMAPP_START, + (size_t)(HEAP_REGION_ROMAPP_END - HEAP_REGION_ROMAPP_START)); +#endif +} +#endif diff --git a/boards/xtensa/esp32/esp32-audio-kit/src/esp32_bringup.c b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_bringup.c new file mode 100644 index 00000000000..049c3e5bdaa --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_bringup.c @@ -0,0 +1,450 @@ +/**************************************************************************** + * boards/xtensa/esp32/esp32-audio-kit/src/esp32_bringup.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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "esp32_i2c.h" +#include "esp32_gpio.h" +#include "esp32_partition.h" + +#include + +#ifdef CONFIG_USERLED +# include +#endif + +#ifdef CONFIG_TIMER +#include +#endif + +#ifdef CONFIG_ONESHOT +# include "esp32_board_oneshot.h" +#endif + +#ifdef CONFIG_WATCHDOG +# include "esp32_board_wdt.h" +#endif + +#ifdef CONFIG_ESP32_SPIFLASH +# include "esp32_board_spiflash.h" +#endif + +#ifdef CONFIG_ESP32_BLE +# include "esp32_ble.h" +#endif + +#ifdef CONFIG_ESP32_WIFI +# include "esp32_board_wlan.h" +#endif + +#ifdef CONFIG_ESP32_I2C +# include "esp32_board_i2c.h" +#endif + +#ifdef CONFIG_ESP32_I2S +# include "esp32_i2s.h" +#endif + +#ifdef CONFIG_SENSORS_BMP180 +# include "esp32_bmp180.h" +#endif + +#ifdef CONFIG_INPUT_BUTTONS +# include +#endif + +#ifdef CONFIG_VIDEO_FB +# include +#endif + +#ifdef CONFIG_ESP32_RT_TIMER +# include "esp32_rt_timer.h" +#endif + +#ifdef CONFIG_LCD_DEV +# include +# include +#endif + +#ifdef CONFIG_RTC_DRIVER +# include "esp32_rtc_lowerhalf.h" +#endif + +#ifdef CONFIG_LCD_BACKPACK +# include "esp32_lcd_backpack.h" +#endif + +#include "esp32-audio-kit.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: esp32_bringup + * + * Description: + * Perform architecture-specific initialization + * + * CONFIG_BOARD_LATE_INITIALIZE=y : + * Called from board_late_initialize(). + * + * CONFIG_BOARD_LATE_INITIALIZE=n && CONFIG_BOARDCTL=y : + * Called from the NSH library + * + ****************************************************************************/ + +int esp32_bringup(void) +{ + int ret; + +#if defined(CONFIG_ESP32_SPIRAM) && \ + defined(CONFIG_ESP32_SPIRAM_BANKSWITCH_ENABLE) + ret = esp_himem_init(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to init HIMEM: %d\n", ret); + } +#endif + +#ifdef CONFIG_FS_PROCFS + /* Mount the procfs file system */ + + ret = nx_mount(NULL, "/proc", "procfs", 0, NULL); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to mount procfs at /proc: %d\n", ret); + } +#endif + +#ifdef CONFIG_FS_TMPFS + /* Mount the tmpfs file system */ + + ret = nx_mount(NULL, CONFIG_LIBC_TMPDIR, "tmpfs", 0, NULL); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to mount tmpfs at %s: %d\n", + CONFIG_LIBC_TMPDIR, ret); + } +#endif + +#ifdef CONFIG_LCD_BACKPACK + /* slcd:0, i2c:0, rows=2, cols=16 */ + + ret = board_lcd_backpack_init(0, 0, 2, 16); + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize PCF8574 LCD, error %d\n", ret); + } +#endif + +#ifdef CONFIG_MMCSD + ret = esp32_mmcsd_initialize(0); + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize SD slot: %d\n", ret); + } +#endif + +#ifdef CONFIG_ESP32_SPIFLASH + ret = esp32_spiflash_init(); + if (ret) + { + syslog(LOG_ERR, "ERROR: Failed to initialize SPI Flash\n"); + } +#endif + +#ifdef CONFIG_ESP32_PARTITION_TABLE + ret = esp32_partition_init(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to initialize partition error=%d\n", + ret); + } +#endif + +#ifdef CONFIG_ESP32_RT_TIMER + ret = esp32_rt_timer_init(); + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize RT timer: %d\n", ret); + } +#endif + +#ifdef CONFIG_ESP32_BLE + ret = esp32_ble_initialize(); + if (ret) + { + syslog(LOG_ERR, "ERROR: Failed to initialize BLE: %d\n", ret); + } +#endif + +#ifdef CONFIG_ESP32_WIFI + ret = board_wlan_init(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to initialize wireless subsystem=%d\n", + ret); + } +#endif + +/* First, register the timer drivers and let timer 1 for oneshot + * if it is enabled. + */ + +#ifdef CONFIG_TIMER + +#if defined(CONFIG_ESP32_TIMER0) && !defined(CONFIG_ESP32_RT_TIMER) + ret = esp32_timer_initialize("/dev/timer0", TIMER0); + if (ret < 0) + { + syslog(LOG_ERR, + "ERROR: Failed to initialize timer driver: %d\n", + ret); + } +#endif + +#if defined(CONFIG_ESP32_TIMER1) && !defined(CONFIG_ONESHOT) + ret = esp32_timer_initialize("/dev/timer1", TIMER1); + if (ret < 0) + { + syslog(LOG_ERR, + "ERROR: Failed to initialize timer driver: %d\n", + ret); + } +#endif + +#ifdef CONFIG_ESP32_TIMER2 + ret = esp32_timer_initialize("/dev/timer2", TIMER2); + if (ret < 0) + { + syslog(LOG_ERR, + "ERROR: Failed to initialize timer driver: %d\n", + ret); + } +#endif + +#ifdef CONFIG_ESP32_TIMER3 + ret = esp32_timer_initialize("/dev/timer3", TIMER3); + if (ret < 0) + { + syslog(LOG_ERR, + "ERROR: Failed to initialize timer driver: %d\n", + ret); + } +#endif + +#endif /* CONFIG_TIMER */ + + /* Now register one oneshot driver */ + +#if defined(CONFIG_ONESHOT) && defined(CONFIG_ESP32_TIMER1) + + ret = esp32_oneshot_init(ONESHOT_TIMER, ONESHOT_RESOLUTION_US); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: esp32_oneshot_init() failed: %d\n", ret); + } + +#endif /* CONFIG_ONESHOT */ + +#ifdef CONFIG_USERLED + /* Register the LED driver */ + + ret = userled_lower_initialize("/dev/userleds"); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: userled_lower_initialize() failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_WATCHDOG + /* Configure watchdog timer */ + + ret = board_wdt_init(); + if (ret < 0) + { + syslog(LOG_ERR, + "ERROR: Failed to initialize watchdog drivers: %d\n", + ret); + } +#endif + +#ifdef CONFIG_DEV_GPIO + ret = esp32_gpio_init(); + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize GPIO Driver: %d\n", ret); + } +#endif + +#ifdef CONFIG_I2C_DRIVER + +#ifdef CONFIG_ESP32_I2C0 + ret = esp32_i2c_register(0); + + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize I2C Driver for I2C0: %d\n", ret); + } +#endif + +#ifdef CONFIG_ESP32_I2C1 + ret = esp32_i2c_register(1); + + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize I2C Driver for I2C1: %d\n", ret); + } +#endif + +#endif + +#ifdef CONFIG_ESP32_I2S + +#ifdef CONFIG_ESP32_I2S0 + + /* Configure I2S0 */ + +#ifdef CONFIG_AUDIO_ES8388 + + /* Configure ES8388 audio on I2C0 and I2S0 */ + + esp32_configgpio(SPEAKER_ENABLE_GPIO, OUTPUT); + esp32_gpiowrite(SPEAKER_ENABLE_GPIO, true); + + ret = esp32_es8388_initialize(ESP32_I2C0, ES8388_I2C_ADDR, + ES8388_I2C_FREQ, ESP32_I2S0); + if (ret != OK) + { + syslog(LOG_ERR, "Failed to initialize ES8388 audio: %d\n", ret); + } +#else + + /* Configure I2S generic audio on I2S0 */ + + ret = board_i2sdev_initialize(ESP32_I2S0); + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize I2S%d driver: %d\n", + CONFIG_ESP32_I2S0, ret); + } +#endif /* CONFIG_AUDIO_ES8388 */ + +#endif /* CONFIG_ESP32_I2S0 */ + +#ifdef CONFIG_ESP32_I2S1 + + /* Configure I2S generic audio on I2S1 */ + + ret = board_i2sdev_initialize(ESP32_I2S1); + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize I2S%d driver: %d\n", + CONFIG_ESP32_I2S0, ret); + } + +#endif /* CONFIG_ESP32_I2S1 */ + +#endif /* CONFIG_ESP32_I2S */ + +#ifdef CONFIG_SENSORS_BMP180 + /* Try to register BMP180 device in I2C0 */ + + ret = board_bmp180_initialize(0, 0); + + if (ret < 0) + { + syslog(LOG_ERR, "Failed to initialize BMP180 driver: %d\n", ret); + } +#endif + +#ifdef CONFIG_INPUT_BUTTONS + /* Register the BUTTON driver */ + + ret = btn_lower_initialize("/dev/buttons"); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: btn_lower_initialize() failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_VIDEO_FB + ret = fb_register(0, 0); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to initialize Frame Buffer Driver.\n"); + } +#endif + +#ifdef CONFIG_LCD_DEV + ret = board_lcd_initialize(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: board_lcd_initialize() failed: %d\n", ret); + } + + ret = lcddev_register(0); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: lcddev_register() failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_RTC_DRIVER + /* Instantiate the ESP32 RTC driver */ + + ret = esp32_rtc_driverinit(); + if (ret < 0) + { + syslog(LOG_ERR, + "ERROR: Failed to Instantiate the RTC driver: %d\n", ret); + } +#endif + + /* If we got here then perhaps not all initialization was successful, but + * at least enough succeeded to bring-up NSH with perhaps reduced + * capabilities. + */ + + UNUSED(ret); + return OK; +} + diff --git a/boards/xtensa/esp32/esp32-audio-kit/src/esp32_buttons.c b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_buttons.c new file mode 100644 index 00000000000..278ff8a6e3a --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_buttons.c @@ -0,0 +1,166 @@ +/**************************************************************************** + * boards/xtensa/esp32/esp32-audio-kit/src/esp32_buttons.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 + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "esp32_gpio.h" + +#include "esp32-audio-kit.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_button_initialize + * + * Description: + * board_button_initialize() must be called to initialize button resources. + * After that, board_buttons() may be called to collect the current state + * of all buttons or board_button_irq() may be called to register button + * interrupt handlers. + * + ****************************************************************************/ + +uint32_t board_button_initialize(void) +{ + esp32_configgpio(BUTTON_BOOT, INPUT_FUNCTION_3 | PULLUP); + return 1; +} + +/**************************************************************************** + * Name: board_buttons + * + * Description: + * After board_button_initialize() has been called, board_buttons() may be + * called to collect the state of all buttons. board_buttons() returns an + * 8-bit bit set with each bit associated with a button. See the + * BUTTON_*_BIT definitions in board.h for the meaning of each bit. + * + ****************************************************************************/ + +uint32_t board_buttons(void) +{ + uint8_t ret = 0; + int i = 0; + int n = 0; + + bool b0 = esp32_gpioread(BUTTON_BOOT); + + for (i = 0; i < 10; i++) + { + up_mdelay(1); /* TODO */ + + bool b1 = esp32_gpioread(BUTTON_BOOT); + + if (b0 == b1) + { + n++; + } + else + { + n = 0; + } + + if (3 == n) + { + break; + } + + b0 = b1; + } + + iinfo("b=%d n=%d\n", b0, n); + + /* Low value means that the button is pressed */ + + if (!b0) + { + ret = 0x1; + } + + return ret; +} + +/**************************************************************************** + * Name: board_button_irq + * + * Description: + * board_button_irq() may be called to register an interrupt handler that + * will be called when a button is depressed or released. The ID value is + * a button enumeration value that uniquely identifies a button resource. + * See the BUTTON_* definitions in board.h for the meaning of enumeration + * value. + * + ****************************************************************************/ + +#ifdef CONFIG_ARCH_IRQBUTTONS +int board_button_irq(int id, xcpt_t irqhandler, void *arg) +{ + int ret; + DEBUGASSERT(id == 0); + + int irq = ESP32_PIN2IRQ(BUTTON_BOOT); + + if (NULL != irqhandler) + { + /* Make sure the interrupt is disabled */ + + esp32_gpioirqdisable(irq); + + ret = irq_attach(irq, irqhandler, arg); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: irq_attach() failed: %d\n", ret); + return ret; + } + + gpioinfo("Attach %p\n", irqhandler); + + gpioinfo("Enabling the interrupt\n"); + + /* Configure the interrupt for rising and falling edges */ + + esp32_gpioirqenable(irq, CHANGE); + } + else + { + gpioinfo("Disable the interrupt\n"); + esp32_gpioirqdisable(irq); + } + + return OK; +} +#endif diff --git a/boards/xtensa/esp32/esp32-audio-kit/src/esp32_gpio.c b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_gpio.c new file mode 100644 index 00000000000..e23048cc448 --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_gpio.c @@ -0,0 +1,391 @@ +/**************************************************************************** + * boards/xtensa/esp32/esp32-audio-kit/src/esp32_gpio.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 + +#include +#include +#include +#include +#include + +#include + +#include + +#include "esp32-audio-kit.h" +#include "esp32_gpio.h" +#include "hardware/esp32_gpio_sigmap.h" + +#if defined(CONFIG_DEV_GPIO) && !defined(CONFIG_GPIO_LOWER_HALF) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#if !defined(CONFIG_ESP32_GPIO_IRQ) && BOARD_NGPIOINT > 0 +# error "NGPIOINT is > 0 and GPIO interrupts aren't enabled" +#endif + +/* Output pins. GPIO16 is used as an example, any other outputs could be + * used. + */ + +#define GPIO_OUT1 16 + +/* Input pins. GPIO17 is used as an example, any other inputs could be + * used. + */ + +#define GPIO_IN1 17 + +/* Interrupt pins. GPIO24 is used as an example, any other inputs could be + * used. + */ + +#define GPIO_IRQPIN1 24 + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct esp32gpio_dev_s +{ + struct gpio_dev_s gpio; + uint8_t id; +}; + +struct esp32gpint_dev_s +{ + struct esp32gpio_dev_s esp32gpio; + pin_interrupt_t callback; +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +#if BOARD_NGPIOOUT > 0 +static int gpout_read(struct gpio_dev_s *dev, bool *value); +static int gpout_write(struct gpio_dev_s *dev, bool value); +#endif + +#if BOARD_NGPIOIN > 0 +static int gpin_read(struct gpio_dev_s *dev, bool *value); +#endif + +#if BOARD_NGPIOINT > 0 +static int gpint_read(struct gpio_dev_s *dev, bool *value); +static int gpint_attach(struct gpio_dev_s *dev, + pin_interrupt_t callback); +static int gpint_enable(struct gpio_dev_s *dev, bool enable); +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +#if BOARD_NGPIOOUT > 0 +static const struct gpio_operations_s gpout_ops = +{ + .go_read = gpout_read, + .go_write = gpout_write, + .go_attach = NULL, + .go_enable = NULL, +}; + +/* This array maps the GPIO pins used as OUTPUT */ + +static const uint32_t g_gpiooutputs[BOARD_NGPIOOUT] = +{ + GPIO_OUT1 +}; + +static struct esp32gpio_dev_s g_gpout[BOARD_NGPIOOUT]; +#endif + +#if BOARD_NGPIOIN > 0 +static const struct gpio_operations_s gpin_ops = +{ + .go_read = gpin_read, + .go_write = NULL, + .go_attach = NULL, + .go_enable = NULL, +}; + +/* This array maps the GPIO pins used as INTERRUPT INPUTS */ + +static const uint32_t g_gpioinputs[BOARD_NGPIOIN] = +{ + GPIO_IN1 +}; + +static struct esp32gpio_dev_s g_gpin[BOARD_NGPIOIN]; +#endif + +#if BOARD_NGPIOINT > 0 +static const struct gpio_operations_s gpint_ops = +{ + .go_read = gpint_read, + .go_write = NULL, + .go_attach = gpint_attach, + .go_enable = gpint_enable, +}; + +/* This array maps the GPIO pins used as INTERRUPT INPUTS */ + +static const uint32_t g_gpiointinputs[BOARD_NGPIOINT] = +{ + GPIO_IRQPIN1, +}; + +static struct esp32gpint_dev_s g_gpint[BOARD_NGPIOINT]; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: gpout_read + ****************************************************************************/ + +#if BOARD_NGPIOOUT > 0 +static int gpout_read(struct gpio_dev_s *dev, bool *value) +{ + struct esp32gpio_dev_s *esp32gpio = (struct esp32gpio_dev_s *)dev; + + DEBUGASSERT(esp32gpio != NULL && value != NULL); + DEBUGASSERT(esp32gpio->id < BOARD_NGPIOOUT); + gpioinfo("Reading...\n"); + + *value = esp32_gpioread(g_gpiooutputs[esp32gpio->id]); + return OK; +} + +/**************************************************************************** + * Name: gpout_write + ****************************************************************************/ + +static int gpout_write(struct gpio_dev_s *dev, bool value) +{ + struct esp32gpio_dev_s *esp32gpio = (struct esp32gpio_dev_s *)dev; + + DEBUGASSERT(esp32gpio != NULL); + DEBUGASSERT(esp32gpio->id < BOARD_NGPIOOUT); + gpioinfo("Writing %d\n", (int)value); + + esp32_gpiowrite(g_gpiooutputs[esp32gpio->id], value); + return OK; +} +#endif + +/**************************************************************************** + * Name: gpin_read + ****************************************************************************/ + +#if BOARD_NGPIOIN > 0 +static int gpin_read(struct gpio_dev_s *dev, bool *value) +{ + struct esp32gpio_dev_s *esp32gpio = (struct esp32gpio_dev_s *)dev; + + DEBUGASSERT(esp32gpio != NULL && value != NULL); + DEBUGASSERT(esp32gpio->id < BOARD_NGPIOIN); + gpioinfo("Reading... pin %d\n", g_gpioinputs[esp32gpio->id]); + + *value = esp32_gpioread(g_gpioinputs[esp32gpio->id]); + return OK; +} +#endif + +/**************************************************************************** + * Name: esp32gpio_interrupt + ****************************************************************************/ + +#if BOARD_NGPIOINT > 0 +static int esp32gpio_interrupt(int irq, void *context, void *arg) +{ + struct esp32gpint_dev_s *esp32gpint = + (struct esp32gpint_dev_s *)arg; + + DEBUGASSERT(esp32gpint != NULL && esp32gpint->callback != NULL); + gpioinfo("Interrupt! callback=%p\n", esp32gpint->callback); + + esp32gpint->callback(&esp32gpint->esp32gpio.gpio, + esp32gpint->esp32gpio.id); + return OK; +} + +/**************************************************************************** + * Name: gpint_read + ****************************************************************************/ + +static int gpint_read(struct gpio_dev_s *dev, bool *value) +{ + struct esp32gpint_dev_s *esp32gpint = + (struct esp32gpint_dev_s *)dev; + + DEBUGASSERT(esp32gpint != NULL && value != NULL); + DEBUGASSERT(esp32gpint->esp32gpio.id < BOARD_NGPIOINT); + gpioinfo("Reading int pin...\n"); + + *value = esp32_gpioread(g_gpiointinputs[esp32gpint->esp32gpio.id]); + return OK; +} + +/**************************************************************************** + * Name: gpint_attach + ****************************************************************************/ + +static int gpint_attach(struct gpio_dev_s *dev, + pin_interrupt_t callback) +{ + struct esp32gpint_dev_s *esp32gpint = + (struct esp32gpint_dev_s *)dev; + int irq = ESP32_PIN2IRQ(g_gpiointinputs[esp32gpint->esp32gpio.id]); + int ret; + + gpioinfo("Attaching the callback\n"); + + /* Make sure the interrupt is disabled */ + + esp32_gpioirqdisable(irq); + ret = irq_attach(irq, + esp32gpio_interrupt, + &g_gpint[esp32gpint->esp32gpio.id]); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: gpint_attach() failed: %d\n", ret); + return ret; + } + + gpioinfo("Attach %p\n", callback); + esp32gpint->callback = callback; + return OK; +} + +/**************************************************************************** + * Name: gpint_enable + ****************************************************************************/ + +static int gpint_enable(struct gpio_dev_s *dev, bool enable) +{ + struct esp32gpint_dev_s *esp32gpint = + (struct esp32gpint_dev_s *)dev; + int irq = ESP32_PIN2IRQ(g_gpiointinputs[esp32gpint->esp32gpio.id]); + + if (enable) + { + if (esp32gpint->callback != NULL) + { + gpioinfo("Enabling the interrupt\n"); + + /* Configure the interrupt for rising edge */ + + esp32_gpioirqenable(irq, RISING); + } + } + else + { + gpioinfo("Disable the interrupt\n"); + esp32_gpioirqdisable(irq); + } + + return OK; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: esp32_gpio_init + ****************************************************************************/ + +int esp32_gpio_init(void) +{ + int pincount = 0; + int i; + +#if BOARD_NGPIOOUT > 0 + for (i = 0; i < BOARD_NGPIOOUT; i++) + { + /* Setup and register the GPIO pin */ + + g_gpout[i].gpio.gp_pintype = GPIO_OUTPUT_PIN; + g_gpout[i].gpio.gp_ops = &gpout_ops; + g_gpout[i].id = i; + gpio_pin_register(&g_gpout[i].gpio, pincount); + + /* Configure the pins that will be used as output */ + + esp32_gpio_matrix_out(g_gpiooutputs[i], SIG_GPIO_OUT_IDX, 0, 0); + esp32_configgpio(g_gpiooutputs[i], OUTPUT_FUNCTION_3 | + INPUT_FUNCTION_3); + esp32_gpiowrite(g_gpiooutputs[i], 0); + + pincount++; + } +#endif + +#if BOARD_NGPIOIN > 0 + for (i = 0; i < BOARD_NGPIOIN; i++) + { + /* Setup and register the GPIO pin */ + + g_gpin[i].gpio.gp_pintype = GPIO_INPUT_PIN; + g_gpin[i].gpio.gp_ops = &gpin_ops; + g_gpin[i].id = i; + gpio_pin_register(&g_gpin[i].gpio, pincount); + + /* Configure the pins that will be used as INPUT */ + + esp32_configgpio(g_gpioinputs[i], INPUT_FUNCTION_3); + + pincount++; + } +#endif + +#if BOARD_NGPIOINT > 0 + for (i = 0; i < BOARD_NGPIOINT; i++) + { + /* Setup and register the GPIO pin */ + + g_gpint[i].esp32gpio.gpio.gp_pintype = GPIO_INTERRUPT_PIN; + g_gpint[i].esp32gpio.gpio.gp_ops = &gpint_ops; + g_gpint[i].esp32gpio.id = i; + gpio_pin_register(&g_gpint[i].esp32gpio.gpio, pincount); + + /* Configure the pins that will be used as interrupt input */ + + esp32_configgpio(g_gpiointinputs[i], INPUT_FUNCTION_3 | PULLDOWN); + + pincount++; + } +#endif + + return OK; +} +#endif /* CONFIG_DEV_GPIO && !CONFIG_GPIO_LOWER_HALF */ diff --git a/boards/xtensa/esp32/esp32-audio-kit/src/esp32_mmcsd.c b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_mmcsd.c new file mode 100644 index 00000000000..2ae013af5ee --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_mmcsd.c @@ -0,0 +1,84 @@ +/**************************************************************************** + * boards/xtensa/esp32/esp32-audio-kit/src/esp32_mmcsd.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 +#include +#include +#include +#include +#include +#include +#include + +#include "esp32_spi.h" +#include "esp32-audio-kit.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: esp32_mmcsd_initialize + * + * Description: + * Initialize SPI-based SD card and card detect thread. + ****************************************************************************/ + +int esp32_mmcsd_initialize(int minor) +{ + struct spi_dev_s *spi; + int rv; + + mcinfo("INFO: Initializing mmcsd card\n"); + + spi = esp32_spibus_initialize(CONFIG_NSH_MMCSDSPIPORTNO); + if (spi == NULL) + { + mcerr("ERROR: Failed to initialize SPI port %d\n", 2); + return -ENODEV; + } + + rv = mmcsd_spislotinitialize(minor, 0, spi); + if (rv < 0) + { + mcerr("ERROR: Failed to bind SPI port %d to SD slot %d\n", + 2, 0); + return rv; + } + + spiinfo("INFO: mmcsd card has been initialized successfully\n"); + return OK; +} diff --git a/boards/xtensa/esp32/esp32-audio-kit/src/esp32_reset.c b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_reset.c new file mode 100644 index 00000000000..a262a3d307f --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_reset.c @@ -0,0 +1,63 @@ +/**************************************************************************** + * boards/xtensa/esp32/esp32-audio-kit/src/esp32_reset.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 + +#include +#include + +#ifdef CONFIG_BOARDCTL_RESET + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_reset + * + * Description: + * Reset board. Support for this function is required by board-level + * logic if CONFIG_BOARDCTL_RESET is selected. + * + * Input Parameters: + * status - Status information provided with the reset event. This + * meaning of this status information is board-specific. If not + * used by a board, the value zero may be provided in calls to + * board_reset(). + * + * Returned Value: + * If this function returns, then it was not possible to power-off the + * board due to some constraints. The return value in this case is a + * board-specific reason for the failure to shutdown. + * + ****************************************************************************/ + +int board_reset(int status) +{ + up_systemreset(); + + return 0; +} + +#endif /* CONFIG_BOARDCTL_RESET */ diff --git a/boards/xtensa/esp32/esp32-audio-kit/src/esp32_userleds.c b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_userleds.c new file mode 100644 index 00000000000..33964fe1e1d --- /dev/null +++ b/boards/xtensa/esp32/esp32-audio-kit/src/esp32_userleds.c @@ -0,0 +1,95 @@ +/**************************************************************************** + * boards/xtensa/esp32/esp32-audio-kit/src/esp32_userleds.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 + +#include +#include +#include + +#include +#include + +#include "esp32_gpio.h" +#include "esp32-audio-kit.h" + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* This array maps an LED number to GPIO pin configuration */ + +static const uint32_t g_ledcfg[BOARD_NLEDS] = +{ + GPIO_LED1 +}; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_userled_initialize + ****************************************************************************/ + +uint32_t board_userled_initialize(void) +{ + uint8_t i; + + /* Configure the LEDs GPIOs as outputs */ + + for (i = 0; i < BOARD_NLEDS; i++) + { + esp32_configgpio(g_ledcfg[i], OUTPUT); + } + + return BOARD_NLEDS; +} + +/**************************************************************************** + * Name: board_userled + ****************************************************************************/ + +void board_userled(int led, bool ledon) +{ + if ((unsigned)led < BOARD_NLEDS) + { + esp32_gpiowrite(g_ledcfg[led], ledon); + } +} + +/**************************************************************************** + * Name: board_userled_all + ****************************************************************************/ + +void board_userled_all(uint32_t ledset) +{ + uint8_t i; + + for (i = 0; i < BOARD_NLEDS; i++) + { + esp32_gpiowrite(g_ledcfg[i], (ledset & (1 << i)) != 0); + } +} +