mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-09 20:41:14 +00:00
feat(lcd): support rgb lcd driver for esp32p4
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
| Supported Targets | ESP32-S3 |
|
||||
| ----------------- | -------- |
|
||||
| Supported Targets | ESP32-P4 | ESP32-S3 |
|
||||
| ----------------- | -------- | -------- |
|
||||
|
||||
# RGB LCD Panel Example
|
||||
|
||||
@@ -19,8 +19,8 @@ This example uses 3 kinds of **buffering mode**:
|
||||
|
||||
### Hardware Required
|
||||
|
||||
* An ESP development board, which has RGB LCD peripheral supported and **Octal PSRAM** onboard
|
||||
* A general RGB panel, 16 bit-width, with HSYNC, VSYNC and DE signal
|
||||
* An ESP development board, which supports the RGB LCD peripheral
|
||||
* A general RGB panel, 16/24 bit-width, with HSYNC, VSYNC and DE signal
|
||||
* An USB cable for power supply and programming
|
||||
|
||||
### Hardware Connection
|
||||
@@ -36,7 +36,7 @@ The connection between ESP Board and the LCD is as follows:
|
||||
| | | |
|
||||
| PCLK+--------------+PCLK |
|
||||
| | | |
|
||||
| DATA[15:0]+--------------+DATA[15:0] |
|
||||
| DATA[N:0]+--------------+DATA[N:0] |
|
||||
| | | |
|
||||
| HSYNC+--------------+HSYNC |
|
||||
| | | |
|
||||
@@ -55,9 +55,9 @@ The connection between ESP Board and the LCD is as follows:
|
||||
|
||||
Run `idf.py menuconfig` and go to `Example Configuration`:
|
||||
|
||||
1. Choose whether to `Use double Frame Buffer`
|
||||
2. Choose whether to `Avoid tearing effect` (available only when step `1` was chosen to false)
|
||||
3. Choose whether to `Use bounce buffer` (available only when step `1` was chosen to false)
|
||||
1. `Use single frame buffer`: The RGB LCD driver allocates one frame buffer and mount it to the DMA. The example also allocates one draw buffer for the LVGL library. The draw buffer contents are copied to the frame buffer by the CPU.
|
||||
2. `Use double frame buffer`: The RGB LCD driver allocates two frame buffers and mount them to the DMA. The LVGL library draws directly to the offline frame buffer while the online frame buffer is displayed by the RGB LCD controller.
|
||||
3. `Use bounce buffer`: The RGB LCD driver allocates one frame buffer and two bounce buffers. The bounce buffers are mounted to the DMA. The frame buffer contents are copied to the bounce buffers by the CPU. The example also allocates one draw buffer for the LVGL library. The draw buffer contents are copied to the frame buffer by the CPU.
|
||||
4. Choose the number of LCD data lines in `RGB LCD Data Lines`
|
||||
5. Set the GPIOs used by RGB LCD peripheral in `GPIO assignment`, e.g. the synchronization signals (HSYNC, VSYNC, DE) and the data lines
|
||||
|
||||
@@ -97,16 +97,13 @@ I (1102) main_task: Returned from app_main()
|
||||
|
||||
* Why the LCD doesn't light up?
|
||||
* Please pay attention to the level used to turn on the LCD backlight, some LCD module needs a low level to turn it on, while others take a high level. You can change the backlight level macro `EXAMPLE_LCD_BK_LIGHT_ON_LEVEL` in [lvgl_example_main.c](main/rgb_lcd_example_main.c).
|
||||
* No memory for frame buffer
|
||||
* Where to allocate the frame buffer?
|
||||
* The frame buffer of RGB panel is located in ESP side (unlike other controller based LCDs, where the frame buffer is located in external chip). As the frame buffer usually consumes much RAM (depends on the LCD resolution and color depth), we recommend to put the frame buffer into PSRAM (like what we do in this example). However, putting frame buffer in PSRAM will limit the maximum PCLK due to the bandwidth of **SPI0**.
|
||||
* LCD screen drift
|
||||
* Why LCD screen drifts?
|
||||
* Slow down the PCLK frequency
|
||||
* Adjust other timing parameters like PCLK clock edge (by `pclk_active_neg`), sync porches like VBP (by `vsync_back_porch`) according to your LCD spec
|
||||
* Enable `CONFIG_SPIRAM_FETCH_INSTRUCTIONS` and `CONFIG_SPIRAM_RODATA`, which can saves some bandwidth of SPI0 from being consumed by ICache.
|
||||
* LCD screen tear effect
|
||||
* Using double frame buffers
|
||||
* Or adding an extra synchronization mechanism between writing (by Cache) and reading (by EDMA) the frame buffer.
|
||||
* Low PCLK frequency
|
||||
* Enable `CONFIG_SPIRAM_XIP_FROM_PSRAM`, which can saves some bandwidth of SPI0 from being consumed by ICache.
|
||||
* How to further increase the PCLK frequency?
|
||||
* Enable `CONFIG_EXAMPLE_USE_BOUNCE_BUFFER`, which will make the LCD controller fetch data from internal SRAM (instead of the PSRAM), but at the cost of increasing CPU usage.
|
||||
* Enable `CONFIG_SPIRAM_XIP_FROM_PSRAM` can also help if the you're not using the bounce buffer mode. These two configurations can save some **SPI0** bandwidth from being consumed by ICache.
|
||||
* Why the RGB timing is correct but the LCD doesn't show anything?
|
||||
|
@@ -1,23 +1,29 @@
|
||||
menu "Example Configuration"
|
||||
config EXAMPLE_DOUBLE_FB
|
||||
bool "Use double Frame Buffer"
|
||||
default "n"
|
||||
choice EXAMPLE_LCD_BUFFER_MODE
|
||||
prompt "RGB LCD Buffer Mode"
|
||||
default EXAMPLE_USE_SINGLE_FB
|
||||
help
|
||||
Enable this option, driver will allocate two frame buffers.
|
||||
Select the LCD buffer mode.
|
||||
|
||||
config EXAMPLE_USE_BOUNCE_BUFFER
|
||||
depends on !EXAMPLE_DOUBLE_FB
|
||||
bool "Use bounce buffer"
|
||||
help
|
||||
Enable bounce buffer mode can achieve higher PCLK frequency at the cost of higher CPU consumption.
|
||||
config EXAMPLE_USE_SINGLE_FB
|
||||
bool "Use single frame buffer"
|
||||
help
|
||||
Allocate one frame buffer in the driver.
|
||||
Allocate one draw buffer in LVGL.
|
||||
|
||||
config EXAMPLE_AVOID_TEAR_EFFECT_WITH_SEM
|
||||
depends on !EXAMPLE_DOUBLE_FB
|
||||
bool "Avoid tearing effect"
|
||||
default "y"
|
||||
help
|
||||
Enable this option, the example will use a pair of semaphores to avoid the tearing effect.
|
||||
Note, if the Double Frame Buffer is used, then we can also avoid the tearing effect without the lock.
|
||||
config EXAMPLE_USE_DOUBLE_FB
|
||||
bool "Use double frame buffer"
|
||||
help
|
||||
Allocate two frame buffers in the driver.
|
||||
The frame buffers also work as ping-pong draw buffers in LVGL.
|
||||
|
||||
config EXAMPLE_USE_BOUNCE_BUFFER
|
||||
bool "Use bounce buffer"
|
||||
help
|
||||
Allocate one frame buffer in the driver.
|
||||
Allocate two bounce buffers in the driver.
|
||||
Allocate one draw buffer in LVGL.
|
||||
endchoice
|
||||
|
||||
choice EXAMPLE_LCD_DATA_LINES
|
||||
prompt "RGB LCD Data Lines"
|
||||
@@ -27,11 +33,15 @@ menu "Example Configuration"
|
||||
|
||||
config EXAMPLE_LCD_DATA_LINES_16
|
||||
bool "16 data lines"
|
||||
|
||||
config EXAMPLE_LCD_DATA_LINES_24
|
||||
bool "24 data lines"
|
||||
endchoice
|
||||
|
||||
config EXAMPLE_LCD_DATA_LINES
|
||||
int
|
||||
default 16 if EXAMPLE_LCD_DATA_LINES_16
|
||||
default 24 if EXAMPLE_LCD_DATA_LINES_24
|
||||
|
||||
menu "GPIO assignment"
|
||||
config EXAMPLE_LCD_VSYNC_GPIO
|
||||
@@ -114,5 +124,45 @@ menu "Example Configuration"
|
||||
int "DATA15 GPIO"
|
||||
help
|
||||
GPIO pin number for data bus[15].
|
||||
config EXAMPLE_LCD_DATA16_GPIO
|
||||
int "DATA16 GPIO"
|
||||
depends on EXAMPLE_LCD_DATA_LINES > 16
|
||||
help
|
||||
GPIO pin number for data bus[16].
|
||||
config EXAMPLE_LCD_DATA17_GPIO
|
||||
int "DATA17 GPIO"
|
||||
depends on EXAMPLE_LCD_DATA_LINES > 16
|
||||
help
|
||||
GPIO pin number for data bus[17].
|
||||
config EXAMPLE_LCD_DATA18_GPIO
|
||||
int "DATA18 GPIO"
|
||||
depends on EXAMPLE_LCD_DATA_LINES > 16
|
||||
help
|
||||
GPIO pin number for data bus[18].
|
||||
config EXAMPLE_LCD_DATA19_GPIO
|
||||
int "DATA19 GPIO"
|
||||
depends on EXAMPLE_LCD_DATA_LINES > 16
|
||||
help
|
||||
GPIO pin number for data bus[19].
|
||||
config EXAMPLE_LCD_DATA20_GPIO
|
||||
int "DATA20 GPIO"
|
||||
depends on EXAMPLE_LCD_DATA_LINES > 16
|
||||
help
|
||||
GPIO pin number for data bus[20].
|
||||
config EXAMPLE_LCD_DATA21_GPIO
|
||||
int "DATA21 GPIO"
|
||||
depends on EXAMPLE_LCD_DATA_LINES > 16
|
||||
help
|
||||
GPIO pin number for data bus[21].
|
||||
config EXAMPLE_LCD_DATA22_GPIO
|
||||
int "DATA22 GPIO"
|
||||
depends on EXAMPLE_LCD_DATA_LINES > 16
|
||||
help
|
||||
GPIO pin number for data bus[22].
|
||||
config EXAMPLE_LCD_DATA23_GPIO
|
||||
int "DATA23 GPIO"
|
||||
depends on EXAMPLE_LCD_DATA_LINES > 16
|
||||
help
|
||||
GPIO pin number for data bus[23].
|
||||
endmenu
|
||||
endmenu
|
||||
|
@@ -10,7 +10,6 @@
|
||||
#include "sdkconfig.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "freertos/semphr.h"
|
||||
#include "esp_timer.h"
|
||||
#include "esp_lcd_panel_ops.h"
|
||||
#include "esp_lcd_panel_rgb.h"
|
||||
@@ -61,17 +60,31 @@ static const char *TAG = "example";
|
||||
#define EXAMPLE_PIN_NUM_DATA13 CONFIG_EXAMPLE_LCD_DATA13_GPIO
|
||||
#define EXAMPLE_PIN_NUM_DATA14 CONFIG_EXAMPLE_LCD_DATA14_GPIO
|
||||
#define EXAMPLE_PIN_NUM_DATA15 CONFIG_EXAMPLE_LCD_DATA15_GPIO
|
||||
#if CONFIG_EXAMPLE_LCD_DATA_LINES > 16
|
||||
#define EXAMPLE_PIN_NUM_DATA16 CONFIG_EXAMPLE_LCD_DATA16_GPIO
|
||||
#define EXAMPLE_PIN_NUM_DATA17 CONFIG_EXAMPLE_LCD_DATA17_GPIO
|
||||
#define EXAMPLE_PIN_NUM_DATA18 CONFIG_EXAMPLE_LCD_DATA18_GPIO
|
||||
#define EXAMPLE_PIN_NUM_DATA19 CONFIG_EXAMPLE_LCD_DATA19_GPIO
|
||||
#define EXAMPLE_PIN_NUM_DATA20 CONFIG_EXAMPLE_LCD_DATA20_GPIO
|
||||
#define EXAMPLE_PIN_NUM_DATA21 CONFIG_EXAMPLE_LCD_DATA21_GPIO
|
||||
#define EXAMPLE_PIN_NUM_DATA22 CONFIG_EXAMPLE_LCD_DATA22_GPIO
|
||||
#define EXAMPLE_PIN_NUM_DATA23 CONFIG_EXAMPLE_LCD_DATA23_GPIO
|
||||
#endif
|
||||
|
||||
#if CONFIG_EXAMPLE_DOUBLE_FB
|
||||
#if CONFIG_EXAMPLE_USE_DOUBLE_FB
|
||||
#define EXAMPLE_LCD_NUM_FB 2
|
||||
#else
|
||||
#define EXAMPLE_LCD_NUM_FB 1
|
||||
#endif // CONFIG_EXAMPLE_DOUBLE_FB
|
||||
#endif // CONFIG_EXAMPLE_USE_DOUBLE_FB
|
||||
|
||||
#if CONFIG_EXAMPLE_LCD_DATA_LINES_16
|
||||
#define EXAMPLE_DATA_BUS_WIDTH 16
|
||||
#define EXAMPLE_PIXEL_SIZE 2
|
||||
#define EXAMPLE_LV_COLOR_FORMAT LV_COLOR_FORMAT_RGB565
|
||||
#elif CONFIG_EXAMPLE_LCD_DATA_LINES_24
|
||||
#define EXAMPLE_DATA_BUS_WIDTH 24
|
||||
#define EXAMPLE_PIXEL_SIZE 3
|
||||
#define EXAMPLE_LV_COLOR_FORMAT LV_COLOR_FORMAT_RGB888
|
||||
#endif
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -86,23 +99,13 @@ static const char *TAG = "example";
|
||||
// LVGL library is not thread-safe, this example will call LVGL APIs from different tasks, so use a mutex to protect it
|
||||
static _lock_t lvgl_api_lock;
|
||||
|
||||
// we use two semaphores to sync the VSYNC event and the LVGL task, to avoid potential tearing effect
|
||||
#if CONFIG_EXAMPLE_AVOID_TEAR_EFFECT_WITH_SEM
|
||||
SemaphoreHandle_t sem_vsync_end;
|
||||
SemaphoreHandle_t sem_gui_ready;
|
||||
#endif
|
||||
|
||||
extern void example_lvgl_demo_ui(lv_display_t *disp);
|
||||
|
||||
static bool example_on_vsync_event(esp_lcd_panel_handle_t panel, const esp_lcd_rgb_panel_event_data_t *event_data, void *user_data)
|
||||
static bool example_notify_lvgl_flush_ready(esp_lcd_panel_handle_t panel, const esp_lcd_rgb_panel_event_data_t *event_data, void *user_ctx)
|
||||
{
|
||||
BaseType_t high_task_awoken = pdFALSE;
|
||||
#if CONFIG_EXAMPLE_AVOID_TEAR_EFFECT_WITH_SEM
|
||||
if (xSemaphoreTakeFromISR(sem_gui_ready, &high_task_awoken) == pdTRUE) {
|
||||
xSemaphoreGiveFromISR(sem_vsync_end, &high_task_awoken);
|
||||
}
|
||||
#endif
|
||||
return high_task_awoken == pdTRUE;
|
||||
lv_display_t *disp = (lv_display_t *)user_ctx;
|
||||
lv_display_flush_ready(disp);
|
||||
return false;
|
||||
}
|
||||
|
||||
static void example_lvgl_flush_cb(lv_display_t *disp, const lv_area_t *area, uint8_t *px_map)
|
||||
@@ -112,13 +115,8 @@ static void example_lvgl_flush_cb(lv_display_t *disp, const lv_area_t *area, uin
|
||||
int offsetx2 = area->x2;
|
||||
int offsety1 = area->y1;
|
||||
int offsety2 = area->y2;
|
||||
#if CONFIG_EXAMPLE_AVOID_TEAR_EFFECT_WITH_SEM
|
||||
xSemaphoreGive(sem_gui_ready);
|
||||
xSemaphoreTake(sem_vsync_end, portMAX_DELAY);
|
||||
#endif
|
||||
// pass the draw buffer to the driver
|
||||
esp_lcd_panel_draw_bitmap(panel_handle, offsetx1, offsety1, offsetx2 + 1, offsety2 + 1, px_map);
|
||||
lv_display_flush_ready(disp);
|
||||
}
|
||||
|
||||
static void example_increase_lvgl_tick(void *arg)
|
||||
@@ -165,14 +163,6 @@ static void example_bsp_set_lcd_backlight(uint32_t level)
|
||||
|
||||
void app_main(void)
|
||||
{
|
||||
#if CONFIG_EXAMPLE_AVOID_TEAR_EFFECT_WITH_SEM
|
||||
ESP_LOGI(TAG, "Create semaphores");
|
||||
sem_vsync_end = xSemaphoreCreateBinary();
|
||||
assert(sem_vsync_end);
|
||||
sem_gui_ready = xSemaphoreCreateBinary();
|
||||
assert(sem_gui_ready);
|
||||
#endif
|
||||
|
||||
ESP_LOGI(TAG, "Turn off LCD backlight");
|
||||
example_bsp_init_lcd_backlight();
|
||||
example_bsp_set_lcd_backlight(EXAMPLE_LCD_BK_LIGHT_OFF_LEVEL);
|
||||
@@ -209,6 +199,16 @@ void app_main(void)
|
||||
EXAMPLE_PIN_NUM_DATA13,
|
||||
EXAMPLE_PIN_NUM_DATA14,
|
||||
EXAMPLE_PIN_NUM_DATA15,
|
||||
#if CONFIG_EXAMPLE_LCD_DATA_LINES > 16
|
||||
EXAMPLE_PIN_NUM_DATA16,
|
||||
EXAMPLE_PIN_NUM_DATA17,
|
||||
EXAMPLE_PIN_NUM_DATA18,
|
||||
EXAMPLE_PIN_NUM_DATA19,
|
||||
EXAMPLE_PIN_NUM_DATA20,
|
||||
EXAMPLE_PIN_NUM_DATA21,
|
||||
EXAMPLE_PIN_NUM_DATA22,
|
||||
EXAMPLE_PIN_NUM_DATA23
|
||||
#endif
|
||||
},
|
||||
.timings = {
|
||||
.pclk_hz = EXAMPLE_LCD_PIXEL_CLOCK_HZ,
|
||||
@@ -246,7 +246,7 @@ void app_main(void)
|
||||
// create draw buffers
|
||||
void *buf1 = NULL;
|
||||
void *buf2 = NULL;
|
||||
#if CONFIG_EXAMPLE_DOUBLE_FB
|
||||
#if CONFIG_EXAMPLE_USE_DOUBLE_FB
|
||||
ESP_LOGI(TAG, "Use frame buffers as LVGL draw buffers");
|
||||
ESP_ERROR_CHECK(esp_lcd_rgb_panel_get_frame_buffer(panel_handle, 2, &buf1, &buf2));
|
||||
// set LVGL draw buffers and direct mode
|
||||
@@ -259,14 +259,14 @@ void app_main(void)
|
||||
assert(buf1);
|
||||
// set LVGL draw buffers and partial mode
|
||||
lv_display_set_buffers(display, buf1, buf2, draw_buffer_sz, LV_DISPLAY_RENDER_MODE_PARTIAL);
|
||||
#endif // CONFIG_EXAMPLE_DOUBLE_FB
|
||||
#endif // CONFIG_EXAMPLE_USE_DOUBLE_FB
|
||||
|
||||
// set the callback which can copy the rendered image to an area of the display
|
||||
lv_display_set_flush_cb(display, example_lvgl_flush_cb);
|
||||
|
||||
ESP_LOGI(TAG, "Register event callbacks");
|
||||
esp_lcd_rgb_panel_event_callbacks_t cbs = {
|
||||
.on_vsync = example_on_vsync_event,
|
||||
.on_color_trans_done = example_notify_lvgl_flush_ready,
|
||||
};
|
||||
ESP_ERROR_CHECK(esp_lcd_rgb_panel_register_event_callbacks(panel_handle, &cbs, display));
|
||||
|
||||
|
@@ -15,7 +15,29 @@ from pytest_embedded import Dut
|
||||
],
|
||||
indirect=True,
|
||||
)
|
||||
def test_rgb_lcd_lvgl(dut: Dut) -> None:
|
||||
def test_rgb_lcd_lvgl_esp32s3(dut: Dut) -> None:
|
||||
dut.expect_exact('example: Turn off LCD backlight')
|
||||
dut.expect_exact('example: Install RGB LCD panel driver')
|
||||
dut.expect_exact('example: Initialize RGB LCD panel')
|
||||
dut.expect_exact('example: Turn on LCD backlight')
|
||||
dut.expect_exact('example: Initialize LVGL library')
|
||||
dut.expect_exact('example: Install LVGL tick timer')
|
||||
dut.expect_exact('example: Create LVGL task')
|
||||
dut.expect_exact('example: Display LVGL UI')
|
||||
|
||||
|
||||
@pytest.mark.esp32p4
|
||||
@pytest.mark.generic
|
||||
@pytest.mark.parametrize(
|
||||
'config',
|
||||
[
|
||||
'single_fb_with_bb',
|
||||
'single_fb_no_bb',
|
||||
'double_fb',
|
||||
],
|
||||
indirect=True,
|
||||
)
|
||||
def test_rgb_lcd_lvgl_esp32p4(dut: Dut) -> None:
|
||||
dut.expect_exact('example: Turn off LCD backlight')
|
||||
dut.expect_exact('example: Install RGB LCD panel driver')
|
||||
dut.expect_exact('example: Initialize RGB LCD panel')
|
||||
|
@@ -1 +1 @@
|
||||
CONFIG_EXAMPLE_DOUBLE_FB=y
|
||||
CONFIG_EXAMPLE_USE_DOUBLE_FB=y
|
||||
|
@@ -1,2 +1 @@
|
||||
CONFIG_EXAMPLE_DOUBLE_FB=n
|
||||
CONFIG_EXAMPLE_USE_BOUNCE_BUFFER=n
|
||||
CONFIG_EXAMPLE_USE_SINGLE_FB=y
|
||||
|
@@ -1,2 +1 @@
|
||||
CONFIG_EXAMPLE_DOUBLE_FB=n
|
||||
CONFIG_EXAMPLE_USE_BOUNCE_BUFFER=y
|
||||
|
@@ -0,0 +1,46 @@
|
||||
# enable the experimental features for higher PSRAM speed
|
||||
CONFIG_IDF_EXPERIMENTAL_FEATURES=y
|
||||
|
||||
CONFIG_SPIRAM=y
|
||||
CONFIG_SPIRAM_MODE_HEX=y
|
||||
CONFIG_SPIRAM_SPEED_200M=y
|
||||
|
||||
# LCD_CAM support 24 data lines at most
|
||||
CONFIG_EXAMPLE_LCD_DATA_LINES_24=y
|
||||
CONFIG_LV_COLOR_DEPTH_24=y
|
||||
|
||||
# Default GPIO assignment
|
||||
CONFIG_EXAMPLE_LCD_VSYNC_GPIO=41
|
||||
CONFIG_EXAMPLE_LCD_HSYNC_GPIO=39
|
||||
CONFIG_EXAMPLE_LCD_DE_GPIO=43
|
||||
CONFIG_EXAMPLE_LCD_PCLK_GPIO=33
|
||||
|
||||
# B0:B7 <=> DATA0:DATA7
|
||||
CONFIG_EXAMPLE_LCD_DATA0_GPIO=34
|
||||
CONFIG_EXAMPLE_LCD_DATA1_GPIO=12
|
||||
CONFIG_EXAMPLE_LCD_DATA2_GPIO=10
|
||||
CONFIG_EXAMPLE_LCD_DATA3_GPIO=40
|
||||
CONFIG_EXAMPLE_LCD_DATA4_GPIO=42
|
||||
CONFIG_EXAMPLE_LCD_DATA5_GPIO=27
|
||||
CONFIG_EXAMPLE_LCD_DATA6_GPIO=29
|
||||
CONFIG_EXAMPLE_LCD_DATA7_GPIO=31
|
||||
|
||||
# G0:G7 <=> DATA8:DATA15
|
||||
CONFIG_EXAMPLE_LCD_DATA8_GPIO=16
|
||||
CONFIG_EXAMPLE_LCD_DATA9_GPIO=14
|
||||
CONFIG_EXAMPLE_LCD_DATA10_GPIO=21
|
||||
CONFIG_EXAMPLE_LCD_DATA11_GPIO=23
|
||||
CONFIG_EXAMPLE_LCD_DATA12_GPIO=26
|
||||
CONFIG_EXAMPLE_LCD_DATA13_GPIO=28
|
||||
CONFIG_EXAMPLE_LCD_DATA14_GPIO=30
|
||||
CONFIG_EXAMPLE_LCD_DATA15_GPIO=32
|
||||
|
||||
# R0:R7 <=> DATA16:DATA23
|
||||
CONFIG_EXAMPLE_LCD_DATA16_GPIO=22
|
||||
CONFIG_EXAMPLE_LCD_DATA17_GPIO=20
|
||||
CONFIG_EXAMPLE_LCD_DATA18_GPIO=18
|
||||
CONFIG_EXAMPLE_LCD_DATA19_GPIO=6
|
||||
CONFIG_EXAMPLE_LCD_DATA20_GPIO=0
|
||||
CONFIG_EXAMPLE_LCD_DATA21_GPIO=15
|
||||
CONFIG_EXAMPLE_LCD_DATA22_GPIO=17
|
||||
CONFIG_EXAMPLE_LCD_DATA23_GPIO=19
|
Reference in New Issue
Block a user