diff --git a/boards/stm32l496g-disco/Kconfig b/boards/stm32l496g-disco/Kconfig index b041984ac9..e50d8e4843 100644 --- a/boards/stm32l496g-disco/Kconfig +++ b/boards/stm32l496g-disco/Kconfig @@ -43,6 +43,8 @@ config BOARD_STM32L496G_DISCO select HAVE_SAUL_GPIO select HAVE_FT5X06 + select HAVE_ST7789 + select HAVE_LCD_PARALLEL_16BIT if MODULE_ST7789 select MODULE_PERIPH_LPUART if MODULE_PERIPH_UART select MODULE_PERIPH_UART_HW_FC if MODULE_PERIPH_UART && !MODULE_PERIPH_SPI_STMOD && HAS_PERIPH_UART_HW_FC diff --git a/boards/stm32l496g-disco/Makefile.dep b/boards/stm32l496g-disco/Makefile.dep index b53a09193a..c63761b6b3 100644 --- a/boards/stm32l496g-disco/Makefile.dep +++ b/boards/stm32l496g-disco/Makefile.dep @@ -21,3 +21,11 @@ ifneq (,$(filter periph_uart,$(USEMODULE))) FEATURES_REQUIRED += periph_uart_hw_fc endif endif + +ifneq (,$(filter disp_dev,$(USEMODULE))) + USEMODULE += st7789 +endif + +ifneq (,$(filter st7789,$(USEMODULE))) + USEMODULE += lcd_parallel_16bit +endif diff --git a/boards/stm32l496g-disco/board.c b/boards/stm32l496g-disco/board.c new file mode 100644 index 0000000000..5451529b5b --- /dev/null +++ b/boards/stm32l496g-disco/board.c @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2023 Gunar Schorcht + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup boards_stm32l496g-disco + * @{ + * + * @file + * @brief Board specific initializations for the STM32L496G-DISCO board + * + * @author Gunar Schorcht + */ + +#include "board.h" + +void board_init(void) +{ +#if MODULE_ST77XX + /* initialize the pin for the HIGH active LCD_BL signal */ + gpio_init(BACKLIGHT_PIN, GPIO_OUT); + + /* enable VDD_LCD by the LOW active LCD_PWR_ON signal connected to PH0 */ + gpio_init(LCD_DISP_PIN, GPIO_OUT); + gpio_clear(LCD_DISP_PIN); +#endif +} diff --git a/boards/stm32l496g-disco/include/board.h b/boards/stm32l496g-disco/include/board.h index af626c9ac8..ec9d1d4c60 100644 --- a/boards/stm32l496g-disco/include/board.h +++ b/boards/stm32l496g-disco/include/board.h @@ -33,7 +33,7 @@ extern "C" { * @name LCD Backlight control defines * @{ */ -#define BACKLIGHT_PIN GPIO_PIN(PORT_I, 0) /**< Backlight pin */ +#define BACKLIGHT_PIN GPIO_PIN(PORT_I, 0) /**< Backlight pin (HIGH active LD_BL) */ #define BACKLIGHT_MASK (1 << 0) /**< Backlight pin mask */ /** Set the backlight pin */ @@ -46,11 +46,82 @@ extern "C" { /** * @name LCD display definitions + * + * The STM32L496-DISCO board has a 240 x 240 pixel TFT color LCD display with + * ST7789 driver IC using MCU 8080 16-bit parallel interface (default with + * SB14=ON and SB15=OFF). SB14 and SB15 control the ST7789 `IM0` signal. + * With SB14=OFF and SB15=ON, the MCU 8080 8-bit parallel interface is enabled. + * + * For the `LCD_*` pins the identifiers are used as given in the [schematic] + * (https://www.st.com/resource/en/schematic_pack/mb1261-l496g-b06-schematic.pdf). + * + * The LCD display has to switched on explicitly by activating VDD_LCD using + * the LOW active `LD_PWR_ON` signal. + * + * @note The `LCD_RESET` signal is provided by the MFX GPIO2 pin. Since the MFX + * is not yet supported, the `LCD_RESET` signal cannot be used by the display + * driver. However, since the `LCD_RESET` signal is pulled up and the MFX GPIO2 + * pin is configured as a floating input by default, the driver will work + * without MFX support and the `LCD_RESET` signal. + * * @{ */ -#define LCD_DISP_PIN GPIO_PIN(PORT_H, 0) /**< LCD screen enable pin */ -#define LCD_SCREEN_WIDTH 240 /**< LCD screen width */ -#define LCD_SCREEN_HEIGHT 240 /**< LCD screen height */ +#define LCD_DISP_PIN GPIO_PIN(PORT_H, 0) /**< LCD power pin (LOW active LD_PWR_ON) */ +#define LCD_SCREEN_WIDTH 240 /**< LCD width */ +#define LCD_SCREEN_HEIGHT 240 /**< LCD height */ + +#define LCD_D0 GPIO_PIN(PORT_D, 14) /**< LCD_D0 pin */ +#define LCD_D1 GPIO_PIN(PORT_D, 15) /**< LCD_D1 pin */ +#define LCD_D2 GPIO_PIN(PORT_D, 0) /**< LCD_D2 pin */ +#define LCD_D3 GPIO_PIN(PORT_D, 1) /**< LCD_D3 pin */ +#define LCD_D4 GPIO_PIN(PORT_E, 7) /**< LCD_D4 pin */ +#define LCD_D5 GPIO_PIN(PORT_E, 8) /**< LCD_D5 pin */ +#define LCD_D6 GPIO_PIN(PORT_E, 9) /**< LCD_D6 pin */ +#define LCD_D7 GPIO_PIN(PORT_E, 10) /**< LCD_D7 pin */ +#define LCD_D8 GPIO_PIN(PORT_E, 11) /**< LCD_D8 pin */ +#define LCD_D9 GPIO_PIN(PORT_E, 12) /**< LCD_D9 pin */ +#define LCD_D10 GPIO_PIN(PORT_E, 13) /**< LCD_D10 pin */ +#define LCD_D11 GPIO_PIN(PORT_E, 14) /**< LCD_D11 pin */ +#define LCD_D12 GPIO_PIN(PORT_E, 15) /**< LCD_D12 pin */ +#define LCD_D13 GPIO_PIN(PORT_D, 8) /**< LCD_D13 pin */ +#define LCD_D14 GPIO_PIN(PORT_D, 9) /**< LCD_D14 pin */ +#define LCD_D15 GPIO_PIN(PORT_D, 10) /**< LCD_D15 pin */ +#define LCD_TE GPIO_PIN(PORT_H, 7) /**< LCD_TE pin */ +#define LCD_WE GPIO_PIN(PORT_D, 5) /**< LCD_WE pin */ +#define LCD_OE GPIO_PIN(PORT_D, 4) /**< LCD_OE pin */ +#define LCD_RS GPIO_PIN(PORT_D, 13) /**< LCD_RS pin */ +#define LCD_NE GPIO_PIN(PORT_D, 7) /**< LCD_NE pin */ +#define LCD_RST GPIO_UNDEF /**< LCD_RST pin (MFX_GPIO2) */ +#define LCD_BACKLIGHT BACKLIGHT_PIN /**< LCD_BL pin */ + +#define ST77XX_PARAM_CNTRL ST77XX_CNTRL_ST7789 /**< ST77xx controller variant */ +#define ST77XX_PARAM_SPI SPI_UNDEF /**< parallel interface is used */ +#define ST77XX_PARAM_D0 LCD_D0 /**< ST77xx D0 signal */ +#define ST77XX_PARAM_D1 LCD_D1 /**< ST77xx D1 signal */ +#define ST77XX_PARAM_D2 LCD_D2 /**< ST77xx D2 signal */ +#define ST77XX_PARAM_D3 LCD_D3 /**< ST77xx D3 signal */ +#define ST77XX_PARAM_D4 LCD_D4 /**< ST77xx D4 signal */ +#define ST77XX_PARAM_D5 LCD_D5 /**< ST77xx D5 signal */ +#define ST77XX_PARAM_D6 LCD_D6 /**< ST77xx D6 signal */ +#define ST77XX_PARAM_D7 LCD_D7 /**< ST77xx D7 signal */ +#define ST77XX_PARAM_D8 LCD_D8 /**< ST77xx D8 signal */ +#define ST77XX_PARAM_D9 LCD_D9 /**< ST77xx D9 signal */ +#define ST77XX_PARAM_D10 LCD_D10 /**< ST77xx D10 signal */ +#define ST77XX_PARAM_D11 LCD_D11 /**< ST77xx D11 signal */ +#define ST77XX_PARAM_D12 LCD_D12 /**< ST77xx D12 signal */ +#define ST77XX_PARAM_D13 LCD_D13 /**< ST77xx D13 signal */ +#define ST77XX_PARAM_D14 LCD_D14 /**< ST77xx D14 signal */ +#define ST77XX_PARAM_D15 LCD_D15 /**< ST77xx D15 signal */ +#define ST77XX_PARAM_WRX LCD_WE /**< ST77xx WR signal */ +#define ST77XX_PARAM_RDX LCD_OE /**< ST77xx RD signal */ +#define ST77XX_PARAM_DCX LCD_RS /**< ST77xx RS signal */ +#define ST77XX_PARAM_RST LCD_RST /**< ST77xx RST signal */ +#define ST77XX_PARAM_CS LCD_NE /**< ST77xx CS signal */ +#define ST77XX_PARAM_RGB 1 /**< ST77xx RGB mode */ +#define ST77XX_PARAM_INVERTED 1 /**< ST77xx inverted colors */ +#define ST77XX_PARAM_ROTATION ST77XX_ROTATION_0 /**< ST77xx rotation */ +#define ST77XX_PARAM_NUM_LINES LCD_SCREEN_HEIGHT /**< ST77xx number of lines */ +#define ST77XX_PARAM_RGB_CHANNELS LCD_SCREEN_WIDTH /**< ST77xx number of channels */ /** @} */ /**