From 6e2486a2e26e2b30ecef579cc790de736e9b30d4 Mon Sep 17 00:00:00 2001 From: tychovrahe Date: Tue, 31 Dec 2024 16:08:45 +0100 Subject: [PATCH] feat(core): add LX250A2401A panel to ltdc_dsi display driver [no changelog] --- .../io/display/ltdc_dsi/display_internal.h | 2 + .../ltdc_dsi/panels/lx250a2401a/lx250a2401a.c | 525 ++++++++++++++++++ .../ltdc_dsi/panels/lx250a2401a/lx250a2401a.h | 58 ++ 3 files changed, 585 insertions(+) create mode 100644 core/embed/io/display/ltdc_dsi/panels/lx250a2401a/lx250a2401a.c create mode 100644 core/embed/io/display/ltdc_dsi/panels/lx250a2401a/lx250a2401a.h diff --git a/core/embed/io/display/ltdc_dsi/display_internal.h b/core/embed/io/display/ltdc_dsi/display_internal.h index 67f7f07a65..31f91cb5d6 100644 --- a/core/embed/io/display/ltdc_dsi/display_internal.h +++ b/core/embed/io/display/ltdc_dsi/display_internal.h @@ -27,6 +27,8 @@ #ifdef DISPLAY_PANEL_LX200D2406A #include "panels/lx200d2406a/lx200d2406a.h" +#elif defined DISPLAY_PANEL_LX250A2401A +#include "panels/lx250a2401a/lx250a2401a.h" #elif defined DISPLAY_PANEL_STM32U5A9J_DK #include "panels/stm32u5a9j-dk/stm32u5a9j-dk.h" #endif diff --git a/core/embed/io/display/ltdc_dsi/panels/lx250a2401a/lx250a2401a.c b/core/embed/io/display/ltdc_dsi/panels/lx250a2401a/lx250a2401a.c new file mode 100644 index 0000000000..1cf710cc31 --- /dev/null +++ b/core/embed/io/display/ltdc_dsi/panels/lx250a2401a/lx250a2401a.c @@ -0,0 +1,525 @@ +/* + * This file is part of the Trezor project, https://trezor.io/ + * + * Copyright (c) SatoshiLabs + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include + +#include "lx250a2401a.h" + +#include "../../display_internal.h" + +#define GFXMMU_LINE_L(line_offset, first_block, last_block) \ + (0x1 | ((first_block) << 8) | ((last_block) << 16)) +#define GFXMMU_LINE_H(line_offset, first_block, last_block) \ + ((((line_offset) - ((first_block))) & 0x3FFFF) << 4) + +typedef struct { + uint16_t limit; + uint8_t px; +} lut_def_t; + +static uint32_t gfxmmu_lut_config[2 * GFXMMU_LUT_SIZE] = {0}; + +static uint32_t lut_add_line(uint32_t line, uint32_t offset, + uint32_t first_pixel) { + uint32_t pixel_cut = first_pixel - 1; + uint32_t offset_px = PANEL_USED_AREA_OFFSET_X; + uint32_t first_block = (pixel_cut + offset_px) >> 2; + uint32_t last_block = (DISPLAY_RESX - 1 + offset_px - pixel_cut) >> 2; + + gfxmmu_lut_config[line * 2] = GFXMMU_LINE_L(offset, first_block, last_block); + gfxmmu_lut_config[line * 2 + 1] = + GFXMMU_LINE_H(offset, first_block, last_block); + + return last_block - first_block + 1; +} + +const uint32_t *panel_lut_get(void) { + uint32_t offset = 0; + uint32_t line = 0; + + const lut_def_t lut[] = { + {1, 13}, {1, 11}, {1, 9}, {1, 8}, {1, 6}, {2, 5}, {1, 4}, {2, 3}, + {2, 2}, {4, 1}, {411, 1}, {12, 1}, {7, 2}, {6, 3}, {5, 4}, {4, 5}, + {4, 6}, {3, 7}, {3, 8}, {3, 9}, {4, 10}, {2, 11}, {3, 12}, {2, 13}, + {3, 14}, {2, 15}, {2, 16}, {2, 17}, {3, 18}, {1, 19}, {2, 20}, {2, 21}, + {2, 22}, {2, 23}, {2, 24}, {1, 25}, {2, 26}, {2, 27}, {1, 28}, {2, 29}, + {1, 30}, {1, 32}, {1, 33}, {1, 36}, + }; + + for (uint32_t i = 0; i < sizeof(lut) / sizeof(lut_def_t); i++) { + for (uint32_t j = 0; j < lut[i].limit; j++) { + offset += lut_add_line(line++, offset, lut[i].px); + } + } + return gfxmmu_lut_config; +} + +bool panel_init(display_driver_t *drv) { + HAL_StatusTypeDef ret; + + // Write(Command , 0xFF); + // Write(Parameter , 0x77); + // Write(Parameter , 0x01); + // Write(Parameter , 0x00); + // Write(Parameter , 0x00); + // Write(Parameter , 0x13); + ret = HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 10, 0xFF, + (uint8_t[]){0x77, 0x01, 0x00, 0x00, 0x13}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xEF); + // Write(Parameter , 0x08); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xEF, + 0x08); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xFF); + // Write(Parameter , 0x77); + // Write(Parameter , 0x01); + // Write(Parameter , 0x00); + // Write(Parameter , 0x00); + // Write(Parameter , 0x10); + ret = HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 10, 0xFF, + (uint8_t[]){0x77, 0x01, 0x00, 0x00, 0x10}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xC0); + // Write(Parameter , 0x40); + // Write(Parameter , 0x00); + ret = HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 2, 0xC0, + (uint8_t[]){0x40, 0x00}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xC1); + // Write(Parameter , 0x0D); + // Write(Parameter , 0x02); + ret = HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 2, 0xC1, + (uint8_t[]){0x0D, 0x02}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xC2); + // Write(Parameter , 0x37); //column //0x30 1dot + // Write(Parameter , 0x06); + ret = HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 2, 0xC2, + (uint8_t[]){0x37, 0x06}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xCC); + // Write(Parameter , 0x18); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xCC, + 0x18); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xB0); + // Write(Parameter , 0x40); + // Write(Parameter , 0x8D); + // Write(Parameter , 0x96); + // Write(Parameter , 0x0F); + // Write(Parameter , 0x13); + // Write(Parameter , 0x07); + // Write(Parameter , 0x07); + // Write(Parameter , 0x0B); + // Write(Parameter , 0x08); + // Write(Parameter , 0x23); + // Write(Parameter , 0x09); + // Write(Parameter , 0x58); + // Write(Parameter , 0x14); + // Write(Parameter , 0x29); + // Write(Parameter , 0xAD); + // Write(Parameter , 0xDF); + ret = HAL_DSI_LongWrite( + &drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 16, 0xB0, + (uint8_t[]){0x40, 0x8D, 0x96, 0x0F, 0x13, 0x07, 0x07, 0x0B, 0x08, 0x23, + 0x09, 0x58, 0x14, 0x29, 0xAD, 0xDF}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xB1); + // Write(Parameter , 0x40); + // Write(Parameter , 0xCD); + // Write(Parameter , 0x13); + // Write(Parameter , 0x0B); + // Write(Parameter , 0x10); + // Write(Parameter , 0x06); + // Write(Parameter , 0x04); + // Write(Parameter , 0x06); + // Write(Parameter , 0x07); + // Write(Parameter , 0x20); + // Write(Parameter , 0x06); + // Write(Parameter , 0x17); + // Write(Parameter , 0x17); + // Write(Parameter , 0xA0); + // Write(Parameter , 0x22); + // Write(Parameter , 0xDF); + ret = HAL_DSI_LongWrite( + &drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 16, 0xB1, + (uint8_t[]){0x40, 0xCD, 0x13, 0x0B, 0x10, 0x06, 0x04, 0x06, 0x07, 0x20, + 0x06, 0x17, 0x17, 0xA0, 0x22, 0xDF}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xFF); + // Write(Parameter , 0x77); + // Write(Parameter , 0x01); + // Write(Parameter , 0x00); + // Write(Parameter , 0x00); + // Write(Parameter , 0x11); + ret = HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 10, 0xFF, + (uint8_t[]){0x77, 0x01, 0x00, 0x00, 0x11}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xB0); + // Write(Parameter , 0x4D); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xB0, + 0x4D); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xB1); + // Write(Parameter , 0x4B); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xB1, + 0x4B); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xB2); + // Write(Parameter , 0x85); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xB2, + 0x85); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xB3); + // Write(Parameter , 0x80); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xB3, + 0x80); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xB5); + // Write(Parameter , 0x45); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xB5, + 0x45); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xB8); + // Write(Parameter , 0x33); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xB8, + 0x33); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xB9); + // Write(Parameter , 0x10); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xB9, + 0x10); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xC0); + // Write(Parameter , 0x09); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xC0, + 0x09); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xC1); + // Write(Parameter , 0x78); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xC1, + 0x78); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xC2); + // Write(Parameter , 0x78); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xC2, + 0x78); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xD0); + // Write(Parameter , 0x88); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xD0, + 0x88); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xE0); + // Write(Parameter , 0x00); + // Write(Parameter , 0x3A); + // Write(Parameter , 0x02); + ret = HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 3, 0xE0, + (uint8_t[]){0x00, 0x3A, 0x02}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xE1); + // Write(Parameter , 0x08); + // Write(Parameter , 0xA0); + // Write(Parameter , 0x00); + // Write(Parameter , 0xA0); + // Write(Parameter , 0x07); + // Write(Parameter , 0xA0); + // Write(Parameter , 0x00); + // Write(Parameter , 0xA0); + // Write(Parameter , 0x00); + // Write(Parameter , 0x40); + // Write(Parameter , 0x40); + ret = HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 11, 0xE1, + (uint8_t[]){0x08, 0xA0, 0x00, 0xA0, 0x07, 0xA0, 0x00, + 0xA0, 0x00, 0x40, 0x40}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xE2); + // Write(Parameter , 0x20); + // Write(Parameter , 0x20); + // Write(Parameter , 0x40); + // Write(Parameter , 0x40); + // Write(Parameter , 0x16); + // Write(Parameter , 0xA0); + // Write(Parameter , 0x00); + // Write(Parameter , 0xA0); + // Write(Parameter , 0x15); + // Write(Parameter , 0xA0); + // Write(Parameter , 0x00); + // Write(Parameter , 0xA0); + // Write(Parameter , 0x00); + ret = HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 13, 0xE2, + (uint8_t[]){0x20, 0x20, 0x40, 0x40, 0x16, 0xA0, 0x00, + 0xA0, 0x15, 0xA0, 0x00, 0xA0, 0x00}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xE3); + // Write(Parameter , 0x00); + // Write(Parameter , 0x00); + // Write(Parameter , 0x22); + // Write(Parameter , 0x22); + ret = HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 4, 0xE3, + (uint8_t[]){0x00, 0x00, 0x22, 0x22}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xE4); + // Write(Parameter , 0x44); + // Write(Parameter , 0x44); + ret = HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 2, 0xE4, + (uint8_t[]){0x44, 0x44}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xE5); + // Write(Parameter , 0x0A); + // Write(Parameter , 0x13); + // Write(Parameter , 0xD8); + // Write(Parameter , 0xA0); + // Write(Parameter , 0x0C); + // Write(Parameter , 0x15); + // Write(Parameter , 0xD8); + // Write(Parameter , 0xA0); + // Write(Parameter , 0x0E); + // Write(Parameter , 0x17); + // Write(Parameter , 0xD8); + // Write(Parameter , 0xA0); + // Write(Parameter , 0x10); + // Write(Parameter , 0x19); + // Write(Parameter , 0xD8); + // Write(Parameter , 0xA0); + ret = HAL_DSI_LongWrite( + &drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 16, 0xE5, + (uint8_t[]){0x0A, 0x13, 0xD8, 0xA0, 0x0C, 0x15, 0xD8, 0xA0, 0x0E, 0x17, + 0xD8, 0xA0, 0x10, 0x19, 0xD8, 0xA0}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xE6); + // Write(Parameter , 0x00); + // Write(Parameter , 0x00); + // Write(Parameter , 0x22); + // Write(Parameter , 0x22); + ret = HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 4, 0xE6, + (uint8_t[]){0x00, 0x00, 0x22, 0x22}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xE7); + // Write(Parameter , 0x44); + // Write(Parameter , 0x44); + ret = HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 2, 0xE7, + (uint8_t[]){0x44, 0x44}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xE8); + // Write(Parameter , 0x09); + // Write(Parameter , 0x12); + // Write(Parameter , 0xD8); + // Write(Parameter , 0xA0); + // Write(Parameter , 0x0B); + // Write(Parameter , 0x14); + // Write(Parameter , 0xD8); + // Write(Parameter , 0xA0); + // Write(Parameter , 0x0D); + // Write(Parameter , 0x16); + // Write(Parameter , 0xD8); + // Write(Parameter , 0xA0); + // Write(Parameter , 0x0F); + // Write(Parameter , 0x18); + // Write(Parameter , 0xD8); + // Write(Parameter , 0xA0); + ret = HAL_DSI_LongWrite( + &drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 16, 0xE8, + (uint8_t[]){0x09, 0x12, 0xD8, 0xA0, 0x0B, 0x14, 0xD8, 0xA0, 0x0D, 0x16, + 0xD8, 0xA0, 0x0F, 0x18, 0xD8, 0xA0}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xEB); + // Write(Parameter , 0x02); + // Write(Parameter , 0x00); + // Write(Parameter , 0xE4); + // Write(Parameter , 0xE4); + // Write(Parameter , 0x88); + // Write(Parameter , 0x00); + // Write(Parameter , 0x00); + ret = + HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 8, 0xEB, + (uint8_t[]){0x02, 0x00, 0xE4, 0xE4, 0x88, 0x00, 0x00}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xEC); + // Write(Parameter , 0x02); + // Write(Parameter , 0x00); + ret = HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 2, 0xEC, + (uint8_t[]){0x02, 0x00}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xED); + // Write(Parameter , 0xFF); + // Write(Parameter , 0x07); + // Write(Parameter , 0x65); + // Write(Parameter , 0x4A); + // Write(Parameter , 0xB2); + // Write(Parameter , 0xF8); + // Write(Parameter , 0x9F); + // Write(Parameter , 0xFF); + // Write(Parameter , 0xFF); + // Write(Parameter , 0xF9); + // Write(Parameter , 0x8F); + // Write(Parameter , 0x2B); + // Write(Parameter , 0xA4); + // Write(Parameter , 0x56); + // Write(Parameter , 0x70); + // Write(Parameter , 0xFF); + ret = HAL_DSI_LongWrite( + &drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 16, 0xED, + (uint8_t[]){0xFF, 0x07, 0x65, 0x4A, 0xB2, 0xF8, 0x9F, 0xFF, 0xFF, 0xF9, + 0x8F, 0x2B, 0xA4, 0x56, 0x70, 0xFF}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0xEF); + // Write(Parameter , 0x08); + // Write(Parameter , 0x08); + // Write(Parameter , 0x08); + // Write(Parameter , 0x45); + // Write(Parameter , 0x3F); + // Write(Parameter , 0x54); + ret = HAL_DSI_LongWrite(&drv->hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 6, 0xEF, + (uint8_t[]){0x08, 0x08, 0x08, 0x45, 0x3F, 0x54}); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0x35); + // Write(Parameter , 0x00); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0x35, + 0x00); + if (ret != HAL_OK) { + return false; + } + + // Write(Command , 0x11); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P0, 0x11, + 0x00); + if (ret != HAL_OK) { + return false; + } + + systick_delay_ms(120); + + // Write(Command , 0x29); + ret = HAL_DSI_ShortWrite(&drv->hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P0, 0x29, + 0x00); + if (ret != HAL_OK) { + return false; + } + + systick_delay_ms(20); + + return true; +} diff --git a/core/embed/io/display/ltdc_dsi/panels/lx250a2401a/lx250a2401a.h b/core/embed/io/display/ltdc_dsi/panels/lx250a2401a/lx250a2401a.h new file mode 100644 index 0000000000..62d7a87583 --- /dev/null +++ b/core/embed/io/display/ltdc_dsi/panels/lx250a2401a/lx250a2401a.h @@ -0,0 +1,58 @@ +/* + * This file is part of the Trezor project, https://trezor.io/ + * + * Copyright (c) SatoshiLabs + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include + +#define VSYNC 2 +#define VBP 26 +#define VFP 16 +#define VACT 520 +#define HSYNC 6 // 16 +#define HBP 2 // 32 +#define HFP 6 // 26 +#define HACT 480 +#define LCD_WIDTH 480 +#define LCD_HEIGHT 520 + +#define LCD_Y_OFFSET 0 + +#define GFXMMU_LUT_FIRST 0 +#define GFXMMU_LUT_LAST 519 +#define GFXMMU_LUT_SIZE 520 + +#define PANEL_DSI_MODE DSI_VID_MODE_BURST +#define PANEL_DSI_LANES DSI_TWO_DATA_LANES +#define PANEL_LTDC_PIXEL_FORMAT LTDC_PIXEL_FORMAT_ARGB8888 + +// Size of the physical frame buffer in bytes +// +// It's smaller than size of the virtual frame buffer +// due to used GFXMMU settings +#define PHYSICAL_FRAME_BUFFER_SIZE (772 * 1024) + +// Pitch (in pixels) of the virtual frame buffer +#define FRAME_BUFFER_PIXELS_PER_LINE 768 + +#define VIRTUAL_FRAME_BUFFER_SIZE \ + (FRAME_BUFFER_PIXELS_PER_LINE * LCD_HEIGHT * 4) + +#define PANEL_USED_AREA_OFFSET_X 50 +#define PANEL_USED_AREA_OFFSET_Y 0