Fix DSI blue flicker under load: lower DPI clock to 40 MHz
The blue flicker during voice activity is a MIPI-DSI framebuffer-read
underrun on the PSRAM bus, not tearing. The DSI DMA reads the 800x800
framebuffer continuously (~138 MB/s at the stock 80 MHz clock); under
load the Wi-Fi (esp-hosted SDIO) and audio-playback DMA on the same
PSRAM bus starve the DSI FIFO, which the hardware then paints blue
("lcd.dsi.dpi: can't fetch data from external memory fast enough").
Drop the DPI pixel clock to 40 MHz (~54 fps): halves the continuous
read and gives the FIFO slack to ride out bursty SDIO latency spikes.
Still smooth for the face UI, and lowers display power.
Vendored as a local component because managed_components/ is gitignored
(same pattern as the esp_hosted fork) — a local component overrides the
same-named waveshare/ managed dependency, so the fix survives a clean
build.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LKPbR6DY2JygHbyLjxm7Uu
This commit is contained in:
@@ -0,0 +1 @@
|
||||
e7a07d2556e2aab26e17533ef1cc5f7574d57303f395c5ec9c8e36ee8742496d
|
||||
@@ -0,0 +1,20 @@
|
||||
|
||||
if("${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}" VERSION_GREATER_EQUAL "5.5")
|
||||
set(REQ esp_driver_gpio esp_driver_i2s esp_driver_sdmmc esp_driver_sdspi esp_driver_i2c)
|
||||
set(PRIV_REQ esp_driver_spi esp_driver_ledc)
|
||||
else()
|
||||
set(REQ driver)
|
||||
set(PRIV_REQ "")
|
||||
endif()
|
||||
|
||||
if(${IDF_VERSION_MAJOR} LESS 6)
|
||||
list(APPEND PRIV_REQ usb)
|
||||
endif()
|
||||
|
||||
idf_component_register(
|
||||
SRCS "esp32_p4_wifi6_touch_lcd_xc.c"
|
||||
INCLUDE_DIRS "include"
|
||||
PRIV_INCLUDE_DIRS "priv_include"
|
||||
REQUIRES ${REQ} fatfs
|
||||
PRIV_REQUIRES ${PRIV_REQ} esp_lcd spiffs esp_psram
|
||||
)
|
||||
@@ -0,0 +1,123 @@
|
||||
menu "Board Support Package(ESP32-P4)"
|
||||
|
||||
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
|
||||
ESP32P4 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 "I2S"
|
||||
config BSP_I2S_NUM
|
||||
int "I2S peripheral index"
|
||||
default 1
|
||||
range 0 2
|
||||
help
|
||||
ESP32P4 has three I2S peripherals, pick the one you want to use.
|
||||
endmenu
|
||||
|
||||
menu "uSD card - Virtual File System"
|
||||
config BSP_SD_FORMAT_ON_MOUNT_FAIL
|
||||
bool "Format uSD card if mounting fails"
|
||||
default n
|
||||
help
|
||||
The SDMMC host will format (FAT) the uSD card if it fails to mount the filesystem.
|
||||
|
||||
config BSP_SD_MOUNT_POINT
|
||||
string "uSD card mount point"
|
||||
default "/sdcard"
|
||||
help
|
||||
Mount point of the uSD card in the Virtual File System
|
||||
|
||||
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 "Display"
|
||||
config BSP_LCD_DPI_BUFFER_NUMS
|
||||
int "Set number of frame buffers"
|
||||
default 3
|
||||
range 1 3
|
||||
help
|
||||
Let DPI LCD driver create a specified number of frame-size buffers. Only when it is set to multiple can the avoiding tearing be turned on.
|
||||
|
||||
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.
|
||||
|
||||
choice BSP_LCD_COLOR_FORMAT
|
||||
prompt "Select LCD color format"
|
||||
default BSP_LCD_COLOR_FORMAT_RGB565
|
||||
help
|
||||
Select the LCD color format RGB565/RGB888.
|
||||
|
||||
config BSP_LCD_COLOR_FORMAT_RGB565
|
||||
bool "RGB565"
|
||||
config BSP_LCD_COLOR_FORMAT_RGB888
|
||||
bool "RGB888"
|
||||
endchoice
|
||||
|
||||
choice BSP_LCD_TYPE
|
||||
prompt "Select LCD type"
|
||||
default BSP_LCD_TYPE_800_800_3_4_INCH
|
||||
help
|
||||
Select the LCD.
|
||||
|
||||
config BSP_LCD_TYPE_800_800_3_4_INCH
|
||||
bool "Waveshare board with 800*800 3.4-inch Display"
|
||||
config BSP_LCD_TYPE_720_720_4_INCH
|
||||
bool "Waveshare board with 720*720 4-inch Display"
|
||||
|
||||
endchoice
|
||||
|
||||
|
||||
endmenu
|
||||
|
||||
endmenu
|
||||
@@ -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.
|
||||
@@ -0,0 +1,28 @@
|
||||
# BSP: Waveshare ESP32-P4-WIFI6-Touch-LCD-XC
|
||||
|
||||
[](https://components.espressif.com/components/waveshare/esp32_p4_wifi6_touch_lcd_xc)
|
||||
|
||||
ESP32-P4-NANO is a small size and highly integrated development board designed by waveshare electronics based on ESP32-P4 chip
|
||||
| HW version | BSP Version |
|
||||
| :--------: | :---------: |
|
||||
| [V1.0](http://www.waveshare.com/wiki/ESP32-P4-WIFI6-Touch-LCD-XC) | ^2 |
|
||||
|
||||
## Configuration
|
||||
|
||||
Configuration in `menuconfig`.
|
||||
|
||||
Selection LCD display `Board Support Package(ESP32-P4) --> Display --> Select LCD type`
|
||||
- Waveshare board with 800*800 3.4-inch Display (default)
|
||||
- Waveshare board with 720*720 4-inch Display
|
||||
|
||||
|
||||
## BackLight
|
||||
```c
|
||||
bsp_display_brightness_init();
|
||||
|
||||
bsp_display_backlight_on();
|
||||
|
||||
bsp_display_backlight_off();
|
||||
|
||||
bsp_display_brightness_set(100);
|
||||
```
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,28 @@
|
||||
dependencies:
|
||||
esp_codec_dev:
|
||||
public: true
|
||||
version: ~1.5
|
||||
esp_lcd_jd9365: ^2.0.0
|
||||
esp_lcd_touch_gt911: ^1
|
||||
espressif/esp_lvgl_adapter:
|
||||
public: true
|
||||
version: ~0.6
|
||||
idf: '>=5.5'
|
||||
lvgl/lvgl: '>=8,<10'
|
||||
usb:
|
||||
public: true
|
||||
rules:
|
||||
- if: idf_version >=6.0
|
||||
version: ^1.0.0
|
||||
description: Based on ESP32-P4 chip, waveshare electronics designed a 3.4-inch, 4-inch
|
||||
circular screen, highly integrated development board
|
||||
repository: git://github.com/waveshareteam/Waveshare-ESP32-components.git
|
||||
repository_info:
|
||||
commit_sha: bfeb6e6d5737178cdde78b630c8118074da0a657
|
||||
path: bsp/esp32_p4_wifi6_touch_lcd_xc
|
||||
tags:
|
||||
- bsp
|
||||
targets:
|
||||
- esp32p4
|
||||
url: https://www.waveshare.com/esp32-p4-wifi6-touch-lcd-3.4c.htm
|
||||
version: 3.0.1
|
||||
@@ -0,0 +1,10 @@
|
||||
#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
|
||||
@@ -0,0 +1,161 @@
|
||||
#pragma once
|
||||
#include "esp_lcd_types.h"
|
||||
#include "esp_lcd_mipi_dsi.h"
|
||||
#include "sdkconfig.h"
|
||||
|
||||
/* LCD color formats */
|
||||
#define ESP_LCD_COLOR_FORMAT_RGB565 (1)
|
||||
#define ESP_LCD_COLOR_FORMAT_RGB888 (2)
|
||||
|
||||
/* LCD display color format */
|
||||
#if CONFIG_BSP_LCD_COLOR_FORMAT_RGB888
|
||||
#define BSP_LCD_COLOR_FORMAT (ESP_LCD_COLOR_FORMAT_RGB888)
|
||||
#else
|
||||
#define BSP_LCD_COLOR_FORMAT (ESP_LCD_COLOR_FORMAT_RGB565)
|
||||
#endif
|
||||
/* LCD display color bytes endianess */
|
||||
#define BSP_LCD_BIGENDIAN (0)
|
||||
/* LCD display color bits */
|
||||
#define BSP_LCD_BITS_PER_PIXEL (16)
|
||||
/* LCD display color space */
|
||||
#define BSP_LCD_COLOR_SPACE (LCD_RGB_ELEMENT_ORDER_RGB)
|
||||
|
||||
#if CONFIG_BSP_LCD_TYPE_800_800_3_4_INCH
|
||||
#define BSP_LCD_H_RES (800)
|
||||
#define BSP_LCD_V_RES (800)
|
||||
#define BSP_LCD_MIPI_DSI_LANE_BITRATE_MBPS (1500)
|
||||
#elif CONFIG_BSP_LCD_TYPE_720_720_4_INCH
|
||||
#define BSP_LCD_H_RES (720)
|
||||
#define BSP_LCD_V_RES (720)
|
||||
#define BSP_LCD_MIPI_DSI_LANE_BITRATE_MBPS (1500)
|
||||
#endif
|
||||
|
||||
#define BSP_LCD_MIPI_DSI_LANE_NUM (2) // 2 data lanes
|
||||
#define BSP_MIPI_DSI_PHY_PWR_LDO_CHAN (3) // LDO_VO3 is connected to VDD_MIPI_DPHY
|
||||
#define BSP_MIPI_DSI_PHY_PWR_LDO_VOLTAGE_MV (2500)
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief BSP display configuration structure
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
int dummy;
|
||||
} bsp_display_config_t;
|
||||
|
||||
/**
|
||||
* @brief BSP display return handles
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
esp_lcd_dsi_bus_handle_t mipi_dsi_bus; /*!< MIPI DSI bus handle */
|
||||
esp_lcd_panel_io_handle_t io; /*!< ESP LCD IO handle */
|
||||
esp_lcd_panel_handle_t panel; /*!< ESP LCD panel (color) handle */
|
||||
esp_lcd_panel_handle_t control; /*!< ESP LCD panel (control) handle */
|
||||
} bsp_lcd_handles_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);
|
||||
* esp_lcd_del_dsi_bus(mipi_dsi_bus);
|
||||
* \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 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_del(control);
|
||||
* esp_lcd_panel_io_del(io);
|
||||
* esp_lcd_del_dsi_bus(mipi_dsi_bus);
|
||||
* \endcode
|
||||
*
|
||||
* @param[in] config display configuration
|
||||
* @param[out] ret_handles all esp_lcd handles in one structure
|
||||
* @return
|
||||
* - ESP_OK On success
|
||||
* - Else esp_lcd failure
|
||||
*/
|
||||
esp_err_t bsp_display_new_with_handles(const bsp_display_config_t *config, bsp_lcd_handles_t *ret_handles);
|
||||
|
||||
/**
|
||||
* @brief Initialize display's brightness
|
||||
*
|
||||
* Brightness is controlled with PWM signal to a pin controlling backlight.
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK On success
|
||||
* - ESP_ERR_INVALID_ARG Parameter error
|
||||
*/
|
||||
esp_err_t bsp_display_brightness_init(void);
|
||||
|
||||
/**
|
||||
* @brief Set display's brightness
|
||||
*
|
||||
* Brightness is controlled with PWM signal to a pin controlling backlight.
|
||||
* Brightness must be already initialized by calling bsp_display_brightness_init() or bsp_display_new()
|
||||
*
|
||||
* @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);
|
||||
int bsp_display_brightness_get(void);
|
||||
|
||||
/**
|
||||
* @brief Turn on display backlight
|
||||
*
|
||||
* Brightness is controlled with PWM signal to a pin controlling backlight.
|
||||
* Brightness must be already initialized by calling bsp_display_brightness_init() or bsp_display_new()
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK On success
|
||||
* - ESP_ERR_INVALID_ARG Parameter error
|
||||
*/
|
||||
esp_err_t bsp_display_backlight_on(void);
|
||||
|
||||
/**
|
||||
* @brief Turn off display backlight
|
||||
*
|
||||
* Brightness is controlled with PWM signal to a pin controlling backlight.
|
||||
* Brightness must be already initialized by calling bsp_display_brightness_init() or bsp_display_new()
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK On success
|
||||
* - ESP_ERR_INVALID_ARG Parameter error
|
||||
*/
|
||||
esp_err_t bsp_display_backlight_off(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,2 @@
|
||||
#pragma once
|
||||
#include "bsp/esp32_p4_wifi6_touch_lcd_xc.h"
|
||||
+342
@@ -0,0 +1,342 @@
|
||||
#pragma once
|
||||
|
||||
#include "sdkconfig.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "driver/i2c_master.h"
|
||||
#include "driver/sdmmc_host.h"
|
||||
#include "driver/i2s_std.h"
|
||||
#include "bsp/config.h"
|
||||
#include "bsp/display.h"
|
||||
#include "esp_codec_dev.h"
|
||||
#include "sdkconfig.h"
|
||||
|
||||
#if (BSP_CONFIG_NO_GRAPHIC_LIB == 0)
|
||||
#include "lvgl.h"
|
||||
#include "esp_lv_adapter.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_8)
|
||||
#define BSP_I2C_SDA (GPIO_NUM_7)
|
||||
|
||||
/* Audio */
|
||||
#define BSP_I2S_SCLK (GPIO_NUM_12)
|
||||
#define BSP_I2S_MCLK (GPIO_NUM_13)
|
||||
#define BSP_I2S_LCLK (GPIO_NUM_10)
|
||||
#define BSP_I2S_DOUT (GPIO_NUM_9)
|
||||
#define BSP_I2S_DSIN (GPIO_NUM_11)
|
||||
#define BSP_POWER_AMP_IO (GPIO_NUM_53)
|
||||
|
||||
#define BSP_LCD_BACKLIGHT (GPIO_NUM_26)
|
||||
#define BSP_LCD_RST (GPIO_NUM_27)
|
||||
#define BSP_LCD_TOUCH_RST (GPIO_NUM_NC)
|
||||
#define BSP_LCD_TOUCH_INT (GPIO_NUM_NC)
|
||||
|
||||
/* uSD card */
|
||||
#define BSP_SD_D0 (GPIO_NUM_39)
|
||||
#define BSP_SD_D1 (GPIO_NUM_40)
|
||||
#define BSP_SD_D2 (GPIO_NUM_41)
|
||||
#define BSP_SD_D3 (GPIO_NUM_42)
|
||||
#define BSP_SD_CMD (GPIO_NUM_44)
|
||||
#define BSP_SD_CLK (GPIO_NUM_43)
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**************************************************************************************************
|
||||
*
|
||||
* I2C interface
|
||||
*
|
||||
* There are multiple devices connected to I2C peripheral:
|
||||
* - Codec ES8311 (configuration only)
|
||||
* - LCD Touch controller
|
||||
**************************************************************************************************/
|
||||
#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);
|
||||
|
||||
/**
|
||||
* @brief Get I2C driver handle
|
||||
*
|
||||
* @return
|
||||
* - I2C handle
|
||||
*
|
||||
*/
|
||||
i2c_master_bus_handle_t bsp_i2c_get_handle(void);
|
||||
|
||||
/**************************************************************************************************
|
||||
*
|
||||
* I2S audio interface
|
||||
*
|
||||
* There are two devices connected to the I2S peripheral:
|
||||
* - Codec ES8311 for output(playback) and 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
|
||||
*/
|
||||
esp_err_t bsp_audio_init(const i2s_std_config_t *i2s_config);
|
||||
|
||||
/**
|
||||
* @brief Initialize speaker codec device
|
||||
*
|
||||
* @return Pointer to codec device handle or NULL when error occurred
|
||||
*/
|
||||
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 occurred
|
||||
*/
|
||||
esp_codec_dev_handle_t bsp_audio_codec_microphone_init(void);
|
||||
|
||||
/**************************************************************************************************
|
||||
*
|
||||
* 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);
|
||||
|
||||
/**************************************************************************************************
|
||||
*
|
||||
* uSD card
|
||||
*
|
||||
* After mounting the uSD card, it can be accessed with stdio functions ie.:
|
||||
* \code{.c}
|
||||
* FILE* f = fopen(BSP_MOUNT_POINT"/hello.txt", "w");
|
||||
* fprintf(f, "Hello %s!\n", bsp_sdcard->cid.name);
|
||||
* fclose(f);
|
||||
* \endcode
|
||||
**************************************************************************************************/
|
||||
#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 cannot be allocated
|
||||
* - ESP_FAIL if partition cannot be mounted
|
||||
* - other error codes from SDMMC or SPI drivers, SDMMC protocol, or FATFS drivers
|
||||
*/
|
||||
esp_err_t bsp_sdcard_mount(void);
|
||||
|
||||
/**
|
||||
* @brief Unmount microSD 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()
|
||||
**************************************************************************************************/
|
||||
#if (BSP_CONFIG_NO_GRAPHIC_LIB == 0)
|
||||
|
||||
/**
|
||||
* @brief BSP display configuration structure
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
esp_lv_adapter_config_t lv_adapter_cfg;
|
||||
esp_lv_adapter_rotation_t rotation;
|
||||
esp_lv_adapter_tear_avoid_mode_t tear_avoid_mode;
|
||||
struct {
|
||||
unsigned int swap_xy; /*!< Swap X and Y after read coordinates */
|
||||
unsigned int mirror_x; /*!< Mirror X after read coordinates */
|
||||
unsigned int mirror_y; /*!< Mirror Y after read coordinates */
|
||||
} touch_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_display_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_display_t *bsp_display_start_with_config(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);
|
||||
|
||||
esp_err_t bsp_display_lock(uint32_t timeout_ms);
|
||||
|
||||
/**
|
||||
* @brief Give LVGL mutex
|
||||
*
|
||||
*/
|
||||
void bsp_display_unlock(void);
|
||||
esp_lcd_panel_handle_t bsp_display_get_panel_handle(void);
|
||||
#endif // BSP_CONFIG_NO_GRAPHIC_LIB == 0
|
||||
|
||||
/**************************************************************************************************
|
||||
*
|
||||
* USB
|
||||
*
|
||||
**************************************************************************************************/
|
||||
|
||||
|
||||
/**
|
||||
* @brief Power modes of USB Host connector
|
||||
*/
|
||||
typedef enum bsp_usb_host_power_mode_t {
|
||||
BSP_USB_HOST_POWER_MODE_USB_DEV, //!< Power from USB DEV port
|
||||
} bsp_usb_host_power_mode_t;
|
||||
|
||||
/**
|
||||
* @brief Start USB host
|
||||
*
|
||||
* This is a one-stop-shop function that will configure the board for USB Host mode
|
||||
* and start USB Host library
|
||||
*
|
||||
* @param[in] mode USB Host connector power mode (Not used on this board)
|
||||
* @param[in] limit_500mA Limit output current to 500mA (Not used on this board)
|
||||
* @return
|
||||
* - ESP_OK On success
|
||||
* - ESP_ERR_INVALID_ARG Parameter error
|
||||
* - ESP_ERR_NO_MEM Memory cannot be allocated
|
||||
*/
|
||||
esp_err_t bsp_usb_host_start(bsp_usb_host_power_mode_t mode, bool limit_500mA);
|
||||
|
||||
/**
|
||||
* @brief Stop USB host
|
||||
*
|
||||
* USB Host lib will be uninstalled and power from connector removed.
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK On success
|
||||
* - ESP_ERR_INVALID_ARG Parameter error
|
||||
*/
|
||||
esp_err_t bsp_usb_host_stop(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,27 @@
|
||||
#pragma once
|
||||
#include "esp_lcd_touch.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @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_display_cfg_t *cfg, esp_lcd_touch_handle_t *ret_touch);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,52 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user