4 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
8 #if !defined (M5UNIFIED_PC_BUILD)
9 #include <soc/efuse_reg.h>
10 #include <soc/gpio_periph.h>
12 #if __has_include (<driver/i2s.h>)
13 #include <driver/i2s.h>
16 #if __has_include (<esp_idf_version.h>)
17 #include <esp_idf_version.h>
18 #if ESP_IDF_VERSION_MAJOR >= 4
20 #define NON_BREAK ;[[fallthrough]];
36 #if !defined (M5UNIFIED_PC_BUILD)
37 #if defined (ESP_IDF_VERSION_VAL)
38 #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(3, 3, 4)
51 static constexpr
const uint8_t _pin_table_i2c_ex_in[][5] = {
53 #if defined (CONFIG_IDF_TARGET_ESP32S3)
54 { board_t::board_M5StackCoreS3, 11,12 , 1, 2 },
55 { board_t::board_M5StampS3 ,255,255, 15,13 },
56 { board_t::board_M5Capsule , 10, 8 , 15,13 },
57 { board_t::board_M5Dial , 12,11 , 15,13 },
58 { board_t::board_M5DinMeter , 12,11 , 15,13 },
59 { board_t::board_M5Cardputer ,255,255, 1, 2 },
60 { board_t::board_unknown , 39,38 , 1, 2 },
61 #elif defined (CONFIG_IDF_TARGET_ESP32C3)
62 { board_t::board_unknown ,255,255, 0, 1 },
64 { board_t::board_M5Stack , 22,21, 22,21 },
65 { board_t::board_M5Paper , 22,21, 32,25 },
66 { board_t::board_M5TimerCam , 14,12, 13, 4 },
67 { board_t::board_M5Atom , 21,25, 32,26 },
68 { board_t::board_M5AtomU , 21,25, 32,26 },
69 { board_t::board_M5AtomPsram , 21,25, 32,26 },
70 { board_t::board_unknown , 22,21, 33,32 },
74 static constexpr
const uint8_t _pin_table_port_bc[][5] = {
76 #if defined (CONFIG_IDF_TARGET_ESP32S3)
77 { board_t::board_M5StackCoreS3, 8, 9, 18,17 },
78 { board_t::board_M5Dial , 1, 2, 255,255 },
79 { board_t::board_M5DinMeter , 1, 2, 255,255 },
80 #elif defined (CONFIG_IDF_TARGET_ESP32C3)
82 { board_t::board_M5Stack , 36,26, 16,17 },
83 { board_t::board_M5StackCore2 , 36,26, 13,14 },
84 { board_t::board_M5Paper , 33,26, 19,18 },
85 { board_t::board_M5Station , 35,25, 13,14 },
87 { board_t::board_unknown , 255,255, 255,255 },
90 static constexpr
const uint8_t _pin_table_port_de[][5] = {
92 #if defined (CONFIG_IDF_TARGET_ESP32S3)
93 { board_t::board_M5StackCoreS3, 14,10, 18,17 },
94 #elif defined (CONFIG_IDF_TARGET_ESP32C3)
96 { board_t::board_M5Stack , 34,35, 5,13 },
97 { board_t::board_M5StackCore2 , 34,35, 27,19 },
98 { board_t::board_M5Station , 36,26, 16,17 },
100 { board_t::board_unknown , 255,255, 255,255 },
103 static constexpr
const uint8_t _pin_table_spi_sd[][5] = {
105 #if defined (CONFIG_IDF_TARGET_ESP32S3)
106 { board_t::board_M5StackCoreS3, 36, 37, 35, 4 },
107 { board_t::board_M5Capsule , 14, 12, 39, 11 },
108 { board_t::board_M5Cardputer , 40, 14, 39, 12 },
109 #elif defined (CONFIG_IDF_TARGET_ESP32C3)
111 { board_t::board_M5Stack , 18, 23, 19, 4 },
112 { board_t::board_M5StackCore2 , 18, 23, 38, 4 },
113 { board_t::board_M5Paper , 14, 12, 13, 4 },
115 { board_t::board_unknown , 255,255, 255,255 },
118 static constexpr
const uint8_t _pin_table_other[][2] = {
120 #if defined (CONFIG_IDF_TARGET_ESP32S3)
121 { board_t::board_M5AtomS3U , 35 },
122 { board_t::board_M5AtomS3Lite , 35 },
123 { board_t::board_M5StampS3 , 21 },
124 { board_t::board_M5Capsule , 21 },
125 { board_t::board_M5Cardputer , 21 },
126 #elif defined (CONFIG_IDF_TARGET_ESP32C3)
127 { board_t::board_M5StampC3 , 2 },
128 { board_t::board_M5StampC3U , 2 },
130 { board_t::board_M5Stack , 15 },
131 { board_t::board_M5StackCore2 , 25 },
132 { board_t::board_M5Station , 4 },
133 { board_t::board_M5Atom , 27 },
134 { board_t::board_M5AtomU , 27 },
135 { board_t::board_M5AtomPsram , 27 },
136 { board_t::board_M5StampPico , 27 },
138 { board_t::board_unknown , 255 },
141 void M5Unified::_setup_pinmap(
board_t id)
143 constexpr
const std::pair<const void*, size_t> tbl[] = {
144 { _pin_table_i2c_ex_in,
sizeof(_pin_table_i2c_ex_in[0]) },
145 { _pin_table_port_bc,
sizeof(_pin_table_port_bc[0]) },
146 { _pin_table_port_de,
sizeof(_pin_table_port_de[0]) },
147 { _pin_table_spi_sd,
sizeof(_pin_table_spi_sd[0]) },
148 { _pin_table_other,
sizeof(_pin_table_other[0]) },
151 int8_t* dst = _get_pin_table;
152 for (
auto &p : tbl) {
153 const uint8_t* t = (uint8_t*)p.first;
154 size_t len = p.second;
155 while (t[0] !=
id && t[0] != board_t::board_unknown) { t += len; }
156 memcpy(dst, &t[1], len - 1);
161 #if defined (CONFIG_IDF_TARGET_ESP32S3)
162 static constexpr uint8_t aw88298_i2c_addr = 0x36;
163 static constexpr uint8_t es7210_i2c_addr = 0x40;
164 static constexpr uint8_t aw9523_i2c_addr = 0x58;
165 static void aw88298_write_reg(uint8_t reg, uint16_t
value)
171 static void es7210_write_reg(uint8_t reg, uint8_t
value)
178 bool M5Unified::_speaker_enabled_cb(
void* args,
bool enabled)
182 switch (self->getBoard())
184 #if defined (M5UNIFIED_PC_BUILD)
185 #elif defined (CONFIG_IDF_TARGET_ESP32S3)
186 case board_t::board_M5StackCoreS3:
188 auto cfg =
self->Speaker.config();
189 if (cfg.pin_bck == GPIO_NUM_34 && enabled)
191 self->In_I2C.bitOn(aw9523_i2c_addr, 0x02, 0b00000100, 400000);
193 static constexpr uint8_t rate_tbl[] = {4,5,6,8,10,11,15,20,22,44};
194 size_t reg0x06_value = 0;
195 size_t rate = (cfg.sample_rate + 1102) / 2205;
196 while (rate > rate_tbl[reg0x06_value] && ++reg0x06_value <
sizeof(rate_tbl)) {}
198 reg0x06_value |= 0x14C0;
199 aw88298_write_reg( 0x61, 0x0673 );
200 aw88298_write_reg( 0x04, 0x4040 );
201 aw88298_write_reg( 0x05, 0x0008 );
202 aw88298_write_reg( 0x06, reg0x06_value );
203 aw88298_write_reg( 0x0C, 0x0064 );
207 aw88298_write_reg( 0x04, 0x4000 );
208 self->In_I2C.bitOff(aw9523_i2c_addr, 0x02, 0b00000100, 400000);
213 #elif !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32)
214 case board_t::board_M5StackCore2:
215 case board_t::board_M5Tough:
217 auto spk_cfg =
self->Speaker.config();
218 if (spk_cfg.pin_bck == GPIO_NUM_12
219 && spk_cfg.pin_ws == GPIO_NUM_0
220 && spk_cfg.pin_data_out == GPIO_NUM_2
222 switch (self->Power.getType()) {
224 self->Power.Axp192.setGPIO2(enabled);
227 self->Power.Axp2101.setALDO3(enabled * 3300);
236 case board_t::board_M5StickC:
237 case board_t::board_M5StickCPlus:
238 case board_t::board_M5StickCPlus2:
239 case board_t::board_M5StackCoreInk:
241 if (self->use_hat_spk)
243 gpio_num_t pin_en =
self->_board == board_t::board_M5StackCoreInk ? GPIO_NUM_25 : GPIO_NUM_0;
246 m5gfx::pinMode(pin_en, m5gfx::pin_mode_t::output);
247 m5gfx::gpio_hi(pin_en);
250 { m5gfx::gpio_lo(pin_en); }
261 bool M5Unified::_microphone_enabled_cb(
void* args,
bool enabled)
265 switch (self->getBoard())
267 #if defined (M5UNIFIED_PC_BUILD)
268 #elif defined (CONFIG_IDF_TARGET_ESP32S3)
269 case board_t::board_M5StackCoreS3:
271 auto cfg =
self->Mic.config();
272 if (cfg.pin_bck == GPIO_NUM_34)
274 es7210_write_reg(0x00, 0xFF);
282 static constexpr reg_data_t data[] =
316 es7210_write_reg(d.reg, d.value);
336 #elif !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32)
337 case board_t::board_M5StickC:
338 case board_t::board_M5StickCPlus:
339 self->Power.Axp192.setLDO0(enabled ? 2800 : 0);
349 #if defined (M5UNIFIED_PC_BUILD)
350 #elif !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32)
351 static constexpr gpio_num_t TFCARD_CS_PIN = GPIO_NUM_4;
352 static constexpr gpio_num_t CoreInk_BUTTON_EXT_PIN = GPIO_NUM_5;
353 static constexpr gpio_num_t CoreInk_BUTTON_PWR_PIN = GPIO_NUM_27;
358 #if defined (M5UNIFIED_PC_BUILD)
359 #elif !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32)
360 if (board == board_t::board_unknown)
362 switch (m5gfx::get_pkg_ver())
364 case EFUSE_RD_CHIP_VER_PKG_ESP32D0WDQ6:
365 board = board_t::board_M5TimerCam;
368 case EFUSE_RD_CHIP_VER_PKG_ESP32PICOD4:
369 m5gfx::pinMode(GPIO_NUM_2, m5gfx::pin_mode_t::input_pullup);
370 m5gfx::pinMode(GPIO_NUM_34, m5gfx::pin_mode_t::input);
371 board = m5gfx::gpio_in(GPIO_NUM_2)
372 ? (m5gfx::gpio_in(GPIO_NUM_34) ? board_t::board_M5Atom : board_t::board_M5AtomU)
373 : board_t::board_M5StampPico;
374 m5gfx::pinMode(GPIO_NUM_2, m5gfx::pin_mode_t::input_pulldown);
378 board = board_t::board_M5AtomPsram;
383 #if defined ( ARDUINO_M5STACK_CORE_ESP32 ) || defined ( ARDUINO_M5STACK_FIRE ) || defined ( ARDUINO_M5Stack_Core_ESP32 )
385 board = board_t::board_M5Stack;
387 #elif defined ( ARDUINO_M5STACK_CORE2 ) || defined ( ARDUINO_M5STACK_Core2 )
389 board = board_t::board_M5StackCore2;
391 #elif defined ( ARDUINO_M5STICK_C ) || defined ( ARDUINO_M5Stick_C )
393 board = board_t::board_M5StickC;
395 #elif defined ( ARDUINO_M5STICK_C_PLUS ) || defined ( ARDUINO_M5Stick_C_Plus )
397 board = board_t::board_M5StickCPlus;
399 #elif defined ( ARDUINO_M5STACK_COREINK ) || defined ( ARDUINO_M5Stack_CoreInk )
401 board = board_t::board_M5StackCoreInk;
403 #elif defined ( ARDUINO_M5STACK_PAPER ) || defined ( ARDUINO_M5STACK_Paper )
405 board = board_t::board_M5Paper;
407 #elif defined ( ARDUINO_M5STACK_TOUGH )
409 board = board_t::board_M5Tough;
411 #elif defined ( ARDUINO_M5STACK_ATOM ) || defined ( ARDUINO_M5Stack_ATOM )
413 board = board_t::board_M5Atom;
415 #elif defined ( ARDUINO_M5STACK_TIMER_CAM ) || defined ( ARDUINO_M5Stack_Timer_CAM )
417 board = board_t::board_M5TimerCam;
424 #elif defined (CONFIG_IDF_TARGET_ESP32S3)
425 if (board == board_t::board_unknown)
436 m5gfx::gpio::pin_backup_t pin_backup[] = { GPIO_NUM_4, GPIO_NUM_8, GPIO_NUM_10, GPIO_NUM_12, GPIO_NUM_38 };
437 auto result = m5gfx::gpio::command(
439 m5gfx::gpio::command_mode_input_pulldown, GPIO_NUM_4,
440 m5gfx::gpio::command_mode_input_pulldown, GPIO_NUM_12,
441 m5gfx::gpio::command_mode_input_pulldown, GPIO_NUM_38,
442 m5gfx::gpio::command_mode_input_pulldown, GPIO_NUM_8,
443 m5gfx::gpio::command_mode_input_pulldown, GPIO_NUM_10,
444 m5gfx::gpio::command_mode_input_pullup , GPIO_NUM_4,
445 m5gfx::gpio::command_mode_input_pullup , GPIO_NUM_12,
446 m5gfx::gpio::command_mode_input_pullup , GPIO_NUM_38,
447 m5gfx::gpio::command_read , GPIO_NUM_8,
448 m5gfx::gpio::command_read , GPIO_NUM_10,
449 m5gfx::gpio::command_read , GPIO_NUM_4,
450 m5gfx::gpio::command_read , GPIO_NUM_12,
451 m5gfx::gpio::command_read , GPIO_NUM_38,
452 m5gfx::gpio::command_mode_input , GPIO_NUM_38,
453 m5gfx::gpio::command_delay , 1,
454 m5gfx::gpio::command_read , GPIO_NUM_38,
455 m5gfx::gpio::command_end
461 board_t::board_unknown, board_t::board_unknown, board_t::board_M5StampS3, board_t::board_unknown,
462 board_t::board_M5AtomS3Lite,board_t::board_M5AtomS3Lite,board_t::board_M5StampS3, board_t::board_M5AtomS3Lite,
463 board_t::board_M5AtomS3U, board_t::board_M5AtomS3U, board_t::board_M5StampS3, board_t::board_M5AtomS3U,
464 board_t::board_unknown, board_t::board_unknown, board_t::board_M5StampS3, board_t::board_unknown,
466 if (board == board_t::board_M5StampS3) {
467 if ((result >> 3) == 0b110) { board = board_t::board_M5Capsule; }
469 for (
auto &backup : pin_backup) {
474 #elif defined (CONFIG_IDF_TARGET_ESP32C3)
475 if (board == board_t::board_unknown)
477 uint32_t tmp = *((
volatile uint32_t *)(IO_MUX_GPIO20_REG));
478 m5gfx::pinMode(GPIO_NUM_20, m5gfx::pin_mode_t::input_pulldown);
483 if (m5gfx::gpio_in(GPIO_NUM_20) ==
false)
485 board = board_t::board_M5StampC3U;
487 *((
volatile uint32_t *)(IO_MUX_GPIO20_REG)) = tmp;
495 void M5Unified::_setup_i2c(
board_t board)
497 #if !defined (M5UNIFIED_PC_BUILD)
504 i2c_port_t ex_port = I2C_NUM_0;
505 #if defined (CONFIG_IDF_TARGET_ESP32C3)
506 i2c_port_t in_port = I2C_NUM_0;
508 i2c_port_t in_port = I2C_NUM_1;
509 if (in_scl == ex_scl && in_sda == ex_sda) {
513 if ((
int)in_scl >= 0)
522 if ((
int)ex_scl >= 0)
530 void M5Unified::_begin(
const config_t& cfg)
535 if (cfg.led_brightness)
539 if (
Power.
getType() == Power_Class::pmic_t::pmic_axp2101
542 use_pmic_button = cfg.pmic_button;
547 if (cfg.clear_display)
552 #if defined (M5UNIFIED_PC_BUILD)
553 #elif !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32)
556 case board_t::board_M5Stack:
558 m5gfx::pinMode(GPIO_NUM_15, m5gfx::pin_mode_t::output);
559 m5gfx::gpio_lo(GPIO_NUM_15);
565 for (
auto gpio: (
const gpio_num_t[]){ GPIO_NUM_18, GPIO_NUM_19, GPIO_NUM_23 })
567 *(
volatile uint32_t*)(GPIO_PIN_MUX_REG[gpio]) |= FUN_DRV_M;
568 gpio_pulldown_dis(gpio);
569 gpio_pullup_en(gpio);
573 case board_t::board_M5StickC:
574 case board_t::board_M5StickCPlus:
575 case board_t::board_M5Atom:
576 case board_t::board_M5AtomU:
579 m5gfx::pinMode(GPIO_NUM_0, m5gfx::pin_mode_t::output);
580 m5gfx::gpio_hi(GPIO_NUM_0);
588 #if defined ( ARDUINO )
590 if (cfg.serial_baudrate)
593 Serial.begin(cfg.serial_baudrate);
600 #if defined (M5UNIFIED_PC_BUILD)
601 #elif !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32)
602 case board_t::board_M5StackCoreInk:
603 m5gfx::pinMode(CoreInk_BUTTON_EXT_PIN, m5gfx::pin_mode_t::input);
604 m5gfx::pinMode(CoreInk_BUTTON_PWR_PIN, m5gfx::pin_mode_t::input);
607 case board_t::board_M5Paper:
608 case board_t::board_M5Station:
609 case board_t::board_M5Stack:
610 m5gfx::pinMode(GPIO_NUM_38, m5gfx::pin_mode_t::input);
613 case board_t::board_M5StickC:
614 case board_t::board_M5StickCPlus:
615 m5gfx::pinMode(GPIO_NUM_37, m5gfx::pin_mode_t::input);
618 case board_t::board_M5Atom:
619 case board_t::board_M5AtomPsram:
620 case board_t::board_M5AtomU:
621 case board_t::board_M5StampPico:
622 m5gfx::pinMode(GPIO_NUM_39, m5gfx::pin_mode_t::input);
625 case board_t::board_M5StackCore2:
626 case board_t::board_M5Tough:
631 case board_t::board_M5StickCPlus2:
632 m5gfx::pinMode(GPIO_NUM_35, m5gfx::pin_mode_t::input);
633 m5gfx::pinMode(GPIO_NUM_37, m5gfx::pin_mode_t::input);
634 m5gfx::pinMode(GPIO_NUM_39, m5gfx::pin_mode_t::input);
637 #elif defined (CONFIG_IDF_TARGET_ESP32C3)
639 case board_t::board_M5StampC3:
640 m5gfx::pinMode(GPIO_NUM_3, m5gfx::pin_mode_t::input_pullup);
643 case board_t::board_M5StampC3U:
644 m5gfx::pinMode(GPIO_NUM_9, m5gfx::pin_mode_t::input_pullup);
647 #elif defined (CONFIG_IDF_TARGET_ESP32S3)
648 case board_t::board_M5AtomS3:
649 case board_t::board_M5AtomS3Lite:
650 case board_t::board_M5AtomS3U:
651 m5gfx::pinMode(GPIO_NUM_41, m5gfx::pin_mode_t::input);
654 case board_t::board_M5StampS3:
655 case board_t::board_M5Cardputer:
656 m5gfx::pinMode(GPIO_NUM_0, m5gfx::pin_mode_t::input);
659 case board_t::board_M5Capsule:
660 case board_t::board_M5Dial:
661 case board_t::board_M5DinMeter:
662 m5gfx::pinMode(GPIO_NUM_42, m5gfx::pin_mode_t::input);
672 void M5Unified::_begin_spk(config_t& cfg)
674 if (cfg.internal_mic)
679 mic_cfg.i2s_port = I2S_NUM_0;
682 #if defined (M5UNIFIED_PC_BUILD)
683 #elif defined (CONFIG_IDF_TARGET_ESP32S3)
684 case board_t::board_M5StackCoreS3:
685 if (cfg.internal_mic)
687 mic_cfg.magnification = 2;
688 mic_cfg.over_sampling = 1;
689 mic_cfg.pin_mck = GPIO_NUM_0;
690 mic_cfg.pin_bck = GPIO_NUM_34;
691 mic_cfg.pin_ws = GPIO_NUM_33;
692 mic_cfg.pin_data_in = GPIO_NUM_14;
693 mic_cfg.i2s_port = I2S_NUM_1;
694 mic_cfg.stereo =
true;
698 case board_t::board_M5AtomS3U:
699 if (cfg.internal_mic)
701 mic_cfg.pin_data_in = GPIO_NUM_38;
702 mic_cfg.pin_ws = GPIO_NUM_39;
706 case board_t::board_M5Cardputer:
707 if (cfg.internal_mic)
709 mic_cfg.pin_data_in = GPIO_NUM_46;
710 mic_cfg.pin_ws = GPIO_NUM_43;
714 case board_t::board_M5Capsule:
715 if (cfg.internal_mic)
717 mic_cfg.pin_data_in = GPIO_NUM_41;
718 mic_cfg.pin_ws = GPIO_NUM_40;
722 #elif !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32)
723 case board_t::board_M5Stack:
724 if (cfg.internal_mic)
726 mic_cfg.pin_data_in = GPIO_NUM_34;
727 mic_cfg.i2s_port = I2S_NUM_0;
728 mic_cfg.use_adc =
true;
729 mic_cfg.over_sampling = 4;
733 case board_t::board_M5StickC:
734 case board_t::board_M5StickCPlus:
735 case board_t::board_M5StickCPlus2:
736 case board_t::board_M5Tough:
737 case board_t::board_M5StackCore2:
738 if (cfg.internal_mic)
740 mic_cfg.pin_data_in = GPIO_NUM_34;
741 mic_cfg.pin_ws = GPIO_NUM_0;
745 case board_t::board_M5AtomU:
747 mic_cfg.pin_data_in = GPIO_NUM_19;
748 mic_cfg.pin_ws = GPIO_NUM_5;
752 case board_t::board_M5Atom:
754 mic_cfg.pin_data_in = GPIO_NUM_23;
755 mic_cfg.pin_ws = GPIO_NUM_33;
762 if (mic_cfg.pin_data_in >= 0)
769 if (cfg.external_spk_detail.enabled && cfg.external_speaker_value == 0) {
770 cfg.external_speaker.atomic_spk =
false==cfg.external_spk_detail.omit_atomic_spk;
771 cfg.external_speaker.hat_spk =
false==cfg.external_spk_detail.omit_spk_hat;
774 if (cfg.internal_spk || cfg.external_speaker_value)
779 #if defined SOC_I2S_NUM
780 spk_cfg.i2s_port = (i2s_port_t)(SOC_I2S_NUM - 1);
782 spk_cfg.i2s_port = (i2s_port_t)(I2S_NUM_MAX - 1);
786 #if defined (M5UNIFIED_PC_BUILD)
787 #elif defined (CONFIG_IDF_TARGET_ESP32S3)
788 case board_t::board_M5StackCoreS3:
789 if (cfg.internal_spk)
791 spk_cfg.pin_bck = GPIO_NUM_34;
792 spk_cfg.pin_ws = GPIO_NUM_33;
793 spk_cfg.pin_data_out = GPIO_NUM_13;
794 spk_cfg.magnification = 4;
795 spk_cfg.i2s_port = I2S_NUM_1;
799 case board_t::board_M5AtomS3:
800 case board_t::board_M5AtomS3Lite:
801 if (cfg.external_speaker.atomic_spk && (
Display.getBoard() != board_t::board_M5AtomDisplay))
803 m5gfx::pinMode(GPIO_NUM_6, m5gfx::pin_mode_t::input_pulldown);
804 m5gfx::pinMode(GPIO_NUM_7, m5gfx::pin_mode_t::input_pulldown);
805 if (m5gfx::gpio_in(GPIO_NUM_6)
806 && m5gfx::gpio_in(GPIO_NUM_7))
808 ESP_LOGD(
"M5Unified",
"ATOMIC SPK");
813 cfg.internal_imu =
false;
814 cfg.internal_rtc =
false;
815 spk_cfg.pin_bck = GPIO_NUM_5;
816 spk_cfg.pin_ws = GPIO_NUM_39;
817 spk_cfg.pin_data_out = GPIO_NUM_38;
818 spk_cfg.magnification = 16;
823 case board_t::board_M5Capsule:
824 if (cfg.internal_spk)
826 spk_cfg.pin_data_out = GPIO_NUM_2;
827 spk_cfg.buzzer =
true;
828 spk_cfg.magnification = 48;
832 case board_t::board_M5Dial:
833 case board_t::board_M5DinMeter:
834 if (cfg.internal_spk)
836 spk_cfg.pin_data_out = GPIO_NUM_3;
837 spk_cfg.buzzer =
true;
838 spk_cfg.magnification = 48;
842 case board_t::board_M5Cardputer:
843 if (cfg.internal_spk)
845 spk_cfg.pin_bck = GPIO_NUM_41;
846 spk_cfg.pin_ws = GPIO_NUM_43;
847 spk_cfg.pin_data_out = GPIO_NUM_42;
848 spk_cfg.magnification = 16;
849 spk_cfg.i2s_port = I2S_NUM_1;
853 #elif !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32)
854 case board_t::board_M5Stack:
855 if (cfg.internal_spk)
857 m5gfx::gpio_lo(GPIO_NUM_25);
858 m5gfx::pinMode(GPIO_NUM_25, m5gfx::pin_mode_t::output);
859 spk_cfg.i2s_port = I2S_NUM_0;
860 spk_cfg.use_dac =
true;
861 spk_cfg.pin_data_out = GPIO_NUM_25;
862 spk_cfg.magnification = 8;
866 case board_t::board_M5StackCoreInk:
867 case board_t::board_M5StickCPlus:
868 case board_t::board_M5StickCPlus2:
869 if (cfg.internal_spk)
871 spk_cfg.buzzer =
true;
872 spk_cfg.pin_data_out = GPIO_NUM_2;
873 spk_cfg.magnification = 48;
877 case board_t::board_M5StickC:
878 if (cfg.external_speaker.hat_spk2 && (_board != board_t::board_M5StackCoreInk))
880 spk_cfg.pin_data_out = GPIO_NUM_25;
881 spk_cfg.pin_bck = GPIO_NUM_26;
882 spk_cfg.pin_ws = GPIO_NUM_0;
883 spk_cfg.i2s_port = I2S_NUM_1;
884 spk_cfg.use_dac =
false;
885 spk_cfg.buzzer =
false;
886 spk_cfg.magnification = 16;
888 else if (cfg.external_speaker.hat_spk)
891 gpio_num_t pin_en = _board == board_t::board_M5StackCoreInk ? GPIO_NUM_25 : GPIO_NUM_0;
892 m5gfx::gpio_lo(pin_en);
893 m5gfx::pinMode(pin_en, m5gfx::pin_mode_t::output);
894 m5gfx::gpio_lo(GPIO_NUM_26);
895 m5gfx::pinMode(GPIO_NUM_26, m5gfx::pin_mode_t::output);
896 spk_cfg.pin_data_out = GPIO_NUM_26;
897 spk_cfg.i2s_port = I2S_NUM_0;
898 spk_cfg.use_dac =
true;
899 spk_cfg.buzzer =
false;
900 spk_cfg.magnification = 32;
904 case board_t::board_M5Tough:
906 spk_cfg.magnification = 24;
908 case board_t::board_M5StackCore2:
909 if (cfg.internal_spk)
911 spk_cfg.pin_bck = GPIO_NUM_12;
912 spk_cfg.pin_ws = GPIO_NUM_0;
913 spk_cfg.pin_data_out = GPIO_NUM_2;
917 case board_t::board_M5Atom:
918 if (cfg.internal_spk && (
Display.getBoard() != board_t::board_M5AtomDisplay))
920 spk_cfg.pin_bck = GPIO_NUM_19;
921 spk_cfg.pin_ws = GPIO_NUM_33;
922 spk_cfg.pin_data_out = GPIO_NUM_22;
923 spk_cfg.magnification = 12;
926 case board_t::board_M5AtomPsram:
927 if (cfg.external_speaker.atomic_spk && (
Display.getBoard() != board_t::board_M5AtomDisplay))
930 gpio_num_t pin = (_board == board_t::board_M5AtomPsram) ? GPIO_NUM_5 : GPIO_NUM_23;
931 m5gfx::pinMode(GPIO_NUM_19, m5gfx::pin_mode_t::input_pulldown);
932 m5gfx::pinMode(pin , m5gfx::pin_mode_t::input_pulldown);
933 if (m5gfx::gpio_in(GPIO_NUM_19)
934 && m5gfx::gpio_in(pin ))
936 ESP_LOGD(
"M5Unified",
"ATOMIC SPK");
941 cfg.internal_imu =
false;
942 cfg.internal_rtc =
false;
943 spk_cfg.pin_bck = GPIO_NUM_22;
944 spk_cfg.pin_ws = GPIO_NUM_21;
945 spk_cfg.pin_data_out = GPIO_NUM_25;
946 spk_cfg.magnification = 16;
958 if (cfg.external_speaker_value)
960 #if defined (M5UNIFIED_PC_BUILD)
961 #elif defined ( CONFIG_IDF_TARGET_ESP32S3 )
962 #define ENABLE_M5MODULE
963 if (_board == board_t::board_M5StackCoreS3)
964 #elif defined ( CONFIG_IDF_TARGET_ESP32 ) || !defined ( CONFIG_IDF_TARGET )
965 #define ENABLE_M5MODULE
966 if ( _board == board_t::board_M5Stack
967 || _board == board_t::board_M5StackCore2
968 || _board == board_t::board_M5Tough)
971 #ifdef ENABLE_M5MODULE
972 bool use_module_display = cfg.external_speaker.module_display
974 if (use_module_display || cfg.external_speaker.module_rca)
976 if (use_module_display) {
979 uint32_t pins_index = use_module_display;
980 #if defined ( CONFIG_IDF_TARGET_ESP32S3 )
981 static constexpr
const uint8_t pins[][2] =
983 { GPIO_NUM_13, GPIO_NUM_7 },
984 { GPIO_NUM_13, GPIO_NUM_6 },
987 static constexpr
const uint8_t pins[][2] =
989 { GPIO_NUM_2 , GPIO_NUM_19 },
990 { GPIO_NUM_2 , GPIO_NUM_27 },
991 { GPIO_NUM_15, GPIO_NUM_13 },
992 { GPIO_NUM_15, GPIO_NUM_12 },
995 if (_board == m5::board_t::board_M5Stack) {
999 spk_cfg.pin_data_out = pins[pins_index][0];
1000 spk_cfg.pin_bck = pins[pins_index][1];
1001 spk_cfg.i2s_port = I2S_NUM_1;
1002 spk_cfg.magnification = 16;
1003 spk_cfg.stereo =
true;
1004 spk_cfg.buzzer =
false;
1005 spk_cfg.use_dac =
false;
1006 spk_cfg.pin_ws = GPIO_NUM_0;
1008 #undef ENABLE_M5MODULE
1013 if (spk_cfg.pin_data_out >= 0)
1021 bool M5Unified::_begin_rtc_imu(
const config_t& cfg)
1023 bool port_a_used =
false;
1024 if (cfg.external_rtc || cfg.external_imu)
1040 if (cfg.disable_rtc_irq) {
1058 auto ms = m5gfx::millis();
1066 #if defined (M5UNIFIED_PC_BUILD)
1071 #elif !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32)
1073 uint_fast8_t raw_gpio32_39 = ~GPIO.in1.data;
1075 uint_fast8_t btn_bits = 0;
1078 case board_t::board_M5StackCore2:
1094 btn_bits |= 1 << ((raw.x - 2) / 107);
1102 case board_t::board_M5StackCoreInk:
1104 uint32_t raw_gpio0_31 = ~GPIO.in;
1110 case board_t::board_M5Paper:
1111 case board_t::board_M5Station:
1112 btn_bits = (raw_gpio32_39 >> 5) & 0x07;
1115 case board_t::board_M5Stack:
1116 btn_bits = ((raw_gpio32_39 >> 5) & 0x02)
1117 + ((raw_gpio32_39 >> 3) & 0x04);
1120 case board_t::board_M5Atom:
1121 case board_t::board_M5AtomPsram:
1122 case board_t::board_M5AtomU:
1123 case board_t::board_M5StampPico:
1124 btn_bits += (raw_gpio32_39 >> 7) & 0x01;
1127 case board_t::board_M5StickC:
1128 case board_t::board_M5StickCPlus:
1129 btn_bits = ((raw_gpio32_39 >> 5) & 0x01)
1130 + ((raw_gpio32_39 >> 6) & 0x02);
1133 case board_t::board_M5StickCPlus2:
1134 btn_bits = ((raw_gpio32_39 >> 5) & 0x01)
1135 + ((raw_gpio32_39 >> 6) & 0x02);
1146 if (use_pmic_button)
1155 case 2: state = Button_Class::button_state_t::state_clicked;
break;
1156 default: state = Button_Class::button_state_t::state_hold;
break;
1162 #elif defined (CONFIG_IDF_TARGET_ESP32S3)
1166 case board_t::board_M5AtomS3:
1167 case board_t::board_M5AtomS3Lite:
1168 case board_t::board_M5AtomS3U:
1172 case board_t::board_M5StampS3:
1173 case board_t::board_M5Cardputer:
1177 case board_t::board_M5Capsule:
1178 case board_t::board_M5Dial:
1179 case board_t::board_M5DinMeter:
1185 if (use_pmic_button)
1194 case 2: state = Button_Class::button_state_t::state_clicked;
break;
1195 default: state = Button_Class::button_state_t::state_hold;
break;
1203 #elif defined (CONFIG_IDF_TARGET_ESP32C3)
1207 case board_t::board_M5StampC3:
1211 case board_t::board_M5StampC3U:
1224 return index != _primary_display_index && index < this->_displays.size() ? this->_displays[index] :
Display;
1229 this->_displays.push_back(dsp);
1230 auto res = this->_displays.size() - 1;
1234 Touch.
begin(_displays.front().touch() ? &_displays.front() :
nullptr);
1241 for (
auto &d : _displays)
1243 if (board == d.getBoard()) {
return i; }
1251 for (
auto b : board_list)
1254 if (i >= 0) {
return i; }
1261 if (index >= _displays.size()) {
return false; }
1262 std::size_t pdi = _primary_display_index;
1264 if (pdi < _displays.size())
1268 _primary_display_index = index;
1276 bool res = (i >= 0);
void __attribute((weak)) adc_power_acquire(void)
m5::M5Unified M5
global instance.
#define NON_BREAK
[[fallthrough]];
void setPort(i2c_port_t port_num, int pin_sda, int pin_scl)
bool isEnabled(void) const
bool writeRegister(std::uint8_t address, std::uint8_t reg, const std::uint8_t *data, std::size_t length, std::uint32_t freq) const
bool begin(i2c_port_t port_num, int pin_sda, int pin_scl)
bool isEnabled(void) const
bool begin(I2C_Class *i2c=nullptr, board_t board=board_t::board_unknown)
bool isEnabled(void) const
void setDisplay(M5GFX *target)
bool setPrimaryDisplayType(std::initializer_list< m5gfx::board_t > board_list)
void setLogDisplayIndex(size_t index)
Set the display to show logs.
I2C_Class & Ex_I2C
for external I2C device (Port.A)
void setLogDisplayType(std::initializer_list< m5gfx::board_t > board_list)
board_t getBoard(void) const
std::size_t addDisplay(M5GFX &dsp)
M5GFX & getDisplay(size_t index)
void update(void)
To call this function in a loop function.
static void delay(uint32_t msec)
bool setPrimaryDisplay(std::size_t index)
static int8_t getPin(pin_name_t name)
I2C_Class & In_I2C
for internal I2C device
int32_t getDisplayIndex(m5gfx::board_t board)
void setCallback(void *args, bool(*func)(void *, bool))
mic_config_t config(void) const
void setExtOutput(bool enable, ext_port_mask_t port_mask=(ext_port_mask_t) 0xFF)
void setLed(uint8_t brightness=255)
uint8_t getKeyState(void)
pmic_t getType(void) const
bool begin(I2C_Class *i2c=nullptr)
void setSystemTimeFromRtc(struct timezone *tz=nullptr)
speaker_config_t config(void) const
void setCallback(void *args, bool(*func)(void *, bool))
const touch_detail_t & getDetail(std::size_t index=0) const
void begin(m5gfx::LGFX_Device *gfx)
void update(std::uint32_t msec)
std::uint8_t getCount(void) const
const m5gfx::touch_point_t & getTouchPointRaw(std::size_t index=0) const
bool isEnabled(void) const
struct __attribute__((packed)) rtc_time_t
int pin_data_in
i2s_data_in (for mic)
uint8_t over_sampling
Sampling times of obtain the average value.
uint32_t sample_rate
input sampling rate (Hz)
uint8_t magnification
multiplier for output value