From 18e103bb94e0e11db8286ba911eaa885de2b01f9 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 19 Jun 2021 19:33:12 +0200 Subject: [PATCH] style(core): refactor style of display-stm32_T --- .../extmod/modtrezorui/display-stm32_T.h | 459 ++++++++++-------- 1 file changed, 269 insertions(+), 190 deletions(-) diff --git a/core/embed/extmod/modtrezorui/display-stm32_T.h b/core/embed/extmod/modtrezorui/display-stm32_T.h index 1745a8be7..410d3e327 100644 --- a/core/embed/extmod/modtrezorui/display-stm32_T.h +++ b/core/embed/extmod/modtrezorui/display-stm32_T.h @@ -172,8 +172,8 @@ static void display_set_orientation(int degrees) { } CMD(0x36); DATA(display_command_parameter); - display_set_window(0, 0, DISPLAY_RESX - 1, - DISPLAY_RESY - 1); // reset the column and page extents + // reset the column and page extents + display_set_window(0, 0, DISPLAY_RESX - 1, DISPLAY_RESY - 1); } BUFFER_OFFSET.x = BX ? (MAX_DISPLAY_RESY - DISPLAY_RESY) : 0; BUFFER_OFFSET.y = BY ? (MAX_DISPLAY_RESY - DISPLAY_RESY) : 0; @@ -183,6 +183,263 @@ static void display_set_backlight(int val) { TIM1->CCR1 = LED_PWM_TIM_PERIOD * val / 255; } +static void send_init_seq_GC9307(void) { + // Inter Register Enable1 + CMD(0xFE); + + // Inter Register Enable2 + CMD(0xEF); + + // TEON: Tearing Effect Line On; V-blanking only + CMD(0x35); + DATA(0x00); + + // COLMOD: Interface Pixel format; 65K color: 16-bit/pixel (RGB 5-6-5 bits + // input) + CMD(0x3A); + DATA(0x55); + + // Frame Rate + // CMD(0xE8); DATA(0x12); DATA(0x00); + + // Power Control 2 + CMD(0xC3); + DATA(0x27); + + // Power Control 3 + CMD(0xC4); + DATA(0x18); + + // Power Control 4 + CMD(0xC9); + DATA(0x1F); + + CMD(0xC5); + DATA(0x0F); + + CMD(0xC6); + DATA(0x00); + + CMD(0xC7); + DATA(0x10); + + CMD(0xC8); + DATA(0x01); + + CMD(0xFF); + DATA(0x62); + + CMD(0x99); + DATA(0x3E); + + CMD(0x9D); + DATA(0x4B); + + CMD(0x8E); + DATA(0x0F); + + // SET_GAMMA1 + CMD(0xF0); + DATA(0x8F); + DATA(0x1B); + DATA(0x05); + DATA(0x06); + DATA(0x07); + DATA(0x42); + + // SET_GAMMA3 + CMD(0xF2); + DATA(0x5C); + DATA(0x1F); + DATA(0x12); + DATA(0x10); + DATA(0x07); + DATA(0x43); + + // SET_GAMMA2 + CMD(0xF1); + DATA(0x59); + DATA(0xCF); + DATA(0xCF); + DATA(0x35); + DATA(0x37); + DATA(0x8F); + + // SET_GAMMA4 + CMD(0xF3); + DATA(0x58); + DATA(0xCF); + DATA(0xCF); + DATA(0x35); + DATA(0x37); + DATA(0x8F); +} + +static void send_init_seq_ST7789V(void) { + // most recent manual: + // https://www.newhavendisplay.com/appnotes/datasheets/LCDs/ST7789V.pdf + // TEON: Tearing Effect Line On; V-blanking only + CMD(0x35); + DATA(0x00); + + // COLMOD: Interface Pixel format; 65K color: 16-bit/pixel (RGB 5-6-5 bits + // input) + CMD(0x3A); + DATA(0x55); + + // CMD2EN: Commands in command table 2 can be executed when EXTC level is Low + CMD(0xDF); + DATA(0x5A); + DATA(0x69); + DATA(0x02); + DATA(0x01); + + // LCMCTRL: LCM Control: XOR RGB setting + CMD(0xC0); + DATA(0x20); + + // GATECTRL: Gate Control; NL = 240 gate lines, first scan line is gate 80.; + // gate scan direction 319 -> 0 + CMD(0xE4); + DATA(0x1D); + DATA(0x0A); + DATA(0x11); + + // INVOFF (20h): Display Inversion Off + // INVON (21h): Display Inversion On + CMD(0x20 | DISPLAY_ST7789V_INVERT_COLORS); + + // the above config is the most important and definitely necessary + + // PWCTRL1: Power Control 1 + CMD(0xD0); + DATA(0xA4); + DATA(0xA1); + + // gamma curve 1 + // CMD(0xE0); DATA(0x70); DATA(0x2C); DATA(0x2E); DATA(0x15); DATA(0x10); + // DATA(0x09); DATA(0x48); DATA(0x33); DATA(0x53); DATA(0x0B); DATA(0x19); + // DATA(0x18); DATA(0x20); DATA(0x25); + + // gamma curve 2 + // CMD(0xE1); DATA(0x70); + // DATA(0x2C); DATA(0x2E); DATA(0x15); DATA(0x10); DATA(0x09); DATA(0x48); + // DATA(0x33); DATA(0x53); DATA(0x0B); DATA(0x19); DATA(0x18); DATA(0x20); + // DATA(0x25); +} + +static void send_init_seq_ILI9341V(void) { + // most recent manual: https://www.newhavendisplay.com/app_notes/ILI9341.pdf + // TEON: Tearing Effect Line On; V-blanking only + CMD(0x35); + DATA(0x00); + + // COLMOD: Interface Pixel format; 65K color: 16-bit/pixel (RGB 5-6-5 bits + // input) + CMD(0x3A); + DATA(0x55); + + // Display Function Control: gate scan direction 319 -> 0 + CMD(0xB6); + DATA(0x0A); + DATA(0xC2); + DATA(0x27); + DATA(0x00); + + // Interface Control: XOR BGR as ST7789V does + CMD(0xF6); + DATA(0x09); + DATA(0x30); + DATA(0x00); + + // the above config is the most important and definitely necessary + + CMD(0xCF); + DATA(0x00); + DATA(0xC1); + DATA(0x30); + + CMD(0xED); + DATA(0x64); + DATA(0x03); + DATA(0x12); + DATA(0x81); + + CMD(0xE8); + DATA(0x85); + DATA(0x10); + DATA(0x7A); + + CMD(0xF7); + DATA(0x20); + + CMD(0xEA); + DATA(0x00); + DATA(0x00); + + // power control VRH[5:0] + CMD(0xC0); + DATA(0x23); + + // power control SAP[2:0] BT[3:0] + CMD(0xC1); + DATA(0x12); + + // vcm control 1 + CMD(0xC5); + DATA(0x60); + DATA(0x44); + + // vcm control 2 + CMD(0xC7); + DATA(0x8A); + + // framerate + CMD(0xB1); + DATA(0x00); + DATA(0x18); + + // 3 gamma func disable + CMD(0xF2); + DATA(0x00); + + // gamma curve 1 + CMD(0xE0); + DATA(0x0F); + DATA(0x2F); + DATA(0x2C); + DATA(0x0B); + DATA(0x0F); + DATA(0x09); + DATA(0x56); + DATA(0xD9); + DATA(0x4A); + DATA(0x0B); + DATA(0x14); + DATA(0x05); + DATA(0x0C); + DATA(0x06); + DATA(0x00); + + // gamma curve 2 + CMD(0xE1); + DATA(0x00); + DATA(0x10); + DATA(0x13); + DATA(0x04); + DATA(0x10); + DATA(0x06); + DATA(0x25); + DATA(0x26); + DATA(0x3B); + DATA(0x04); + DATA(0x0B); + DATA(0x0A); + DATA(0x33); + DATA(0x39); + DATA(0x0F); +} + void display_init_seq(void) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET); // LCD_RST/PC14 // wait 10 milliseconds. only needs to be low for 10 microseconds. @@ -198,186 +455,11 @@ void display_init_seq(void) { // identify the controller we will communicate with uint32_t id = display_identify(); if (id == DISPLAY_ID_GC9307) { - CMD(0xFE); // Inter Register Enable1 - CMD(0xEF); // Inter Register Enable2 - CMD(0x35); - DATA(0x00); // TEON: Tearing Effect Line On; V-blanking only - CMD(0x3A); - DATA(0x55); // COLMOD: Interface Pixel format; 65K color: 16-bit/pixel (RGB - // 5-6-5 bits input) - // CMD(0xE8); DATA(0x12); DATA(0x00); // Frame Rate - CMD(0xC3); - DATA(0x27); // Power Control 2 - CMD(0xC4); - DATA(0x18); // Power Control 3 - CMD(0xC9); - DATA(0x1F); // Power Control 4 - CMD(0xC5); - DATA(0x0F); - CMD(0xC6); - DATA(0x00); - CMD(0xC7); - DATA(0x10); - CMD(0xC8); - DATA(0x01); - CMD(0xFF); - DATA(0x62); - CMD(0x99); - DATA(0x3E); - CMD(0x9D); - DATA(0x4B); - CMD(0x8E); - DATA(0x0F); - // SET_GAMMA1 - CMD(0xF0); - DATA(0x8F); - DATA(0x1B); - DATA(0x05); - DATA(0x06); - DATA(0x07); - DATA(0x42); - // SET_GAMMA3 - CMD(0xF2); - DATA(0x5C); - DATA(0x1F); - DATA(0x12); - DATA(0x10); - DATA(0x07); - DATA(0x43); - // SET_GAMMA2 - CMD(0xF1); - DATA(0x59); - DATA(0xCF); - DATA(0xCF); - DATA(0x35); - DATA(0x37); - DATA(0x8F); - // SET_GAMMA4 - CMD(0xF3); - DATA(0x58); - DATA(0xCF); - DATA(0xCF); - DATA(0x35); - DATA(0x37); - DATA(0x8F); + send_init_seq_GC9307(); } else if (id == DISPLAY_ID_ST7789V) { - // most recent manual: - // https://www.newhavendisplay.com/appnotes/datasheets/LCDs/ST7789V.pdf - CMD(0x35); - DATA(0x00); // TEON: Tearing Effect Line On; V-blanking only - CMD(0x3A); - DATA(0x55); // COLMOD: Interface Pixel format; 65K color: 16-bit/pixel (RGB - // 5-6-5 bits input) - CMD(0xDF); - DATA(0x5A); - DATA(0x69); - DATA(0x02); - DATA(0x01); // CMD2EN: Commands in command table 2 can be executed when - // EXTC level is Low - CMD(0xC0); - DATA(0x20); // LCMCTRL: LCM Control: XOR RGB setting - CMD(0xE4); - DATA(0x1D); - DATA(0x0A); - DATA(0x11); // GATECTRL: Gate Control; NL = 240 gate lines, first scan line - // is gate 80.; gate scan direction 319 -> 0 - // INVOFF (20h): Display Inversion Off - // INVON (21h): Display Inversion On - CMD(0x20 | DISPLAY_ST7789V_INVERT_COLORS); - // the above config is the most important and definitely necessary - CMD(0xD0); - DATA(0xA4); - DATA(0xA1); // PWCTRL1: Power Control 1 - // gamma curve 1 - // CMD(0xE0); DATA(0x70); DATA(0x2C); DATA(0x2E); DATA(0x15); DATA(0x10); - // DATA(0x09); DATA(0x48); DATA(0x33); DATA(0x53); DATA(0x0B); DATA(0x19); - // DATA(0x18); DATA(0x20); DATA(0x25); gamma curve 2 CMD(0xE1); DATA(0x70); - // DATA(0x2C); DATA(0x2E); DATA(0x15); DATA(0x10); DATA(0x09); DATA(0x48); - // DATA(0x33); DATA(0x53); DATA(0x0B); DATA(0x19); DATA(0x18); DATA(0x20); - // DATA(0x25); + send_init_seq_ST7789V(); } else if (id == DISPLAY_ID_ILI9341V) { - // most recent manual: https://www.newhavendisplay.com/app_notes/ILI9341.pdf - CMD(0x35); - DATA(0x00); // TEON: Tearing Effect Line On; V-blanking only - CMD(0x3A); - DATA(0x55); // COLMOD: Interface Pixel format; 65K color: 16-bit/pixel (RGB - // 5-6-5 bits input) - CMD(0xB6); - DATA(0x0A); - DATA(0xC2); - DATA(0x27); - DATA(0x00); // Display Function Control: gate scan direction 319 -> 0 - CMD(0xF6); - DATA(0x09); - DATA(0x30); - DATA(0x00); // Interface Control: XOR BGR as ST7789V does - // the above config is the most important and definitely necessary - CMD(0xCF); - DATA(0x00); - DATA(0xC1); - DATA(0x30); - CMD(0xED); - DATA(0x64); - DATA(0x03); - DATA(0x12); - DATA(0x81); - CMD(0xE8); - DATA(0x85); - DATA(0x10); - DATA(0x7A); - CMD(0xF7); - DATA(0x20); - CMD(0xEA); - DATA(0x00); - DATA(0x00); - CMD(0xC0); - DATA(0x23); // power control VRH[5:0] - CMD(0xC1); - DATA(0x12); // power control SAP[2:0] BT[3:0] - CMD(0xC5); - DATA(0x60); - DATA(0x44); // vcm control 1 - CMD(0xC7); - DATA(0x8A); // vcm control 2 - CMD(0xB1); - DATA(0x00); - DATA(0x18); // framerate - CMD(0xF2); - DATA(0x00); // 3 gamma func disable - // gamma curve 1 - CMD(0xE0); - DATA(0x0F); - DATA(0x2F); - DATA(0x2C); - DATA(0x0B); - DATA(0x0F); - DATA(0x09); - DATA(0x56); - DATA(0xD9); - DATA(0x4A); - DATA(0x0B); - DATA(0x14); - DATA(0x05); - DATA(0x0C); - DATA(0x06); - DATA(0x00); - // gamma curve 2 - CMD(0xE1); - DATA(0x00); - DATA(0x10); - DATA(0x13); - DATA(0x04); - DATA(0x10); - DATA(0x06); - DATA(0x25); - DATA(0x26); - DATA(0x3B); - DATA(0x04); - DATA(0x0B); - DATA(0x0A); - DATA(0x33); - DATA(0x39); - DATA(0x0F); + send_init_seq_ILI9341V(); } display_clear(); @@ -433,8 +515,8 @@ void display_init(void) { GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStructure.Alternate = 0; GPIO_InitStructure.Pin = GPIO_PIN_14; - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, - GPIO_PIN_RESET); // default to keeping display in reset + // default to keeping display in reset + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET); HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); // LCD_FMARK/PD12 (tearing effect) @@ -449,16 +531,13 @@ void display_init(void) { GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStructure.Alternate = GPIO_AF12_FMC; - // LCD_CS/PD7 LCD_RS/PD11 LCD_RD/PD4 - // LCD_WR/PD5 + // LCD_CS/PD7 LCD_RS/PD11 LCD_RD/PD4 LCD_WR/PD5 GPIO_InitStructure.Pin = GPIO_PIN_7 | GPIO_PIN_11 | GPIO_PIN_4 | GPIO_PIN_5; HAL_GPIO_Init(GPIOD, &GPIO_InitStructure); - // LCD_D0/PD14 LCD_D1/PD15 LCD_D2/PD0 - // LCD_D3/PD1 + // LCD_D0/PD14 LCD_D1/PD15 LCD_D2/PD0 LCD_D3/PD1 GPIO_InitStructure.Pin = GPIO_PIN_14 | GPIO_PIN_15 | GPIO_PIN_0 | GPIO_PIN_1; HAL_GPIO_Init(GPIOD, &GPIO_InitStructure); - // LCD_D4/PE7 LCD_D5/PE8 LCD_D6/PE9 - // LCD_D7/PE10 + // LCD_D4/PE7 LCD_D5/PE8 LCD_D6/PE9 LCD_D7/PE10 GPIO_InitStructure.Pin = GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10; HAL_GPIO_Init(GPIOE, &GPIO_InitStructure); @@ -504,8 +583,8 @@ void display_init(void) { void display_refresh(void) { uint32_t id = display_identify(); if (id && (id != DISPLAY_ID_GC9307)) { - // synchronize with the panel synchronization signal in order to avoid - // visual tearing effects + // synchronize with the panel synchronization signal + // in order to avoid visual tearing effects while (GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_12)) { } while (GPIO_PIN_SET == HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_12)) {