Skip to content

Commit

Permalink
bsp: Added support for IDF v4.4 into ESP-BOX-Lite
Browse files Browse the repository at this point in the history
  • Loading branch information
espzav committed Aug 10, 2023
1 parent bf3cc23 commit 06f8f30
Show file tree
Hide file tree
Showing 11 changed files with 334 additions and 157 deletions.
2 changes: 1 addition & 1 deletion .build-test-rules.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
examples:
disable:
- if: IDF_VERSION_MAJOR < 5 and CONFIG_NAME not in ["esp-box"]
- if: IDF_VERSION_MAJOR < 5 and CONFIG_NAME not in ["esp-box", "esp-box-lite"]
reason: Example depends on BSP, which is supported only for IDF >= 5.0
9 changes: 8 additions & 1 deletion esp-box-lite/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
#IDF version is less than IDF5.0
if("${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}" VERSION_LESS "5.0")
set(SRC_VER "esp-box-lite_idf4.c")
else()
set(SRC_VER "esp-box-lite_idf5.c")
endif()

idf_component_register(
SRCS "esp-box-lite.c"
SRCS "esp-box-lite.c" ${SRC_VER}
INCLUDE_DIRS "include"
PRIV_INCLUDE_DIRS "priv_include"
REQUIRES driver spiffs
Expand Down
120 changes: 42 additions & 78 deletions esp-box-lite/esp-box-lite.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,27 +24,36 @@
static const char *TAG = "ESP-BOX-LITE";

static lv_indev_t *disp_indev = NULL; /* Input device (buttons) */
static const audio_codec_data_if_t *i2s_data_if = NULL; /* Codec data interface */
static i2s_chan_handle_t i2s_tx_chan = NULL;
static i2s_chan_handle_t i2s_rx_chan = NULL;
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
static adc_oneshot_unit_handle_t bsp_adc_handle = NULL;
#endif

const button_config_t bsp_button_config[BSP_BUTTON_NUM] = {
static const button_config_t bsp_button_config[BSP_BUTTON_NUM] = {
{
.type = BUTTON_TYPE_ADC,
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
.adc_button_config.adc_handle = &bsp_adc_handle,
#endif
.adc_button_config.adc_channel = ADC_CHANNEL_0, // ADC1 channel 0 is GPIO1
.adc_button_config.button_index = BSP_BUTTON_PREV,
.adc_button_config.min = 2310, // middle is 2410mV
.adc_button_config.max = 2510
},
{
.type = BUTTON_TYPE_ADC,
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
.adc_button_config.adc_handle = &bsp_adc_handle,
#endif
.adc_button_config.adc_channel = ADC_CHANNEL_0, // ADC1 channel 0 is GPIO1
.adc_button_config.button_index = BSP_BUTTON_ENTER,
.adc_button_config.min = 1880, // middle is 1980mV
.adc_button_config.max = 2080
},
{
.type = BUTTON_TYPE_ADC,
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
.adc_button_config.adc_handle = &bsp_adc_handle,
#endif
.adc_button_config.adc_channel = ADC_CHANNEL_0, // ADC1 channel 0 is GPIO1
.adc_button_config.button_index = BSP_BUTTON_NEXT,
.adc_button_config.min = 720, // middle is 820mV
Expand Down Expand Up @@ -116,81 +125,20 @@ esp_err_t bsp_spiffs_unmount(void)
return esp_vfs_spiffs_unregister(CONFIG_BSP_SPIFFS_PARTITION_LABEL);
}


esp_err_t bsp_audio_init(const i2s_std_config_t *i2s_config, i2s_chan_handle_t *tx_channel, i2s_chan_handle_t *rx_channel)
{
if (i2s_tx_chan && i2s_rx_chan && i2s_data_if) {
if (tx_channel) {
*tx_channel = i2s_tx_chan;
}
if (rx_channel) {
*rx_channel = i2s_rx_chan;
}

/* Audio was initialized before */
return ESP_OK;
}

/* Setup I2S peripheral */
i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(CONFIG_BSP_I2S_NUM, I2S_ROLE_MASTER);
chan_cfg.auto_clear = true; // Auto clear the legacy data in the DMA buffer
BSP_ERROR_CHECK_RETURN_ERR(i2s_new_channel(&chan_cfg, tx_channel, rx_channel));

/* Setup I2S channels */
const i2s_std_config_t std_cfg_default = BSP_I2S_DUPLEX_MONO_CFG(22050);
const i2s_std_config_t *p_i2s_cfg = &std_cfg_default;
if (i2s_config != NULL) {
p_i2s_cfg = i2s_config;
}

if (tx_channel != NULL) {
BSP_ERROR_CHECK_RETURN_ERR(i2s_channel_init_std_mode(*tx_channel, p_i2s_cfg));
BSP_ERROR_CHECK_RETURN_ERR(i2s_channel_enable(*tx_channel));
}
if (rx_channel != NULL) {
BSP_ERROR_CHECK_RETURN_ERR(i2s_channel_init_std_mode(*rx_channel, p_i2s_cfg));
BSP_ERROR_CHECK_RETURN_ERR(i2s_channel_enable(*rx_channel));
}

audio_codec_i2s_cfg_t i2s_cfg = {
.port = CONFIG_BSP_I2S_NUM,
.rx_handle = i2s_rx_chan,
.tx_handle = i2s_tx_chan,
};
i2s_data_if = audio_codec_new_i2s_data(&i2s_cfg);
BSP_NULL_CHECK(i2s_data_if, NULL);

/* Setup power amplifier pin */
const gpio_config_t io_conf = {
.intr_type = GPIO_INTR_DISABLE,
.mode = GPIO_MODE_OUTPUT,
.pin_bit_mask = BIT64(BSP_POWER_AMP_IO),
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.pull_up_en = GPIO_PULLDOWN_DISABLE,
};
BSP_ERROR_CHECK_RETURN_ERR(gpio_config(&io_conf));

return ESP_OK;
}

esp_err_t bsp_audio_poweramp_enable(bool enable)
{
BSP_ERROR_CHECK_RETURN_ERR(gpio_set_level(BSP_POWER_AMP_IO, enable ? 1 : 0));

return ESP_OK;
}

esp_codec_dev_handle_t bsp_audio_codec_speaker_init(void)
{
if (i2s_tx_chan == NULL || i2s_rx_chan == NULL || i2s_data_if == NULL) {
const audio_codec_data_if_t *i2s_data_if = bsp_audio_get_codec_itf();
if (i2s_data_if == NULL) {
/* Initilize I2C */
BSP_ERROR_CHECK_RETURN_ERR(bsp_i2c_init());
BSP_ERROR_CHECK_RETURN_NULL(bsp_i2c_init());
/* Configure I2S peripheral and Power Amplifier */
BSP_ERROR_CHECK_RETURN_ERR(bsp_audio_init(NULL, &i2s_tx_chan, &i2s_rx_chan));
BSP_ERROR_CHECK_RETURN_ERR(bsp_audio_poweramp_enable(true));
BSP_ERROR_CHECK_RETURN_NULL(bsp_audio_init(NULL));
i2s_data_if = bsp_audio_get_codec_itf();
}
assert(i2s_data_if);

const audio_codec_gpio_if_t *gpio_if = audio_codec_new_gpio();

audio_codec_i2c_cfg_t i2c_cfg = {
.port = BSP_I2C_NUM,
.addr = ES8156_CODEC_DEFAULT_ADDR,
Expand All @@ -205,6 +153,7 @@ esp_codec_dev_handle_t bsp_audio_codec_speaker_init(void)

es8156_codec_cfg_t es8156_cfg = {
.ctrl_if = i2c_ctrl_if,
.gpio_if = gpio_if,
.pa_pin = BSP_POWER_AMP_IO,
.pa_reverted = false,
.hw_gain = gain,
Expand All @@ -222,12 +171,13 @@ esp_codec_dev_handle_t bsp_audio_codec_speaker_init(void)

esp_codec_dev_handle_t bsp_audio_codec_microphone_init(void)
{
if (i2s_tx_chan == NULL || i2s_rx_chan == NULL || i2s_data_if == NULL) {
const audio_codec_data_if_t *i2s_data_if = bsp_audio_get_codec_itf();
if (i2s_data_if == NULL) {
/* Initilize I2C */
BSP_ERROR_CHECK_RETURN_ERR(bsp_i2c_init());
BSP_ERROR_CHECK_RETURN_NULL(bsp_i2c_init());
/* Configure I2S peripheral and Power Amplifier */
BSP_ERROR_CHECK_RETURN_ERR(bsp_audio_init(NULL, &i2s_tx_chan, &i2s_rx_chan));
BSP_ERROR_CHECK_RETURN_ERR(bsp_audio_poweramp_enable(true));
BSP_ERROR_CHECK_RETURN_NULL(bsp_audio_init(NULL));
i2s_data_if = bsp_audio_get_codec_itf();
}
assert(i2s_data_if);

Expand Down Expand Up @@ -407,6 +357,12 @@ static lv_disp_t *bsp_display_lcd_init(void)

static lv_indev_t *bsp_display_indev_init(lv_disp_t *disp)
{
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
/* Initialize ADC and get ADC handle */
BSP_ERROR_CHECK_RETURN_NULL(bsp_adc_initialize());
bsp_adc_handle = bsp_adc_get_handle();
#endif

const lvgl_port_nav_btns_cfg_t btns = {
.disp = disp,
.button_prev = &bsp_button_config[BSP_BUTTON_PREV],
Expand All @@ -418,10 +374,18 @@ static lv_indev_t *bsp_display_indev_init(lv_disp_t *disp)
}

lv_disp_t *bsp_display_start(void)
{
bsp_display_cfg_t cfg = {
.lvgl_port_cfg = ESP_LVGL_PORT_INIT_CONFIG()
};
return bsp_display_start_with_config(&cfg);
}

lv_disp_t *bsp_display_start_with_config(const bsp_display_cfg_t *cfg)
{
lv_disp_t *disp;
const lvgl_port_cfg_t lvgl_cfg = ESP_LVGL_PORT_INIT_CONFIG();
BSP_ERROR_CHECK_RETURN_NULL(lvgl_port_init(&lvgl_cfg));
assert(cfg != NULL);
BSP_ERROR_CHECK_RETURN_NULL(lvgl_port_init(&cfg->lvgl_port_cfg));

BSP_ERROR_CHECK_RETURN_NULL(bsp_display_brightness_init());

Expand Down
80 changes: 80 additions & 0 deletions esp-box-lite/esp-box-lite_idf4.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/*
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/

#include "esp_err.h"
#include "bsp/esp-box-lite.h"
#include "bsp_err_check.h"
#include "esp_codec_dev_defaults.h"

static const char *TAG = "ESP-BOX";

/* This configuration is used by default in bsp_audio_init() */
#define BSP_I2S_DUPLEX_MONO_CFG(_sample_rate) \
{ \
.mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX, \
.sample_rate = _sample_rate, \
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, \
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, \
.communication_format = I2S_COMM_FORMAT_STAND_I2S, \
.dma_buf_count = 3, \
.dma_buf_len = 1024, \
.use_apll = true, \
.tx_desc_auto_clear = true, \
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL2 | ESP_INTR_FLAG_IRAM \
}

static const audio_codec_data_if_t *i2s_data_if = NULL; /* Codec data interface */

esp_err_t bsp_audio_init(const i2s_config_t *i2s_config)
{
esp_err_t ret = ESP_FAIL;

if (i2s_data_if != NULL) {
/* Audio was initialized before */
return ESP_OK;
}

/* Setup I2S peripheral */
const i2s_pin_config_t i2s_pin_config = {
.mck_io_num = BSP_I2S_MCLK,
.bck_io_num = BSP_I2S_SCLK,
.ws_io_num = BSP_I2S_LCLK,
.data_out_num = BSP_I2S_DOUT,
.data_in_num = BSP_I2S_DSIN
};

/* Setup I2S channels */
const i2s_config_t std_cfg_default = BSP_I2S_DUPLEX_MONO_CFG(22050);
const i2s_config_t *p_i2s_cfg = &std_cfg_default;
if (i2s_config != NULL) {
p_i2s_cfg = i2s_config;
}

ESP_ERROR_CHECK(i2s_driver_install(CONFIG_BSP_I2S_NUM, p_i2s_cfg, 0, NULL));
ESP_GOTO_ON_ERROR(i2s_set_pin(CONFIG_BSP_I2S_NUM, &i2s_pin_config), err, TAG, "I2S set pin failed");

audio_codec_i2s_cfg_t i2s_cfg = {
.port = CONFIG_BSP_I2S_NUM,
};
i2s_data_if = audio_codec_new_i2s_data(&i2s_cfg);
BSP_NULL_CHECK_GOTO(i2s_data_if, err);

return ESP_OK;

err:
i2s_driver_uninstall(CONFIG_BSP_I2S_NUM);
return ret;
}

const audio_codec_data_if_t *bsp_audio_get_codec_itf(void)
{
return i2s_data_if;
}

esp_err_t bsp_adc_initialize(void)
{
return ESP_OK;
}
Loading

0 comments on commit 06f8f30

Please sign in to comment.