From 3512bf2921dda7eb9ae9d88f4656d3c888090703 Mon Sep 17 00:00:00 2001 From: Vilem Zavodny Date: Mon, 2 Oct 2023 16:08:52 +0200 Subject: [PATCH] bsp: Add M5Stack CoreS3 --- .build-test-rules.yml | 2 +- .github/workflows/upload_component.yml | 2 +- .github/workflows/upload_component_noglib.yml | 3 +- README.md | 3 +- SquareLine/boards/m5stack_core_s3/image.png | Bin 0 -> 66369 bytes .../m5stack_core_s3/main/idf_component.yml | 6 + .../boards/m5stack_core_s3/manifest.json | 18 + .../boards/m5stack_core_s3/partitions.csv | 5 + .../boards/m5stack_core_s3/sdkconfig.defaults | 11 + bsp/m5stack_core_s3/CMakeLists.txt | 7 + bsp/m5stack_core_s3/Kconfig | 86 +++ bsp/m5stack_core_s3/LICENSE | 202 +++++++ bsp/m5stack_core_s3/README.md | 28 + bsp/m5stack_core_s3/idf_component.yml | 23 + bsp/m5stack_core_s3/include/bsp/config.h | 16 + bsp/m5stack_core_s3/include/bsp/display.h | 109 ++++ bsp/m5stack_core_s3/include/bsp/esp-bsp.h | 8 + .../include/bsp/m5stack_core_s3.h | 426 ++++++++++++++ bsp/m5stack_core_s3/include/bsp/touch.h | 51 ++ bsp/m5stack_core_s3/m5stack_core_s3.c | 521 ++++++++++++++++++ bsp/m5stack_core_s3/m5stack_core_s3_idf5.c | 95 ++++ bsp/m5stack_core_s3/pic.webp | Bin 0 -> 120028 bytes .../priv_include/bsp_err_check.h | 58 ++ docu/pics/m5stack_cores3.webp | Bin 0 -> 37116 bytes examples/bsp_ext.py | 1 + .../display/sdkconfig.bsp.m5stack_core_s3 | 10 + .../display_audio_photo/main/app_disp_fs.c | 2 + .../sdkconfig.bsp.m5stack_core_s3 | 17 + .../sdkconfig.bsp.m5stack_core_s3 | 20 + .../sdkconfig.bsp.m5stack_core_s3 | 10 + 30 files changed, 1736 insertions(+), 4 deletions(-) create mode 100644 SquareLine/boards/m5stack_core_s3/image.png create mode 100644 SquareLine/boards/m5stack_core_s3/main/idf_component.yml create mode 100644 SquareLine/boards/m5stack_core_s3/manifest.json create mode 100644 SquareLine/boards/m5stack_core_s3/partitions.csv create mode 100644 SquareLine/boards/m5stack_core_s3/sdkconfig.defaults create mode 100644 bsp/m5stack_core_s3/CMakeLists.txt create mode 100644 bsp/m5stack_core_s3/Kconfig create mode 100644 bsp/m5stack_core_s3/LICENSE create mode 100644 bsp/m5stack_core_s3/README.md create mode 100644 bsp/m5stack_core_s3/idf_component.yml create mode 100644 bsp/m5stack_core_s3/include/bsp/config.h create mode 100644 bsp/m5stack_core_s3/include/bsp/display.h create mode 100644 bsp/m5stack_core_s3/include/bsp/esp-bsp.h create mode 100644 bsp/m5stack_core_s3/include/bsp/m5stack_core_s3.h create mode 100644 bsp/m5stack_core_s3/include/bsp/touch.h create mode 100644 bsp/m5stack_core_s3/m5stack_core_s3.c create mode 100644 bsp/m5stack_core_s3/m5stack_core_s3_idf5.c create mode 100644 bsp/m5stack_core_s3/pic.webp create mode 100644 bsp/m5stack_core_s3/priv_include/bsp_err_check.h create mode 100644 docu/pics/m5stack_cores3.webp create mode 100644 examples/display/sdkconfig.bsp.m5stack_core_s3 create mode 100644 examples/display_audio_photo/sdkconfig.bsp.m5stack_core_s3 create mode 100644 examples/display_camera/sdkconfig.bsp.m5stack_core_s3 create mode 100644 examples/display_rotation/sdkconfig.bsp.m5stack_core_s3 diff --git a/.build-test-rules.yml b/.build-test-rules.yml index ea3120c39..99591e44c 100644 --- a/.build-test-rules.yml +++ b/.build-test-rules.yml @@ -1,6 +1,6 @@ examples: disable: - - if: IDF_VERSION_MAJOR < 5 and CONFIG_NAME in ["esp32_c3_lcdkit", "esp32_s3_lcd_ev_board", "esp32_s3_usb_otg"] + - if: IDF_VERSION_MAJOR < 5 and CONFIG_NAME in ["esp32_c3_lcdkit", "esp32_s3_lcd_ev_board", "esp32_s3_usb_otg", "m5stack_core_s3"] reason: Example depends on BSP, which is supported only for IDF >= 5.0 - if: IDF_VERSION_MAJOR < 5 and IDF_TARGET in ["esp32c2", "esp32p4", "esp32c5", "esp32c6"] reason: Example depends on target, which is supported only for IDF >= 5.0 diff --git a/.github/workflows/upload_component.yml b/.github/workflows/upload_component.yml index 412cf6ba7..3ccaf8c98 100644 --- a/.github/workflows/upload_component.yml +++ b/.github/workflows/upload_component.yml @@ -17,7 +17,7 @@ jobs: uses: espressif/upload-components-ci-action@v1 with: directories: > - bsp/esp32_azure_iot_kit;bsp/esp32_s2_kaluga_kit;bsp/esp_wrover_kit;bsp/esp-box;bsp/esp32_s3_usb_otg;bsp/esp32_s3_eye;bsp/esp32_s3_lcd_ev_board;bsp/esp32_s3_korvo_2;bsp/esp-box-lite;bsp/esp32_lyrat;bsp/esp32_c3_lcdkit;bsp/esp-box-3;bsp/esp_bsp_generic;bsp/esp32_s3_korvo_1;bsp/esp32_p4_function_ev_board; + bsp/esp32_azure_iot_kit;bsp/esp32_s2_kaluga_kit;bsp/esp_wrover_kit;bsp/esp-box;bsp/esp32_s3_usb_otg;bsp/esp32_s3_eye;bsp/esp32_s3_lcd_ev_board;bsp/esp32_s3_korvo_2;bsp/esp-box-lite;bsp/esp32_lyrat;bsp/esp32_c3_lcdkit;bsp/esp-box-3;bsp/esp_bsp_generic;bsp/esp32_s3_korvo_1;bsp/esp32_p4_function_ev_board;bsp/m5stack_core_s3; components/bh1750;components/ds18b20;components/es8311;components/es7210;components/fbm320;components/hts221;components/mag3110;components/mpu6050;components/esp_lvgl_port;components/icm42670; components/lcd_touch/esp_lcd_touch;components/lcd_touch/esp_lcd_touch_ft5x06;components/lcd_touch/esp_lcd_touch_gt911;components/lcd_touch/esp_lcd_touch_tt21100;components/lcd_touch/esp_lcd_touch_gt1151;components/lcd_touch/esp_lcd_touch_cst816s; components/lcd/esp_lcd_gc9a01;components/lcd/esp_lcd_ili9341;components/lcd/esp_lcd_ra8875;components/lcd_touch/esp_lcd_touch_stmpe610;components/lcd/esp_lcd_sh1107;components/lcd/esp_lcd_st7796;components/lcd/esp_lcd_gc9503;components/lcd/esp_lcd_ssd1681;components/lcd/esp_lcd_ili9881c; diff --git a/.github/workflows/upload_component_noglib.yml b/.github/workflows/upload_component_noglib.yml index 20f15534a..85a1b82cf 100644 --- a/.github/workflows/upload_component_noglib.yml +++ b/.github/workflows/upload_component_noglib.yml @@ -16,7 +16,7 @@ jobs: - name: Upload noglib version of BSPs # TODO: Extend this part to all BSPs env: - BSPs: "bsp/esp32_s3_eye bsp/esp32_p4_function_ev_board" + BSPs: "bsp/esp32_s3_eye bsp/esp32_p4_function_ev_board bsp/m5stack_core_s3" run: | pip install idf-component-manager py-markdown-table --upgrade python .github/ci/bsp_noglib.py ${BSPs} @@ -25,6 +25,7 @@ jobs: directories: > bsp/esp32_s3_eye_noglib; bsp/esp32_p4_function_ev_board_noglib; + bsp/m5stack_core_s3_noglib; namespace: "espressif" api_token: ${{ secrets.IDF_COMPONENT_API_TOKEN }} dry_run: ${{ github.ref_name != 'master' || github.repository_owner != 'espressif' }} diff --git a/README.md b/README.md index 89083c2e8..f3e3c2229 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,8 @@ Board support packages for development boards using Espressif's SoCs, written in | [ESP32-LyraT](bsp/esp32_lyrat) | ESP32 | uSD card slot, microphone, audio codec + power amplifier | | | [ESP32-C3-LCDKit](bsp/esp32_c3_lcdkit) | ESP32-C3 | LCD display with encoder, IR, PDM audio| | | [ESP-BOX-3](bsp/esp-box-3) | ESP32-S3 | LCD display with touch, audio codec + power amplifier,
accelerometer and gyroscope | | -| [ESP32-S3-KORVO-1](bsp/esp32_s3_korvo_1) | ESP32-S3-KORVO-1 | uSD card slot, microphone, audio codec + power amplifier, RGB led strip | | +| [ESP32-S3-KORVO-1](bsp/esp32_s3_korvo_1) | ESP32-S3 | uSD card slot, microphone, audio codec + power amplifier, RGB led strip | | +| [M5Stack CoreS3](bsp/m5stack_core_s3) | ESP32-S3 | LCD display with touch, uSD card slot, microphone, audio codec | | ## LCD displays and TOUCH | [LVGL port](components/esp_lvgl_port) | [LCD drivers](LCD.md) | diff --git a/SquareLine/boards/m5stack_core_s3/image.png b/SquareLine/boards/m5stack_core_s3/image.png new file mode 100644 index 0000000000000000000000000000000000000000..01dc38edee50eec5d359f7c6e7329ef3c03ca746 GIT binary patch literal 66369 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�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�%qcy>OHC7HJxLcBlUq>{mwV{(_f(+R(Bq0` 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�+Y!a6avr1CY3 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 actT%7o6>o_u literal 0 HcmV?d00001 diff --git a/SquareLine/boards/m5stack_core_s3/main/idf_component.yml b/SquareLine/boards/m5stack_core_s3/main/idf_component.yml new file mode 100644 index 000000000..fac109b2e --- /dev/null +++ b/SquareLine/boards/m5stack_core_s3/main/idf_component.yml @@ -0,0 +1,6 @@ +description: ESP-BSP SquareLine LVGL Example +targets: + - esp32s3 +dependencies: + idf: ">=5.0" + m5stack_core_s3: "*" diff --git a/SquareLine/boards/m5stack_core_s3/manifest.json b/SquareLine/boards/m5stack_core_s3/manifest.json new file mode 100644 index 000000000..7a01cd9f5 --- /dev/null +++ b/SquareLine/boards/m5stack_core_s3/manifest.json @@ -0,0 +1,18 @@ +{ + "name":"M5Stack CoreS3", + "version":"1.0.0", + "mcu":"ESP32S3", + + "screen_width":"320", + "screen_height":"240", + "screen_color_swap":true, + + "short_description":"CoreS3 is the third generation of the M5Stack Core series. Powered by the ESP32-S3 solution, this kit features a dual-core Xtensa LX7 processor running at 240MHz. CoreS3 comes equipped with built-in Wi-Fi functionality, enabling seamless connectivity. It boasts 16MB of onboard flash memory and 8MB of PSRAM, providing ample space for program storage.", + "long_description":"CoreS3 offers convenient programming options through its TYPE-C interface, supporting OTG and CDC functions. This allows for easy connection with external USB devices and hassle-free firmware flashing. CoreS3 features a 2.0-inch capacitive touch IPS screen, protected by high-strength glass material. Additionally, a 0.3 megapixel camera GC0308 is integrated at the bottom of the screen, accompanied by a proximity sensor LTR-553ALS-WA for enhanced functionality. Power management is handled by the AXP2101 power management core chip, employing a 4-way power flow control loop for efficient power distribution. The overall design emphasizes low power consumption. CoreS3 also features a 6-axis attitude sensor BMI270 and a magnetometer BMM150 for precise motion detection. With the onboard TF-card (microSD) card slot and BM8563 RTC chip, accurate timing and sleep-timer wake-up functions are readily available.", + + "placeholders": + { + "__ESP_BOARD_INCLUDE__": "bsp/esp-bsp.h", + "__ESP_BOARD_I2C_INIT__": "/* Initialize I2C (for touch and audio) */\n bsp_i2c_init();" + } +} diff --git a/SquareLine/boards/m5stack_core_s3/partitions.csv b/SquareLine/boards/m5stack_core_s3/partitions.csv new file mode 100644 index 000000000..7c211a410 --- /dev/null +++ b/SquareLine/boards/m5stack_core_s3/partitions.csv @@ -0,0 +1,5 @@ +# Name, Type, SubType, Offset, Size, Flags +# Note: if you change the phy_init or app partition offset, make sure to change the offset in Kconfig.projbuild +nvs, data, nvs, 0x9000, 0x6000, +phy_init, data, phy, 0xf000, 0x1000, +factory, app, factory, 0x10000, 8M, diff --git a/SquareLine/boards/m5stack_core_s3/sdkconfig.defaults b/SquareLine/boards/m5stack_core_s3/sdkconfig.defaults new file mode 100644 index 000000000..6071db689 --- /dev/null +++ b/SquareLine/boards/m5stack_core_s3/sdkconfig.defaults @@ -0,0 +1,11 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHMODE_QIO=y +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_LV_COLOR_16_SWAP=y +CONFIG_LV_MEM_CUSTOM=y +CONFIG_LV_MEMCPY_MEMSET_STD=y +CONFIG_LV_USE_PERF_MONITOR=y diff --git a/bsp/m5stack_core_s3/CMakeLists.txt b/bsp/m5stack_core_s3/CMakeLists.txt new file mode 100644 index 000000000..93ff8cc9d --- /dev/null +++ b/bsp/m5stack_core_s3/CMakeLists.txt @@ -0,0 +1,7 @@ +idf_component_register( + SRCS "m5stack_core_s3.c" "m5stack_core_s3_idf5.c" + INCLUDE_DIRS "include" + PRIV_INCLUDE_DIRS "priv_include" + REQUIRES driver spiffs + PRIV_REQUIRES fatfs esp_lcd +) diff --git a/bsp/m5stack_core_s3/Kconfig b/bsp/m5stack_core_s3/Kconfig new file mode 100644 index 000000000..699b43868 --- /dev/null +++ b/bsp/m5stack_core_s3/Kconfig @@ -0,0 +1,86 @@ +menu "Board Support Package" + + config BSP_ERROR_CHECK + bool "Enable error check in BSP" + default y + help + Error check assert the application before returning the error code. + + menu "I2C" + config BSP_I2C_NUM + int "I2C peripheral index" + default 1 + range 0 1 + help + ESP32S3 has two I2C peripherals, pick the one you want to use. + + config BSP_I2C_FAST_MODE + bool "Enable I2C fast mode" + default y + help + I2C has two speed modes: normal (100kHz) and fast (400kHz). + + config BSP_I2C_CLK_SPEED_HZ + int + default 400000 if BSP_I2C_FAST_MODE + default 100000 + endmenu + + menu "SPIFFS - Virtual File System" + config BSP_SPIFFS_FORMAT_ON_MOUNT_FAIL + bool "Format SPIFFS if mounting fails" + default n + help + Format SPIFFS if it fails to mount the filesystem. + + config BSP_SPIFFS_MOUNT_POINT + string "SPIFFS mount point" + default "/spiffs" + help + Mount point of SPIFFS in the Virtual File System. + + config BSP_SPIFFS_PARTITION_LABEL + string "Partition label of SPIFFS" + default "storage" + help + Partition label which stores SPIFFS. + + config BSP_SPIFFS_MAX_FILES + int "Max files supported for SPIFFS VFS" + default 5 + help + Supported max files for SPIFFS in the Virtual File System. + endmenu + + menu "SD card - Virtual File System" + config BSP_SD_FORMAT_ON_MOUNT_FAIL + bool "Format SD card if mounting fails" + default n + help + The SDMMC host will format (FAT) the SD card if it fails to mount the filesystem. + + config BSP_SD_MOUNT_POINT + string "SD card mount point" + default "/sdcard" + help + Mount point of the SD card in the Virtual File System + + endmenu + + menu "Display" + config BSP_DISPLAY_BRIGHTNESS_LEDC_CH + int "LEDC channel index" + default 1 + range 0 7 + help + LEDC channel is used to generate PWM signal that controls display brightness. + Set LEDC index that should be used. + endmenu + + config BSP_I2S_NUM + int "I2S peripheral index" + default 1 + range 0 1 + help + ESP32S3 has two I2S peripherals, pick the one you want to use. +endmenu diff --git a/bsp/m5stack_core_s3/LICENSE b/bsp/m5stack_core_s3/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/bsp/m5stack_core_s3/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/bsp/m5stack_core_s3/README.md b/bsp/m5stack_core_s3/README.md new file mode 100644 index 000000000..60d1adf94 --- /dev/null +++ b/bsp/m5stack_core_s3/README.md @@ -0,0 +1,28 @@ +# BSP: M5Stack CoreS3 + +> [!WARNING] +> The SD card is not working simultaneously with the LCD screen. We are working on a fix. + +[![Component Registry](https://components.espressif.com/components/espressif/m5stack_core_s3/badge.svg)](https://components.espressif.com/components/espressif/m5stack_core_s3) + +* [Hardware Reference](https://docs.m5stack.com/en/core/CoreS3) + +![image](pic.webp) + +CoreS3 is the third generation of the M5Stack Core series. Powered by the ESP32-S3 solution, this kit features a dual-core Xtensa LX7 processor running at 240MHz. CoreS3 comes equipped with built-in Wi-Fi functionality, enabling seamless connectivity. It boasts 16MB of onboard flash memory and 8MB of PSRAM, providing ample space for program storage. + +CoreS3 offers convenient programming options through its TYPE-C interface, supporting OTG and CDC functions. This allows for easy connection with external USB devices and hassle-free firmware flashing. CoreS3 features a 2.0-inch capacitive touch IPS screen, protected by high-strength glass material. Additionally, a 0.3 megapixel camera GC0308 is integrated at the bottom of the screen, accompanied by a proximity sensor LTR-553ALS-WA for enhanced functionality. Power management is handled by the AXP2101 power management core chip, employing a 4-way power flow control loop for efficient power distribution. The overall design emphasizes low power consumption. CoreS3 also features a 6-axis attitude sensor BMI270 and a magnetometer BMM150 for precise motion detection. With the onboard TF-card (microSD) card slot and BM8563 RTC chip, accurate timing and sleep-timer wake-up functions are readily available. + +Sound output on CoreS3 is optimized with the high-fidelity 16-bit I2S power amplifier chip AW88298, accompanied by a built-in 1W speaker for clear audio playback. For sound input, the kit incorporates the ES7210 audio decoding chip and dual-microphone input. The side of the device includes an independent power button and restart (RST) button, complemented by a self-built delay circuit. By long-pressing the reset button, users can easily enter the program download mode. The CoreS3 kit comes with the DinBase Base, providing convenient options for Din rail, wall, and screw fixing. It can be powered by an external DC 12V (supports 9~24V) or an internal 500mAh lithium battery. The DinBase also offers multiple proto locations for users to customize and expand their projects. CoreS3 is an ideal choice for IoT development, various DIY project development, smart home control systems, and industrial automation control systems. + + +### Dependencies +| component |version| +|------------------------------------------------------------------------------------------------------------|-------| +| [espressif/esp32-camera](https://components.espressif.com/components/espressif/esp32-camera) | ^2.0.2| +| [espressif/esp_codec_dev](https://components.espressif.com/components/espressif/esp_codec_dev) | ^1.1 | +| [espressif/esp_lcd_ili9341](https://components.espressif.com/components/espressif/esp_lcd_ili9341) | ^1 | +|[espressif/esp_lcd_touch_ft5x06](https://components.espressif.com/components/espressif/esp_lcd_touch_ft5x06)| ^1 | +| [espressif/esp_lvgl_port](https://components.espressif.com/components/espressif/esp_lvgl_port) | ^1.3 | +| idf | >=5.0 | + diff --git a/bsp/m5stack_core_s3/idf_component.yml b/bsp/m5stack_core_s3/idf_component.yml new file mode 100644 index 000000000..b370c20a3 --- /dev/null +++ b/bsp/m5stack_core_s3/idf_component.yml @@ -0,0 +1,23 @@ +version: "1.0.0" +description: Board Support Package for M5Stack CoreS3 +url: https://github.com/espressif/esp-bsp/tree/master/bsp/m5stack_core_s3 + +targets: + - esp32s3 + +dependencies: + idf: ">=5.0" + esp_lcd_ili9341: "^1" + esp_lcd_touch_ft5x06: "^1" + + espressif/esp_lvgl_port: + version: "^1.3" + public: true + + esp_codec_dev: + version: "^1.1" + public: true + + esp32-camera: + version: "^2.0.2" + public: true diff --git a/bsp/m5stack_core_s3/include/bsp/config.h b/bsp/m5stack_core_s3/include/bsp/config.h new file mode 100644 index 000000000..f3cb5ebe7 --- /dev/null +++ b/bsp/m5stack_core_s3/include/bsp/config.h @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +/************************************************************************************************** + * BSP configuration + **************************************************************************************************/ +// By default, this BSP is shipped with LVGL graphical library. Enabling this option will exclude it. +// If you want to use BSP without LVGL, select BSP version with 'noglib' suffix. +#if !defined(BSP_CONFIG_NO_GRAPHIC_LIB) // Check if the symbol is not coming from compiler definitions (-D...) +#define BSP_CONFIG_NO_GRAPHIC_LIB (0) +#endif diff --git a/bsp/m5stack_core_s3/include/bsp/display.h b/bsp/m5stack_core_s3/include/bsp/display.h new file mode 100644 index 000000000..429e581e3 --- /dev/null +++ b/bsp/m5stack_core_s3/include/bsp/display.h @@ -0,0 +1,109 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief BSP LCD + * + * This file offers API for basic LCD control. + * It is useful for users who want to use the LCD without the default Graphical Library LVGL. + * + * For standard LCD initialization with LVGL graphical library, you can call all-in-one function bsp_display_start(). + */ + +#pragma once +#include "esp_lcd_types.h" + +/* LCD color formats */ +#define ESP_LCD_COLOR_FORMAT_RGB565 (1) +#define ESP_LCD_COLOR_FORMAT_RGB888 (2) + +/* LCD display color format */ +#define BSP_LCD_COLOR_FORMAT (ESP_LCD_COLOR_FORMAT_RGB565) +/* LCD display color bytes endianess */ +#define BSP_LCD_BIGENDIAN (1) +/* LCD display color bits */ +#define BSP_LCD_BITS_PER_PIXEL (16) +/* LCD display color space */ +#define BSP_LCD_COLOR_SPACE (ESP_LCD_COLOR_SPACE_BGR) +/* LCD definition */ +#define BSP_LCD_H_RES (320) +#define BSP_LCD_V_RES (240) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief BSP display configuration structure + * + */ +typedef struct { + int max_transfer_sz; /*!< Maximum transfer size, in bytes. */ +} bsp_display_config_t; + +/** + * @brief Create new display panel + * + * For maximum flexibility, this function performs only reset and initialization of the display. + * You must turn on the display explicitly by calling esp_lcd_panel_disp_on_off(). + * The display's backlight is not turned on either. You can use bsp_display_backlight_on/off(), + * bsp_display_brightness_set() (on supported boards) or implement your own backlight control. + * + * If you want to free resources allocated by this function, you can use esp_lcd API, ie.: + * + * \code{.c} + * esp_lcd_panel_del(panel); + * esp_lcd_panel_io_del(io); + * spi_bus_free(spi_num_from_configuration); + * \endcode + * + * @param[in] config display configuration + * @param[out] ret_panel esp_lcd panel handle + * @param[out] ret_io esp_lcd IO handle + * @return + * - ESP_OK On success + * - Else esp_lcd failure + */ +esp_err_t bsp_display_new(const bsp_display_config_t *config, esp_lcd_panel_handle_t *ret_panel, esp_lcd_panel_io_handle_t *ret_io); + +/** + * @brief Set display's brightness + * + * Brightness is controlled with PWM signal to a pin controling backlight. + * + * @param[in] brightness_percent Brightness in [%] + * @return + * - ESP_OK On success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t bsp_display_brightness_set(int brightness_percent); + +/** + * @brief Turn on display backlight + * + * Display must be already initialized by calling bsp_display_start() + * + * @return + * - ESP_OK On success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t bsp_display_backlight_on(void); + +/** + * @brief Turn off display backlight + * + * Display must be already initialized by calling bsp_display_start() + * + * @return + * - ESP_OK On success + * - ESP_ERR_INVALID_ARG Parameter error + */ +esp_err_t bsp_display_backlight_off(void); + +#ifdef __cplusplus +} +#endif diff --git a/bsp/m5stack_core_s3/include/bsp/esp-bsp.h b/bsp/m5stack_core_s3/include/bsp/esp-bsp.h new file mode 100644 index 000000000..e7171a429 --- /dev/null +++ b/bsp/m5stack_core_s3/include/bsp/esp-bsp.h @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once +#include "bsp/m5stack_core_s3.h" diff --git a/bsp/m5stack_core_s3/include/bsp/m5stack_core_s3.h b/bsp/m5stack_core_s3/include/bsp/m5stack_core_s3.h new file mode 100644 index 000000000..5ea3ddc80 --- /dev/null +++ b/bsp/m5stack_core_s3/include/bsp/m5stack_core_s3.h @@ -0,0 +1,426 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief ESP BSP: M5Stack CoreS3 + */ + +#pragma once + +#include "sdkconfig.h" +#include "driver/gpio.h" +#include "driver/i2c.h" +#include "driver/sdmmc_host.h" +#include "soc/usb_pins.h" +#include "esp_codec_dev.h" +#include "bsp/config.h" +#include "bsp/display.h" + +#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0) +#include "driver/i2s.h" +#else +#include "driver/i2s_std.h" +#endif + +#if (BSP_CONFIG_NO_GRAPHIC_LIB == 0) +#include "lvgl.h" +#include "esp_lvgl_port.h" +#endif // BSP_CONFIG_NO_GRAPHIC_LIB == 0 + +/************************************************************************************************** + * BSP Capabilities + **************************************************************************************************/ + +#define BSP_CAPS_DISPLAY 1 +#define BSP_CAPS_TOUCH 1 +#define BSP_CAPS_BUTTONS 0 +#define BSP_CAPS_AUDIO 1 +#define BSP_CAPS_AUDIO_SPEAKER 1 +#define BSP_CAPS_AUDIO_MIC 1 +#define BSP_CAPS_SDCARD 1 +#define BSP_CAPS_IMU 0 + +/************************************************************************************************** + * ESP-BOX pinout + **************************************************************************************************/ +/* I2C */ +#define BSP_I2C_SCL (GPIO_NUM_11) +#define BSP_I2C_SDA (GPIO_NUM_12) + +/* Audio */ +#define BSP_I2S_SCLK (GPIO_NUM_34) +#define BSP_I2S_MCLK (GPIO_NUM_0) +#define BSP_I2S_LCLK (GPIO_NUM_33) +#define BSP_I2S_DOUT (GPIO_NUM_13) // To Codec AW88298 +#define BSP_I2S_DSIN (GPIO_NUM_14) // From ADC ES7210 +#define BSP_POWER_AMP_IO (GPIO_NUM_NC) +#define BSP_MUTE_STATUS (GPIO_NUM_NC) + +/* Display */ +#define BSP_LCD_MOSI (GPIO_NUM_37) +#define BSP_LCD_MISO (GPIO_NUM_35) +#define BSP_LCD_PCLK (GPIO_NUM_36) +#define BSP_LCD_CS (GPIO_NUM_3) +#define BSP_LCD_DC (GPIO_NUM_35) +#define BSP_LCD_RST (GPIO_NUM_NC) +#define BSP_LCD_BACKLIGHT (GPIO_NUM_NC) +#define BSP_LCD_TOUCH_INT (GPIO_NUM_NC) + +/* Camera */ +#define BSP_CAMERA_XCLK (GPIO_NUM_NC) +#define BSP_CAMERA_PCLK (GPIO_NUM_45) +#define BSP_CAMERA_VSYNC (GPIO_NUM_46) +#define BSP_CAMERA_HSYNC (GPIO_NUM_38) +#define BSP_CAMERA_D0 (GPIO_NUM_39) +#define BSP_CAMERA_D1 (GPIO_NUM_40) +#define BSP_CAMERA_D2 (GPIO_NUM_41) +#define BSP_CAMERA_D3 (GPIO_NUM_42) +#define BSP_CAMERA_D4 (GPIO_NUM_15) +#define BSP_CAMERA_D5 (GPIO_NUM_16) +#define BSP_CAMERA_D6 (GPIO_NUM_48) +#define BSP_CAMERA_D7 (GPIO_NUM_47) + +/* SD card */ +#define BSP_SD_MOSI (GPIO_NUM_37) +#define BSP_SD_MISO (GPIO_NUM_35) +#define BSP_SD_SCK (GPIO_NUM_36) +#define BSP_SD_CS (GPIO_NUM_4) + +/* USB */ +#define BSP_USB_POS USBPHY_DP_NUM +#define BSP_USB_NEG USBPHY_DM_NUM + + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************************************** + * + * I2S audio interface + * + * There are two devices connected to the I2S peripheral: + * - Codec ES8311 for output (playback) path + * - ADC ES7210 for input (recording) path + * + * For speaker initialization use bsp_audio_codec_speaker_init() which is inside initialize I2S with bsp_audio_init(). + * For microphone initialization use bsp_audio_codec_microphone_init() which is inside initialize I2S with bsp_audio_init(). + * After speaker or microphone initialization, use functions from esp_codec_dev for play/record audio. + * Example audio play: + * \code{.c} + * esp_codec_dev_set_out_vol(spk_codec_dev, DEFAULT_VOLUME); + * esp_codec_dev_open(spk_codec_dev, &fs); + * esp_codec_dev_write(spk_codec_dev, wav_bytes, bytes_read_from_spiffs); + * esp_codec_dev_close(spk_codec_dev); + * \endcode + **************************************************************************************************/ + +/** + * @brief Init audio + * + * @note There is no deinit audio function. Users can free audio resources by calling i2s_del_channel() + * @warning The type of i2s_config param is depending on IDF version. + * @param[in] i2s_config I2S configuration. Pass NULL to use default values (Mono, duplex, 16bit, 22050 Hz) + * @return + * - ESP_OK On success + * - ESP_ERR_NOT_SUPPORTED The communication mode is not supported on the current chip + * - ESP_ERR_INVALID_ARG NULL pointer or invalid configuration + * - ESP_ERR_NOT_FOUND No available I2S channel found + * - ESP_ERR_NO_MEM No memory for storing the channel information + * - ESP_ERR_INVALID_STATE This channel has not initialized or already started + */ +#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0) +esp_err_t bsp_audio_init(const i2s_config_t *i2s_config); +#else +esp_err_t bsp_audio_init(const i2s_std_config_t *i2s_config); +#endif + +/** + * @brief Get codec I2S interface (initialized in bsp_audio_init) + * + * @return + * - Pointer to codec I2S interface handle or NULL when error occured + */ +const audio_codec_data_if_t *bsp_audio_get_codec_itf(void); + +/** + * @brief Initialize speaker codec device + * + * @return Pointer to codec device handle or NULL when error occured + */ +esp_codec_dev_handle_t bsp_audio_codec_speaker_init(void); + +/** + * @brief Initialize microphone codec device + * + * @return Pointer to codec device handle or NULL when error occured + */ +esp_codec_dev_handle_t bsp_audio_codec_microphone_init(void); + +/************************************************************************************************** + * + * I2C interface + * + * There are multiple devices connected to I2C peripheral: + * - Codec ES8311 (configuration only) + * - ADC ES7210 (configuration only) + * - Encryption chip ATECC608A (NOT populated on most boards) + * - LCD Touch controller + * - Inertial Measurement Unit ICM-42607-P + * + * After initialization of I2C, use BSP_I2C_NUM macro when creating I2C devices drivers ie.: + * \code{.c} + * es8311_handle_t es8311_dev = es8311_create(BSP_I2C_NUM, ES8311_ADDRRES_0); + * \endcode + **************************************************************************************************/ +#define BSP_I2C_NUM CONFIG_BSP_I2C_NUM + +/** + * @brief Init I2C driver + * + * @return + * - ESP_OK On success + * - ESP_ERR_INVALID_ARG I2C parameter error + * - ESP_FAIL I2C driver installation error + * + */ +esp_err_t bsp_i2c_init(void); + +/** + * @brief Deinit I2C driver and free its resources + * + * @return + * - ESP_OK On success + * - ESP_ERR_INVALID_ARG I2C parameter error + * + */ +esp_err_t bsp_i2c_deinit(void); + +/************************************************************************************************** + * + * Camera interface + * + * ESP32-S3-EYE is shipped with OV2640 camera module. + * As a camera driver, esp32-camera component is used. + * + * Example configuration: + * \code{.c} + * const camera_config_t camera_config = BSP_CAMERA_DEFAULT_CONFIG; + * esp_err_t err = esp_camera_init(&camera_config); + * \endcode + **************************************************************************************************/ +/** + * @brief Camera default configuration + * + * In this configuration we select RGB565 color format and 320x240 image size - matching the display. + * We use double-buffering for the best performance. + * Since we don't want to waste internal SRAM, we allocate the framebuffers in external PSRAM. + * By setting XCLK to 16MHz, we configure the esp32-camera driver to use EDMA when accessing the PSRAM. + * + * @attention I2C must be enabled by bsp_i2c_init(), before camera is initialized + */ +#define BSP_CAMERA_DEFAULT_CONFIG \ + { \ + .pin_pwdn = GPIO_NUM_NC, \ + .pin_reset = GPIO_NUM_NC, \ + .pin_xclk = BSP_CAMERA_XCLK, \ + .pin_sccb_sda = GPIO_NUM_NC, \ + .pin_sccb_scl = GPIO_NUM_NC, \ + .pin_d7 = BSP_CAMERA_D7, \ + .pin_d6 = BSP_CAMERA_D6, \ + .pin_d5 = BSP_CAMERA_D5, \ + .pin_d4 = BSP_CAMERA_D4, \ + .pin_d3 = BSP_CAMERA_D3, \ + .pin_d2 = BSP_CAMERA_D2, \ + .pin_d1 = BSP_CAMERA_D1, \ + .pin_d0 = BSP_CAMERA_D0, \ + .pin_vsync = BSP_CAMERA_VSYNC, \ + .pin_href = BSP_CAMERA_HSYNC, \ + .pin_pclk = BSP_CAMERA_PCLK, \ + .xclk_freq_hz = 10000000, \ + .ledc_timer = LEDC_TIMER_0, \ + .ledc_channel = LEDC_CHANNEL_0, \ + .pixel_format = PIXFORMAT_RGB565, \ + .frame_size = FRAMESIZE_QVGA, \ + .jpeg_quality = 12, \ + .fb_count = 2, \ + .fb_location = CAMERA_FB_IN_PSRAM,\ + .sccb_i2c_port = BSP_I2C_NUM, \ + } + +/************************************************************************************************** + * + * SPIFFS + * + * After mounting the SPIFFS, it can be accessed with stdio functions ie.: + * \code{.c} + * FILE* f = fopen(BSP_SPIFFS_MOUNT_POINT"/hello.txt", "w"); + * fprintf(f, "Hello World!\n"); + * fclose(f); + * \endcode + **************************************************************************************************/ +#define BSP_SPIFFS_MOUNT_POINT CONFIG_BSP_SPIFFS_MOUNT_POINT + +/** + * @brief Mount SPIFFS to virtual file system + * + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if esp_vfs_spiffs_register was already called + * - ESP_ERR_NO_MEM if memory can not be allocated + * - ESP_FAIL if partition can not be mounted + * - other error codes + */ +esp_err_t bsp_spiffs_mount(void); + +/** + * @brief Unmount SPIFFS from virtual file system + * + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_FOUND if the partition table does not contain SPIFFS partition with given label + * - ESP_ERR_INVALID_STATE if esp_vfs_spiffs_unregister was already called + * - ESP_ERR_NO_MEM if memory can not be allocated + * - ESP_FAIL if partition can not be mounted + * - other error codes + */ +esp_err_t bsp_spiffs_unmount(void); + +/************************************************************************************************** + * + * SD card + * + * After mounting the SD card, it can be accessed with stdio functions ie.: + * \code{.c} + * FILE* f = fopen(BSP_SD_MOUNT_POINT"/hello.txt", "w"); + * fprintf(f, "Hello %s!\n", bsp_sdcard->cid.name); + * fclose(f); + * \endcode + * + * @attention IO2 is also routed to RGB LED and push button + **************************************************************************************************/ +#define BSP_SD_MOUNT_POINT CONFIG_BSP_SD_MOUNT_POINT +extern sdmmc_card_t *bsp_sdcard; + +/** + * @brief Mount microSD card to virtual file system + * + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_STATE if esp_vfs_fat_sdmmc_mount was already called + * - ESP_ERR_NO_MEM if memory can not be allocated + * - ESP_FAIL if partition can not be mounted + * - other error codes from SDMMC or SPI drivers, SDMMC protocol, or FATFS drivers + */ +esp_err_t bsp_sdcard_mount(void); + +/** + * @brief Unmount micorSD card from virtual file system + * + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_FOUND if the partition table does not contain FATFS partition with given label + * - ESP_ERR_INVALID_STATE if esp_vfs_fat_spiflash_mount was already called + * - ESP_ERR_NO_MEM if memory can not be allocated + * - ESP_FAIL if partition can not be mounted + * - other error codes from wear levelling library, SPI flash driver, or FATFS drivers + */ +esp_err_t bsp_sdcard_unmount(void); + +/************************************************************************************************** + * + * LCD interface + * + * ESP-BOX is shipped with 2.4inch ST7789 display controller. + * It features 16-bit colors, 320x240 resolution and capacitive touch controller. + * + * LVGL is used as graphics library. LVGL is NOT thread safe, therefore the user must take LVGL mutex + * by calling bsp_display_lock() before calling and LVGL API (lv_...) and then give the mutex with + * bsp_display_unlock(). + * + * Display's backlight must be enabled explicitly by calling bsp_display_backlight_on() + **************************************************************************************************/ +#define BSP_LCD_PIXEL_CLOCK_HZ (40 * 1000 * 1000) +#define BSP_LCD_SPI_NUM (SPI3_HOST) + + +#if (BSP_CONFIG_NO_GRAPHIC_LIB == 0) +#define BSP_LCD_DRAW_BUFF_SIZE (BSP_LCD_H_RES * 50) +#define BSP_LCD_DRAW_BUFF_DOUBLE (1) + +/** + * @brief BSP display configuration structure + */ +typedef struct { + lvgl_port_cfg_t lvgl_port_cfg; /*!< LVGL port configuration */ + uint32_t buffer_size; /*!< Size of the buffer for the screen in pixels */ + bool double_buffer; /*!< True, if should be allocated two buffers */ + struct { + unsigned int buff_dma: 1; /*!< Allocated LVGL buffer will be DMA capable */ + unsigned int buff_spiram: 1; /*!< Allocated LVGL buffer will be in PSRAM */ + } flags; +} bsp_display_cfg_t; +/** + * @brief Initialize display + * + * This function initializes SPI, display controller and starts LVGL handling task. + * LCD backlight must be enabled separately by calling bsp_display_brightness_set() + * + * @return Pointer to LVGL display or NULL when error occured + */ +lv_disp_t *bsp_display_start(void); + +/** + * @brief Initialize display + * + * This function initializes SPI, display controller and starts LVGL handling task. + * LCD backlight must be enabled separately by calling bsp_display_brightness_set() + * + * @param cfg display configuration + * + * @return Pointer to LVGL display or NULL when error occured + */ +lv_disp_t *bsp_display_start_with_config(const bsp_display_cfg_t *cfg); + +/** + * @brief Get pointer to input device (touch, buttons, ...) + * + * @note The LVGL input device is initialized in bsp_display_start() function. + * + * @return Pointer to LVGL input device or NULL when not initialized + */ +lv_indev_t *bsp_display_get_input_dev(void); + +/** + * @brief Take LVGL mutex + * + * @param timeout_ms Timeout in [ms]. 0 will block indefinitely. + * @return true Mutex was taken + * @return false Mutex was NOT taken + */ +bool bsp_display_lock(uint32_t timeout_ms); + +/** + * @brief Give LVGL mutex + * + */ +void bsp_display_unlock(void); + +/** + * @brief Rotate screen + * + * Display must be already initialized by calling bsp_display_start() + * + * @param[in] disp Pointer to LVGL display + * @param[in] rotation Angle of the display rotation + */ +void bsp_display_rotate(lv_disp_t *disp, lv_disp_rot_t rotation); +#endif // BSP_CONFIG_NO_GRAPHIC_LIB == 0 + +#ifdef __cplusplus +} +#endif diff --git a/bsp/m5stack_core_s3/include/bsp/touch.h b/bsp/m5stack_core_s3/include/bsp/touch.h new file mode 100644 index 000000000..095e8ce1d --- /dev/null +++ b/bsp/m5stack_core_s3/include/bsp/touch.h @@ -0,0 +1,51 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief BSP Touchscreen + * + * This file offers API for basic touchscreen initialization. + * It is useful for users who want to use the touchscreen without the default Graphical Library LVGL. + * + * For standard LCD initialization with LVGL graphical library, you can call all-in-one function bsp_display_start(). + */ + +#pragma once +#include "esp_lcd_touch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief BSP touch configuration structure + * + */ +typedef struct { + void *dummy; /*!< Prepared for future use. */ +} bsp_touch_config_t; + +/** + * @brief Create new touchscreen + * + * If you want to free resources allocated by this function, you can use esp_lcd_touch API, ie.: + * + * \code{.c} + * esp_lcd_touch_del(tp); + * \endcode + * + * @param[in] config touch configuration + * @param[out] ret_touch esp_lcd_touch touchscreen handle + * @return + * - ESP_OK On success + * - Else esp_lcd_touch failure + */ +esp_err_t bsp_touch_new(const bsp_touch_config_t *config, esp_lcd_touch_handle_t *ret_touch); + +#ifdef __cplusplus +} +#endif diff --git a/bsp/m5stack_core_s3/m5stack_core_s3.c b/bsp/m5stack_core_s3/m5stack_core_s3.c new file mode 100644 index 000000000..1ba94440a --- /dev/null +++ b/bsp/m5stack_core_s3/m5stack_core_s3.c @@ -0,0 +1,521 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "driver/gpio.h" +#include "driver/spi_master.h" +#include "esp_err.h" +#include "esp_log.h" +#include "esp_check.h" +#include "esp_spiffs.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_panel_vendor.h" +#include "esp_lcd_panel_ops.h" +#include "esp_vfs_fat.h" +#include "driver/sdmmc_host.h" +#include "driver/sdspi_host.h" +#include "driver/i2c.h" + +#include "bsp/m5stack_core_s3.h" +#include "bsp/display.h" +#include "bsp/touch.h" +#include "esp_lcd_ili9341.h" +#include "esp_lcd_touch_ft5x06.h" +#include "esp_lvgl_port.h" +#include "bsp_err_check.h" +#include "esp_codec_dev_defaults.h" + +static const char *TAG = "M5Stack"; + +#define BSP_AXP2101_ADDR 0x34 +#define BSP_AW9523_ADDR 0x58 + +/* Features */ +typedef enum { + BSP_FEATURE_LCD, + BSP_FEATURE_TOUCH, + BSP_FEATURE_SD, + BSP_FEATURE_SPEAKER, + BSP_FEATURE_CAMERA, +} bsp_feature_t; + +static lv_disp_t *disp; +static lv_indev_t *disp_indev = NULL; +static esp_lcd_touch_handle_t tp; // LCD touch handle +sdmmc_card_t *bsp_sdcard = NULL; // Global SD card handler +static bool i2c_initialized = false; +static bool spi_initialized = false; + +esp_err_t bsp_i2c_init(void) +{ + /* I2C was initialized before */ + if (i2c_initialized) { + return ESP_OK; + } + + const i2c_config_t i2c_conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = BSP_I2C_SDA, + .sda_pullup_en = GPIO_PULLUP_DISABLE, + .scl_io_num = BSP_I2C_SCL, + .scl_pullup_en = GPIO_PULLUP_DISABLE, + .master.clk_speed = CONFIG_BSP_I2C_CLK_SPEED_HZ + }; + BSP_ERROR_CHECK_RETURN_ERR(i2c_param_config(BSP_I2C_NUM, &i2c_conf)); + BSP_ERROR_CHECK_RETURN_ERR(i2c_driver_install(BSP_I2C_NUM, i2c_conf.mode, 0, 0, 0)); + + i2c_initialized = true; + + return ESP_OK; +} + +esp_err_t bsp_i2c_deinit(void) +{ + BSP_ERROR_CHECK_RETURN_ERR(i2c_driver_delete(BSP_I2C_NUM)); + i2c_initialized = false; + return ESP_OK; +} + +static esp_err_t bsp_enable_feature(bsp_feature_t feature) +{ + esp_err_t err = ESP_OK; + static uint8_t aw9523_P0 = 0b10; + static uint8_t aw9523_P1 = 0b10100000; + uint8_t data[2]; + + /* Initilize I2C */ + BSP_ERROR_CHECK_RETURN_ERR(bsp_i2c_init()); + + switch (feature) { + case BSP_FEATURE_LCD: + /* Enable LCD */ + aw9523_P1 |= (1 << 1); + break; + case BSP_FEATURE_TOUCH: + /* Enable Touch */ + aw9523_P0 |= (1); + break; + case BSP_FEATURE_SD: + /* AXP ALDO4 voltage / SD Card / 3V3 */ + data[0] = 0x95; + data[1] = 0b00011100; //3V3 + err |= i2c_master_write_to_device(BSP_I2C_NUM, BSP_AXP2101_ADDR, data, sizeof(data), 1000 / portTICK_PERIOD_MS); + /* Enable SD */ + aw9523_P0 |= (1 << 4); + break; + case BSP_FEATURE_SPEAKER: + /* AXP ALDO1 voltage / PA PVDD / 1V8 */ + data[0] = 0x92; + data[1] = 0b00001101; //1V8 + err |= i2c_master_write_to_device(BSP_I2C_NUM, BSP_AXP2101_ADDR, data, sizeof(data), 1000 / portTICK_PERIOD_MS); + /* AXP ALDO2 voltage / Codec / 3V3 */ + data[0] = 0x93; + data[1] = 0b00011100; //3V3 + err |= i2c_master_write_to_device(BSP_I2C_NUM, BSP_AXP2101_ADDR, data, sizeof(data), 1000 / portTICK_PERIOD_MS); + /* AXP ALDO3 voltage / Codec+Mic / 3V3 */ + data[0] = 0x94; + data[1] = 0b00011100; //3V3 + err |= i2c_master_write_to_device(BSP_I2C_NUM, BSP_AXP2101_ADDR, data, sizeof(data), 1000 / portTICK_PERIOD_MS); + /* AW9523 P0 is in push-pull mode */ + data[0] = 0x11; + data[1] = 0x10; + err |= i2c_master_write_to_device(BSP_I2C_NUM, BSP_AW9523_ADDR, data, sizeof(data), 1000 / portTICK_PERIOD_MS); + /* Enable Codec AW88298 */ + aw9523_P0 |= (1 << 2); + break; + case BSP_FEATURE_CAMERA: + /* Enable Camera */ + aw9523_P1 |= (1); + break; + } + + data[0] = 0x02; + data[1] = aw9523_P0; + err |= i2c_master_write_to_device(BSP_I2C_NUM, BSP_AW9523_ADDR, data, sizeof(data), 1000 / portTICK_PERIOD_MS); + + data[0] = 0x03; + data[1] = aw9523_P1; + err |= i2c_master_write_to_device(BSP_I2C_NUM, BSP_AW9523_ADDR, data, sizeof(data), 1000 / portTICK_PERIOD_MS); + + return err; +} + +static esp_err_t bsp_spi_init(uint32_t max_transfer_sz) +{ + /* SPI was initialized before */ + if (spi_initialized) { + return ESP_OK; + } + + ESP_LOGD(TAG, "Initialize SPI bus"); + const spi_bus_config_t buscfg = { + .sclk_io_num = BSP_LCD_PCLK, + .mosi_io_num = BSP_LCD_MOSI, + .miso_io_num = BSP_LCD_MISO, + .quadwp_io_num = GPIO_NUM_NC, + .quadhd_io_num = GPIO_NUM_NC, + .max_transfer_sz = max_transfer_sz, + }; + ESP_RETURN_ON_ERROR(spi_bus_initialize(BSP_LCD_SPI_NUM, &buscfg, SPI_DMA_CH_AUTO), TAG, "SPI init failed"); + + spi_initialized = true; + + return ESP_OK; +} + +esp_err_t bsp_spiffs_mount(void) +{ + esp_vfs_spiffs_conf_t conf = { + .base_path = CONFIG_BSP_SPIFFS_MOUNT_POINT, + .partition_label = CONFIG_BSP_SPIFFS_PARTITION_LABEL, + .max_files = CONFIG_BSP_SPIFFS_MAX_FILES, +#ifdef CONFIG_BSP_SPIFFS_FORMAT_ON_MOUNT_FAIL + .format_if_mount_failed = true, +#else + .format_if_mount_failed = false, +#endif + }; + + esp_err_t ret_val = esp_vfs_spiffs_register(&conf); + + BSP_ERROR_CHECK_RETURN_ERR(ret_val); + + size_t total = 0, used = 0; + ret_val = esp_spiffs_info(conf.partition_label, &total, &used); + if (ret_val != ESP_OK) { + ESP_LOGE(TAG, "Failed to get SPIFFS partition information (%s)", esp_err_to_name(ret_val)); + } else { + ESP_LOGI(TAG, "Partition size: total: %d, used: %d", total, used); + } + + return ret_val; +} + +esp_err_t bsp_spiffs_unmount(void) +{ + return esp_vfs_spiffs_unregister(CONFIG_BSP_SPIFFS_PARTITION_LABEL); +} + +esp_err_t bsp_sdcard_mount(void) +{ + BSP_ERROR_CHECK_RETURN_ERR(bsp_enable_feature(BSP_FEATURE_SD)); + + const esp_vfs_fat_sdmmc_mount_config_t mount_config = { +#ifdef CONFIG_BSP_SD_FORMAT_ON_MOUNT_FAIL + .format_if_mount_failed = true, +#else + .format_if_mount_failed = false, +#endif + .max_files = 5, + .allocation_unit_size = 16 * 1024 + }; + + sdmmc_host_t host = SDSPI_HOST_DEFAULT(); + host.slot = BSP_LCD_SPI_NUM; + sdspi_device_config_t slot_config = SDSPI_DEVICE_CONFIG_DEFAULT(); + slot_config.gpio_cs = BSP_SD_CS; + slot_config.host_id = host.slot; + + ESP_RETURN_ON_ERROR(bsp_spi_init((BSP_LCD_H_RES * BSP_LCD_V_RES) * sizeof(uint16_t)), TAG, ""); + + return esp_vfs_fat_sdspi_mount(BSP_SD_MOUNT_POINT, &host, &slot_config, &mount_config, &bsp_sdcard); +} + +esp_err_t bsp_sdcard_unmount(void) +{ + return esp_vfs_fat_sdcard_unmount(BSP_SD_MOUNT_POINT, bsp_sdcard); +} + +esp_codec_dev_handle_t bsp_audio_codec_speaker_init(void) +{ + 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_NULL(bsp_i2c_init()); + /* Configure I2S peripheral and Power Amplifier */ + BSP_ERROR_CHECK_RETURN_NULL(bsp_audio_init(NULL)); + i2s_data_if = bsp_audio_get_codec_itf(); + } + assert(i2s_data_if); + + BSP_ERROR_CHECK_RETURN_ERR(bsp_enable_feature(BSP_FEATURE_SPEAKER)); + + audio_codec_i2c_cfg_t i2c_cfg = { + .port = BSP_I2C_NUM, + .addr = AW88298_CODEC_DEFAULT_ADDR, + }; + const audio_codec_ctrl_if_t *out_ctrl_if = audio_codec_new_i2c_ctrl(&i2c_cfg); + + const audio_codec_gpio_if_t *gpio_if = audio_codec_new_gpio(); + + // New output codec interface + aw88298_codec_cfg_t aw88298_cfg = { + .ctrl_if = out_ctrl_if, + .gpio_if = gpio_if, + .hw_gain.pa_gain = 15, + // .reset_pin = -1, + }; + const audio_codec_if_t *out_codec_if = aw88298_codec_new(&aw88298_cfg); + + esp_codec_dev_cfg_t codec_dev_cfg = { + .dev_type = ESP_CODEC_DEV_TYPE_OUT, + .codec_if = out_codec_if, + .data_if = i2s_data_if, + }; + return esp_codec_dev_new(&codec_dev_cfg); +} + +esp_codec_dev_handle_t bsp_audio_codec_microphone_init(void) +{ + 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_NULL(bsp_i2c_init()); + /* Configure I2S peripheral and Power Amplifier */ + BSP_ERROR_CHECK_RETURN_NULL(bsp_audio_init(NULL)); + i2s_data_if = bsp_audio_get_codec_itf(); + } + assert(i2s_data_if); + + audio_codec_i2c_cfg_t i2c_cfg = { + .port = BSP_I2C_NUM, + .addr = ES7210_CODEC_DEFAULT_ADDR, + }; + const audio_codec_ctrl_if_t *i2c_ctrl_if = audio_codec_new_i2c_ctrl(&i2c_cfg); + BSP_NULL_CHECK(i2c_ctrl_if, NULL); + + es7210_codec_cfg_t es7210_cfg = { + .ctrl_if = i2c_ctrl_if, + }; + const audio_codec_if_t *es7210_dev = es7210_codec_new(&es7210_cfg); + BSP_NULL_CHECK(es7210_dev, NULL); + + esp_codec_dev_cfg_t codec_es7210_dev_cfg = { + .dev_type = ESP_CODEC_DEV_TYPE_IN, + .codec_if = es7210_dev, + .data_if = i2s_data_if, + }; + return esp_codec_dev_new(&codec_es7210_dev_cfg); +} + +// Bit number used to represent command and parameter +#define LCD_CMD_BITS 8 +#define LCD_PARAM_BITS 8 +#define LCD_LEDC_CH CONFIG_BSP_DISPLAY_BRIGHTNESS_LEDC_CH + +static esp_err_t bsp_display_brightness_init(void) +{ + /* Initilize I2C */ + BSP_ERROR_CHECK_RETURN_ERR(bsp_i2c_init()); + + const uint8_t lcd_bl_en[] = { 0x90, 0xBF }; // AXP DLDO1 Enable + ESP_RETURN_ON_ERROR(i2c_master_write_to_device(BSP_I2C_NUM, BSP_AXP2101_ADDR, lcd_bl_en, sizeof(lcd_bl_en), 1000 / portTICK_PERIOD_MS), TAG, "I2C write failed"); + const uint8_t lcd_bl_val[] = { 0x99, 0b00011000 }; // AXP DLDO1 voltage + ESP_RETURN_ON_ERROR(i2c_master_write_to_device(BSP_I2C_NUM, BSP_AXP2101_ADDR, lcd_bl_val, sizeof(lcd_bl_val), 1000 / portTICK_PERIOD_MS), TAG, "I2C write failed"); + + return ESP_OK; +} + +esp_err_t bsp_display_brightness_set(int brightness_percent) +{ + if (brightness_percent > 100) { + brightness_percent = 100; + } + if (brightness_percent < 0) { + brightness_percent = 0; + } + + ESP_LOGI(TAG, "Setting LCD backlight: %d%%", brightness_percent); + const uint8_t reg_val = 20 + ((8 * brightness_percent) / 100); // 0b00000 ~ 0b11100; under 20, it is too dark + const uint8_t lcd_bl_val[] = { 0x99, reg_val }; // AXP DLDO1 voltage + ESP_RETURN_ON_ERROR(i2c_master_write_to_device(BSP_I2C_NUM, BSP_AXP2101_ADDR, lcd_bl_val, sizeof(lcd_bl_val), 1000 / portTICK_PERIOD_MS), TAG, "I2C write failed"); + + return ESP_OK; +} + +esp_err_t bsp_display_backlight_off(void) +{ + return bsp_display_brightness_set(0); +} + +esp_err_t bsp_display_backlight_on(void) +{ + return bsp_display_brightness_set(100); +} + +esp_err_t bsp_display_new(const bsp_display_config_t *config, esp_lcd_panel_handle_t *ret_panel, esp_lcd_panel_io_handle_t *ret_io) +{ + esp_err_t ret = ESP_OK; + assert(config != NULL && config->max_transfer_sz > 0); + + BSP_ERROR_CHECK_RETURN_ERR(bsp_enable_feature(BSP_FEATURE_LCD)); + BSP_ERROR_CHECK_RETURN_ERR(bsp_enable_feature(BSP_FEATURE_CAMERA)); + + /* Initialize SPI */ + ESP_RETURN_ON_ERROR(bsp_spi_init(config->max_transfer_sz), TAG, ""); + + ESP_LOGD(TAG, "Install panel IO"); + const esp_lcd_panel_io_spi_config_t io_config = { + .dc_gpio_num = BSP_LCD_DC, + .cs_gpio_num = BSP_LCD_CS, + .pclk_hz = BSP_LCD_PIXEL_CLOCK_HZ, + .lcd_cmd_bits = LCD_CMD_BITS, + .lcd_param_bits = LCD_PARAM_BITS, + .spi_mode = 0, + .trans_queue_depth = 10, + }; + ESP_GOTO_ON_ERROR(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)BSP_LCD_SPI_NUM, &io_config, ret_io), err, TAG, "New panel IO failed"); + + ESP_LOGD(TAG, "Install LCD driver"); + const esp_lcd_panel_dev_config_t panel_config = { + .reset_gpio_num = BSP_LCD_RST, // Shared with Touch reset + .color_space = BSP_LCD_COLOR_SPACE, + .bits_per_pixel = BSP_LCD_BITS_PER_PIXEL, + }; + ESP_GOTO_ON_ERROR(esp_lcd_new_panel_ili9341(*ret_io, &panel_config, ret_panel), err, TAG, "New panel failed"); + + esp_lcd_panel_reset(*ret_panel); + esp_lcd_panel_init(*ret_panel); + esp_lcd_panel_mirror(*ret_panel, true, true); + esp_lcd_panel_invert_color(*ret_panel, true); + return ret; + +err: + if (*ret_panel) { + esp_lcd_panel_del(*ret_panel); + } + if (*ret_io) { + esp_lcd_panel_io_del(*ret_io); + } + spi_bus_free(BSP_LCD_SPI_NUM); + return ret; +} + +esp_err_t bsp_touch_new(const bsp_touch_config_t *config, esp_lcd_touch_handle_t *ret_touch) +{ + BSP_ERROR_CHECK_RETURN_ERR(bsp_enable_feature(BSP_FEATURE_TOUCH)); + + /* Initialize touch */ + const esp_lcd_touch_config_t tp_cfg = { + .x_max = BSP_LCD_H_RES, + .y_max = BSP_LCD_V_RES, + .rst_gpio_num = GPIO_NUM_NC, // Shared with LCD reset + .int_gpio_num = BSP_LCD_TOUCH_INT, + .levels = { + .reset = 0, + .interrupt = 0, + }, + .flags = { + .swap_xy = 0, + .mirror_x = 1, + .mirror_y = 1, + }, + }; + esp_lcd_panel_io_handle_t tp_io_handle = NULL; + const esp_lcd_panel_io_i2c_config_t tp_io_config = ESP_LCD_TOUCH_IO_I2C_FT5x06_CONFIG(); + ESP_RETURN_ON_ERROR(esp_lcd_new_panel_io_i2c((esp_lcd_i2c_bus_handle_t)BSP_I2C_NUM, &tp_io_config, &tp_io_handle), TAG, ""); + return esp_lcd_touch_new_i2c_ft5x06(tp_io_handle, &tp_cfg, ret_touch); +} + +#if (BSP_CONFIG_NO_GRAPHIC_LIB == 0) +static lv_disp_t *bsp_display_lcd_init(const bsp_display_cfg_t *cfg) +{ + assert(cfg != NULL); + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_handle_t panel_handle = NULL; + const bsp_display_config_t bsp_disp_cfg = { + .max_transfer_sz = BSP_LCD_DRAW_BUFF_SIZE * sizeof(uint16_t), + }; + BSP_ERROR_CHECK_RETURN_NULL(bsp_display_new(&bsp_disp_cfg, &panel_handle, &io_handle)); + + esp_lcd_panel_disp_on_off(panel_handle, true); + + /* Add LCD screen */ + ESP_LOGD(TAG, "Add LCD screen"); + const lvgl_port_display_cfg_t disp_cfg = { + .io_handle = io_handle, + .panel_handle = panel_handle, + .buffer_size = cfg->buffer_size, + .double_buffer = cfg->double_buffer, + .hres = BSP_LCD_H_RES, + .vres = BSP_LCD_V_RES, + .monochrome = false, + /* Rotation values must be same as used in esp_lcd for initial settings of the screen */ + .rotation = { + .swap_xy = false, + .mirror_x = true, + .mirror_y = true, + }, + .flags = { + .buff_dma = cfg->flags.buff_dma, + .buff_spiram = cfg->flags.buff_spiram, + } + }; + + return lvgl_port_add_disp(&disp_cfg); +} + +static lv_indev_t *bsp_display_indev_init(lv_disp_t *disp) +{ + BSP_ERROR_CHECK_RETURN_NULL(bsp_touch_new(NULL, &tp)); + assert(tp); + + /* Add touch input (for selected screen) */ + const lvgl_port_touch_cfg_t touch_cfg = { + .disp = disp, + .handle = tp, + }; + + return lvgl_port_add_touch(&touch_cfg); +} + +lv_disp_t *bsp_display_start(void) +{ + bsp_display_cfg_t cfg = { + .lvgl_port_cfg = ESP_LVGL_PORT_INIT_CONFIG(), + .buffer_size = BSP_LCD_DRAW_BUFF_SIZE, + .double_buffer = BSP_LCD_DRAW_BUFF_DOUBLE, + .flags = { + .buff_dma = true, + .buff_spiram = false, + } + }; + return bsp_display_start_with_config(&cfg); +} + +lv_disp_t *bsp_display_start_with_config(const bsp_display_cfg_t *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()); + + BSP_NULL_CHECK(disp = bsp_display_lcd_init(cfg), NULL); + + BSP_NULL_CHECK(disp_indev = bsp_display_indev_init(disp), NULL); + + return disp; +} + +lv_indev_t *bsp_display_get_input_dev(void) +{ + return disp_indev; +} + +void bsp_display_rotate(lv_disp_t *disp, lv_disp_rot_t rotation) +{ + lv_disp_set_rotation(disp, rotation); +} + +bool bsp_display_lock(uint32_t timeout_ms) +{ + return lvgl_port_lock(timeout_ms); +} + +void bsp_display_unlock(void) +{ + lvgl_port_unlock(); +} +#endif // (BSP_CONFIG_NO_GRAPHIC_LIB == 0) diff --git a/bsp/m5stack_core_s3/m5stack_core_s3_idf5.c b/bsp/m5stack_core_s3/m5stack_core_s3_idf5.c new file mode 100644 index 000000000..d8ae391ee --- /dev/null +++ b/bsp/m5stack_core_s3/m5stack_core_s3_idf5.c @@ -0,0 +1,95 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "esp_err.h" +#include "bsp/m5stack_core_s3.h" +#include "bsp_err_check.h" +#include "esp_codec_dev_defaults.h" + +static const char *TAG = "M5Stack"; + +static i2s_chan_handle_t i2s_tx_chan = NULL; +static i2s_chan_handle_t i2s_rx_chan = NULL; +static const audio_codec_data_if_t *i2s_data_if = NULL; /* Codec data interface */ + + +/* Can be used for i2s_std_gpio_config_t and/or i2s_std_config_t initialization */ +#define BSP_I2S_GPIO_CFG \ + { \ + .mclk = BSP_I2S_MCLK, \ + .bclk = BSP_I2S_SCLK, \ + .ws = BSP_I2S_LCLK, \ + .dout = BSP_I2S_DOUT, \ + .din = BSP_I2S_DSIN, \ + .invert_flags = { \ + .mclk_inv = false, \ + .bclk_inv = false, \ + .ws_inv = false, \ + }, \ + } + +/* This configuration is used by default in bsp_audio_init() */ +#define BSP_I2S_DUPLEX_MONO_CFG(_sample_rate) \ + { \ + .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(_sample_rate), \ + .slot_cfg = I2S_STD_PHILIP_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO), \ + .gpio_cfg = BSP_I2S_GPIO_CFG, \ + } + +esp_err_t bsp_audio_init(const i2s_std_config_t *i2s_config) +{ + esp_err_t ret = ESP_FAIL; + if (i2s_tx_chan && 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, &i2s_tx_chan, &i2s_rx_chan)); + + /* 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 (i2s_tx_chan != NULL) { + ESP_GOTO_ON_ERROR(i2s_channel_init_std_mode(i2s_tx_chan, p_i2s_cfg), err, TAG, "I2S channel initialization failed"); + ESP_GOTO_ON_ERROR(i2s_channel_enable(i2s_tx_chan), err, TAG, "I2S enabling failed"); + } + if (i2s_rx_chan != NULL) { + ESP_GOTO_ON_ERROR(i2s_channel_init_std_mode(i2s_rx_chan, p_i2s_cfg), err, TAG, "I2S channel initialization failed"); + ESP_GOTO_ON_ERROR(i2s_channel_enable(i2s_rx_chan), err, TAG, "I2S enabling failed"); + } + + 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_GOTO(i2s_data_if, err); + + return ESP_OK; + +err: + if (i2s_tx_chan) { + i2s_del_channel(i2s_tx_chan); + } + if (i2s_rx_chan) { + i2s_del_channel(i2s_rx_chan); + } + + return ret; +} + +const audio_codec_data_if_t *bsp_audio_get_codec_itf(void) +{ + return i2s_data_if; +} diff --git a/bsp/m5stack_core_s3/pic.webp b/bsp/m5stack_core_s3/pic.webp new file mode 100644 index 0000000000000000000000000000000000000000..fe0c71af21bca9115813c720e32066321f12fb1e GIT binary patch literal 120028 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 G_WuCovU(l> literal 0 HcmV?d00001 diff --git a/bsp/m5stack_core_s3/priv_include/bsp_err_check.h b/bsp/m5stack_core_s3/priv_include/bsp_err_check.h new file mode 100644 index 000000000..cf2f36eb4 --- /dev/null +++ b/bsp/m5stack_core_s3/priv_include/bsp_err_check.h @@ -0,0 +1,58 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "esp_check.h" +#include "sdkconfig.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Assert on error, if selected in menuconfig. Otherwise return error code. */ +#if CONFIG_BSP_ERROR_CHECK +#define BSP_ERROR_CHECK_RETURN_ERR(x) ESP_ERROR_CHECK(x) +#define BSP_ERROR_CHECK_RETURN_NULL(x) ESP_ERROR_CHECK(x) +#define BSP_ERROR_CHECK(x, ret) ESP_ERROR_CHECK(x) +#define BSP_NULL_CHECK(x, ret) assert(x) +#define BSP_NULL_CHECK_GOTO(x, goto_tag) assert(x) +#else +#define BSP_ERROR_CHECK_RETURN_ERR(x) do { \ + esp_err_t err_rc_ = (x); \ + if (unlikely(err_rc_ != ESP_OK)) { \ + return err_rc_; \ + } \ + } while(0) + +#define BSP_ERROR_CHECK_RETURN_NULL(x) do { \ + if (unlikely((x) != ESP_OK)) { \ + return NULL; \ + } \ + } while(0) + +#define BSP_NULL_CHECK(x, ret) do { \ + if ((x) == NULL) { \ + return ret; \ + } \ + } while(0) + +#define BSP_ERROR_CHECK(x, ret) do { \ + if (unlikely((x) != ESP_OK)) { \ + return ret; \ + } \ + } while(0) + +#define BSP_NULL_CHECK_GOTO(x, goto_tag) do { \ + if ((x) == NULL) { \ + goto goto_tag; \ + } \ + } while(0) +#endif + +#ifdef __cplusplus +} +#endif diff --git a/docu/pics/m5stack_cores3.webp b/docu/pics/m5stack_cores3.webp new file mode 100644 index 0000000000000000000000000000000000000000..aa1dd99bceb5a0ff1752991c591c25a17028c766 GIT binary patch literal 37116 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 zE~z@)jde#c$0olsC(&m!1ElQ^O_Bi|0Se~-Nf%59O0!Mg7gJ$_aG>Ww#i4KIdsC7u ze+MadYQy(_|M)*v1r2xV?rv-CfGys8nrveO=;mP!{F3e^`)N9 zE@k+nU@DTTc_9;Z5Gzmnl?}{jG5~+R(=I)%m(6YR;31T%YfO!2aR5kxyRkiM0E0~F zG8k%xpJay;X%D*+MD6tONVE{oFp0A@(HeRHmL$%^iXS^1OsLIduEw{>_o`~r;> zGapWdVF{{hJjX*XhRD`S_CJBtqoH+mqZ<+HOB0HME@1# zpxePf_Lft#NG}@4BVIUxON9Ni4sOaL_Frijy6rx|0(mORW9_8|5oe|+;HFv8;9R=g zZ{VXReLkZ-MS`-U1D*&kz=07*$I00;m800saO z0RsR5000010000Q0R;d7000110000R0R;d7000190000e0RsR5000020000n0RjLK z0001H0001KhXeot0001Z000000001B000010001B000010001RVQFr3E^cLXAT=&9 zE-^9y00aO4kOu$+0000mGBYp%paTE_00030{{R32pacK`000130ssI5pacK`0001P K0ssI20002p%ZXh8 literal 0 HcmV?d00001 diff --git a/examples/bsp_ext.py b/examples/bsp_ext.py index c8bebe4b9..f1be4fbf9 100644 --- a/examples/bsp_ext.py +++ b/examples/bsp_ext.py @@ -58,6 +58,7 @@ def set_bsp_callback(action: str, ctx: Context, args: PropertyDict, **kwargs: st 'esp_bsp_generic', 'esp32_s3_korvo_1', 'esp32_p4_function_ev_board', + 'm5stack_core_s3' } if bsp == '': diff --git a/examples/display/sdkconfig.bsp.m5stack_core_s3 b/examples/display/sdkconfig.bsp.m5stack_core_s3 new file mode 100644 index 000000000..a81a29935 --- /dev/null +++ b/examples/display/sdkconfig.bsp.m5stack_core_s3 @@ -0,0 +1,10 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHMODE_QIO=y +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_LV_COLOR_16_SWAP=y +CONFIG_LV_MEM_CUSTOM=y +CONFIG_LV_MEMCPY_MEMSET_STD=y +CONFIG_LV_USE_PERF_MONITOR=y diff --git a/examples/display_audio_photo/main/app_disp_fs.c b/examples/display_audio_photo/main/app_disp_fs.c index ad88631e5..f4930338c 100644 --- a/examples/display_audio_photo/main/app_disp_fs.c +++ b/examples/display_audio_photo/main/app_disp_fs.c @@ -345,6 +345,7 @@ static void play_file(void *arg) .sample_rate = wav_header.sample_rate, .channel = wav_header.num_channels, .bits_per_sample = wav_header.bits_per_sample, + .mclk_multiple = I2S_MCLK_MULTIPLE_384, }; esp_codec_dev_open(spk_codec_dev, &fs); @@ -793,6 +794,7 @@ static void rec_file(void *arg) .sample_rate = SAMPLE_RATE, .channel = 1, .bits_per_sample = 16, + .mclk_multiple = I2S_MCLK_MULTIPLE_384, }; esp_codec_dev_open(mic_codec_dev, &fs); diff --git a/examples/display_audio_photo/sdkconfig.bsp.m5stack_core_s3 b/examples/display_audio_photo/sdkconfig.bsp.m5stack_core_s3 new file mode 100644 index 000000000..4e8064c11 --- /dev/null +++ b/examples/display_audio_photo/sdkconfig.bsp.m5stack_core_s3 @@ -0,0 +1,17 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHMODE_QIO=y +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_SPIRAM=y +CONFIG_SPIRAM_SPEED_80M=y +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y +CONFIG_SPIFFS_PAGE_SIZE=1024 +CONFIG_LV_COLOR_16_SWAP=y +CONFIG_LV_MEM_CUSTOM=y +CONFIG_LV_MEMCPY_MEMSET_STD=y +CONFIG_LV_USE_PERF_MONITOR=y +CONFIG_LV_SPRINTF_CUSTOM=y +# CONFIG_LV_BUILD_EXAMPLES is not set diff --git a/examples/display_camera/sdkconfig.bsp.m5stack_core_s3 b/examples/display_camera/sdkconfig.bsp.m5stack_core_s3 new file mode 100644 index 000000000..76f3de7be --- /dev/null +++ b/examples/display_camera/sdkconfig.bsp.m5stack_core_s3 @@ -0,0 +1,20 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHMODE_QIO=y +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_ESP_DEFAULT_CPU_FREQ_240=y +CONFIG_SPIRAM=y +CONFIG_ESP32S3_SPIRAM_SUPPORT=y +CONFIG_SPIRAM_MODE_QUAD=y +CONFIG_SPIRAM_SPEED_80M=y +CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y +CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=8192 +CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y +CONFIG_LV_COLOR_16_SWAP=y +CONFIG_LV_MEM_CUSTOM=y +CONFIG_LV_MEMCPY_MEMSET_STD=y +CONFIG_LV_USE_PERF_MONITOR=y +CONFIG_LV_SPRINTF_CUSTOM=y +# CONFIG_LV_BUILD_EXAMPLES is not set diff --git a/examples/display_rotation/sdkconfig.bsp.m5stack_core_s3 b/examples/display_rotation/sdkconfig.bsp.m5stack_core_s3 new file mode 100644 index 000000000..a81a29935 --- /dev/null +++ b/examples/display_rotation/sdkconfig.bsp.m5stack_core_s3 @@ -0,0 +1,10 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHMODE_QIO=y +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_LV_COLOR_16_SWAP=y +CONFIG_LV_MEM_CUSTOM=y +CONFIG_LV_MEMCPY_MEMSET_STD=y +CONFIG_LV_USE_PERF_MONITOR=y