2019-07-15 06:44:15 +00:00
// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD
//
// Licensed 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.
# pragma once
# include <stdint.h>
# include <stdlib.h>
# include <stddef.h>
# include "soc/i2s_caps.h"
# ifdef __cplusplus
extern " C " {
# endif
/**
* @ brief I2S port number , the max port number is ( I2S_NUM_MAX - 1 ) .
*/
2019-12-09 07:20:41 +00:00
typedef enum {
I2S_NUM_0 = 0 , /*!< I2S port 0 */
# if SOC_I2S_NUM > 1
I2S_NUM_1 = 1 , /*!< I2S port 1 */
# endif
I2S_NUM_MAX , /*!< I2S port max */
} i2s_port_t ;
2019-07-15 06:44:15 +00:00
# define I2S_PIN_NO_CHANGE (-1) /*!< Use in i2s_pin_config_t for pins which should not be changed */
/**
* @ brief I2S bit width per sample .
*
*/
typedef enum {
I2S_BITS_PER_SAMPLE_8BIT = 8 , /*!< I2S bits per sample: 8-bits*/
I2S_BITS_PER_SAMPLE_16BIT = 16 , /*!< I2S bits per sample: 16-bits*/
I2S_BITS_PER_SAMPLE_24BIT = 24 , /*!< I2S bits per sample: 24-bits*/
I2S_BITS_PER_SAMPLE_32BIT = 32 , /*!< I2S bits per sample: 32-bits*/
} i2s_bits_per_sample_t ;
/**
* @ brief I2S channel .
*
*/
typedef enum {
I2S_CHANNEL_MONO = 1 , /*!< I2S 1 channel (mono)*/
I2S_CHANNEL_STEREO = 2 /*!< I2S 2 channel (stereo)*/
} i2s_channel_t ;
/**
* @ brief I2S communication standard format
*
*/
typedef enum {
I2S_COMM_FORMAT_I2S = 0x01 , /*!< I2S communication format I2S*/
I2S_COMM_FORMAT_I2S_MSB = 0x02 , /*!< I2S format MSB*/
I2S_COMM_FORMAT_I2S_LSB = 0x04 , /*!< I2S format LSB*/
I2S_COMM_FORMAT_PCM = 0x08 , /*!< I2S communication format PCM*/
I2S_COMM_FORMAT_PCM_SHORT = 0x10 , /*!< PCM Short*/
I2S_COMM_FORMAT_PCM_LONG = 0x20 , /*!< PCM Long*/
} i2s_comm_format_t ;
/**
* @ brief I2S channel format type
*/
typedef enum {
I2S_CHANNEL_FMT_RIGHT_LEFT = 0x00 ,
I2S_CHANNEL_FMT_ALL_RIGHT ,
I2S_CHANNEL_FMT_ALL_LEFT ,
I2S_CHANNEL_FMT_ONLY_RIGHT ,
I2S_CHANNEL_FMT_ONLY_LEFT ,
} i2s_channel_fmt_t ;
2020-02-20 08:00:48 +00:00
# if SOC_I2S_SUPPORTS_PDM
2019-07-15 06:44:15 +00:00
/**
* @ brief PDM sample rate ratio , measured in Hz .
*
*/
typedef enum {
PDM_SAMPLE_RATE_RATIO_64 ,
PDM_SAMPLE_RATE_RATIO_128 ,
} pdm_sample_rate_ratio_t ;
/**
* @ brief PDM PCM convter enable / disable .
*
*/
typedef enum {
PDM_PCM_CONV_ENABLE ,
PDM_PCM_CONV_DISABLE ,
} pdm_pcm_conv_t ;
2019-12-09 07:20:41 +00:00
# endif
2019-07-15 06:44:15 +00:00
/**
* @ brief I2S Mode , defaut is I2S_MODE_MASTER | I2S_MODE_TX
*
* @ note PDM and built - in DAC functions are only supported on I2S0 for current ESP32 chip .
*
*/
typedef enum {
I2S_MODE_MASTER = 1 ,
I2S_MODE_SLAVE = 2 ,
I2S_MODE_TX = 4 ,
I2S_MODE_RX = 8 ,
2020-02-20 08:00:48 +00:00
# if SOC_I2S_SUPPORTS_ADC_DAC
2019-07-15 06:44:15 +00:00
I2S_MODE_DAC_BUILT_IN = 16 , /*!< Output I2S data to built-in DAC, no matter the data format is 16bit or 32 bit, the DAC module will only take the 8bits from MSB*/
I2S_MODE_ADC_BUILT_IN = 32 , /*!< Input I2S data from built-in ADC, each data can be 12-bit width at most*/
2020-02-20 08:00:48 +00:00
# endif
# if SOC_I2S_SUPPORTS_PDM
2019-07-15 06:44:15 +00:00
I2S_MODE_PDM = 64 ,
# endif
} i2s_mode_t ;
/**
* @ brief I2S configuration parameters for i2s_param_config function
*
*/
typedef struct {
i2s_mode_t mode ; /*!< I2S work mode*/
int sample_rate ; /*!< I2S sample rate*/
i2s_bits_per_sample_t bits_per_sample ; /*!< I2S bits per sample*/
i2s_channel_fmt_t channel_format ; /*!< I2S channel format */
i2s_comm_format_t communication_format ; /*!< I2S communication format */
int intr_alloc_flags ; /*!< Flags used to allocate the interrupt. One or multiple (ORred) ESP_INTR_FLAG_* values. See esp_intr_alloc.h for more info */
int dma_buf_count ; /*!< I2S DMA Buffer Count */
int dma_buf_len ; /*!< I2S DMA Buffer Length */
bool use_apll ; /*!< I2S using APLL as main I2S clock, enable it to get accurate clock */
bool tx_desc_auto_clear ; /*!< I2S auto clear tx descriptor if there is underflow condition (helps in avoiding noise in case of data unavailability) */
int fixed_mclk ; /*!< I2S using fixed MCLK output. If use_apll = true and fixed_mclk > 0, then the clock output for i2s is fixed and equal to the fixed_mclk value.*/
} i2s_config_t ;
/**
* @ brief I2S event types
*
*/
typedef enum {
I2S_EVENT_DMA_ERROR ,
I2S_EVENT_TX_DONE , /*!< I2S DMA finish sent 1 buffer*/
I2S_EVENT_RX_DONE , /*!< I2S DMA finish received 1 buffer*/
I2S_EVENT_MAX , /*!< I2S event max index*/
} i2s_event_type_t ;
/**
* @ brief I2S DAC mode for i2s_set_dac_mode .
*
* @ note PDM and built - in DAC functions are only supported on I2S0 for current ESP32 chip .
*/
typedef enum {
I2S_DAC_CHANNEL_DISABLE = 0 , /*!< Disable I2S built-in DAC signals*/
I2S_DAC_CHANNEL_RIGHT_EN = 1 , /*!< Enable I2S built-in DAC right channel, maps to DAC channel 1 on GPIO25*/
I2S_DAC_CHANNEL_LEFT_EN = 2 , /*!< Enable I2S built-in DAC left channel, maps to DAC channel 2 on GPIO26*/
I2S_DAC_CHANNEL_BOTH_EN = 0x3 , /*!< Enable both of the I2S built-in DAC channels.*/
I2S_DAC_CHANNEL_MAX = 0x4 , /*!< I2S built-in DAC mode max index*/
} i2s_dac_mode_t ;
/**
* @ brief Event structure used in I2S event queue
*
*/
typedef struct {
i2s_event_type_t type ; /*!< I2S event type */
size_t size ; /*!< I2S data size for I2S_DATA event*/
} i2s_event_t ;
/**
* @ brief I2S pin number for i2s_set_pin
*
*/
typedef struct {
int bck_io_num ; /*!< BCK in out pin*/
int ws_io_num ; /*!< WS in out pin*/
int data_out_num ; /*!< DATA out pin*/
int data_in_num ; /*!< DATA in pin*/
} i2s_pin_config_t ;
2020-02-20 08:00:48 +00:00
# if SOC_I2S_SUPPORTS_PDM
2019-07-15 06:44:15 +00:00
/**
* @ brief I2S PDM RX downsample mode
*/
typedef enum {
I2S_PDM_DSR_8S = 0 , /*!< downsampling number is 8 for PDM RX mode*/
I2S_PDM_DSR_16S , /*!< downsampling number is 16 for PDM RX mode*/
I2S_PDM_DSR_MAX ,
} i2s_pdm_dsr_t ;
# endif
typedef enum {
I2S_CLK_D2CLK = 0 ,
I2S_CLK_APLL ,
} i2s_clock_src_t ;
# ifdef __cplusplus
}
# endif