mirror of
https://github.com/stasenso/rp_pico_display_engine.git
synced 2026-06-26 21:32:41 +03:00
Add ILI9341 backend and fix orientation/color settings
This commit is contained in:
@@ -41,7 +41,9 @@ set(DISPLAY_PIN_CS 13)
|
|||||||
set(DISPLAY_PIN_DC 12)
|
set(DISPLAY_PIN_DC 12)
|
||||||
set(DISPLAY_PIN_RST 11)
|
set(DISPLAY_PIN_RST 11)
|
||||||
set(DISPLAY_PIN_BL 10)
|
set(DISPLAY_PIN_BL 10)
|
||||||
set(DISPLAY_TYPE DISPLAY_TYPE_ST7789)
|
# Available values: DISPLAY_TYPE_ST7789, DISPLAY_TYPE_ILI9341
|
||||||
|
set(DISPLAY_TYPE "DISPLAY_TYPE_ILI9341" CACHE STRING "Display controller backend")
|
||||||
|
set_property(CACHE DISPLAY_TYPE PROPERTY STRINGS DISPLAY_TYPE_ST7789 DISPLAY_TYPE_ILI9341)
|
||||||
|
|
||||||
# Pass display mapping into display backend without editing engine sources.
|
# Pass display mapping into display backend without editing engine sources.
|
||||||
target_compile_definitions(display_engine PUBLIC
|
target_compile_definitions(display_engine PUBLIC
|
||||||
|
|||||||
@@ -4,8 +4,6 @@
|
|||||||
#include "pico/stdlib.h"
|
#include "pico/stdlib.h"
|
||||||
#include "hardware/spi.h"
|
#include "hardware/spi.h"
|
||||||
|
|
||||||
#if DISPLAY_TYPE == DISPLAY_TYPE_ST7789
|
|
||||||
|
|
||||||
static inline void display_send_command(uint8_t cmd)
|
static inline void display_send_command(uint8_t cmd)
|
||||||
{
|
{
|
||||||
gpio_put(DISPLAY_PIN_DC, 0);
|
gpio_put(DISPLAY_PIN_DC, 0);
|
||||||
@@ -27,7 +25,7 @@ static inline void display_send_data_u8(uint8_t data)
|
|||||||
display_send_data_bytes(&data, 1);
|
display_send_data_bytes(&data, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void st7789_set_window(uint16_t width, uint16_t height)
|
static inline void display_set_window(uint16_t width, uint16_t height)
|
||||||
{
|
{
|
||||||
uint16_t x_end = (width > 0) ? (uint16_t)(width - 1u) : 0u;
|
uint16_t x_end = (width > 0) ? (uint16_t)(width - 1u) : 0u;
|
||||||
uint16_t y_end = (height > 0) ? (uint16_t)(height - 1u) : 0u;
|
uint16_t y_end = (height > 0) ? (uint16_t)(height - 1u) : 0u;
|
||||||
@@ -46,6 +44,8 @@ static inline void st7789_set_window(uint16_t width, uint16_t height)
|
|||||||
display_send_data_bytes(window, sizeof(window));
|
display_send_data_bytes(window, sizeof(window));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if DISPLAY_TYPE == DISPLAY_TYPE_ST7789
|
||||||
|
|
||||||
void display_driver_panel_init(uint16_t width, uint16_t height)
|
void display_driver_panel_init(uint16_t width, uint16_t height)
|
||||||
{
|
{
|
||||||
gpio_set_function(DISPLAY_PIN_MOSI, GPIO_FUNC_SPI);
|
gpio_set_function(DISPLAY_PIN_MOSI, GPIO_FUNC_SPI);
|
||||||
@@ -80,7 +80,7 @@ void display_driver_panel_init(uint16_t width, uint16_t height)
|
|||||||
display_send_command(0x3A); /* COLMOD */
|
display_send_command(0x3A); /* COLMOD */
|
||||||
display_send_data_u8(0x55); /* RGB565 */
|
display_send_data_u8(0x55); /* RGB565 */
|
||||||
|
|
||||||
st7789_set_window(width, height);
|
display_set_window(width, height);
|
||||||
|
|
||||||
display_send_command(0x21); /* INVON */
|
display_send_command(0x21); /* INVON */
|
||||||
display_send_command(0x29); /* DISPON */
|
display_send_command(0x29); /* DISPON */
|
||||||
@@ -89,18 +89,74 @@ void display_driver_panel_init(uint16_t width, uint16_t height)
|
|||||||
|
|
||||||
void display_driver_begin_frame_transfer(uint16_t width, uint16_t height)
|
void display_driver_begin_frame_transfer(uint16_t width, uint16_t height)
|
||||||
{
|
{
|
||||||
st7789_set_window(width, height);
|
display_set_window(width, height);
|
||||||
display_send_command(0x2C); /* RAMWR */
|
display_send_command(0x2C); /* RAMWR */
|
||||||
|
|
||||||
gpio_put(DISPLAY_PIN_DC, 1);
|
gpio_put(DISPLAY_PIN_DC, 1);
|
||||||
gpio_put(DISPLAY_PIN_CS, 0);
|
gpio_put(DISPLAY_PIN_CS, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void display_driver_end_frame_transfer(void)
|
#elif DISPLAY_TYPE == DISPLAY_TYPE_ILI9341
|
||||||
|
|
||||||
|
void display_driver_panel_init(uint16_t width, uint16_t height)
|
||||||
{
|
{
|
||||||
|
gpio_set_function(DISPLAY_PIN_MOSI, GPIO_FUNC_SPI);
|
||||||
|
gpio_set_function(DISPLAY_PIN_SCK, GPIO_FUNC_SPI);
|
||||||
|
|
||||||
|
gpio_init(DISPLAY_PIN_CS);
|
||||||
|
gpio_init(DISPLAY_PIN_DC);
|
||||||
|
gpio_init(DISPLAY_PIN_RST);
|
||||||
|
gpio_init(DISPLAY_PIN_BL);
|
||||||
|
gpio_set_dir(DISPLAY_PIN_CS, GPIO_OUT);
|
||||||
|
gpio_set_dir(DISPLAY_PIN_DC, GPIO_OUT);
|
||||||
|
gpio_set_dir(DISPLAY_PIN_RST, GPIO_OUT);
|
||||||
|
gpio_set_dir(DISPLAY_PIN_BL, GPIO_OUT);
|
||||||
|
|
||||||
gpio_put(DISPLAY_PIN_CS, 1);
|
gpio_put(DISPLAY_PIN_CS, 1);
|
||||||
|
gpio_put(DISPLAY_PIN_DC, 1);
|
||||||
|
gpio_put(DISPLAY_PIN_BL, 0);
|
||||||
|
|
||||||
|
gpio_put(DISPLAY_PIN_RST, 0);
|
||||||
|
sleep_ms(50);
|
||||||
|
gpio_put(DISPLAY_PIN_RST, 1);
|
||||||
|
sleep_ms(50);
|
||||||
|
|
||||||
|
display_send_command(0x01); /* SWRESET */
|
||||||
|
sleep_ms(150);
|
||||||
|
display_send_command(0x11); /* SLPOUT */
|
||||||
|
sleep_ms(150);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ILI9341 uses a different MADCTL layout than ST7789 for practical panel
|
||||||
|
* orientations; this value keeps 320x240 landscape without mirror and BGR.
|
||||||
|
*/
|
||||||
|
display_send_command(0x36); /* MADCTL */
|
||||||
|
display_send_data_u8(0b11101000);
|
||||||
|
|
||||||
|
display_send_command(0x3A); /* PIXFMT */
|
||||||
|
display_send_data_u8(0x55); /* RGB565 */
|
||||||
|
|
||||||
|
display_set_window(width, height);
|
||||||
|
|
||||||
|
display_send_command(0x20); /* INVOFF */
|
||||||
|
display_send_command(0x29); /* DISPON */
|
||||||
|
gpio_put(DISPLAY_PIN_BL, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void display_driver_begin_frame_transfer(uint16_t width, uint16_t height)
|
||||||
|
{
|
||||||
|
display_set_window(width, height);
|
||||||
|
display_send_command(0x2C); /* RAMWR */
|
||||||
|
|
||||||
|
gpio_put(DISPLAY_PIN_DC, 1);
|
||||||
|
gpio_put(DISPLAY_PIN_CS, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#error "Unsupported DISPLAY_TYPE. Add implementation in src/core/display_driver.c."
|
#error "Unsupported DISPLAY_TYPE. Add implementation in src/core/display_driver.c."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void display_driver_end_frame_transfer(void)
|
||||||
|
{
|
||||||
|
gpio_put(DISPLAY_PIN_CS, 1);
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
/* Display type identifiers used by DISPLAY_TYPE. */
|
/* Display type identifiers used by DISPLAY_TYPE. */
|
||||||
#define DISPLAY_TYPE_ST7789 1
|
#define DISPLAY_TYPE_ST7789 1
|
||||||
|
#define DISPLAY_TYPE_ILI9341 2
|
||||||
|
|
||||||
#ifndef DISPLAY_TYPE
|
#ifndef DISPLAY_TYPE
|
||||||
#define DISPLAY_TYPE DISPLAY_TYPE_ST7789
|
#define DISPLAY_TYPE DISPLAY_TYPE_ST7789
|
||||||
|
|||||||
Reference in New Issue
Block a user