Skip to content

Commit 416bcb5

Browse files
committed
Add custom boards and support for INMP441 microphone on DogePe V2
1 parent e8ed16b commit 416bcb5

File tree

20 files changed

+1244
-10
lines changed

20 files changed

+1244
-10
lines changed

main/CMakeLists.txt

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ elseif(CONFIG_BOARD_TYPE_XMINI_C3)
192192
set(BOARD_TYPE "xmini-c3")
193193
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
194194
set(BUILTIN_ICON_FONT font_awesome_14_1)
195+
elseif(CONFIG_BOARD_TYPE_XMINI_C3_SUPERMINI)
196+
set(BOARD_TYPE "xmini-c3-supermini")
197+
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
198+
set(BUILTIN_ICON_FONT font_awesome_14_1)
195199
elseif(CONFIG_BOARD_TYPE_ESP32S3_KORVO2_V3)
196200
set(BOARD_TYPE "esp32s3-korvo2-v3")
197201
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
@@ -518,6 +522,17 @@ elseif(CONFIG_BOARD_TYPE_WTP4C5MP07S)
518522
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
519523
set(BUILTIN_ICON_FONT font_awesome_30_4)
520524
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
525+
elseif(CONFIG_BOARD_TYPE_DOGEPET_V2)
526+
# Folder name for DogePetV2 board
527+
set(BOARD_TYPE "dogepeV2")
528+
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
529+
set(BUILTIN_ICON_FONT font_awesome_16_4)
530+
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
531+
elseif(CONFIG_BOARD_TYPE_DOGEPET)
532+
set(BOARD_TYPE "dogepet")
533+
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
534+
set(BUILTIN_ICON_FONT font_awesome_16_4)
535+
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
521536
endif()
522537

523538
file(GLOB BOARD_SOURCES
@@ -532,11 +547,19 @@ if(CONFIG_USE_AUDIO_PROCESSOR)
532547
else()
533548
list(APPEND SOURCES "audio/processors/no_audio_processor.cc")
534549
endif()
550+
# Include wake word sources only for the selected implementation and target
551+
# Note: WAKE_WORD_TYPE is a Kconfig choice; only one of these will be set
535552
if(CONFIG_IDF_TARGET_ESP32S3 OR CONFIG_IDF_TARGET_ESP32P4)
536-
list(APPEND SOURCES "audio/wake_words/afe_wake_word.cc")
537-
list(APPEND SOURCES "audio/wake_words/custom_wake_word.cc")
553+
if(CONFIG_USE_AFE_WAKE_WORD)
554+
list(APPEND SOURCES "audio/wake_words/afe_wake_word.cc")
555+
endif()
556+
if(CONFIG_USE_CUSTOM_WAKE_WORD)
557+
list(APPEND SOURCES "audio/wake_words/custom_wake_word.cc")
558+
endif()
538559
else()
539-
list(APPEND SOURCES "audio/wake_words/esp_wake_word.cc")
560+
if(CONFIG_USE_ESP_WAKE_WORD)
561+
list(APPEND SOURCES "audio/wake_words/esp_wake_word.cc")
562+
endif()
540563
endif()
541564

542565
# Select language directory according to Kconfig
@@ -662,7 +685,6 @@ endif()
662685
idf_component_register(SRCS ${SOURCES}
663686
EMBED_FILES ${LANG_SOUNDS} ${COMMON_SOUNDS}
664687
INCLUDE_DIRS ${INCLUDE_DIRS}
665-
WHOLE_ARCHIVE
666688
)
667689

668690
# Use target_compile_definitions to define BOARD_TYPE, BOARD_NAME

main/Kconfig.projbuild

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ choice BOARD_TYPE
144144
config BOARD_TYPE_XMINI_C3
145145
bool "Xmini C3"
146146
depends on IDF_TARGET_ESP32C3
147+
config BOARD_TYPE_XMINI_C3_SUPERMINI
148+
bool "Xmini C3 SuperMini (MAX98357 + INMP441 + OLED 128x64)"
149+
depends on IDF_TARGET_ESP32C3
147150
config BOARD_TYPE_ESP32S3_KORVO2_V3
148151
bool "ESP32S3 KORVO2 V3"
149152
depends on IDF_TARGET_ESP32S3
@@ -421,6 +424,12 @@ choice BOARD_TYPE
421424
config BOARD_TYPE_WTP4C5MP07S
422425
bool "Wireless-Tag WTP4C5MP07S"
423426
depends on IDF_TARGET_ESP32P4
427+
config BOARD_TYPE_DOGEPET
428+
bool "DogePet (ESP32-S3 SuperMini)"
429+
depends on IDF_TARGET_ESP32S3
430+
config BOARD_TYPE_DOGEPET_V2
431+
bool "DogePetV2 (ESP32-S3 SuperMini)"
432+
depends on IDF_TARGET_ESP32S3
424433
endchoice
425434

426435
choice
@@ -468,8 +477,10 @@ choice DISPLAY_OLED_TYPE
468477
endchoice
469478

470479
choice DISPLAY_LCD_TYPE
471-
depends on BOARD_TYPE_BREAD_COMPACT_WIFI_LCD || BOARD_TYPE_BREAD_COMPACT_ESP32_LCD || BOARD_TYPE_ESP32_CGC || BOARD_TYPE_ESP32P4_NANO || BOARD_TYPE_ESP32P4_WIFI6_Touch_LCD_XC || BOARD_TYPE_BREAD_COMPACT_WIFI_CAM
480+
depends on BOARD_TYPE_BREAD_COMPACT_WIFI_LCD || BOARD_TYPE_BREAD_COMPACT_ESP32_LCD || BOARD_TYPE_ESP32_CGC || BOARD_TYPE_ESP32P4_NANO || BOARD_TYPE_ESP32P4_WIFI6_Touch_LCD_XC || BOARD_TYPE_BREAD_COMPACT_WIFI_CAM || BOARD_TYPE_DOGEBOARD || BOARD_TYPE_DOGEPET || BOARD_TYPE_DOGEPET_V2
472481
prompt "LCD Type"
482+
default LCD_ST7789_240X240 if BOARD_TYPE_DOGEPET
483+
default LCD_ST7789_240X280 if BOARD_TYPE_DOGEPET_V2
473484
default LCD_ST7789_240X320
474485
help
475486
LCD Display Type

main/audio/audio_service.cc

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,15 @@
88
#include "processors/no_audio_processor.h"
99
#endif
1010

11-
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4
11+
#if (CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4)
12+
#if CONFIG_USE_AFE_WAKE_WORD
1213
#include "wake_words/afe_wake_word.h"
14+
#endif
15+
#if CONFIG_USE_CUSTOM_WAKE_WORD
1316
#include "wake_words/custom_wake_word.h"
14-
#else
17+
#endif
18+
#endif
19+
#if CONFIG_USE_ESP_WAKE_WORD
1520
#include "wake_words/esp_wake_word.h"
1621
#endif
1722

@@ -652,20 +657,32 @@ void AudioService::CheckAndUpdateAudioPowerState() {
652657
void AudioService::SetModelsList(srmodel_list_t* models_list) {
653658
models_list_ = models_list;
654659

655-
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4
660+
#if (CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4)
661+
#if CONFIG_USE_CUSTOM_WAKE_WORD
656662
if (esp_srmodel_filter(models_list_, ESP_MN_PREFIX, NULL) != nullptr) {
657663
wake_word_ = std::make_unique<CustomWakeWord>();
658-
} else if (esp_srmodel_filter(models_list_, ESP_WN_PREFIX, NULL) != nullptr) {
664+
} else {
665+
wake_word_ = nullptr;
666+
}
667+
#elif CONFIG_USE_AFE_WAKE_WORD
668+
if (esp_srmodel_filter(models_list_, ESP_WN_PREFIX, NULL) != nullptr) {
659669
wake_word_ = std::make_unique<AfeWakeWord>();
660670
} else {
661671
wake_word_ = nullptr;
662672
}
663673
#else
674+
wake_word_ = nullptr;
675+
#endif
676+
#else
677+
#if CONFIG_USE_ESP_WAKE_WORD
664678
if (esp_srmodel_filter(models_list_, ESP_WN_PREFIX, NULL) != nullptr) {
665679
wake_word_ = std::make_unique<EspWakeWord>();
666680
} else {
667681
wake_word_ = nullptr;
668682
}
683+
#else
684+
wake_word_ = nullptr;
685+
#endif
669686
#endif
670687

671688
if (wake_word_) {
@@ -678,7 +695,7 @@ void AudioService::SetModelsList(srmodel_list_t* models_list) {
678695
}
679696

680697
bool AudioService::IsAfeWakeWord() {
681-
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4
698+
#if (CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4) && CONFIG_USE_AFE_WAKE_WORD
682699
return wake_word_ != nullptr && dynamic_cast<AfeWakeWord*>(wake_word_.get()) != nullptr;
683700
#else
684701
return false;

main/audio/codecs/no_audio_codec.cc

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,69 @@ NoAudioCodecDuplex::NoAudioCodecDuplex(int input_sample_rate, int output_sample_
7474
ESP_LOGI(TAG, "Duplex channels created");
7575
}
7676

77+
NoAudioCodecDuplex::NoAudioCodecDuplex(int input_sample_rate, int output_sample_rate, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din, i2s_std_slot_mask_t rx_slot_mask) {
78+
duplex_ = true;
79+
input_sample_rate_ = input_sample_rate;
80+
output_sample_rate_ = output_sample_rate;
81+
82+
i2s_chan_config_t chan_cfg = {
83+
.id = I2S_NUM_0,
84+
.role = I2S_ROLE_MASTER,
85+
.dma_desc_num = AUDIO_CODEC_DMA_DESC_NUM,
86+
.dma_frame_num = AUDIO_CODEC_DMA_FRAME_NUM,
87+
.auto_clear_after_cb = true,
88+
.auto_clear_before_cb = false,
89+
.intr_priority = 0,
90+
};
91+
ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, &tx_handle_, &rx_handle_));
92+
93+
i2s_std_config_t std_cfg = {
94+
.clk_cfg = {
95+
.sample_rate_hz = (uint32_t)output_sample_rate_,
96+
.clk_src = I2S_CLK_SRC_DEFAULT,
97+
.mclk_multiple = I2S_MCLK_MULTIPLE_256,
98+
#ifdef I2S_HW_VERSION_2
99+
.ext_clk_freq_hz = 0,
100+
#endif
101+
102+
},
103+
.slot_cfg = {
104+
.data_bit_width = I2S_DATA_BIT_WIDTH_32BIT,
105+
.slot_bit_width = I2S_SLOT_BIT_WIDTH_AUTO,
106+
.slot_mode = I2S_SLOT_MODE_MONO,
107+
.slot_mask = I2S_STD_SLOT_LEFT,
108+
.ws_width = I2S_DATA_BIT_WIDTH_32BIT,
109+
.ws_pol = false,
110+
.bit_shift = true,
111+
#ifdef I2S_HW_VERSION_2
112+
.left_align = true,
113+
.big_endian = false,
114+
.bit_order_lsb = false
115+
#endif
116+
117+
},
118+
.gpio_cfg = {
119+
.mclk = I2S_GPIO_UNUSED,
120+
.bclk = bclk,
121+
.ws = ws,
122+
.dout = dout,
123+
.din = din,
124+
.invert_flags = {
125+
.mclk_inv = false,
126+
.bclk_inv = false,
127+
.ws_inv = false
128+
}
129+
}
130+
};
131+
ESP_ERROR_CHECK(i2s_channel_init_std_mode(tx_handle_, &std_cfg));
132+
133+
// Configure RX channel with specified slot mask (e.g., I2S_STD_SLOT_RIGHT for INMP441)
134+
std_cfg.slot_cfg.slot_mask = rx_slot_mask;
135+
ESP_ERROR_CHECK(i2s_channel_init_std_mode(rx_handle_, &std_cfg));
136+
ESP_LOGI(TAG, "Duplex channels created (TX: LEFT, RX: %s)",
137+
rx_slot_mask == I2S_STD_SLOT_RIGHT ? "RIGHT" : "LEFT");
138+
}
139+
77140

78141
NoAudioCodecSimplex::NoAudioCodecSimplex(int input_sample_rate, int output_sample_rate, gpio_num_t spk_bclk, gpio_num_t spk_ws, gpio_num_t spk_dout, gpio_num_t mic_sck, gpio_num_t mic_ws, gpio_num_t mic_din) {
79142
duplex_ = false;

main/audio/codecs/no_audio_codec.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class NoAudioCodec : public AudioCodec {
2121
class NoAudioCodecDuplex : public NoAudioCodec {
2222
public:
2323
NoAudioCodecDuplex(int input_sample_rate, int output_sample_rate, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din);
24+
NoAudioCodecDuplex(int input_sample_rate, int output_sample_rate, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din, i2s_std_slot_mask_t rx_slot_mask);
2425
};
2526

2627
class NoAudioCodecSimplex : public NoAudioCodec {

0 commit comments

Comments
 (0)