Skip to content

Commit 124540e

Browse files
committed
boards: Add AtomS3R support.
Signed-off-by: lbuque <1102390310@qq.com>
1 parent 35bc51d commit 124540e

File tree

16 files changed

+270
-3
lines changed

16 files changed

+270
-3
lines changed

Diff for: m5stack/Makefile

+6-2
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ boards := \
3636
M5STACK_Stamp_PICO:stamppico \
3737
M5STACK_Atom_Matrix:atommatrix \
3838
M5STACK_AtomU:atomu \
39-
M5STACK_Atom_Echo:atomecho
39+
M5STACK_Atom_Echo:atomecho \
40+
M5STACK_AtomS3R:atoms3r
4041

4142
define find_board
4243
$(if $(filter $(1):%,$(boards)),$(word 2,$(subst :, ,$(filter $(1):%,$(boards)))),none)
@@ -69,7 +70,8 @@ BOARD_TYPE_DEF := \
6970
stamppico \
7071
atommatrix \
7172
atomu \
72-
atomecho
73+
atomecho \
74+
atoms3r
7375

7476
# Select the board type to build, default is None
7577
# This value affects which folder in the "./fs/system/" directory is pack into "fs-system.bin"
@@ -281,6 +283,7 @@ patch:
281283
$(call Package/patche,$(abspath ./../micropython),$(abspath ./patches/0003-modtime-Add-timezone.patch))
282284
$(call Package/patche,$(abspath $(IDF_PATH)),$(abspath ./patches/1000-WIP-Compatible-with-esp-adf-v2.6.patch))
283285
$(call Package/patche,$(abspath ./components/M5Unified/M5Unified),$(abspath ./patches/2003-Support-LTR553.patch))
286+
$(call Package/patche,$(abspath ./components/M5Unified/M5Unified),$(abspath ./patches/2004-Support-AtomS3R.patch))
284287
$(call Package/patche,$(abspath $(ADF_PATH)),$(abspath ./patches/3000-commponents-audio_board-Add-ESP32_S3_BOX_3-board.patch))
285288
$(call Package/patche,$(abspath $(ADF_PATH)),$(abspath ./patches/3001-commponents-audio_board-Add-M5STACK-CoreS3-board.patch))
286289

@@ -289,6 +292,7 @@ unpatch:
289292
$(call Package/unpatche,$(abspath ./components/lv_bindings),$(abspath ./patches/0002_avoid_lv_bindings_compile_error.patch))
290293
$(call Package/unpatche,$(abspath ./../micropython),$(abspath ./patches/0003-modtime-Add-timezone.patch))
291294
$(call Package/unpatche,$(abspath $(IDF_PATH)),$(abspath ./patches/1000-WIP-Compatible-with-esp-adf-v2.6.patch))
295+
$(call Package/unpatche,$(abspath ./components/M5Unified/M5Unified),$(abspath ./patches/2004-Support-AtomS3R.patch))
292296
$(call Package/unpatche,$(abspath ./components/M5Unified/M5Unified),$(abspath ./patches/2003-Support-LTR553.patch))
293297
$(call Package/unpatche,$(abspath $(ADF_PATH)),$(abspath ./patches/3001-commponents-audio_board-Add-M5STACK-CoreS3-board.patch))
294298
$(call Package/unpatche,$(abspath $(ADF_PATH)),$(abspath ./patches/3000-commponents-audio_board-Add-ESP32_S3_BOX_3-board.patch))

Diff for: m5stack/boards/M5STACK_AtomS3R/board.json

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"deploy": [
3+
"../deploy_s3.md"
4+
],
5+
"docs": "",
6+
"features": [
7+
"BLE",
8+
"WiFi"
9+
],
10+
"images": [
11+
"generic_s3.jpg"
12+
],
13+
"mcu": "esp32s3",
14+
"product": "M5Stack S3 Serials",
15+
"thumbnail": "",
16+
"url": "https://www.espressif.com/en/products/modules",
17+
"vendor": "M5Stack"
18+
}

Diff for: m5stack/boards/M5STACK_AtomS3R/manifest.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
include("$(MPY_DIR)/../m5stack/modules/startup/manifest_atoms3r.py")

Diff for: m5stack/boards/M5STACK_AtomS3R/mpconfigboard.cmake

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
set(IDF_TARGET esp32s3)
6+
7+
# atoms3 https://github.com/m5stack/m5stack-board-id/blob/main/board.csv#L13
8+
set(BOARD_ID 18)
9+
10+
set(SDKCONFIG_DEFAULTS
11+
./boards/M5STACK_AtomS3/sdkconfig.board
12+
./boards/sdkconfig.base
13+
./boards/sdkconfig.240mhz
14+
./boards/sdkconfig.disable_iram
15+
./boards/sdkconfig.ble
16+
./boards/sdkconfig.usb
17+
./boards/sdkconfig.flash_8mb
18+
./boards/sdkconfig.spiram_oct
19+
)
20+
21+
# If not enable LVGL, ignore this...
22+
set(LV_CFLAGS -DLV_COLOR_DEPTH=16 -DLV_COLOR_16_SWAP=0)
23+
24+
if(NOT MICROPY_FROZEN_MANIFEST)
25+
set(MICROPY_FROZEN_MANIFEST ${CMAKE_SOURCE_DIR}/boards/manifest.py)
26+
endif()
27+
28+
# NOTE: 这里的配置是无效的,仅为了兼容ADF,保证编译通过
29+
set(ADF_COMPS "$ENV{ADF_PATH}/components")
30+
set(ADF_BOARD_DIR "$ENV{ADF_PATH}/components/audio_board/esp32_s3_box_3")
31+
32+
list(APPEND EXTRA_COMPONENT_DIRS
33+
$ENV{ADF_PATH}/components/audio_pipeline
34+
$ENV{ADF_PATH}/components/audio_sal
35+
$ENV{ADF_PATH}/components/esp-adf-libs
36+
$ENV{ADF_PATH}/components/esp-sr
37+
${CMAKE_SOURCE_DIR}/boards
38+
)

Diff for: m5stack/boards/M5STACK_AtomS3R/mpconfigboard.h

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*/
6+
7+
#define MICROPY_HW_BOARD_NAME "M5STACK AtomS3R"
8+
#define MICROPY_HW_MCU_NAME "ESP32-S3-PICO-1"
9+
10+
#define MICROPY_PY_MACHINE_DAC (0)
11+
12+
// Enable UART REPL for modules that have an external USB-UART and don't use native USB.
13+
#define MICROPY_HW_ENABLE_UART_REPL (1)
14+
15+
#define MICROPY_HW_I2C0_SCL (9)
16+
#define MICROPY_HW_I2C0_SDA (8)
17+
18+
// If not enable LVGL, ignore this...
19+
#include "./../mpconfiglvgl.h"

Diff for: m5stack/boards/M5STACK_AtomS3R/sdkconfig.board

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
CONFIG_FLASHMODE_DIO=y # QIO mode has some problem when mount fs
6+
CONFIG_ESPTOOLPY_FLASHMODE_DIO=y
7+
CONFIG_ESPTOOLPY_FLASHMODE="dio"
8+
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
9+
CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y
10+
CONFIG_ESPTOOLPY_AFTER_NORESET=y
11+
12+
CONFIG_SPIRAM_MEMTEST=
13+
# CONFIG_FREERTOS_UNICORE=y
14+
15+
# M5STACK UiFlow USB description
16+
CONFIG_TINYUSB_DESC_CDC_STRING="M5Stack AtomS3R(UiFlow2)"
17+
18+
# SSL
19+
CONFIG_MBEDTLS_AES_USE_INTERRUPT=n
20+
21+
CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY=y

Diff for: m5stack/boards/sdkconfig.spiram_oct

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# MicroPython on ESP32-S2 and ESP32-PAD1_subscript_3, ESP IDF configuration with SPIRAM support in Octal mode
2+
CONFIG_SPIRAM_MODE_QUAD=
3+
CONFIG_SPIRAM_MODE_OCT=y

Diff for: m5stack/cmodules/m5unified/m5unified.c

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ STATIC const mp_rom_map_elem_t m5_board_member_table[] = {
2626
{ MP_ROM_QSTR(MP_QSTR_M5DinMeter), MP_ROM_INT(13) },
2727
{ MP_ROM_QSTR(MP_QSTR_M5Cardputer), MP_ROM_INT(14) },
2828
{ MP_ROM_QSTR(MP_QSTR_M5AirQ), MP_ROM_INT(15) },
29+
{ MP_ROM_QSTR(MP_QSTR_M5AtomS3R), MP_ROM_INT(18) },
2930
// non display boards
3031
{ MP_ROM_QSTR(MP_QSTR_M5Atom), MP_ROM_INT(128) },
3132
{ MP_ROM_QSTR(MP_QSTR_M5AtomPsram), MP_ROM_INT(129) },

Diff for: m5stack/fs/system/atoms3r/mode_dev.png

4.16 KB
Loading

Diff for: m5stack/fs/system/atoms3r/wifi_err.png

6.94 KB
Loading

Diff for: m5stack/fs/system/atoms3r/wifi_ok.png

7.31 KB
Loading

Diff for: m5stack/modules/startup/__init__.py

+5
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,11 @@ def startup(boot_opt, timeout: int = 60) -> None:
110110

111111
atomlite = AtomS3Lite_Startup()
112112
atomlite.startup(ssid, pswd, timeout)
113+
elif board_id == M5.BOARD.M5AtomS3R:
114+
from .atoms3r import AtomS3R_Startup
115+
116+
atoms3r = AtomS3R_Startup()
117+
atoms3r.startup(ssid, pswd, timeout)
113118
elif board_id == M5.BOARD.M5AtomMatrix:
114119
from .atommatrix import AtomMatrix_Startup
115120

Diff for: m5stack/modules/startup/atoms3r.py

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
2+
#
3+
# SPDX-License-Identifier: MIT
4+
# AtomS3 startup script
5+
import M5
6+
import time
7+
import network
8+
import machine
9+
import binascii
10+
from . import Startup
11+
from hardware import RGB
12+
13+
# AtomS3 startup menu
14+
15+
16+
class AtomS3R_Startup(Startup):
17+
WIFI_OK = "/system/atoms3r/wifi_ok.png"
18+
WIFI_ERR = "/system/atoms3r/wifi_err.png"
19+
MODE_DEV = "/system/atoms3r/mode_dev.png"
20+
21+
def __init__(self) -> None:
22+
super().__init__()
23+
24+
def show_hits(self, hits: str) -> None:
25+
M5.Lcd.fillRect(24, 70, 95, 11, M5.Lcd.COLOR.BLACK)
26+
M5.Lcd.setFont(M5.Lcd.FONTS.DejaVu9)
27+
M5.Lcd.drawCenterString(hits, 73, 70)
28+
29+
def show_msg(self, msg: str) -> None:
30+
M5.Lcd.fillRect(36, 49, 82, 17, M5.Lcd.COLOR.BLACK)
31+
M5.Lcd.setFont(M5.Lcd.FONTS.DejaVu12)
32+
M5.Lcd.drawCenterString(msg, 71, 51)
33+
34+
def show_ssid(self, ssid: str) -> None:
35+
if len(ssid) > 9:
36+
self.show_msg(ssid[:7] + "...")
37+
else:
38+
self.show_msg(ssid)
39+
40+
def show_mac(self) -> None:
41+
mac = binascii.hexlify(machine.unique_id()).decode("utf-8").upper()
42+
M5.Lcd.setFont(M5.Lcd.FONTS.DejaVu9)
43+
M5.Lcd.drawCenterString(mac[0:6] + "_" + mac[6:], 65, 85)
44+
45+
def show_error(self, ssid: str, error: str) -> None:
46+
M5.Lcd.clear()
47+
M5.Lcd.drawImage(self.WIFI_ERR, 0, 0)
48+
M5.Lcd.drawImage(self.MODE_DEV, 0, 98)
49+
self.show_ssid(ssid)
50+
self.show_hits(error)
51+
self.show_mac()
52+
print("SSID: " + ssid + "\r\nNotice: " + error)
53+
54+
def startup(self, ssid: str, pswd: str, timeout: int = 60) -> None:
55+
M5.Lcd.drawImage(self.WIFI_OK, 0, 0)
56+
M5.Lcd.drawImage(self.MODE_DEV, 0, 98)
57+
self.show_mac()
58+
59+
if super().connect_network(ssid=ssid, pswd=pswd):
60+
self.show_ssid(ssid)
61+
count = 1
62+
status = super().connect_status()
63+
start = time.time()
64+
while status is not network.STAT_GOT_IP:
65+
time.sleep_ms(300)
66+
if status is network.STAT_NO_AP_FOUND:
67+
self.show_error(ssid, "NO AP FOUND")
68+
break
69+
elif status is network.STAT_WRONG_PASSWORD:
70+
self.show_error(ssid, "WRONG PASSWORD")
71+
break
72+
elif status is network.STAT_HANDSHAKE_TIMEOUT:
73+
self.show_error(ssid, "HANDSHAKE ERR")
74+
break
75+
elif status is network.STAT_CONNECTING:
76+
self.show_hits("." * count)
77+
count = count + 1
78+
if count > 5:
79+
count = 1
80+
status = super().connect_status()
81+
# connect to network timeout
82+
if (time.time() - start) > timeout:
83+
self.show_error(ssid, "TIMEOUT")
84+
break
85+
86+
if status is network.STAT_GOT_IP:
87+
self.show_hits(super().local_ip())
88+
print("Local IP: " + super().local_ip())
89+
else:
90+
self.show_error("Not Found", "Use Burner setup")
91+
M5.Lcd.drawImage(self.MODE_DEV, 0, 98)

Diff for: m5stack/modules/startup/manifest_atoms3r.py

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
package(
6+
"startup",
7+
(
8+
"__init__.py",
9+
"atoms3r.py",
10+
),
11+
base_path="..",
12+
opt=3,
13+
)

Diff for: m5stack/patches/2004-Support-AtomS3R.patch

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
Index: M5Unified/src/M5Unified.cpp
2+
===================================================================
3+
--- M5Unified.orig/src/M5Unified.cpp
4+
+++ M5Unified/src/M5Unified.cpp
5+
@@ -67,6 +67,7 @@ static constexpr const uint8_t _pin_tabl
6+
{ board_t::board_M5AirQ , GPIO_NUM_12,GPIO_NUM_11 , GPIO_NUM_15,GPIO_NUM_13 },
7+
{ board_t::board_M5Cardputer , 255 ,255 , GPIO_NUM_1 ,GPIO_NUM_2 },
8+
{ board_t::board_M5VAMeter , GPIO_NUM_6 ,GPIO_NUM_5 , GPIO_NUM_9 ,GPIO_NUM_8 },
9+
+{ board_t::board_M5AtomS3R , GPIO_NUM_0 ,GPIO_NUM_45 , GPIO_NUM_1 ,GPIO_NUM_2 }, // AtomS3R
10+
{ board_t::board_unknown , GPIO_NUM_39,GPIO_NUM_38 , GPIO_NUM_1 ,GPIO_NUM_2 }, // AtomS3,AtomS3Lite,AtomS3U
11+
#elif defined (CONFIG_IDF_TARGET_ESP32C3)
12+
{ board_t::board_unknown , 255 ,255 , GPIO_NUM_0 ,GPIO_NUM_1 },
13+
@@ -721,6 +722,7 @@ for (int i = 0; i < 0x50; ++i)
14+
case board_t::board_M5AtomS3:
15+
case board_t::board_M5AtomS3Lite:
16+
case board_t::board_M5AtomS3U:
17+
+ case board_t::board_M5AtomS3R:
18+
m5gfx::pinMode(GPIO_NUM_41, m5gfx::pin_mode_t::input);
19+
break;
20+
21+
@@ -894,6 +896,7 @@ for (int i = 0; i < 0x50; ++i)
22+
23+
case board_t::board_M5AtomS3:
24+
case board_t::board_M5AtomS3Lite:
25+
+ case board_t::board_M5AtomS3R:
26+
if (cfg.external_speaker.atomic_spk && (Display.getBoard() != board_t::board_M5AtomDisplay))
27+
{ // for ATOMIC SPK
28+
m5gfx::pinMode(GPIO_NUM_6, m5gfx::pin_mode_t::input_pulldown); // MOSI
29+
@@ -1301,6 +1304,7 @@ for (int i = 0; i < 0x50; ++i)
30+
case board_t::board_M5AtomS3:
31+
case board_t::board_M5AtomS3Lite:
32+
case board_t::board_M5AtomS3U:
33+
+ case board_t::board_M5AtomS3R:
34+
use_rawstate_bits = 0b00001;
35+
btn_rawstate_bits = (!m5gfx::gpio_in(GPIO_NUM_41)) & 1;
36+
break;
37+
Index: M5Unified/src/M5Unified.hpp
38+
===================================================================
39+
--- M5Unified.orig/src/M5Unified.hpp
40+
+++ M5Unified/src/M5Unified.hpp
41+
@@ -340,7 +340,7 @@ namespace m5
42+
#if defined ( __M5GFX_M5ATOMDISPLAY__ )
43+
#if !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32) || defined (CONFIG_IDF_TARGET_ESP32S3)
44+
if (cfg.external_display.atom_display) {
45+
- if (_board == board_t::board_M5Atom || _board == board_t::board_M5AtomPsram || _board == board_t::board_M5AtomS3 || _board == board_t::board_M5AtomS3Lite)
46+
+ if (_board == board_t::board_M5Atom || _board == board_t::board_M5AtomPsram || _board == board_t::board_M5AtomS3 || _board == board_t::board_M5AtomS3Lite || _board == board_t::board_M5AtomS3R)
47+
{
48+
M5AtomDisplay dsp(cfg.atom_display);
49+
if (dsp.init_without_reset()) {

0 commit comments

Comments
 (0)